github.com/vmware/govmomi@v0.37.2/govc/datastore/vsan/ls.go (about)

     1  /*
     2  Copyright (c) 2017 VMware, Inc. All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package vsan
    18  
    19  import (
    20  	"context"
    21  	"flag"
    22  	"fmt"
    23  	"net/url"
    24  	"text/tabwriter"
    25  
    26  	"github.com/vmware/govmomi/govc/cli"
    27  	"github.com/vmware/govmomi/govc/flags"
    28  	"github.com/vmware/govmomi/object"
    29  	"github.com/vmware/govmomi/vim25/mo"
    30  )
    31  
    32  type ls struct {
    33  	*flags.DatastoreFlag
    34  
    35  	long   bool
    36  	orphan bool
    37  }
    38  
    39  func init() {
    40  	cli.Register("datastore.vsan.dom.ls", &ls{})
    41  }
    42  
    43  func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) {
    44  	cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx)
    45  	cmd.DatastoreFlag.Register(ctx, f)
    46  
    47  	f.BoolVar(&cmd.long, "l", false, "Long listing")
    48  	f.BoolVar(&cmd.orphan, "o", false, "List orphan objects")
    49  }
    50  
    51  func (cmd *ls) Process(ctx context.Context) error {
    52  	if err := cmd.DatastoreFlag.Process(ctx); err != nil {
    53  		return err
    54  	}
    55  	return nil
    56  }
    57  
    58  func (cmd *ls) Usage() string {
    59  	return "[UUID]..."
    60  }
    61  
    62  func (cmd *ls) Description() string {
    63  	return `List vSAN DOM objects in DS.
    64  
    65  Examples:
    66    govc datastore.vsan.dom.ls
    67    govc datastore.vsan.dom.ls -ds vsanDatastore -l
    68    govc datastore.vsan.dom.ls -l d85aa758-63f5-500a-3150-0200308e589c`
    69  }
    70  
    71  func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error {
    72  	ds, err := cmd.Datastore()
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	var mds mo.Datastore
    78  	err = ds.Properties(ctx, ds.Reference(), []string{"summary"}, &mds)
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	if mds.Summary.Type != "vsan" {
    84  		return flag.ErrHelp
    85  	}
    86  
    87  	hosts, err := ds.AttachedHosts(ctx)
    88  	if err != nil {
    89  		return err
    90  	}
    91  
    92  	if len(hosts) == 0 {
    93  		return flag.ErrHelp
    94  	}
    95  
    96  	m, err := hosts[0].ConfigManager().VsanInternalSystem(ctx)
    97  	if err != nil {
    98  		return err
    99  	}
   100  
   101  	ids, err := m.QueryVsanObjectUuidsByFilter(ctx, f.Args(), 0, 0)
   102  	if err != nil {
   103  		return err
   104  	}
   105  
   106  	if len(ids) == 0 {
   107  		return nil
   108  	}
   109  
   110  	if !cmd.long && !cmd.orphan {
   111  		for _, id := range ids {
   112  			fmt.Fprintln(cmd.Out, id)
   113  		}
   114  
   115  		return nil
   116  	}
   117  
   118  	objs, err := m.GetVsanObjExtAttrs(ctx, ids)
   119  	if err != nil {
   120  		return err
   121  	}
   122  
   123  	u, err := url.Parse(mds.Summary.Url)
   124  	if err != nil {
   125  		return err
   126  	}
   127  
   128  	tw := tabwriter.NewWriter(cmd.Out, 2, 0, 2, ' ', 0)
   129  	cmd.Out = tw
   130  
   131  	for id, obj := range objs {
   132  		path := obj.DatastorePath(u.Path)
   133  
   134  		if cmd.orphan {
   135  			_, err = ds.Stat(ctx, path)
   136  			if err == nil {
   137  				continue
   138  			}
   139  
   140  			switch err.(type) {
   141  			case object.DatastoreNoSuchDirectoryError, object.DatastoreNoSuchFileError:
   142  			default:
   143  				return err
   144  			}
   145  
   146  			if !cmd.long {
   147  				fmt.Fprintln(cmd.Out, id)
   148  				continue
   149  			}
   150  		}
   151  
   152  		fmt.Fprintf(cmd.Out, "%s\t%s\t%s\n", id, obj.Class, path)
   153  	}
   154  
   155  	return tw.Flush()
   156  }