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