Documentation ¶
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Client ¶
type Client struct { SOAP *govmomi.Client REST *rest.Client Tags *tags.Manager Tasks *task.Manager Events *event.Manager }
Client is a combined vCenter SOAP and REST (VAPI) client with fields to directly access commonly used managers
func New ¶
New returns a combined vCenter SOAP and REST (VAPI) client with active keep-alive configured via environment variables. Commonly used managers are exposed for quick access.
A custom logger (zap.Logger) can be injected into the context via the logger package.
Use Logout() to release resources and perform a clean logout from vCenter.
Example ¶
package main import ( "context" "fmt" "os" "path/filepath" "github.com/vmware/govmomi/simulator" "github.com/vmware/govmomi/vim25" "go.uber.org/zap" "github.com/embano1/vsphere/logger" "github.com/embano1/vsphere/client" ) func main() { // use vcenter simulator simulator.Run(func(ctx context.Context, simClient *vim25.Client) error { l, err := setup(simClient.URL().String()) if err != nil { return fmt.Errorf("setup environment: %w", err) } ctx = logger.Set(ctx, l) c, err := client.New(ctx) if err != nil { l.Fatal("create vsphere client", zap.Error(err)) } defer func() { if err = c.Logout(); err != nil { l.Warn("logout", zap.Error(err)) } }() l.Info("connected to vcenter", zap.String("version", c.SOAP.Version)) return nil }) } // this is only needed for the example. In a real deployment, e.g. Kubernetes // the secret and environment variables would be injected. func setup(url string) (*zap.Logger, error) { dir, err := os.MkdirTemp("", "") if err != nil { return nil, fmt.Errorf("create temp directory: %w", err) } f, err := os.Create(filepath.Join(dir, "username")) if err != nil { return nil, fmt.Errorf("create user file: %w", err) } _, err = f.Write([]byte("usr")) if err != nil { return nil, fmt.Errorf("write to user file: %w", err) } if err = f.Close(); err != nil { return nil, fmt.Errorf("close user file: %w", err) } f, err = os.Create(filepath.Join(dir, "password")) if err != nil { return nil, fmt.Errorf("create password file: %w", err) } _, err = f.Write([]byte("pass")) if err != nil { return nil, fmt.Errorf("write to password file: %w", err) } if err = f.Close(); err != nil { return nil, fmt.Errorf("close password file: %w", err) } env := map[string]string{ "VCENTER_URL": url, "VCENTER_INSECURE": "true", "VCENTER_SECRET_PATH": dir, } for e, v := range env { if err = os.Setenv(e, v); err != nil { return nil, fmt.Errorf("set %q env var: %w", e, err) } } // create logger cfg := zap.NewDevelopmentConfig() cfg.OutputPaths = []string{"stdout"} cfg.EncoderConfig.TimeKey = "" // no timestamps cfg.EncoderConfig.CallerKey = "" // no func lines cfg.EncoderConfig.ConsoleSeparator = " " l, err := cfg.Build() if err != nil { return nil, fmt.Errorf("create logger: %w", err) } return l, nil }
Output: INFO connected to vcenter {"version": "8.0.2.0"}
type Config ¶ added in v0.2.1
type Config struct { Insecure bool `envconfig:"VCENTER_INSECURE" default:"false"` Address string `envconfig:"VCENTER_URL" required:"true"` SecretPath string `envconfig:"VCENTER_SECRET_PATH" required:"true" default:"/var/bindings/vsphere"` }
Config configures the vsphere client via environment variables
Click to show internal directories.
Click to hide internal directories.