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