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.
cyclops-4-hpc/extensions/lexis/server/syncManager/flavors.go

249 lines
4.8 KiB

package syncManager
import (
"context"
"fmt"
"net/http"
"strconv"
"strings"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"gitlab.com/cyclops-utilities/datamodels"
pmBundle "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/client/bundle_management"
pmModels "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/models"
l "gitlab.com/cyclops-utilities/logging"
)
func (m *SyncManager) updateBundles(param *http.Request) (state int, err error) {
l.Trace.Printf("[LoaderManager] UpdateBundles endpoint invoked.\n")
var opts gophercloud.AuthOptions
var bundles []*pmModels.SkuBundle
opts = gophercloud.AuthOptions{
IdentityEndpoint: m.db.Configs.OpenStack.Keystone,
Username: m.db.Configs.OpenStack.Username,
Password: m.db.Configs.OpenStack.Password,
DomainName: m.db.Configs.OpenStack.Domain,
}
if len(m.db.Configs.OpenStack.Project) > 0 {
opts.TenantName = m.db.Configs.OpenStack.Project
}
provider, e := openstack.AuthenticatedClient(opts)
if e != nil {
l.Error.Printf("[SyncManager] Authentication failed. Error: %v", e)
state = statusFail
err = e
return
}
pmClient := m.getPMClient(param)
ctx := context.Background()
for _, region := range m.db.Configs.OpenStack.Regions {
l.Info.Printf("[SyncManager] Processing OS region: %s\n", region)
client, e := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
Region: region,
})
if e != nil {
l.Warning.Printf("[SyncManager] There was a problem creating compute collector client. Error: %v", e)
state = statusFail
err = e
return
}
listOpts := flavors.ListOpts{
AccessType: flavors.AllAccess,
}
allPages, e := flavors.ListDetail(client, listOpts).AllPages()
if e != nil {
l.Warning.Printf("[SyncManager] There was a problem while getting flavor list. Error: %v", e)
state = statusFail
err = e
return
}
allFlavors, e := flavors.ExtractFlavors(allPages)
if e != nil {
l.Warning.Printf("[SyncManager] Could not extract flavors. Error: %v", e)
state = statusFail
err = e
return
}
flavorLoop:
for _, flavor := range allFlavors {
name := strings.ToLower(flavor.Name)
for _, filter := range m.db.Configs.OpenStack.Filters {
if strings.Contains(flavor.Name, filter) {
continue flavorLoop
}
}
l.Trace.Printf("[SyncManager] Located flavor: VCPUs: %2d, Disk (GB): %3d, RAM (MB): %5d, Name: %15s, ID:%s\n", flavor.VCPUs, flavor.Disk, flavor.RAM, flavor.Name, flavor.ID)
//here insert or update flavor details in the db
var bundle pmModels.SkuBundle
bundle.ID = flavor.ID
bundle.Name = &flavor.Name
bundle.SkuPrices = make(datamodels.JSONdb)
bundle.SkuPrices["vcpu"] = int64(flavor.VCPUs)
bundle.SkuPrices["ram"] = float64(float64(flavor.RAM) / float64(1024))
fmt.Printf("RAM: %v\n", bundle.SkuPrices["ram"])
if strings.Contains(name, "windows") {
bundle.SkuPrices["license"] = int64(flavor.VCPUs)
}
if strings.HasPrefix(name, "g1") {
l.Trace.Printf("[SyncManager] Found a GPU flavor: %s, proceeding to parse next.\n", name)
var temp string
if strings.Contains(name, "t4") {
temp = "t4"
}
if strings.Contains(name, "p100") {
temp = "p100"
}
if strings.Contains(name, "titanxp") {
temp = "titanxp"
}
typeCut := strings.Split(name, temp)
coresCut := strings.Split(typeCut[0], "-")
var gpucount int64
if coresCut[len(coresCut)-1] == "" {
gpucount = int64(1)
} else {
n, e := strconv.ParseInt(coresCut[len(coresCut)-1], 10, 64)
if e != nil {
l.Warning.Printf("[SyncManager] Non numeric count detected in gpu flavor name %s\n", name)
} else {
gpucount = n
}
}
bundle.SkuPrices[temp] = int64(gpucount)
}
if strings.Contains(name, "ssd") {
bundle.SkuPrices["rootdisk_ssd"] = float64(flavor.Disk)
bundle.SkuPrices["ephemeraldisk_ssd"] = float64(flavor.Ephemeral)
} else {
bundle.SkuPrices["rootdisk"] = float64(flavor.Disk)
bundle.SkuPrices["ephemeraldisk"] = float64(flavor.Ephemeral)
}
params := pmBundle.NewCreateSkuBundleParams().WithBundle(&bundle)
_, e = pmClient.BundleManagement.CreateSkuBundle(ctx, params)
if e != nil {
uparams := pmBundle.NewUpdateSkuBundleParams().WithID(bundle.ID).WithBundle(&bundle)
_, e := pmClient.BundleManagement.UpdateSkuBundle(ctx, uparams)
if e != nil {
err = e
state = statusFail
} else {
state = statusOK
}
}
bundles = append(bundles, &bundle)
}
}
state = statusOK
if len(bundles) < 1 {
state = statusFail
} else if e != nil {
state = statusMissing
}
return
}