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 15package command 16 17import ( 18 "fmt" 19 "os" 20 21 "github.com/spf13/cobra" 22) 23 24// NewDefragCommand returns the cobra command for "Defrag". 25func NewDefragCommand() *cobra.Command { 26 return &cobra.Command{ 27 Use: "defrag", 28 Short: "Defragments the storage of the etcd members with given endpoints", 29 Run: defragCommandFunc, 30 } 31} 32 33func defragCommandFunc(cmd *cobra.Command, args []string) { 34 failures := 0 35 c := mustClientFromCmd(cmd) 36 for _, ep := range c.Endpoints() { 37 ctx, cancel := commandCtx(cmd) 38 _, err := c.Defragment(ctx, ep) 39 cancel() 40 if err != nil { 41 fmt.Fprintf(os.Stderr, "Failed to defragment etcd member[%s] (%v)\n", ep, err) 42 failures++ 43 } else { 44 fmt.Printf("Finished defragmenting etcd member[%s]\n", ep) 45 } 46 } 47 48 if failures != 0 { 49 os.Exit(ExitError) 50 } 51} 52