client

package
v0.2.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 26, 2023 License: Apache-2.0 Imports: 22 Imported by: 4

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewREST

func NewREST(ctx context.Context, vc *vim25.Client) (*rest.Client, error)

NewREST returns a vCenter REST (VAPI) API client with active keep-alive configured via environment variables.

Use Logout() to release resources and perform a clean logout from vCenter.

func NewSOAP

func NewSOAP(ctx context.Context) (*govmomi.Client, error)

NewSOAP returns a vCenter SOAP API client with active keep-alive configured via environment variables.

Use Logout() to release resources and perform a clean logout from vCenter.

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

func New(ctx context.Context) (*Client, error)

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

func (*Client) Logout

func (c *Client) Logout() error

Logout attempts a clean logout from the various vCenter APIs

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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL