Skip to content

Instantly share code, notes, and snippets.

@anjannath
Created August 8, 2024 10:31
Show Gist options
  • Save anjannath/ddbd8e5270fa83e674329f5afec00ea2 to your computer and use it in GitHub Desktop.
Save anjannath/ddbd8e5270fa83e674329f5afec00ea2 to your computer and use it in GitHub Desktop.
Filter Azure compute resources
package main
import (
"context"
"fmt"
"log"
"os"
"strconv"
"sync"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
armcompute "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6"
)
func main() {
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("failed to obtain a credential: %v", err)
}
ctx := context.Background()
subscriptionId := os.Getenv("ARM_SUBSCRIPTION_ID")
clientFactory, err := armcompute.NewClientFactory(subscriptionId, cred, nil)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
pager := clientFactory.NewResourceSKUsClient().NewListPager(&armcompute.ResourceSKUsClientListOptions{Filter: nil,
IncludeExtendedLocations: nil,
})
wg := &sync.WaitGroup{}
for pager.More() {
page, err := pager.NextPage(ctx)
if err != nil {
log.Fatalf("failed to advance page: %v", err)
}
wg.Add(1)
go FilterVMs(wg, page, filterCPUsAndMemory(64, 256))
}
wg.Wait()
}
type filterFunc func(*armcompute.ResourceSKU) bool
func filterCPUsAndMemory(cpus, memory uint64) filterFunc {
return func(res *armcompute.ResourceSKU) bool {
choose := false
for _, capability := range res.Capabilities {
if *capability.Name == "vCPUs" {
vCpus, err := strconv.ParseUint(*capability.Value, 10, 64)
if err != nil {
return false
}
choose = choose || (vCpus >= cpus)
}
if *capability.Name == "MemoryGB" {
mem, err := strconv.ParseUint(*capability.Value, 10, 64)
if err != nil {
return false
}
choose = choose && (mem == memory)
}
}
return choose
}
}
func filterCPUsMemoryAndDedicatedHost(cpus, memory uint64) filterFunc {
return func(res *armcompute.ResourceSKU) bool {
// figure out the instance name family type and compare to dedicated hosts family list
return false
}
}
func FilterVMs(wg *sync.WaitGroup, skus armcompute.ResourceSKUsClientListResponse, filter filterFunc) {
defer wg.Done()
for _, v := range skus.Value {
if filter(v) {
fmt.Println("VirtualMachine name: ", *v.Name)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment