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 }