github.com/Cloud-Foundations/Dominator@v0.3.4/hypervisor/manager/manager.go (about) 1 package manager 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "time" 8 9 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 10 "github.com/Cloud-Foundations/Dominator/lib/stringutil" 11 proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 12 ) 13 14 func (m *Manager) getSummary() *summaryData { 15 m.summaryMutex.RLock() 16 defer m.summaryMutex.RUnlock() 17 return m.summary 18 } 19 20 func (m *Manager) holdLock(timeout time.Duration, writeLock bool) error { 21 if timeout > time.Minute { 22 return fmt.Errorf("timeout: %s exceeds one minute", timeout) 23 } 24 if writeLock { 25 m.mutex.Lock() 26 time.Sleep(timeout) 27 m.mutex.Unlock() 28 } else { 29 m.mutex.RLock() 30 time.Sleep(timeout) 31 m.mutex.RUnlock() 32 } 33 return nil 34 } 35 36 func (m *Manager) updateSummaryWithMainRLock() { 37 availableMilliCPU := m.getAvailableMilliCPUWithLock() 38 memUnallocated := m.getUnallocatedMemoryInMiBWithLock(nil) 39 numFreeAddresses := uint(len(m.addressPool.Free)) 40 numRegisteredAddresses := uint(len(m.addressPool.Registered)) 41 numRunning, numStopped := m.getNumVMsWithLock() 42 numSubnets := uint(len(m.subnets)) 43 ownerGroups := stringutil.ConvertMapKeysToList(m.ownerGroups, false) 44 ownerUsers := stringutil.ConvertMapKeysToList(m.ownerUsers, false) 45 summary := &summaryData{ 46 availableMilliCPU: availableMilliCPU, 47 memUnallocated: memUnallocated, 48 numFreeAddresses: numFreeAddresses, 49 numRegisteredAddresses: numRegisteredAddresses, 50 numRunning: numRunning, 51 numStopped: numStopped, 52 numSubnets: numSubnets, 53 ownerGroups: ownerGroups, 54 ownerUsers: ownerUsers, 55 updatedAt: time.Now(), 56 } 57 m.summaryMutex.Lock() 58 defer m.summaryMutex.Unlock() 59 m.summary = summary 60 } 61 62 func (m *Manager) setDisabledState(disable bool) error { 63 m.mutex.Lock() 64 doUnlock := true 65 defer func() { 66 if doUnlock { 67 m.mutex.Unlock() 68 } 69 }() 70 if m.disabled == disable { 71 return nil 72 } 73 filename := filepath.Join(m.StartOptions.StateDir, "disabled") 74 if disable { 75 file, err := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 76 fsutil.PublicFilePerms) 77 if err != nil { 78 return err 79 } 80 file.Close() 81 } else { 82 if err := os.Remove(filename); err != nil { 83 return err 84 } 85 } 86 m.disabled = disable 87 numFreeAddresses, err := m.computeNumFreeAddressesMap(m.addressPool) 88 if err != nil { 89 m.Logger.Println(err) 90 } 91 m.mutex.Unlock() 92 doUnlock = false 93 m.sendUpdate(proto.Update{ 94 HaveDisabled: true, 95 Disabled: disable, 96 NumFreeAddresses: numFreeAddresses, 97 }) 98 return nil 99 }