Files
cocos/manager/ttl.go
T
Sammy Kerata Oina 45187d7f41 COCOS-454 - Implement graceful shutdown for services and add TTL management for VMs (#473)
* Implement graceful shutdown for services and add TTL management for VMs

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Remove unnecessary comment from go-tdx-guest dependency in go.mod

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Update manager/api/logging.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Add TTL manager initialization in TestStop

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Fix logging format in Shutdown method for consistency

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Add unit tests for TTL manager functionality

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Enhance TTL tests with mutex for thread safety in expiration checks

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Add TTL parameter to CreateVM in TestRun for improved testing scenarios

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* Add Shutdown test to verify VM cleanup and TTL manager integration

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

---------

Signed-off-by: Sammy Oina <sammyoina@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-11 16:21:29 +02:00

67 lines
1.3 KiB
Go

// Copyright (c) Ultraviolet
// SPDX-License-Identifier: Apache-2.0
package manager
import (
"context"
sync "sync"
"time"
)
// TTLManager handles TTL functionality for VMs.
type TTLManager struct {
timers map[string]*time.Timer
mu sync.RWMutex
}
// NewTTLManager creates a new TTL manager.
func NewTTLManager() *TTLManager {
return &TTLManager{
timers: make(map[string]*time.Timer),
}
}
// SetTTL sets a TTL for a VM and returns a function to cancel it.
func (tm *TTLManager) SetTTL(vmID string, ttl time.Duration, onExpiry func()) context.CancelFunc {
tm.mu.Lock()
defer tm.mu.Unlock()
if timer, exists := tm.timers[vmID]; exists {
timer.Stop()
}
timer := time.AfterFunc(ttl, onExpiry)
tm.timers[vmID] = timer
return func() {
tm.mu.Lock()
defer tm.mu.Unlock()
if t, exists := tm.timers[vmID]; exists {
t.Stop()
delete(tm.timers, vmID)
}
}
}
// CancelTTL cancels the TTL for a specific VM.
func (tm *TTLManager) CancelTTL(vmID string) {
tm.mu.Lock()
defer tm.mu.Unlock()
if timer, exists := tm.timers[vmID]; exists {
timer.Stop()
delete(tm.timers, vmID)
}
}
// CancelAll cancels all active TTLs.
func (tm *TTLManager) CancelAll() {
tm.mu.Lock()
defer tm.mu.Unlock()
for vmID, timer := range tm.timers {
timer.Stop()
delete(tm.timers, vmID)
}
}