package disk import "fmt" type LVMVolumeGroup struct { Name string Description string LogicalVolumes []LVMLogicalVolume } func (vg *LVMVolumeGroup) IsContainer() bool { return true } func (vg *LVMVolumeGroup) Clone() Entity { if vg == nil { return nil } clone := &LVMVolumeGroup{ Name: vg.Name, Description: vg.Description, LogicalVolumes: make([]LVMLogicalVolume, len(vg.LogicalVolumes)), } for idx, lv := range vg.LogicalVolumes { ent := lv.Clone() var lv *LVMLogicalVolume if ent != nil { lvEnt, cloneOk := ent.(*LVMLogicalVolume) if !cloneOk { panic("LVMLogicalVolume.Clone() returned an Entity that cannot be converted to *LVMLogicalVolume; this is a programming error") } lv = lvEnt } clone.LogicalVolumes[idx] = *lv } return clone } func (vg *LVMVolumeGroup) GetItemCount() uint { if vg == nil { return 0 } return uint(len(vg.LogicalVolumes)) } func (vg *LVMVolumeGroup) GetChild(n uint) Entity { if vg == nil { panic("LVMVolumeGroup.GetChild: nil entity") } return &vg.LogicalVolumes[n] } func (vg *LVMVolumeGroup) CreateVolume(mountpoint string, size uint64) (Entity, error) { if vg == nil { panic("LVMVolumeGroup.CreateVolume: nil entity") } filesystem := Filesystem{ Type: "xfs", Mountpoint: mountpoint, FSTabOptions: "defaults", FSTabFreq: 0, FSTabPassNo: 0, } lv := LVMLogicalVolume{ Size: size, Payload: &filesystem, } vg.LogicalVolumes = append(vg.LogicalVolumes, lv) return &vg.LogicalVolumes[len(vg.LogicalVolumes)-1], nil } type LVMLogicalVolume struct { Name string Size uint64 Payload Entity } func (lv *LVMLogicalVolume) IsContainer() bool { return true } func (lv *LVMLogicalVolume) Clone() Entity { if lv == nil { return nil } return &LVMLogicalVolume{ Name: lv.Name, Size: lv.Size, Payload: lv.Payload, } } func (lv *LVMLogicalVolume) GetItemCount() uint { if lv == nil || lv.Payload == nil { return 0 } return 1 } func (lv *LVMLogicalVolume) GetChild(n uint) Entity { if n != 0 || lv == nil { panic(fmt.Sprintf("invalid child index for LVMLogicalVolume: %d != 0", n)) } return lv.Payload } func (lv *LVMLogicalVolume) GetSize() uint64 { if lv == nil { return 0 } return lv.Size } func (lv *LVMLogicalVolume) EnsureSize(s uint64) bool { if lv == nil { panic("LVMLogicalVolume.EnsureSize: nil entity") } if s > lv.Size { lv.Size = s return true } return false }