1/*
2Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package datastore
18
19import (
20	"context"
21	"flag"
22
23	"github.com/vmware/govmomi/govc/cli"
24	"github.com/vmware/govmomi/govc/flags"
25	"github.com/vmware/govmomi/object"
26	"github.com/vmware/govmomi/vim25/types"
27)
28
29type rm struct {
30	*flags.DatastoreFlag
31
32	kind        bool
33	force       bool
34	isNamespace bool
35}
36
37func init() {
38	cli.Register("datastore.rm", &rm{})
39	cli.Alias("datastore.rm", "datastore.delete")
40}
41
42func (cmd *rm) Register(ctx context.Context, f *flag.FlagSet) {
43	cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx)
44	cmd.DatastoreFlag.Register(ctx, f)
45
46	f.BoolVar(&cmd.kind, "t", true, "Use file type to choose disk or file manager")
47	f.BoolVar(&cmd.force, "f", false, "Force; ignore nonexistent files and arguments")
48	f.BoolVar(&cmd.isNamespace, "namespace", false, "Path is uuid of namespace on vsan datastore")
49}
50
51func (cmd *rm) Process(ctx context.Context) error {
52	if err := cmd.DatastoreFlag.Process(ctx); err != nil {
53		return err
54	}
55	return nil
56}
57
58func (cmd *rm) Usage() string {
59	return "FILE"
60}
61
62func (cmd *rm) Description() string {
63	return `Remove FILE from DATASTORE.
64
65Examples:
66  govc datastore.rm vm/vmware.log
67  govc datastore.rm vm
68  govc datastore.rm -f images/base.vmdk`
69}
70
71func (cmd *rm) Run(ctx context.Context, f *flag.FlagSet) error {
72	args := f.Args()
73	if len(args) == 0 {
74		return flag.ErrHelp
75	}
76
77	c, err := cmd.Client()
78	if err != nil {
79		return err
80	}
81
82	var dc *object.Datacenter
83	dc, err = cmd.Datacenter()
84	if err != nil {
85		return err
86	}
87
88	ds, err := cmd.Datastore()
89	if err != nil {
90		return err
91	}
92
93	if cmd.isNamespace {
94		path := args[0]
95
96		nm := object.NewDatastoreNamespaceManager(c)
97		err = nm.DeleteDirectory(ctx, dc, path)
98	} else {
99		fm := ds.NewFileManager(dc, cmd.force)
100
101		remove := fm.DeleteFile // File delete
102		if cmd.kind {
103			remove = fm.Delete // VirtualDisk or File delete
104		}
105
106		err = remove(ctx, args[0])
107	}
108
109	if err != nil {
110		if types.IsFileNotFound(err) && cmd.force {
111			// Ignore error
112			return nil
113		}
114	}
115
116	return err
117}
118