Cyclops 4 HPC is the purpose built stack to support large HPC centers with resource accounting and billing of cluster as well as cloud resources.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

189 lines
4.1 KiB

package main
import (
"time"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/gophercloud/gophercloud/openstack/compute/v2/images"
l "gitlab.com/cyclops-utilities/logging"
)
type FlavorIDCacheData struct {
FlavorName string
LastRefreshed int64
}
type ImageIDCacheData struct {
ImageName string
OSFlavor string
LastRefreshed int64
}
var (
FlavorCache map[string]FlavorIDCacheData
ImageCache map[string]ImageIDCacheData
)
func getFromFlavorCache(client *gophercloud.ServiceClient, flavorid string) (flavorname string, e error) {
var flavor *flavors.Flavor
if FlavorCache[flavorid].LastRefreshed != 0 {
//the cache entry exists
l.Trace.Printf("[CACHE] Flavor cache entry found for key: %v.\n", flavorid)
if time.Now().Unix()-FlavorCache[flavorid].LastRefreshed > 86400 {
//invalidate the entry and get a fresh one
l.Trace.Printf("[CACHE] Cache invalidation for key [ %v ], refreshing entry now.\n", flavorid)
flavor, e = flavors.Get(client, flavorid).Extract()
if e != nil {
l.Warning.Printf("[CACHE] Error reading remote API response for flavor-id data. Error: %v\n", e)
return
}
flavorname = flavor.Name
FlavorCache[flavorid] = FlavorIDCacheData{
flavor.Name,
time.Now().Unix(),
}
l.Trace.Printf("[CACHE] Cache entry updated for key [ %v ]. New value returned.\n", flavorid)
return
}
l.Trace.Printf("[CACHE] Cache entry value for key [ %v ] returned without refreshing.\n", flavorid)
flavorname = FlavorCache[flavorid].FlavorName
return
}
l.Trace.Printf("[CACHE] Cache entry miss for key: %v\n.", flavorid)
flavor, e = flavors.Get(client, flavorid).Extract()
if e != nil {
l.Warning.Printf("[CACHE] Error reading remote API response for flavor-id data. Error: %v ", e)
return
}
flavorname = flavor.Name
l.Trace.Printf("[CACHE] Going to add a new cache entry added for key: %v\n", flavorid)
FlavorCache[flavorid] = FlavorIDCacheData{
flavor.Name,
time.Now().Unix(),
}
l.Trace.Printf("[CACHE] Cache entry added for key [ %v ]. New value returned.\n", flavorid)
return
}
func getFromImageCache(client *gophercloud.ServiceClient, imageid string) (imagename string, osflavor string, e error) {
var image *images.Image
if ImageCache[imageid].LastRefreshed != 0 {
//the cache entry exists
l.Trace.Printf("[CACHE] Image cache entry found for image key: %v.\n", imageid)
if time.Now().Unix()-ImageCache[imageid].LastRefreshed > 86400 {
//invalidate the entry and get a fresh one
l.Trace.Printf("[CACHE] Cache invalidation for image key [ %v ], refreshing entry now.\n", imageid)
image, e = images.Get(client, imageid).Extract()
if e != nil {
l.Warning.Printf("[CACHE] Error reading remote API response for image data. Error: %v.\n", e)
return
}
imagename = image.Name
osflavor_test, exists := image.Metadata["os_flavor"] //image operating system flavor
if exists {
osflavor = osflavor_test.(string)
}
ImageCache[imageid] = ImageIDCacheData{
image.Name,
osflavor,
time.Now().Unix(),
}
l.Trace.Printf("[CACHE] Cache entry updated for image key [ %v ]. New value returned.\n", imageid)
return
}
l.Trace.Printf("[CACHE] Cache entry value for image key [ %v ] returned without refreshing.\n", imageid)
imagename = ImageCache[imageid].ImageName
osflavor = ImageCache[imageid].OSFlavor
return
}
l.Trace.Printf("[CACHE] Cache entry miss for image key: %v.\n", imageid)
image, e = images.Get(client, imageid).Extract()
if e != nil {
l.Warning.Printf("[CACHE] Error reading remote API response for image data. Error: %v.\n", e)
return
}
imagename = image.Name
osflavor_test, exists := image.Metadata["os_flavor"] //image operating system flavor
if exists {
osflavor = osflavor_test.(string)
}
l.Trace.Printf("[CACHE] Going to add a new cache entry added for image key: " + imageid)
ImageCache[imageid] = ImageIDCacheData{
image.Name,
osflavor,
time.Now().Unix(),
}
l.Trace.Printf("[CACHE] Cache entry added for image key: " + imageid + ". New value returned.")
return
}