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  }