Blame vendor/github.com/vmware/govmomi/govc/flags/datastore.go

Packit 63bb0d
/*
Packit 63bb0d
Copyright (c) 2014-2016 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 flags
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"context"
Packit 63bb0d
	"flag"
Packit 63bb0d
	"fmt"
Packit 63bb0d
	"os"
Packit 63bb0d
Packit 63bb0d
	"github.com/vmware/govmomi/object"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25/types"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type DatastoreFlag struct {
Packit 63bb0d
	common
Packit 63bb0d
Packit 63bb0d
	*DatacenterFlag
Packit 63bb0d
Packit 63bb0d
	Name string
Packit 63bb0d
Packit 63bb0d
	ds *object.Datastore
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
var datastoreFlagKey = flagKey("datastore")
Packit 63bb0d
Packit 63bb0d
// NewCustomDatastoreFlag creates and returns a new DatastoreFlag without
Packit 63bb0d
// trying to retrieve an existing one from the specified context.
Packit 63bb0d
func NewCustomDatastoreFlag(ctx context.Context) (*DatastoreFlag, context.Context) {
Packit 63bb0d
	v := &DatastoreFlag{}
Packit 63bb0d
	v.DatacenterFlag, ctx = NewDatacenterFlag(ctx)
Packit 63bb0d
	return v, ctx
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func NewDatastoreFlag(ctx context.Context) (*DatastoreFlag, context.Context) {
Packit 63bb0d
	if v := ctx.Value(datastoreFlagKey); v != nil {
Packit 63bb0d
		return v.(*DatastoreFlag), ctx
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	v, ctx := NewCustomDatastoreFlag(ctx)
Packit 63bb0d
	ctx = context.WithValue(ctx, datastoreFlagKey, v)
Packit 63bb0d
	return v, ctx
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (f *DatastoreFlag) Register(ctx context.Context, fs *flag.FlagSet) {
Packit 63bb0d
	f.RegisterOnce(func() {
Packit 63bb0d
		f.DatacenterFlag.Register(ctx, fs)
Packit 63bb0d
Packit 63bb0d
		env := "GOVC_DATASTORE"
Packit 63bb0d
		value := os.Getenv(env)
Packit 63bb0d
		usage := fmt.Sprintf("Datastore [%s]", env)
Packit 63bb0d
		fs.StringVar(&f.Name, "ds", value, usage)
Packit 63bb0d
	})
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (f *DatastoreFlag) Process(ctx context.Context) error {
Packit 63bb0d
	return f.ProcessOnce(func() error {
Packit 63bb0d
		if err := f.DatacenterFlag.Process(ctx); err != nil {
Packit 63bb0d
			return err
Packit 63bb0d
		}
Packit 63bb0d
		return nil
Packit 63bb0d
	})
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (f *DatastoreFlag) Args(args []string) []object.DatastorePath {
Packit 63bb0d
	var files []object.DatastorePath
Packit 63bb0d
Packit 63bb0d
	for _, arg := range args {
Packit 63bb0d
		var p object.DatastorePath
Packit 63bb0d
Packit 63bb0d
		if p.FromString(arg) {
Packit 63bb0d
			f.Name = p.Datastore
Packit 63bb0d
		} else {
Packit 63bb0d
			p.Datastore = f.Name
Packit 63bb0d
			p.Path = arg
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		files = append(files, p)
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return files
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (f *DatastoreFlag) Datastore() (*object.Datastore, error) {
Packit 63bb0d
	if f.ds != nil {
Packit 63bb0d
		return f.ds, nil
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	var p object.DatastorePath
Packit 63bb0d
	if p.FromString(f.Name) {
Packit 63bb0d
		// Example use case:
Packit 63bb0d
		//   -ds "$(govc object.collect -s vm/foo config.files.logDirectory)"
Packit 63bb0d
		f.Name = p.Datastore
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	finder, err := f.Finder()
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return nil, err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	if f.ds, err = finder.DatastoreOrDefault(context.TODO(), f.Name); err != nil {
Packit 63bb0d
		return nil, err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return f.ds, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (flag *DatastoreFlag) DatastoreIfSpecified() (*object.Datastore, error) {
Packit 63bb0d
	if flag.Name == "" {
Packit 63bb0d
		return nil, nil
Packit 63bb0d
	}
Packit 63bb0d
	return flag.Datastore()
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (f *DatastoreFlag) DatastorePath(name string) (string, error) {
Packit 63bb0d
	ds, err := f.Datastore()
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return "", err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return ds.Path(name), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (f *DatastoreFlag) Stat(ctx context.Context, file string) (types.BaseFileInfo, error) {
Packit 63bb0d
	ds, err := f.Datastore()
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return nil, err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return ds.Stat(ctx, file)
Packit 63bb0d
Packit 63bb0d
}