proxmox

package module
v1.0.9 Latest Latest
Warning

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

Go to latest
Published: Apr 13, 2023 License: Apache-2.0 Imports: 20 Imported by: 0

README

Proxmox API Client Go Package

A Go package to consume the Proxmox VE api2/json. Inspiration drawn from the existing Telmate package but looking to improve in the following ways.

  • Treated as a proper standalone go package
  • Types and JSON marshal/unmarshalling for all end points
  • Full Testing, unit testing and integration tests against an API endpoint
  • Configuration options when creating a client for flexible usage
  • Client logging for debugging within your code
  • Added functionality for better go tooling built on this library, some things we'd like
    • Boot VM from qcow URL, inspiration: Proxmox Linux Templates
    • Dynamic host targeting for VM, Proxmox lacks a scheduler when given VM params it will try and locate a host with resources to put it
    • cloud-init support via no-cloud ISOs uploaded to node data stores and auto-mounted before boot, inspiration quiso
    • Unattend XML Support via ISOs similar to cloud-init ideas
    • node/vm/container shell command support via KVM proxy already built into proxmox

Core developers are home lab enthusiasts working in the virtualization and kubernetes space. The common use case we have for Proxmox is dev stress testing and validation of functionality in the products we work on, we plan to build the following tooling around this library to make that easier.

Usage

Create a client and use the public methods to access Proxmox resources.

Basic usage with login credentials
package main

import (
	"fmt"
	"github.com/earentir/go-proxmox"
)

func main() {
    client := proxmox.NewClient("https://localhost:8006/api2/json")
    if err := client.Login("root@pam", "password"); err != nil {
        panic(err)
    }
    version, err := client.Version()
    if err != nil {
        panic(err)
    }
    fmt.Println(version.Release) // 6.3
}
Usage with Client Options
package main

import (
	"fmt"
	"github.com/earentir/go-proxmox"
)

func main() {
    insecureHTTPClient := http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                InsecureSkipVerify: true,
            },
        },
    }
    tokenID := "root@pam!mytoken"
    secret := "somegeneratedapitokenguidefromtheproxmoxui"
    
    client := proxmox.NewClient("https://localhost:8006/api2/json",
        proxmox.WithClient(&insecureHTTPClient),
        proxmox.WithAPIToken(tokenID, secret),
    )
    
    version, err := client.Version()
    if err != nil {
        panic(err)
    }
    fmt.Println(version.Release) // 6.3
}

Developing

This project relies on Mage for cross os/arch compatibility, please see their installation guide.

Unit Testing

Run mage test to run the unit tests in the root directory.

Integration Testing

To run the integration testing suite against an existing Proxmox API set some env vars in your shell before running mage testIntegration. The integration tests will test logging in and using an API token credentials so make sure you set all five env vars before running tests for them to pass.

Please leave no trace when developing integration tests. All tests should create and remove all testing data they generate then they can be repeatably run against the same proxmox environment. Most people working on this package will likely use their personal Proxmox VE home lab and consuming extra resources via tests will lead to frustration.

Bash
export PROXMOX_URL="https://192.168.1.6:8006/api2/json"
export PROXMOX_USERNAME="root@pam"
export PROXMOX_PASSWORD="password"
export PROXMOX_TOKENID="root@pam!mytoken"
export PROXMOX_SECRET="somegeneratedapitokenguidefromtheproxmoxui"

mage test:integration
Powershell
$Env:PROXMOX_URL = "https://192.168.1.6:8006/api2/json"
$Env:PROXMOX_USERNAME = "root@pam"
$Env:PROXMOX_PASSWORD = "password"
$Env:PROXMOX_TOKENID = "root@pam!mytoken"
$Env:PROXMOX_SECRET = "somegeneratedapitokenguidefromtheproxmoxui"

mage test:integration

Documentation

Index

Constants

View Source
const (
	LevelError = iota + 1
	LevelWarn
	LevelInfo
	LevelDebug
)
View Source
const (
	DefaultUserAgent = "go-proxmox/dev"
	TagFormat        = "go-proxmox+%s"
)
View Source
const (
	StatusVirtualMachineRunning = "running"
	StatusVirtualMachineStopped = "stopped"
	StatusVirtualMachinePaused  = "paused"

	UserDataISOFormat = "user-data-%d.iso"
)
View Source
const (
	TaskRunning = "running"
)

Variables

View Source
var DefaultWaitInterval = 1 * time.Second
View Source
var ErrNotAuthorized = errors.New("not authorized to access endpoint")
View Source
var ErrNotFound = errors.New("unable to find the item you are looking for")
View Source
var ErrTimeout = errors.New("the operation has timed out")

Functions

func IsNotAuthorized

func IsNotAuthorized(err error) bool

func IsNotFound

func IsNotFound(err error) bool

func IsTimeout

func IsTimeout(err error) bool

func MakeTag

func MakeTag(v string) string

Types

type AgentExecStatus

type AgentExecStatus struct {
	Exited       bool   `json:"exited"`
	ErrData      string `json:"err-data"`
	ErrTruncated bool   `json:"err-truncated"`
	ExitCode     int    `json:"exit-code"`
	OutData      string `json:"out-data"`
	OutTruncated string `json:"out-truncated"`
	Signal       bool   `json:"signal"`
}

type AgentNetworkIPAddress

type AgentNetworkIPAddress struct {
	IPAddressType string `json:"ip-address-type"` //ipv4 ipv6
	IPAddress     string `json:"ip-address"`
	Prefix        int    `json:"prefix"`
	MacAddress    string `json:"mac-address"`
}

type AgentNetworkIface

type AgentNetworkIface struct {
	Name            string                   `json:"name"`
	HardwareAddress string                   `json:"hardware-address"`
	IPAddresses     []*AgentNetworkIPAddress `json:"ip-addresses"`
}

type AgentOsInfo

type AgentOsInfo struct {
	Version       string `json:"version"`
	VersionID     string `json:"version-id"`
	ID            string `json:"id"`
	Machine       string `json:"machine"`
	PrettyName    string `json:"pretty-name"`
	Name          string `json:"name"`
	KernelRelease string `json:"kernel-release"`
	KernelVersion string `json:"kernel-version"`
}

type Appliance

type Appliance struct {
	Node         string `json:",omitempty"`
	Os           string
	Source       string
	Type         string
	SHA512Sum    string
	Package      string
	Template     string
	Architecture string
	InfoPage     string
	Description  string
	ManageURL    string
	Version      string
	Section      string
	Headline     string
	// contains filtered or unexported fields
}

type Appliances

type Appliances []*Appliance

type Backup

type Backup struct{ Content }

func (*Backup) Delete

func (b *Backup) Delete() (*Task, error)

type Backups

type Backups []*Backup

type CPUInfo

type CPUInfo struct {
	UserHz  int `json:"user_hz"`
	MHZ     string
	Mode    string
	Cores   int
	Sockets int
	Flags   string
	CPUs    int
	HVM     string
}

type Client

type Client struct {
	// contains filtered or unexported fields
}

func NewClient

func NewClient(baseURL string, opts ...Option) *Client

func (*Client) APIToken

func (c *Client) APIToken(tokenID, secret string)

func (*Client) Cluster

func (c *Client) Cluster() (*Cluster, error)

func (*Client) Delete

func (c *Client) Delete(p string, v interface{}) error

func (*Client) Get

func (c *Client) Get(p string, v interface{}) error

func (*Client) Login

func (c *Client) Login(username, password string) error

func (*Client) Node

func (c *Client) Node(name string) (*Node, error)

func (*Client) Nodes

func (c *Client) Nodes() (ns NodeStatuses, err error)

func (*Client) Post

func (c *Client) Post(p string, d interface{}, v interface{}) error

func (*Client) Put

func (c *Client) Put(p string, d interface{}, v interface{}) error

func (*Client) Req

func (c *Client) Req(method, path string, data []byte, v interface{}) error

func (*Client) Ticket

func (c *Client) Ticket(credentials *Credentials) (*Session, error)

func (*Client) Upload

func (c *Client) Upload(path string, fields map[string]string, file *os.File, v interface{}) error

Upload - There is some weird 16kb limit hardcoded in proxmox for the max POST size, hopefully in the future we make a func to scp the file to the node directly as this API endpoint is kind of janky. For now big ISOs/vztmpl should be put somewhere and a use DownloadUrl. code link for posterity, I think they meant to do 16mb and got the bit math wrong https://git.proxmox.com/?p=pve-manager.git;a=blob;f=PVE/HTTPServer.pm;h=8a0c308ea6d6601b886b0dec2bada3d4c3da65d0;hb=HEAD#l36 the task returned is the imgcopy from the tmp file to where the node actually wants the iso and you should wait for that to complete before using the iso

func (*Client) VNCWebSocket

func (c *Client) VNCWebSocket(path string, vnc *VNC) (chan string, chan string, chan error, func() error, error)

func (*Client) Version

func (c *Client) Version() (*Version, error)

type Cluster

type Cluster struct {
	Version int
	Quorate int
	Nodes   NodeStatuses
	Name    string
	ID      string
	// contains filtered or unexported fields
}

func (*Cluster) FWGroup

func (cl *Cluster) FWGroup(name string) (group *FirewallSecurityGroup, err error)

func (*Cluster) FWGroups

func (cl *Cluster) FWGroups() (groups []*FirewallSecurityGroup, err error)

func (*Cluster) NewFWGroup

func (cl *Cluster) NewFWGroup(group *FirewallSecurityGroup) error

func (*Cluster) NextID

func (cl *Cluster) NextID() (int, error)

func (*Cluster) Resources

func (cl *Cluster) Resources(filters ...string) (rs ClusterResources, err error)

Resources retrieves a summary list of all resources in the cluster. It calls /cluster/resources api v2 endpoint with an optional "type" parameter to filter searched values. It returns a list of ClusterResources.

func (*Cluster) UnmarshalJSON

func (cl *Cluster) UnmarshalJSON(b []byte) error

type ClusterResource

type ClusterResource struct {
	ID         string  `jsont:"id"`
	Type       string  `json:"type"`
	Content    string  `json:",omitempty"`
	CPU        float64 `json:",omitempty"`
	Disk       uint64  `json:",omitempty"` // documented as string but this is an int
	HAstate    string  `json:",omitempty"`
	Level      string  `json:",omitempty"`
	MaxCPU     uint64  `json:",omitempty"`
	MaxDisk    uint64  `json:",omitempty"`
	MaxMem     uint64  `json:",omitempty"`
	Mem        uint64  `json:",omitempty"` // documented as string but this is an int
	Name       string  `json:",omitempty"`
	Node       string  `json:",omitempty"`
	PluginType string  `json:",omitempty"`
	Pool       string  `json:",omitempty"`
	Status     string  `json:",omitempty"`
	Storage    string  `json:",omitempty"`
	Uptime     uint64  `json:",omitempty"`
}

type ClusterResources

type ClusterResources []*ClusterResource

type Container

type Container struct {
	Name string
	Node string

	CPUs    int
	Status  string
	VMID    StringOrUint64
	Uptime  uint64
	MaxMem  uint64
	MaxDisk uint64
	MaxSwap uint64
	// contains filtered or unexported fields
}

func (*Container) Reboot

func (c *Container) Reboot() (status *ContainerStatus, err error)

func (*Container) Resume

func (c *Container) Resume() (status *ContainerStatus, err error)

func (*Container) Start

func (c *Container) Start() (status string, err error)

func (*Container) Stop

func (c *Container) Stop() (status *ContainerStatus, err error)

func (*Container) Suspend

func (c *Container) Suspend() (status *ContainerStatus, err error)

func (*Container) TermProxy

func (c *Container) TermProxy() (vnc *VNC, err error)

func (*Container) VNCWebSocket

func (c *Container) VNCWebSocket(vnc *VNC) (chan string, chan string, chan error, func() error, error)

type ContainerStatus

type ContainerStatus struct {
	Data string `json:",omitempty"`
}

type ContainerStatuses

type ContainerStatuses []*ContainerStatus

type Containers

type Containers []*Container

type Content

type Content struct {
	URL     string
	Node    string
	Storage string `json:",omitempty"`
	Content string `json:",omitempty"`
	VolID   string `json:",omitempty"`
	CTime   uint64 `json:",omitempty"`
	Format  string
	Size    StringOrUint64
	Used    StringOrUint64 `json:",omitempty"`
	Path    string         `json:",omitempty"`
	Notes   string         `json:",omitempty"`
	// contains filtered or unexported fields
}

type Credentials

type Credentials struct {
	Username string `json:"username"`
	Password string `json:"password"`
	Otp      string `json:"otp,omitempty"`
	Path     string `json:"path,omitempty"`
	Privs    string `json:"privs,omitempty"`
	Realm    string `json:"realm,omitempty"`
}

type FirewallNodeOption

type FirewallNodeOption struct {
	Enable                           bool   `json:"enable,omitempty"`
	LogLevelIn                       string `json:"log_level_in,omitempty"`
	LogLevelOut                      string `json:"log_level_out,omitempty"`
	LogNfConntrack                   bool   `json:"log_nf_conntrack,omitempty"`
	Ntp                              bool   `json:"ntp,omitempty"`
	NFConntrackAllowInvalid          bool   `json:"nf_conntrack_allow_invalid,omitempty"`
	NFConntrackMax                   int    `json:"nf_conntrack_max,omitempty"`
	NFConntrackTCPTimeoutEstablished int    `json:"nf_conntrack_tcp_timeout_established,omitempty"`
	NFConntrackTCPTimeoutSynRecv     int    `json:"nf_conntrack_tcp_timeout_syn_recv,omitempty"`
	Nosmurfs                         bool   `json:"nosmurfs,omitempty"`
	ProtectionSynflood               bool   `json:"protection_synflood,omitempty"`
	ProtectionSynfloodBurst          int    `json:"protection_synflood_burst,omitempty"`
	ProtectionSynfloodRate           int    `json:"protection_synflood_rate,omitempty"`
	SmurfLogLevel                    string `json:"smurf_log_level,omitempty"`
	TCPFlagsLogLevel                 string `json:"tcp_flags_log_level,omitempty"`
	TCPflags                         bool   `json:"tcpflags,omitempty"`
}

type FirewallRule

type FirewallRule struct {
	Type     string `json:"type,omitempty"`
	Action   string `json:"action,omitempty"`
	Pos      int    `json:"pos,omitempty"`
	Comment  string `json:"comment,omitempty"`
	Dest     string `json:"dest,omitempty"`
	Dport    string `json:"dport,omitempty"`
	Enable   int    `json:"enable,omitempty"`
	IcmpType string `json:"icmp_type,omitempty"`
	Iface    string `json:"iface,omitempty"`
	Log      string `json:"log,omitempty"`
	Macro    string `json:"macro,omitempty"`
	Proto    string `json:"proto,omitempty"`
	Source   string `json:"source,omitempty"`
	Sport    string `json:"sport,omitempty"`
}

func (*FirewallRule) IsEnable

func (r *FirewallRule) IsEnable() bool

type FirewallSecurityGroup

type FirewallSecurityGroup struct {
	Group   string          `json:"group,omitempty"`
	Comment string          `json:"comment,omitempty"`
	Rules   []*FirewallRule `json:"rules,omitempty"`
	// contains filtered or unexported fields
}

func (*FirewallSecurityGroup) Delete

func (g *FirewallSecurityGroup) Delete() error

func (*FirewallSecurityGroup) GetRules

func (g *FirewallSecurityGroup) GetRules() ([]*FirewallRule, error)

func (*FirewallSecurityGroup) RuleCreate

func (g *FirewallSecurityGroup) RuleCreate(rule *FirewallRule) error

func (*FirewallSecurityGroup) RuleDelete

func (g *FirewallSecurityGroup) RuleDelete(rulePos int) error

func (*FirewallSecurityGroup) RuleUpdate

func (g *FirewallSecurityGroup) RuleUpdate(rule *FirewallRule) error

type FirewallVirtualMachineOption

type FirewallVirtualMachineOption struct {
	Enable      bool   `json:"enable,omitempty"`
	Dhcp        bool   `json:"dhcp,omitempty"`
	Ipfilter    bool   `json:"ipfilter,omitempty"`
	LogLevelIn  string `json:"log_level_in,omitempty"`
	LogLevelOut string `json:"log_level_out,omitempty"`
	Macfilter   bool   `json:"macfilter,omitempty"`
	Ntp         bool   `json:"ntp,omitempty"`
	PolicyIn    string `json:"policy_in,omitempty"`
	PolicyOut   string `json:"policy_out,omitempty"`
	Radv        bool   `json:"radv,omitempty"`
}

type HA

type HA struct {
	Managed int
}

type ISO

type ISO struct{ Content }

func (*ISO) Delete

func (i *ISO) Delete() (*Task, error)

type ISOs

type ISOs []*ISO

type IsTemplate

type IsTemplate bool

func (*IsTemplate) UnmarshalJSON

func (it *IsTemplate) UnmarshalJSON(b []byte) error

type Ksm

type Ksm struct {
	Shared int64
}

type LeveledLogger

type LeveledLogger struct {
	// Level is the minimum logging level that will be emitted by this logger.
	//
	// For example, a Level set to LevelWarn will emit warnings and errors, but
	// not informational or debug messages.
	//
	// Always set this with a constant like LevelWarn because the individual
	// values are not guaranteed to be stable.
	Level int
	// contains filtered or unexported fields
}

func (*LeveledLogger) Debugf

func (l *LeveledLogger) Debugf(format string, v ...interface{})

Debugf logs a debug message using Printf conventions.

func (*LeveledLogger) Errorf

func (l *LeveledLogger) Errorf(format string, v ...interface{})

Errorf logs a warning message using Printf conventions.

func (*LeveledLogger) Infof

func (l *LeveledLogger) Infof(format string, v ...interface{})

Infof logs an informational message using Printf conventions.

func (*LeveledLogger) Warnf

func (l *LeveledLogger) Warnf(format string, v ...interface{})

Warnf logs a warning message using Printf conventions.

type LeveledLoggerInterface

type LeveledLoggerInterface interface {
	Debugf(format string, v ...interface{})
	Errorf(format string, v ...interface{})
	Infof(format string, v ...interface{})
	Warnf(format string, v ...interface{})
}

type Log

type Log map[int]string

func (*Log) UnmarshalJSON

func (l *Log) UnmarshalJSON(b []byte) error

line numbers in the response start a 1 but the start param indexes from 0 so converting to that

type Memory

type Memory struct {
	Used  uint64
	Free  uint64
	Total uint64
}

type Node

type Node struct {
	Name string

	Kversion   string
	LoadAvg    []string
	CPU        float64
	RootFS     RootFS
	PVEVersion string
	CPUInfo    CPUInfo
	Swap       Memory
	Idle       int
	Memory     Memory
	Ksm        Ksm
	Uptime     uint64
	Wait       float64
	// contains filtered or unexported fields
}

func (*Node) Appliances

func (n *Node) Appliances() (appliances Appliances, err error)

func (*Node) Container

func (n *Node) Container(vmid int) (*Container, error)

func (*Node) Containers

func (n *Node) Containers() (c Containers, err error)

func (*Node) DownloadAppliance

func (n *Node) DownloadAppliance(template, storage string) (ret string, err error)

func (*Node) FirewallGetRules

func (n *Node) FirewallGetRules() (rules []*FirewallRule, err error)

func (*Node) FirewallOptionGet

func (n *Node) FirewallOptionGet() (firewallOption *FirewallNodeOption, err error)

func (*Node) FirewallOptionSet

func (n *Node) FirewallOptionSet(firewallOption *FirewallNodeOption) error

func (*Node) FirewallRulesCreate

func (n *Node) FirewallRulesCreate(rule *FirewallRule) error

func (*Node) FirewallRulesDelete

func (n *Node) FirewallRulesDelete(rulePos int) error

func (*Node) FirewallRulesUpdate

func (n *Node) FirewallRulesUpdate(rule *FirewallRule) error

func (*Node) Network

func (n *Node) Network(iface string) (network *NodeNetwork, err error)

func (*Node) NetworkReload

func (n *Node) NetworkReload() (*Task, error)

func (*Node) Networks

func (n *Node) Networks() (networks NodeNetworks, err error)

func (*Node) NewNetwork

func (n *Node) NewNetwork(network *NodeNetwork) (task *Task, err error)

func (*Node) NewVirtualMachine

func (n *Node) NewVirtualMachine(vmid int, options ...VirtualMachineOption) (*Task, error)

func (*Node) Storage

func (n *Node) Storage(name string) (storage *Storage, err error)

func (*Node) StorageBackup

func (n *Node) StorageBackup() (*Storage, error)

func (*Node) StorageISO

func (n *Node) StorageISO() (*Storage, error)

func (*Node) StorageImages

func (n *Node) StorageImages() (*Storage, error)

func (*Node) StorageRootDir

func (n *Node) StorageRootDir() (*Storage, error)

func (*Node) StorageVZTmpl

func (n *Node) StorageVZTmpl() (*Storage, error)

func (*Node) Storages

func (n *Node) Storages() (storages Storages, err error)

func (*Node) TermProxy

func (n *Node) TermProxy() (vnc *VNC, err error)

func (*Node) VNCWebSocket

func (n *Node) VNCWebSocket(vnc *VNC) (chan string, chan string, chan error, func() error, error)

VNCWebSocket send, recv, errors, closer, error

func (*Node) Version

func (n *Node) Version() (version *Version, err error)

func (*Node) VirtualMachine

func (n *Node) VirtualMachine(vmid int) (*VirtualMachine, error)

func (*Node) VirtualMachines

func (n *Node) VirtualMachines() (vms VirtualMachines, err error)

func (*Node) VzTmpl

func (n *Node) VzTmpl(template, storage string) (*VzTmpl, error)

func (*Node) VzTmpls

func (n *Node) VzTmpls(storage string) (templates VzTmpls, err error)

type NodeNetwork

type NodeNetwork struct {
	Node    string `json:"-"`
	NodeAPI *Node  `json:"-"`

	Iface    string `json:"iface,omitempty"`
	BondMode string `json:"bond_mode,omitempty"`

	Autostart int `json:"autostart,omitempty"`

	CIDR            string `json:"cidr,omitempty"`
	CIDR6           string `json:"cidr6,omitempty"`
	Gateway         string `json:"gateway,omitempty"`
	Gateway6        string `json:"gateway6,omitempty"`
	Netmask         string `json:"netmask,omitempty"`
	Netmask6        string `json:"netmask6,omitempty"`
	BridgeVlanAware bool   `json:"bridge_vlan_aware,omitempty"`
	BridgePorts     string `json:"bridge_ports,omitempty"`
	Comments        string `json:"comments,omitempty"`
	Comments6       string `json:"comments6,omitempty"`
	BridgeStp       string `json:"bridge_stp,omitempty"`
	BridgeFd        string `json:"bridge_fd,omitempty"`
	BondPrimary     string `json:"bond-primary,omitempty"`

	Address  string `json:"address,omitempty"`
	Address6 string `json:"address6,omitempty"`
	Type     string `json:"type,omitempty"`
	Active   int    `json:"active,omitempty"`
	Method   string `json:"method,omitempty"`
	Method6  string `json:"method6,omitempty"`
	Priority int    `json:"priority,omitempty"`
	// contains filtered or unexported fields
}

func (*NodeNetwork) Delete

func (nw *NodeNetwork) Delete() (task *Task, err error)

type NodeNetworks

type NodeNetworks []*NodeNetwork

type NodeStatus

type NodeStatus struct {
	// shared
	Status string `json:",omitempty"`
	Level  string `json:",omitempty"`
	ID     string `json:",omitempty"` // format "node/<name>"

	// from /nodes endpoint
	Node           string  `json:",omitempty"`
	MaxCPU         int     `json:",omitempty"`
	MaxMem         uint64  `json:",omitempty"`
	Disk           uint64  `json:",omitempty"`
	SSLFingerprint string  `json:"ssl_fingerprint,omitempty"`
	MaxDisk        uint64  `json:",omitempty"`
	Mem            uint64  `json:",omitempty"`
	CPU            float64 `json:",omitempty"`
	Uptime         uint64  `json:",omitempty"`

	// from /cluster endpoint
	NodeID int    `json:",omitempty"` // the internal id of the node
	Name   string `json:",omitempty"`
	IP     string `json:",omitempty"`
	Online int    `json:",omitempty"`
	Local  int    `json:",omitempty"`
}

type NodeStatuses

type NodeStatuses []*NodeStatus

type Option

type Option func(*Client)

func WithAPIToken

func WithAPIToken(tokenID, secret string) Option

func WithClient

func WithClient(client *http.Client) Option

func WithLogger

func WithLogger(logger LeveledLoggerInterface) Option

func WithLogins

func WithLogins(username, password string) Option

func WithSession

func WithSession(ticket, csrfPreventionToken string) Option

WithSession experimental

func WithUserAgent

func WithUserAgent(ua string) Option

type RootFS

type RootFS struct {
	Avail uint64
	Total uint64
	Free  uint64
	Used  uint64
}

type Session

type Session struct {
	Username            string `json:"username"`
	CsrfPreventionToken string `json:"CSRFPreventionToken,omitempty"`
	ClusterName         string `json:"clustername,omitempty"`
	Ticket              string `json:"ticket,omitempty"`
}

type Snapshot

type Snapshot struct {
	Name        string
	Vmstate     int
	Description string
	Snaptime    int64
	Parent      string
	Snapstate   string
}

type Storage

type Storage struct {
	Node         string
	Name         string `json:"storage"`
	Enabled      int
	UsedFraction float64 `json:"used_fraction"`
	Active       int
	Content      string
	Shared       int
	Avail        uint64
	Type         string
	Used         uint64
	Total        uint64
	Storage      string
	// contains filtered or unexported fields
}

func (*Storage) Backup

func (s *Storage) Backup(name string) (backup *Backup, err error)

func (*Storage) DownloadURL

func (s *Storage) DownloadURL(content, filename, url string) (*Task, error)

func (*Storage) ISO

func (s *Storage) ISO(name string) (iso *ISO, err error)

func (*Storage) Upload

func (s *Storage) Upload(content, file string) (*Task, error)

func (*Storage) VzTmpl

func (s *Storage) VzTmpl(name string) (vztmpl *VzTmpl, err error)

type Storages

type Storages []*Storage

type StringOrInt

type StringOrInt int

func (*StringOrInt) UnmarshalJSON

func (d *StringOrInt) UnmarshalJSON(b []byte) error

type StringOrUint64

type StringOrUint64 uint64

func (*StringOrUint64) UnmarshalJSON

func (d *StringOrUint64) UnmarshalJSON(b []byte) error

type Task

type Task struct {
	UPID         UPID
	ID           string
	Type         string
	User         string
	Status       string
	Node         string
	PID          uint64 `json:",omitempty"`
	PStart       uint64 `json:",omitempty"`
	Saved        string `json:",omitempty"`
	ExitStatus   string `json:",omitempty"`
	IsCompleted  bool
	IsRunning    bool
	IsFailed     bool
	IsSuccessful bool
	StartTime    time.Time     `json:"-"`
	EndTime      time.Time     `json:"-"`
	Duration     time.Duration `json:"-"`
	// contains filtered or unexported fields
}

func NewTask

func NewTask(upid UPID, client *Client) *Task

func (*Task) Log

func (t *Task) Log(start, limit int) (l Log, err error)

func (*Task) Ping

func (t *Task) Ping() error

func (*Task) Stop

func (t *Task) Stop() error

func (*Task) UnmarshalJSON

func (t *Task) UnmarshalJSON(b []byte) error

func (*Task) Wait

func (t *Task) Wait(interval, max time.Duration) error

func (*Task) WaitFor

func (t *Task) WaitFor(seconds int) error

func (*Task) WaitForCompleteStatus

func (t *Task) WaitForCompleteStatus(timesNum int, steps ...int) (status bool, completed bool, err error)

func (*Task) Watch

func (t *Task) Watch(start int) (chan string, error)

type Tasks

type Tasks []*Tasks

type Time

type Time struct {
	Timezone  string
	Time      uint64
	Localtime uint64
}

type UPID

type UPID string

type VNC

type VNC struct {
	Cert   string
	Port   StringOrInt
	Ticket string
	UPID   string
	User   string
}

type Version

type Version struct {
	Release string `json:"release"`
	RepoID  string `json:"repoid"`
	Version string `json:"version"`
}

type VirtualMachine

type VirtualMachine struct {
	VirtualMachineConfig *VirtualMachineConfig

	Name      string
	Node      string
	NetIn     uint64
	CPUs      int
	DiskWrite uint64
	Status    string
	Lock      string `json:",omitempty"`
	VMID      StringOrUint64
	PID       StringOrUint64
	Netout    uint64
	Disk      uint64
	Uptime    uint64
	Mem       uint64
	CPU       float64
	MaxMem    uint64
	MaxDisk   uint64
	DiskRead  uint64
	QMPStatus string     `json:"qmpstatus,omitempty"`
	Template  IsTemplate // empty str if a vm, int 1 if a template
	HA        HA         `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*VirtualMachine) AddTag

func (v *VirtualMachine) AddTag(value string) (*Task, error)

func (*VirtualMachine) AgentExec

func (v *VirtualMachine) AgentExec(command, inputData string) (pid int, err error)

func (*VirtualMachine) AgentExecStatus

func (v *VirtualMachine) AgentExecStatus(pid int) (status *AgentExecStatus, err error)

func (*VirtualMachine) AgentGetNetworkIFaces

func (v *VirtualMachine) AgentGetNetworkIFaces() (iFaces []*AgentNetworkIface, err error)

func (*VirtualMachine) AgentOsInfo

func (v *VirtualMachine) AgentOsInfo() (info *AgentOsInfo, err error)

func (*VirtualMachine) AgentSetUserPassword

func (v *VirtualMachine) AgentSetUserPassword(password string, username string) error

func (*VirtualMachine) Clone

func (v *VirtualMachine) Clone(params *VirtualMachineCloneOptions) (newid int, task *Task, err error)

func (*VirtualMachine) CloudInit

func (v *VirtualMachine) CloudInit(device, userdata, metadata, vendordata, networkconfig string) error

CloudInit takes four yaml docs as a string and make an ISO, upload it to the data store as <vmid>-user-data.iso and will mount it as a CDROM to be used with nocloud cloud-init. This is NOT how proxmox expects a user to do cloud-init which can be found here: https://pve.proxmox.com/wiki/Cloud-Init_Support#:~:text=and%20meta.-,Cloud%2DInit%20specific%20Options,-cicustom%3A%20%5Bmeta If you want to use the proxmox implementation you'll need to use the cloudinit APIs https://pve.proxmox.com/pve-docs/api-viewer/index.html#/nodes/{node}/qemu/{vmid}/cloudinit

func (*VirtualMachine) Config

func (v *VirtualMachine) Config(options ...VirtualMachineOption) (*Task, error)

func (*VirtualMachine) Delete

func (v *VirtualMachine) Delete() (task *Task, err error)

func (*VirtualMachine) FirewallGetRules

func (v *VirtualMachine) FirewallGetRules() (rules []*FirewallRule, err error)

func (*VirtualMachine) FirewallOptionGet

func (v *VirtualMachine) FirewallOptionGet() (firewallOption *FirewallVirtualMachineOption, err error)

func (*VirtualMachine) FirewallOptionSet

func (v *VirtualMachine) FirewallOptionSet(firewallOption *FirewallVirtualMachineOption) error

func (*VirtualMachine) FirewallRulesCreate

func (v *VirtualMachine) FirewallRulesCreate(rule *FirewallRule) error

func (*VirtualMachine) FirewallRulesDelete

func (v *VirtualMachine) FirewallRulesDelete(rulePos int) error

func (*VirtualMachine) FirewallRulesUpdate

func (v *VirtualMachine) FirewallRulesUpdate(rule *FirewallRule) error

func (*VirtualMachine) HasTag

func (v *VirtualMachine) HasTag(value string) bool

func (*VirtualMachine) Hibernate

func (v *VirtualMachine) Hibernate() (task *Task, err error)

func (*VirtualMachine) IsHibernated

func (v *VirtualMachine) IsHibernated() bool

func (*VirtualMachine) IsPaused

func (v *VirtualMachine) IsPaused() bool

func (*VirtualMachine) IsRunning

func (v *VirtualMachine) IsRunning() bool

func (*VirtualMachine) IsStopped

func (v *VirtualMachine) IsStopped() bool

func (*VirtualMachine) Migrate

func (v *VirtualMachine) Migrate(target, targetstorage string) (task *Task, err error)

func (*VirtualMachine) MoveDisk

func (v *VirtualMachine) MoveDisk(disk string, params *VirtualMachineMoveDiskOptions) (task *Task, err error)

func (*VirtualMachine) NewSnapshot

func (v *VirtualMachine) NewSnapshot(name string) (task *Task, err error)

func (*VirtualMachine) Pause

func (v *VirtualMachine) Pause() (task *Task, err error)

func (*VirtualMachine) Ping

func (v *VirtualMachine) Ping() error

func (*VirtualMachine) Reboot

func (v *VirtualMachine) Reboot() (task *Task, err error)

func (*VirtualMachine) RemoveTag

func (v *VirtualMachine) RemoveTag(value string) (*Task, error)

func (*VirtualMachine) Reset

func (v *VirtualMachine) Reset() (task *Task, err error)

func (*VirtualMachine) ResizeDisk

func (v *VirtualMachine) ResizeDisk(disk, size string) (err error)

func (*VirtualMachine) Resume

func (v *VirtualMachine) Resume() (task *Task, err error)

func (*VirtualMachine) Shutdown

func (v *VirtualMachine) Shutdown() (task *Task, err error)

func (*VirtualMachine) SnapshotRollback

func (v *VirtualMachine) SnapshotRollback(name string) (task *Task, err error)

func (*VirtualMachine) Snapshots

func (v *VirtualMachine) Snapshots() (snapshots []*Snapshot, err error)

func (*VirtualMachine) SplitTags

func (v *VirtualMachine) SplitTags()

func (*VirtualMachine) Start

func (v *VirtualMachine) Start() (*Task, error)

func (*VirtualMachine) Stop

func (v *VirtualMachine) Stop() (task *Task, err error)

func (*VirtualMachine) TermProxy

func (v *VirtualMachine) TermProxy() (vnc *VNC, err error)

func (*VirtualMachine) UnlinkDisk

func (v *VirtualMachine) UnlinkDisk(diskID string, force bool) (task *Task, err error)

func (*VirtualMachine) VNCWebSocket

func (v *VirtualMachine) VNCWebSocket(vnc *VNC) (chan string, chan string, chan error, func() error, error)

VNCWebSocket copy/paste when calling to get the channel names right send, recv, errors, closer, errors := vm.VNCWebSocket(vnc) for this to work you need to first setup a serial terminal on your vm https://pve.proxmox.com/wiki/Serial_Terminal

func (*VirtualMachine) WaitForAgent

func (v *VirtualMachine) WaitForAgent(seconds int) error

func (*VirtualMachine) WaitForAgentExecExit

func (v *VirtualMachine) WaitForAgentExecExit(pid, seconds int) (*AgentExecStatus, error)

type VirtualMachineCloneOptions

type VirtualMachineCloneOptions struct {
	NewID       int    `json:"newid"`
	BWLimit     uint64 `json:"bwlimit,omitempty"`
	Description string `json:"description,omitempty"`
	Format      string `json:"format,omitempty"`
	Full        uint8  `json:"full,omitempty"`
	Name        string `json:"name,omitempty"`
	Pool        string `json:"pool,omitempty"`
	SnapName    string `json:"snapname,omitempty"`
	Storage     string `json:"storage,omitempty"`
	Target      string `json:"target,omitempty"`
}

type VirtualMachineConfig

type VirtualMachineConfig struct {
	// PVE Metadata
	Digest      string `json:"digest"`
	Name        string `json:"name,omitempty"`
	Description string `json:"description,omitempty"`
	Meta        string `json:"meta,omitempty"`
	VMGenID     string `json:"vmgenid,omitempty"`
	Hookscript  string `json:"hookscript,omitempty"`
	Hotplug     string `json:"hotplug,omitempty"`
	Template    int    `json:"template,omitempty"`

	Tags      string   `json:"tags,omitempty"`
	TagsSlice []string `json:"-"` // internal helper to manage tags easier

	Protection int    `json:"protection,omitempty"`
	Lock       string `json:"lock,omitempty"`

	// Boot configuration
	Boot   string `json:"boot,omitempty"`
	OnBoot int    `json:"onboot,omitempty"`

	// Qemu general specs
	OSType  string `json:"ostype,omitempty"`
	Machine string `json:"machine,omitempty"`
	Args    string `json:"args,omitempty"`

	// Qemu firmware specs
	Bios     string `json:"bios,omitempty"`
	EFIDisk0 string `json:"efidisk0,omitempty"`
	SMBios1  string `json:"smbios1,omitempty"`
	Acpi     int    `json:"acpi,omitempty"`

	// Qemu CPU specs
	Sockets  int    `json:"sockets,omitempty"`
	Cores    int    `json:"cores,omitempty"`
	CPU      string `json:"cpu,omitempty"`
	CPULimit int    `json:"cpulimit,omitempty"`
	CPUUnits int    `json:"cpuunits,omitempty"`
	Vcpus    int    `json:"vcpus,omitempty"`
	Affinity string `json:"affinity,omitempty"`

	// Qemu memory specs
	Numa      int    `json:"numa,omitempty"`
	Memory    int    `json:"memory,omitempty"`
	Hugepages string `json:"hugepages,omitempty"`
	Balloon   int    `json:"balloon,omitempty"`

	// Other Qemu devices
	VGA       string `json:"vga,omitempty"`
	SCSIHW    string `json:"scsihw,omitempty"`
	TPMState0 string `json:"tpmstate0,omitempty"`
	Rng0      string `json:"rng0,omitempty"`
	Audio0    string `json:"audio0,omitempty"`

	// Disk devices
	IDEs map[string]string `json:"-"`
	IDE0 string            `json:"ide0,omitempty"`
	IDE1 string            `json:"ide1,omitempty"`
	IDE2 string            `json:"ide2,omitempty"`
	IDE3 string            `json:"ide3,omitempty"`

	SCSIs  map[string]string `json:"-"`
	SCSI0  string            `json:"scsi0,omitempty"`
	SCSI1  string            `json:"scsi1,omitempty"`
	SCSI2  string            `json:"scsi2,omitempty"`
	SCSI3  string            `json:"scsi3,omitempty"`
	SCSI4  string            `json:"scsi4,omitempty"`
	SCSI5  string            `json:"scsi5,omitempty"`
	SCSI6  string            `json:"scsi6,omitempty"`
	SCSI7  string            `json:"scsi7,omitempty"`
	SCSI8  string            `json:"scsi8,omitempty"`
	SCSI9  string            `json:"scsi9,omitempty"`
	SCSI10 string            `json:"scsi10,omitempty"`
	SCSI11 string            `json:"scsi11,omitempty"`
	SCSI12 string            `json:"scsi12,omitempty"`
	SCSI13 string            `json:"scsi13,omitempty"`
	SCSI14 string            `json:"scsi14,omitempty"`
	SCSI15 string            `json:"scsi15,omitempty"`
	SCSI16 string            `json:"scsi16,omitempty"`
	SCSI17 string            `json:"scsi17,omitempty"`
	SCSI18 string            `json:"scsi18,omitempty"`
	SCSI19 string            `json:"scsi19,omitempty"`
	SCSI20 string            `json:"scsi20,omitempty"`
	SCSI21 string            `json:"scsi21,omitempty"`
	SCSI22 string            `json:"scsi22,omitempty"`
	SCSI23 string            `json:"scsi23,omitempty"`
	SCSI24 string            `json:"scsi24,omitempty"`
	SCSI25 string            `json:"scsi25,omitempty"`
	SCSI26 string            `json:"scsi26,omitempty"`
	SCSI27 string            `json:"scsi27,omitempty"`
	SCSI28 string            `json:"scsi28,omitempty"`
	SCSI29 string            `json:"scsi29,omitempty"`
	SCSI30 string            `json:"scsi30,omitempty"`

	SATAs map[string]string `json:"-"`
	SATA0 string            `json:"sata0,omitempty"`
	SATA1 string            `json:"sata1,omitempty"`
	SATA2 string            `json:"sata2,omitempty"`
	SATA3 string            `json:"sata3,omitempty"`
	SATA4 string            `json:"sata4,omitempty"`
	SATA5 string            `json:"sata5,omitempty"`

	VirtIOs  map[string]string `json:"-"`
	VirtIO0  string            `json:"virtio0,omitempty"`
	VirtIO1  string            `json:"virtio1,omitempty"`
	VirtIO2  string            `json:"virtio2,omitempty"`
	VirtIO3  string            `json:"virtio3,omitempty"`
	VirtIO4  string            `json:"virtio4,omitempty"`
	VirtIO5  string            `json:"virtio5,omitempty"`
	VirtIO6  string            `json:"virtio6,omitempty"`
	VirtIO7  string            `json:"virtio7,omitempty"`
	VirtIO8  string            `json:"virtio8,omitempty"`
	VirtIO9  string            `json:"virtio9,omitempty"`
	VirtIO10 string            `json:"virtio10,omitempty"`
	VirtIO11 string            `json:"virtio11,omitempty"`
	VirtIO12 string            `json:"virtio12,omitempty"`
	VirtIO13 string            `json:"virtio13,omitempty"`
	VirtIO14 string            `json:"virtio14,omitempty"`
	VirtIO15 string            `json:"virtio15,omitempty"`

	Unuseds map[string]string `json:"-"`
	Unused0 string            `json:"unused0,omitempty"`
	Unused1 string            `json:"unused1,omitempty"`
	Unused2 string            `json:"unused2,omitempty"`
	Unused3 string            `json:"unused3,omitempty"`
	Unused4 string            `json:"unused4,omitempty"`
	Unused5 string            `json:"unused5,omitempty"`
	Unused6 string            `json:"unused6,omitempty"`
	Unused7 string            `json:"unused7,omitempty"`
	Unused8 string            `json:"unused8,omitempty"`
	Unused9 string            `json:"unused9,omitempty"`

	// Network devices
	Nets map[string]string `json:"-"`
	Net0 string            `json:"net0,omitempty"`
	Net1 string            `json:"net1,omitempty"`
	Net2 string            `json:"net2,omitempty"`
	Net3 string            `json:"net3,omitempty"`
	Net4 string            `json:"net4,omitempty"`
	Net5 string            `json:"net5,omitempty"`
	Net6 string            `json:"net6,omitempty"`
	Net7 string            `json:"net7,omitempty"`
	Net8 string            `json:"net8,omitempty"`
	Net9 string            `json:"net9,omitempty"`

	// NUMA topology
	Numas map[string]string `json:"-"`
	Numa0 string            `json:"numa0,omitempty"`
	Numa1 string            `json:"numa1,omitempty"`
	Numa2 string            `json:"numa2,omitempty"`
	Numa3 string            `json:"numa3,omitempty"`
	Numa4 string            `json:"numa4,omitempty"`
	Numa5 string            `json:"numa5,omitempty"`
	Numa6 string            `json:"numa6,omitempty"`
	Numa7 string            `json:"numa7,omitempty"`
	Numa8 string            `json:"numa8,omitempty"`
	Numa9 string            `json:"numa9,omitempty"`

	// Host PCI devices
	HostPCIs map[string]string `json:"-"`
	HostPCI0 string            `json:"hostpci0,omitempty"`
	HostPCI1 string            `json:"hostpci1,omitempty"`
	HostPCI2 string            `json:"hostpci2,omitempty"`
	HostPCI3 string            `json:"hostpci3,omitempty"`
	HostPCI4 string            `json:"hostpci4,omitempty"`
	HostPCI5 string            `json:"hostpci5,omitempty"`
	HostPCI6 string            `json:"hostpci6,omitempty"`
	HostPCI7 string            `json:"hostpci7,omitempty"`
	HostPCI8 string            `json:"hostpci8,omitempty"`
	HostPCI9 string            `json:"hostpci9,omitempty"`

	// Serial devices
	Serials map[string]string `json:"-"`
	Serial0 string            `json:"serial0,omitempty"`
	Serial1 string            `json:"serial1,omitempty"`
	Serial2 string            `json:"serial2,omitempty"`
	Serial3 string            `json:"serial3,omitempty"`

	// USB devices
	USBs  map[string]string `json:"-"`
	USB0  string            `json:"usb0,omitempty"`
	USB1  string            `json:"usb1,omitempty"`
	USB2  string            `json:"usb2,omitempty"`
	USB3  string            `json:"usb3,omitempty"`
	USB4  string            `json:"usb4,omitempty"`
	USB5  string            `json:"usb5,omitempty"`
	USB6  string            `json:"usb6,omitempty"`
	USB7  string            `json:"usb7,omitempty"`
	USB8  string            `json:"usb8,omitempty"`
	USB9  string            `json:"usb9,omitempty"`
	USB10 string            `json:"usb10,omitempty"`
	USB11 string            `json:"usb11,omitempty"`
	USB12 string            `json:"usb12,omitempty"`
	USB13 string            `json:"usb13,omitempty"`
	USB14 string            `json:"usb14,omitempty"`

	// Parallel devices
	Parallels map[string]string `json:"-"`
	Parallel0 string            `json:"parallel0,omitempty"`
	Parallel1 string            `json:"parallel1,omitempty"`
	Parallel2 string            `json:"parallel2,omitempty"`

	// Cloud-init
	CIType       string `json:"citype,omitempty"`
	CIUser       string `json:"ciuser,omitempty"`
	CIPassword   string `json:"cipassword,omitempty"`
	Nameserver   string `json:"nameserver,omitempty"`
	Searchdomain string `json:"searchdomain,omitempty"`
	SSHKeys      string `json:"sshkeys,omitempty"`
	CICustom     string `json:"cicustom,omitempty"`

	// Cloud-init interfaces
	IPConfigs map[string]string `json:"-"`
	IPConfig0 string            `json:"ipconfig0,omitempty"`
	IPConfig1 string            `json:"ipconfig1,omitempty"`
	IPConfig2 string            `json:"ipconfig2,omitempty"`
	IPConfig3 string            `json:"ipconfig3,omitempty"`
	IPConfig4 string            `json:"ipconfig4,omitempty"`
	IPConfig5 string            `json:"ipconfig5,omitempty"`
	IPConfig6 string            `json:"ipconfig6,omitempty"`
	IPConfig7 string            `json:"ipconfig7,omitempty"`
	IPConfig8 string            `json:"ipconfig8,omitempty"`
	IPConfig9 string            `json:"ipconfig9,omitempty"`
}

func (*VirtualMachineConfig) MergeHostPCIs

func (vmc *VirtualMachineConfig) MergeHostPCIs() map[string]string

func (*VirtualMachineConfig) MergeIDEs

func (vmc *VirtualMachineConfig) MergeIDEs() map[string]string

func (*VirtualMachineConfig) MergeIPConfigs

func (vmc *VirtualMachineConfig) MergeIPConfigs() map[string]string

func (*VirtualMachineConfig) MergeNets

func (vmc *VirtualMachineConfig) MergeNets() map[string]string

func (*VirtualMachineConfig) MergeNumas

func (vmc *VirtualMachineConfig) MergeNumas() map[string]string

func (*VirtualMachineConfig) MergeParallels

func (vmc *VirtualMachineConfig) MergeParallels() map[string]string

func (*VirtualMachineConfig) MergeSATAs

func (vmc *VirtualMachineConfig) MergeSATAs() map[string]string

func (*VirtualMachineConfig) MergeSCSIs

func (vmc *VirtualMachineConfig) MergeSCSIs() map[string]string

func (*VirtualMachineConfig) MergeSerials

func (vmc *VirtualMachineConfig) MergeSerials() map[string]string

func (*VirtualMachineConfig) MergeUSBs

func (vmc *VirtualMachineConfig) MergeUSBs() map[string]string

func (*VirtualMachineConfig) MergeUnuseds

func (vmc *VirtualMachineConfig) MergeUnuseds() map[string]string

func (*VirtualMachineConfig) MergeVirtIOs

func (vmc *VirtualMachineConfig) MergeVirtIOs() map[string]string

type VirtualMachineMoveDiskOptions

type VirtualMachineMoveDiskOptions struct {
	Disk         string `json:"disk"`
	BWLimit      uint64 `json:"bwlimit,omitempty"`
	Delete       uint8  `json:"delete,omitempty"`
	Digest       string `json:"digest,omitempty"`
	Format       string `json:"format,omitempty"`
	Storage      string `json:"storage,omitempty"`
	TargetDigest string `json:"target-digest,omitempty"`
	TargetDisk   string `json:"target-disk,omitempty"`
	TargetVMID   int    `json:"target-vmid,omitempty"`
}

type VirtualMachineOption

type VirtualMachineOption struct {
	Name  string
	Value interface{}
}

type VirtualMachineOptions

type VirtualMachineOptions []*VirtualMachineOption

type VirtualMachines

type VirtualMachines []*VirtualMachine

type Volume

type Volume interface {
	Delete() error
}

type VzTmpl

type VzTmpl struct{ Content }

func (*VzTmpl) Delete

func (v *VzTmpl) Delete() (*Task, error)

type VzTmpls

type VzTmpls []*VzTmpl

Directories

Path Synopsis
mage
tests

Jump to

Keyboard shortcuts

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