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  }