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

Packit 63bb0d
/*
Packit 63bb0d
Copyright (c) 2014-2015 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 datastore
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"context"
Packit 63bb0d
	"errors"
Packit 63bb0d
	"flag"
Packit 63bb0d
	"fmt"
Packit 63bb0d
Packit 63bb0d
	"github.com/vmware/govmomi/govc/cli"
Packit 63bb0d
	"github.com/vmware/govmomi/govc/flags"
Packit 63bb0d
	"github.com/vmware/govmomi/object"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25/soap"
Packit 63bb0d
	"github.com/vmware/govmomi/vim25/types"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type mkdir struct {
Packit 63bb0d
	*flags.DatastoreFlag
Packit 63bb0d
Packit 63bb0d
	createParents bool
Packit 63bb0d
	isNamespace   bool
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func init() {
Packit 63bb0d
	cli.Register("datastore.mkdir", &mkdir{})
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (cmd *mkdir) Register(ctx context.Context, f *flag.FlagSet) {
Packit 63bb0d
	cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx)
Packit 63bb0d
	cmd.DatastoreFlag.Register(ctx, f)
Packit 63bb0d
Packit 63bb0d
	f.BoolVar(&cmd.createParents, "p", false, "Create intermediate directories as needed")
Packit 63bb0d
	f.BoolVar(&cmd.isNamespace, "namespace", false, "Return uuid of namespace created on vsan datastore")
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (cmd *mkdir) Process(ctx context.Context) error {
Packit 63bb0d
	if err := cmd.DatastoreFlag.Process(ctx); err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (cmd *mkdir) Usage() string {
Packit 63bb0d
	return "DIRECTORY"
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (cmd *mkdir) Run(ctx context.Context, f *flag.FlagSet) error {
Packit 63bb0d
	args := f.Args()
Packit 63bb0d
	if len(args) == 0 {
Packit 63bb0d
		return errors.New("missing operand")
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	c, err := cmd.Client()
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	if cmd.isNamespace {
Packit 63bb0d
		var uuid string
Packit 63bb0d
		var ds *object.Datastore
Packit 63bb0d
Packit 63bb0d
		if ds, err = cmd.Datastore(); err != nil {
Packit 63bb0d
			return err
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		path := args[0]
Packit 63bb0d
Packit 63bb0d
		nm := object.NewDatastoreNamespaceManager(c)
Packit 63bb0d
		if uuid, err = nm.CreateDirectory(ctx, ds, path, ""); err != nil {
Packit 63bb0d
			return err
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		fmt.Println(uuid)
Packit 63bb0d
	} else {
Packit 63bb0d
		var dc *object.Datacenter
Packit 63bb0d
		var path string
Packit 63bb0d
Packit 63bb0d
		dc, err = cmd.Datacenter()
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			return err
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		path, err = cmd.DatastorePath(args[0])
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			return err
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		m := object.NewFileManager(c)
Packit 63bb0d
		err = m.MakeDirectory(ctx, path, dc, cmd.createParents)
Packit 63bb0d
Packit 63bb0d
		// ignore EEXIST if -p flag is given
Packit 63bb0d
		if err != nil && cmd.createParents {
Packit 63bb0d
			if soap.IsSoapFault(err) {
Packit 63bb0d
				soapFault := soap.ToSoapFault(err)
Packit 63bb0d
				if _, ok := soapFault.VimFault().(types.FileAlreadyExists); ok {
Packit 63bb0d
					return nil
Packit 63bb0d
				}
Packit 63bb0d
			}
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return err
Packit 63bb0d
}