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.
 
 

248 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
}