package vcenter import ( "context" "fmt" "log" "log/slog" "net/url" "os" "github.com/vmware/govmomi" "github.com/vmware/govmomi/view" "github.com/vmware/govmomi/vim25/mo" "github.com/vmware/govmomi/vim25/soap" ) type Vcenter struct { logger *slog.Logger ctx context.Context client *govmomi.Client } // New creates a new Vcenter with the given logger func New(logger *slog.Logger) *Vcenter { //ctx, cancel := context.WithCancel(context.Background()) //defer cancel() return &Vcenter{ logger: logger, ctx: context.Background(), } } func (v *Vcenter) Login(vUrl string) error { var insecure bool insecureString := os.Getenv("VCENTER_INSECURE") username := os.Getenv("VCENTER_USERNAME") password := os.Getenv("VCENTER_PASSWORD") // Connect to vCenter u, err := soap.ParseURL(vUrl) if err != nil { log.Fatalf("Error parsing vCenter URL: %s", err) } u.User = url.UserPassword(username, password) /* c, err := govmomi.NewClient(ctx, u, insecure) if err != nil { log.Fatalf("Error connecting to vCenter: %s", err) } */ if insecureString == "true" { insecure = true } c, err := govmomi.NewClient(v.ctx, u, insecure) if err != nil { v.logger.Error("Unable to connect to vCenter", "error", err) return fmt.Errorf("unable to connect to vCenter : %s", err) } //defer c.Logout(v.ctx) v.client = c return nil } func (v *Vcenter) Logout() error { return v.client.Logout(v.ctx) } func (v *Vcenter) FindVMByName(vmName string) ([]mo.VirtualMachine, error) { m := view.NewManager(v.client.Client) vms, err := m.CreateContainerView(v.ctx, v.client.ServiceContent.RootFolder, []string{"VirtualMachine"}, true) if err != nil { return nil, err } defer vms.Destroy(v.ctx) var matchingVMs []mo.VirtualMachine err = vms.Retrieve(v.ctx, []string{"VirtualMachine"}, []string{"name"}, &matchingVMs) if err != nil { return nil, err } // Temporarily just return all VMs //return matchingVMs, nil var result []mo.VirtualMachine for _, vm := range matchingVMs { if vm.Name == vmName { result = append(result, vm) } } return result, nil }