go.etcd.io/etcd@v3.3.27+incompatible/etcdctl/ctlv3/command/printer_simple.go (about)

     1  // Copyright 2016 The etcd Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package command
    16  
    17  import (
    18  	"fmt"
    19  	"os"
    20  	"strings"
    21  
    22  	v3 "github.com/coreos/etcd/clientv3"
    23  	pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
    24  	"github.com/coreos/etcd/pkg/types"
    25  )
    26  
    27  type simplePrinter struct {
    28  	isHex     bool
    29  	valueOnly bool
    30  }
    31  
    32  func (s *simplePrinter) Del(resp v3.DeleteResponse) {
    33  	fmt.Println(resp.Deleted)
    34  	for _, kv := range resp.PrevKvs {
    35  		printKV(s.isHex, s.valueOnly, kv)
    36  	}
    37  }
    38  
    39  func (s *simplePrinter) Get(resp v3.GetResponse) {
    40  	for _, kv := range resp.Kvs {
    41  		printKV(s.isHex, s.valueOnly, kv)
    42  	}
    43  }
    44  
    45  func (s *simplePrinter) Put(r v3.PutResponse) {
    46  	fmt.Println("OK")
    47  	if r.PrevKv != nil {
    48  		printKV(s.isHex, s.valueOnly, r.PrevKv)
    49  	}
    50  }
    51  
    52  func (s *simplePrinter) Txn(resp v3.TxnResponse) {
    53  	if resp.Succeeded {
    54  		fmt.Println("SUCCESS")
    55  	} else {
    56  		fmt.Println("FAILURE")
    57  	}
    58  
    59  	for _, r := range resp.Responses {
    60  		fmt.Println("")
    61  		switch v := r.Response.(type) {
    62  		case *pb.ResponseOp_ResponseDeleteRange:
    63  			s.Del((v3.DeleteResponse)(*v.ResponseDeleteRange))
    64  		case *pb.ResponseOp_ResponsePut:
    65  			s.Put((v3.PutResponse)(*v.ResponsePut))
    66  		case *pb.ResponseOp_ResponseRange:
    67  			s.Get(((v3.GetResponse)(*v.ResponseRange)))
    68  		default:
    69  			fmt.Printf("unexpected response %+v\n", r)
    70  		}
    71  	}
    72  }
    73  
    74  func (s *simplePrinter) Watch(resp v3.WatchResponse) {
    75  	for _, e := range resp.Events {
    76  		fmt.Println(e.Type)
    77  		if e.PrevKv != nil {
    78  			printKV(s.isHex, s.valueOnly, e.PrevKv)
    79  		}
    80  		printKV(s.isHex, s.valueOnly, e.Kv)
    81  	}
    82  }
    83  
    84  func (s *simplePrinter) Grant(resp v3.LeaseGrantResponse) {
    85  	fmt.Printf("lease %016x granted with TTL(%ds)\n", resp.ID, resp.TTL)
    86  }
    87  
    88  func (p *simplePrinter) Revoke(id v3.LeaseID, r v3.LeaseRevokeResponse) {
    89  	fmt.Printf("lease %016x revoked\n", id)
    90  }
    91  
    92  func (p *simplePrinter) KeepAlive(resp v3.LeaseKeepAliveResponse) {
    93  	fmt.Printf("lease %016x keepalived with TTL(%d)\n", resp.ID, resp.TTL)
    94  }
    95  
    96  func (s *simplePrinter) TimeToLive(resp v3.LeaseTimeToLiveResponse, keys bool) {
    97  	if resp.GrantedTTL == 0 && resp.TTL == -1 {
    98  		fmt.Printf("lease %016x already expired\n", resp.ID)
    99  		return
   100  	}
   101  
   102  	txt := fmt.Sprintf("lease %016x granted with TTL(%ds), remaining(%ds)", resp.ID, resp.GrantedTTL, resp.TTL)
   103  	if keys {
   104  		ks := make([]string, len(resp.Keys))
   105  		for i := range resp.Keys {
   106  			ks[i] = string(resp.Keys[i])
   107  		}
   108  		txt += fmt.Sprintf(", attached keys(%v)", ks)
   109  	}
   110  	fmt.Println(txt)
   111  }
   112  
   113  func (s *simplePrinter) Leases(resp v3.LeaseLeasesResponse) {
   114  	fmt.Printf("found %d leases\n", len(resp.Leases))
   115  	for _, item := range resp.Leases {
   116  		fmt.Printf("%016x\n", item.ID)
   117  	}
   118  }
   119  
   120  func (s *simplePrinter) Alarm(resp v3.AlarmResponse) {
   121  	for _, e := range resp.Alarms {
   122  		fmt.Printf("%+v\n", e)
   123  	}
   124  }
   125  
   126  func (s *simplePrinter) MemberAdd(r v3.MemberAddResponse) {
   127  	fmt.Printf("Member %16x added to cluster %16x\n", r.Member.ID, r.Header.ClusterId)
   128  }
   129  
   130  func (s *simplePrinter) MemberRemove(id uint64, r v3.MemberRemoveResponse) {
   131  	fmt.Printf("Member %16x removed from cluster %16x\n", id, r.Header.ClusterId)
   132  }
   133  
   134  func (s *simplePrinter) MemberUpdate(id uint64, r v3.MemberUpdateResponse) {
   135  	fmt.Printf("Member %16x updated in cluster %16x\n", id, r.Header.ClusterId)
   136  }
   137  
   138  func (s *simplePrinter) MemberList(resp v3.MemberListResponse) {
   139  	_, rows := makeMemberListTable(resp)
   140  	for _, row := range rows {
   141  		fmt.Println(strings.Join(row, ", "))
   142  	}
   143  }
   144  
   145  func (s *simplePrinter) EndpointHealth(hs []epHealth) {
   146  	for _, h := range hs {
   147  		if h.Error == "" {
   148  			fmt.Fprintf(os.Stderr, "%s is healthy: successfully committed proposal: took = %v\n", h.Ep, h.Took)
   149  		} else {
   150  			fmt.Fprintf(os.Stderr, "%s is unhealthy: failed to commit proposal: %v\n", h.Ep, h.Error)
   151  		}
   152  	}
   153  }
   154  
   155  func (s *simplePrinter) EndpointStatus(statusList []epStatus) {
   156  	_, rows := makeEndpointStatusTable(statusList)
   157  	for _, row := range rows {
   158  		fmt.Println(strings.Join(row, ", "))
   159  	}
   160  }
   161  
   162  func (s *simplePrinter) EndpointHashKV(hashList []epHashKV) {
   163  	_, rows := makeEndpointHashKVTable(hashList)
   164  	for _, row := range rows {
   165  		fmt.Println(strings.Join(row, ", "))
   166  	}
   167  }
   168  
   169  func (s *simplePrinter) DBStatus(ds dbstatus) {
   170  	_, rows := makeDBStatusTable(ds)
   171  	for _, row := range rows {
   172  		fmt.Println(strings.Join(row, ", "))
   173  	}
   174  }
   175  
   176  func (s *simplePrinter) MoveLeader(leader, target uint64, r v3.MoveLeaderResponse) {
   177  	fmt.Printf("Leadership transferred from %s to %s\n", types.ID(leader), types.ID(target))
   178  }
   179  
   180  func (s *simplePrinter) RoleAdd(role string, r v3.AuthRoleAddResponse) {
   181  	fmt.Printf("Role %s created\n", role)
   182  }
   183  
   184  func (s *simplePrinter) RoleGet(role string, r v3.AuthRoleGetResponse) {
   185  	fmt.Printf("Role %s\n", role)
   186  	fmt.Println("KV Read:")
   187  
   188  	printRange := func(perm *v3.Permission) {
   189  		sKey := string(perm.Key)
   190  		sRangeEnd := string(perm.RangeEnd)
   191  		if strings.Compare(sRangeEnd, "\x00") != 0 {
   192  			fmt.Printf("\t[%s, %s)", sKey, sRangeEnd)
   193  		} else {
   194  			fmt.Printf("\t[%s, <open ended>", sKey)
   195  		}
   196  		if strings.Compare(v3.GetPrefixRangeEnd(sKey), sRangeEnd) == 0 {
   197  			fmt.Printf(" (prefix %s)", sKey)
   198  		}
   199  		fmt.Printf("\n")
   200  	}
   201  
   202  	for _, perm := range r.Perm {
   203  		if perm.PermType == v3.PermRead || perm.PermType == v3.PermReadWrite {
   204  			if len(perm.RangeEnd) == 0 {
   205  				fmt.Printf("\t%s\n", string(perm.Key))
   206  			} else {
   207  				printRange((*v3.Permission)(perm))
   208  			}
   209  		}
   210  	}
   211  	fmt.Println("KV Write:")
   212  	for _, perm := range r.Perm {
   213  		if perm.PermType == v3.PermWrite || perm.PermType == v3.PermReadWrite {
   214  			if len(perm.RangeEnd) == 0 {
   215  				fmt.Printf("\t%s\n", string(perm.Key))
   216  			} else {
   217  				printRange((*v3.Permission)(perm))
   218  			}
   219  		}
   220  	}
   221  }
   222  
   223  func (s *simplePrinter) RoleList(r v3.AuthRoleListResponse) {
   224  	for _, role := range r.Roles {
   225  		fmt.Printf("%s\n", role)
   226  	}
   227  }
   228  
   229  func (s *simplePrinter) RoleDelete(role string, r v3.AuthRoleDeleteResponse) {
   230  	fmt.Printf("Role %s deleted\n", role)
   231  }
   232  
   233  func (s *simplePrinter) RoleGrantPermission(role string, r v3.AuthRoleGrantPermissionResponse) {
   234  	fmt.Printf("Role %s updated\n", role)
   235  }
   236  
   237  func (s *simplePrinter) RoleRevokePermission(role string, key string, end string, r v3.AuthRoleRevokePermissionResponse) {
   238  	if len(end) == 0 {
   239  		fmt.Printf("Permission of key %s is revoked from role %s\n", key, role)
   240  		return
   241  	}
   242  	if strings.Compare(end, "\x00") != 0 {
   243  		fmt.Printf("Permission of range [%s, %s) is revoked from role %s\n", key, end, role)
   244  	} else {
   245  		fmt.Printf("Permission of range [%s, <open ended> is revoked from role %s\n", key, role)
   246  	}
   247  }
   248  
   249  func (s *simplePrinter) UserAdd(name string, r v3.AuthUserAddResponse) {
   250  	fmt.Printf("User %s created\n", name)
   251  }
   252  
   253  func (s *simplePrinter) UserGet(name string, r v3.AuthUserGetResponse) {
   254  	fmt.Printf("User: %s\n", name)
   255  	fmt.Printf("Roles:")
   256  	for _, role := range r.Roles {
   257  		fmt.Printf(" %s", role)
   258  	}
   259  	fmt.Printf("\n")
   260  }
   261  
   262  func (s *simplePrinter) UserChangePassword(v3.AuthUserChangePasswordResponse) {
   263  	fmt.Println("Password updated")
   264  }
   265  
   266  func (s *simplePrinter) UserGrantRole(user string, role string, r v3.AuthUserGrantRoleResponse) {
   267  	fmt.Printf("Role %s is granted to user %s\n", role, user)
   268  }
   269  
   270  func (s *simplePrinter) UserRevokeRole(user string, role string, r v3.AuthUserRevokeRoleResponse) {
   271  	fmt.Printf("Role %s is revoked from user %s\n", role, user)
   272  }
   273  
   274  func (s *simplePrinter) UserDelete(user string, r v3.AuthUserDeleteResponse) {
   275  	fmt.Printf("User %s deleted\n", user)
   276  }
   277  
   278  func (s *simplePrinter) UserList(r v3.AuthUserListResponse) {
   279  	for _, user := range r.Users {
   280  		fmt.Printf("%s\n", user)
   281  	}
   282  }