(s *state.State, inst instance.Instance)
| 235 | } |
| 236 | |
| 237 | func instanceDebugRepairRebuildConfigVolume(s *state.State, inst instance.Instance) error { |
| 238 | // Initial validation. |
| 239 | if inst.Type() != instancetype.VM { |
| 240 | return errors.New("Config volume rebuild is only possible on VMs") |
| 241 | } |
| 242 | |
| 243 | if inst.IsRunning() { |
| 244 | return errors.New("Config volume rebuild is only possible on stopped VMs") |
| 245 | } |
| 246 | |
| 247 | // Load the storage pool. |
| 248 | pool, err := storagePools.LoadByInstance(s, inst) |
| 249 | if err != nil { |
| 250 | return err |
| 251 | } |
| 252 | |
| 253 | // Load the volume. |
| 254 | dbVol, err := storagePools.VolumeDBGet(pool, inst.Project().Name, inst.Name(), storageDrivers.VolumeTypeVM) |
| 255 | if err != nil { |
| 256 | return err |
| 257 | } |
| 258 | |
| 259 | if dbVol.Config["block.type"] != "qcow2" { |
| 260 | return errors.New("Config volume rebuild is only possible on QCOW2 backed VMs") |
| 261 | } |
| 262 | |
| 263 | volStorageName := project.Instance(inst.Project().Name, inst.Name()) |
| 264 | vol := pool.GetVolume(storageDrivers.VolumeTypeVM, storageDrivers.ContentTypeFS, volStorageName, dbVol.Config) |
| 265 | |
| 266 | // Re-create the filesystem. |
| 267 | err = pool.Driver().ActivateTask(vol, func(devPath string, op *operations.Operation) error { |
| 268 | _, err = subprocess.RunCommand("mkfs.btrfs", "-f", devPath) |
| 269 | if err != nil { |
| 270 | return err |
| 271 | } |
| 272 | |
| 273 | return nil |
| 274 | }, nil) |
| 275 | if err != nil { |
| 276 | return err |
| 277 | } |
| 278 | |
| 279 | // Re-configure the sub-volumes. |
| 280 | err = storageDrivers.Qcow2CreateConfig(vol, nil) |
| 281 | if err != nil { |
| 282 | return err |
| 283 | } |
| 284 | |
| 285 | snaps, err := inst.Snapshots() |
| 286 | if err != nil { |
| 287 | return err |
| 288 | } |
| 289 | |
| 290 | for _, snap := range snaps { |
| 291 | snapVolStorageName := project.Instance(snap.Project().Name, snap.Name()) |
| 292 | snapVol := pool.GetVolume(storageDrivers.VolumeTypeVM, storageDrivers.ContentTypeFS, snapVolStorageName, dbVol.Config) |
| 293 | |
| 294 | err = storageDrivers.Qcow2CreateConfigSnapshot(vol, snapVol, nil) |
no test coverage detected
searching dependent graphs…