Blame vendor/github.com/vmware/govmomi/nfc/lease.go

Packit 63bb0d
/*
Packit 63bb0d
Copyright (c) 2015-2017 VMware, Inc. All Rights Reserved.
Packit 63bb0d
Packit 63bb0d
Licensed under the Apache License, Version 2.0 (the "License");
Packit 63bb0d
you may not use this file except in compliance with the License.
Packit 63bb0d
You may obtain a copy of the License at
Packit 63bb0d
Packit 63bb0d
    http://www.apache.org/licenses/LICENSE-2.0
Packit 63bb0d
Packit 63bb0d
Unless required by applicable law or agreed to in writing, software
Packit 63bb0d
distributed under the License is distributed on an "AS IS" BASIS,
Packit 63bb0d
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 63bb0d
See the License for the specific language governing permissions and
Packit 63bb0d
limitations under the License.
Packit 63bb0d
*/
Packit 63bb0d
Packit 63bb0d
package nfc
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"context"
Packit 63bb0d
	"errors"
Packit 63bb0d
	"fmt"
Packit 63bb0d
	"io"
Packit 63bb0d
	"path"
Packit 63bb0d
Packit 63bb0d
	"github.com/vmware/govmomi/property"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25/methods"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25/mo"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25/soap"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25/types"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type Lease struct {
Packit 63bb0d
	types.ManagedObjectReference
Packit 63bb0d
Packit 63bb0d
	c *vim25.Client
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func NewLease(c *vim25.Client, ref types.ManagedObjectReference) *Lease {
Packit 63bb0d
	return &Lease{ref, c}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Abort wraps methods.Abort
Packit 63bb0d
func (l *Lease) Abort(ctx context.Context, fault *types.LocalizedMethodFault) error {
Packit 63bb0d
	req := types.HttpNfcLeaseAbort{
Packit 63bb0d
		This:  l.Reference(),
Packit 63bb0d
		Fault: fault,
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	_, err := methods.HttpNfcLeaseAbort(ctx, l.c, &req)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Complete wraps methods.Complete
Packit 63bb0d
func (l *Lease) Complete(ctx context.Context) error {
Packit 63bb0d
	req := types.HttpNfcLeaseComplete{
Packit 63bb0d
		This: l.Reference(),
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	_, err := methods.HttpNfcLeaseComplete(ctx, l.c, &req)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetManifest wraps methods.GetManifest
Packit 63bb0d
func (l *Lease) GetManifest(ctx context.Context) error {
Packit 63bb0d
	req := types.HttpNfcLeaseGetManifest{
Packit 63bb0d
		This: l.Reference(),
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	_, err := methods.HttpNfcLeaseGetManifest(ctx, l.c, &req)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Progress wraps methods.Progress
Packit 63bb0d
func (l *Lease) Progress(ctx context.Context, percent int32) error {
Packit 63bb0d
	req := types.HttpNfcLeaseProgress{
Packit 63bb0d
		This:    l.Reference(),
Packit 63bb0d
		Percent: percent,
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	_, err := methods.HttpNfcLeaseProgress(ctx, l.c, &req)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type LeaseInfo struct {
Packit 63bb0d
	types.HttpNfcLeaseInfo
Packit 63bb0d
Packit 63bb0d
	Items []FileItem
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (l *Lease) newLeaseInfo(li *types.HttpNfcLeaseInfo, items []types.OvfFileItem) (*LeaseInfo, error) {
Packit 63bb0d
	info := &LeaseInfo{
Packit 63bb0d
		HttpNfcLeaseInfo: *li,
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	for _, device := range li.DeviceUrl {
Packit 63bb0d
		u, err := l.c.ParseURL(device.Url)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			return nil, err
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		if device.SslThumbprint != "" {
Packit 63bb0d
			// TODO: prefer host management IP
Packit 63bb0d
			l.c.SetThumbprint(u.Host, device.SslThumbprint)
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		if len(items) == 0 {
Packit 63bb0d
			// this is an export
Packit 63bb0d
			item := types.OvfFileItem{
Packit 63bb0d
				DeviceId: device.Key,
Packit 63bb0d
				Path:     device.TargetId,
Packit 63bb0d
				Size:     device.FileSize,
Packit 63bb0d
			}
Packit 63bb0d
Packit 63bb0d
			if item.Size == 0 {
Packit 63bb0d
				item.Size = li.TotalDiskCapacityInKB * 1024
Packit 63bb0d
			}
Packit 63bb0d
Packit 63bb0d
			if item.Path == "" {
Packit 63bb0d
				item.Path = path.Base(device.Url)
Packit 63bb0d
			}
Packit 63bb0d
Packit 63bb0d
			info.Items = append(info.Items, NewFileItem(u, item))
Packit 63bb0d
Packit 63bb0d
			continue
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		// this is an import
Packit 63bb0d
		for _, item := range items {
Packit 63bb0d
			if device.ImportKey == item.DeviceId {
Packit 63bb0d
				info.Items = append(info.Items, NewFileItem(u, item))
Packit 63bb0d
				break
Packit 63bb0d
			}
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return info, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (l *Lease) Wait(ctx context.Context, items []types.OvfFileItem) (*LeaseInfo, error) {
Packit 63bb0d
	var lease mo.HttpNfcLease
Packit 63bb0d
Packit 63bb0d
	pc := property.DefaultCollector(l.c)
Packit 63bb0d
	err := property.Wait(ctx, pc, l.Reference(), []string{"state", "info", "error"}, func(pc []types.PropertyChange) bool {
Packit 63bb0d
		done := false
Packit 63bb0d
Packit 63bb0d
		for _, c := range pc {
Packit 63bb0d
			if c.Val == nil {
Packit 63bb0d
				continue
Packit 63bb0d
			}
Packit 63bb0d
Packit 63bb0d
			switch c.Name {
Packit 63bb0d
			case "error":
Packit 63bb0d
				val := c.Val.(types.LocalizedMethodFault)
Packit 63bb0d
				lease.Error = &val
Packit 63bb0d
				done = true
Packit 63bb0d
			case "info":
Packit 63bb0d
				val := c.Val.(types.HttpNfcLeaseInfo)
Packit 63bb0d
				lease.Info = &val
Packit 63bb0d
			case "state":
Packit 63bb0d
				lease.State = c.Val.(types.HttpNfcLeaseState)
Packit 63bb0d
				if lease.State != types.HttpNfcLeaseStateInitializing {
Packit 63bb0d
					done = true
Packit 63bb0d
				}
Packit 63bb0d
			}
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		return done
Packit 63bb0d
	})
Packit 63bb0d
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return nil, err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	if lease.State == types.HttpNfcLeaseStateReady {
Packit 63bb0d
		return l.newLeaseInfo(lease.Info, items)
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	if lease.Error != nil {
Packit 63bb0d
		return nil, errors.New(lease.Error.LocalizedMessage)
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return nil, fmt.Errorf("unexpected nfc lease state: %s", lease.State)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (l *Lease) StartUpdater(ctx context.Context, info *LeaseInfo) *LeaseUpdater {
Packit 63bb0d
	return newLeaseUpdater(ctx, l, info)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (l *Lease) Upload(ctx context.Context, item FileItem, f io.Reader, opts soap.Upload) error {
Packit 63bb0d
	if opts.Progress == nil {
Packit 63bb0d
		opts.Progress = item
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	// Non-disk files (such as .iso) use the PUT method.
Packit 63bb0d
	// Overwrite: t header is also required in this case (ovftool does the same)
Packit 63bb0d
	if item.Create {
Packit 63bb0d
		opts.Method = "PUT"
Packit 63bb0d
		opts.Headers = map[string]string{
Packit 63bb0d
			"Overwrite": "t",
Packit 63bb0d
		}
Packit 63bb0d
	} else {
Packit 63bb0d
		opts.Method = "POST"
Packit 63bb0d
		opts.Type = "application/x-vnd.vmware-streamVmdk"
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return l.c.Upload(ctx, f, item.URL, &opts)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (l *Lease) DownloadFile(ctx context.Context, file string, item FileItem, opts soap.Download) error {
Packit 63bb0d
	if opts.Progress == nil {
Packit 63bb0d
		opts.Progress = item
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return l.c.DownloadFile(ctx, file, item.URL, &opts)
Packit 63bb0d
}