github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/fleetmanager/hypervisors/fsstorer/vm.go (about) 1 package fsstorer 2 3 import ( 4 "encoding/gob" 5 "net" 6 "os" 7 "path/filepath" 8 9 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 10 proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 11 ) 12 13 func (s *Storer) deleteVm(hypervisor net.IP, ipAddr string) error { 14 if dirname, err := s.getVmDirname(hypervisor, ipAddr); err != nil { 15 return err 16 } else { 17 return os.RemoveAll(dirname) 18 } 19 } 20 21 func (s *Storer) getNetHypervisorDirectory(hypervisor net.IP) (string, error) { 22 hypervisorIP, err := netIpToIp(hypervisor) 23 if err != nil { 24 return "", err 25 } 26 return s.getHypervisorDirectory(hypervisorIP), nil 27 } 28 29 func (s *Storer) getVmDirname(hypervisor net.IP, 30 ipAddr string) (string, error) { 31 if hDirname, err := s.getNetHypervisorDirectory(hypervisor); err != nil { 32 return "", err 33 } else { 34 return filepath.Join(hDirname, "VMs", ipAddr), nil 35 } 36 } 37 38 func (s *Storer) listVMs(hypervisor net.IP) ([]string, error) { 39 if hDirname, err := s.getNetHypervisorDirectory(hypervisor); err != nil { 40 return nil, err 41 } else { 42 return fsutil.ReadDirnames(filepath.Join(hDirname, "VMs"), true) 43 } 44 } 45 46 func (s *Storer) readVm(hypervisor net.IP, 47 ipAddr string) (*proto.VmInfo, error) { 48 if dirname, err := s.getVmDirname(hypervisor, ipAddr); err != nil { 49 return nil, err 50 } else { 51 filename := filepath.Join(dirname, "info.gob") 52 if file, err := os.Open(filename); err != nil { 53 return nil, err 54 } else { 55 defer file.Close() 56 decoder := gob.NewDecoder(file) 57 var vmInfo proto.VmInfo 58 if err := decoder.Decode(&vmInfo); err != nil { 59 return nil, err 60 } 61 return &vmInfo, nil 62 } 63 } 64 } 65 66 func (s *Storer) writeVm(hypervisor net.IP, ipAddr string, 67 vmInfo proto.VmInfo) error { 68 if dirname, err := s.getVmDirname(hypervisor, ipAddr); err != nil { 69 return err 70 } else { 71 if err := os.MkdirAll(dirname, dirPerms); err != nil { 72 return err 73 } 74 filename := filepath.Join(dirname, "info.gob") 75 writer, err := fsutil.CreateRenamingWriter(filename, filePerms) 76 if err != nil { 77 return err 78 } else { 79 defer writer.Close() 80 encoder := gob.NewEncoder(writer) 81 if err := encoder.Encode(vmInfo); err != nil { 82 writer.Abort() 83 return err 84 } 85 return writer.Close() 86 } 87 } 88 }