github.com/vmware/govmomi@v0.37.2/govc/sso/service/ls.go (about)

     1  /*
     2  Copyright (c) 2018 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 service
    18  
    19  import (
    20  	"context"
    21  	"flag"
    22  	"fmt"
    23  	"io"
    24  	"text/tabwriter"
    25  
    26  	"github.com/vmware/govmomi/govc/cli"
    27  	"github.com/vmware/govmomi/govc/flags"
    28  	"github.com/vmware/govmomi/lookup"
    29  	"github.com/vmware/govmomi/lookup/types"
    30  )
    31  
    32  type ls struct {
    33  	*flags.ClientFlag
    34  	*flags.OutputFlag
    35  
    36  	long bool
    37  	url  bool
    38  
    39  	types.LookupServiceRegistrationFilter
    40  }
    41  
    42  func init() {
    43  	cli.Register("sso.service.ls", &ls{})
    44  }
    45  
    46  func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) {
    47  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    48  	cmd.ClientFlag.Register(ctx, f)
    49  
    50  	cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    51  	cmd.OutputFlag.Register(ctx, f)
    52  
    53  	f.BoolVar(&cmd.long, "l", false, "Long listing format")
    54  	f.BoolVar(&cmd.url, "U", false, "List endpoint URL(s) only")
    55  
    56  	cmd.LookupServiceRegistrationFilter.EndpointType = new(types.LookupServiceRegistrationEndpointType)
    57  	cmd.LookupServiceRegistrationFilter.ServiceType = new(types.LookupServiceRegistrationServiceType)
    58  	f.StringVar(&cmd.SiteId, "s", "", "Site ID")
    59  	f.StringVar(&cmd.NodeId, "n", "", "Node ID")
    60  	f.StringVar(&cmd.ServiceType.Type, "t", "", "Service type")
    61  	f.StringVar(&cmd.ServiceType.Product, "p", "", "Service product")
    62  	f.StringVar(&cmd.EndpointType.Type, "T", "", "Endpoint type")
    63  	f.StringVar(&cmd.EndpointType.Protocol, "P", "", "Endpoint protocol")
    64  }
    65  
    66  func (cmd *ls) Description() string {
    67  	return `List platform services.
    68  
    69  Examples:
    70    govc sso.service.ls
    71    govc sso.service.ls -t vcenterserver -P vmomi
    72    govc sso.service.ls -t cs.identity
    73    govc sso.service.ls -t cs.identity -P wsTrust -U
    74    govc sso.service.ls -t cs.identity -json | jq -r .[].ServiceEndpoints[].Url`
    75  }
    76  
    77  func (cmd *ls) Process(ctx context.Context) error {
    78  	if err := cmd.ClientFlag.Process(ctx); err != nil {
    79  		return err
    80  	}
    81  	return cmd.OutputFlag.Process(ctx)
    82  }
    83  
    84  type infoResult []types.LookupServiceRegistrationInfo
    85  
    86  func (r infoResult) Dump() interface{} {
    87  	return []types.LookupServiceRegistrationInfo(r)
    88  }
    89  
    90  func (r infoResult) Write(w io.Writer) error {
    91  	tw := tabwriter.NewWriter(w, 2, 0, 2, ' ', 0)
    92  
    93  	for _, info := range r {
    94  		fmt.Fprintf(tw, "%s\t%s\t%s\n", info.ServiceType.Product, info.ServiceType.Type, info.ServiceId)
    95  	}
    96  
    97  	return tw.Flush()
    98  }
    99  
   100  type infoResultLong []types.LookupServiceRegistrationInfo
   101  
   102  func (r infoResultLong) Dump() interface{} {
   103  	return []types.LookupServiceRegistrationInfo(r)
   104  }
   105  
   106  func (r infoResultLong) Write(w io.Writer) error {
   107  	tw := tabwriter.NewWriter(w, 2, 0, 2, ' ', 0)
   108  
   109  	for _, info := range r {
   110  		for _, s := range info.ServiceEndpoints {
   111  			fmt.Fprintf(tw, "%s\t%s\t%s\t%s\t%s\t%s\n",
   112  				info.ServiceType.Product, info.ServiceType.Type, info.ServiceId,
   113  				s.EndpointType.Protocol, s.EndpointType.Type, s.Url)
   114  		}
   115  	}
   116  
   117  	return tw.Flush()
   118  }
   119  
   120  type infoResultURL []types.LookupServiceRegistrationInfo
   121  
   122  func (r infoResultURL) Dump() interface{} {
   123  	return []types.LookupServiceRegistrationInfo(r)
   124  }
   125  
   126  func (r infoResultURL) Write(w io.Writer) error {
   127  	for _, info := range r {
   128  		for _, s := range info.ServiceEndpoints {
   129  			fmt.Fprintln(w, s.Url)
   130  		}
   131  	}
   132  
   133  	return nil
   134  }
   135  
   136  func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error {
   137  	vc, err := cmd.Client()
   138  	if err != nil {
   139  		return err
   140  	}
   141  
   142  	c, err := lookup.NewClient(ctx, vc)
   143  	if err != nil {
   144  		return err
   145  	}
   146  	c.RoundTripper = cmd.RoundTripper(c.Client)
   147  
   148  	info, err := c.List(ctx, &cmd.LookupServiceRegistrationFilter)
   149  	if err != nil {
   150  		return err
   151  	}
   152  
   153  	switch {
   154  	case cmd.long:
   155  		return cmd.WriteResult(infoResultLong(info))
   156  	case cmd.url:
   157  		return cmd.WriteResult(infoResultURL(info))
   158  	default:
   159  		return cmd.WriteResult(infoResult(info))
   160  	}
   161  }