github.com/technosophos/deis@v1.7.1-0.20150915173815-f9005256004b/deisctl/backend/fleet/destroy.go (about) 1 package fleet 2 3 import ( 4 "fmt" 5 "io" 6 "strings" 7 "sync" 8 "time" 9 10 "github.com/deis/deis/pkg/prettyprint" 11 ) 12 13 // Destroy units for a given target 14 func (c *FleetClient) Destroy(targets []string, wg *sync.WaitGroup, out, ew io.Writer) { 15 // expand @* targets 16 expandedTargets, err := c.expandTargets(targets) 17 if err != nil { 18 fmt.Fprintln(ew, err.Error()) 19 return 20 } 21 22 for _, target := range expandedTargets { 23 wg.Add(1) 24 go doDestroy(c, target, wg, out, ew) 25 } 26 return 27 } 28 29 func doDestroy(c *FleetClient, target string, wg *sync.WaitGroup, out, ew io.Writer) { 30 defer wg.Done() 31 32 // prepare string representation 33 component, num, err := splitTarget(target) 34 if err != nil { 35 fmt.Fprintln(ew, err.Error()) 36 return 37 } 38 name, err := formatUnitName(component, num) 39 if err != nil { 40 fmt.Fprintln(ew, err.Error()) 41 return 42 } 43 tpl := prettyprint.Colorize("{{.Yellow}}%v:{{.Default}} destroyed") 44 destroyed := fmt.Sprintf(tpl, name) 45 46 // tell fleet to destroy the unit 47 c.Fleet.DestroyUnit(name) 48 49 // loop until the unit is actually gone from unit states 50 outerLoop: 51 for { 52 time.Sleep(250 * time.Millisecond) 53 unitStates, err := c.Fleet.UnitStates() 54 if err != nil { 55 fmt.Fprintln(ew, err.Error()) 56 } 57 for _, us := range unitStates { 58 if strings.HasPrefix(us.Name, name) { 59 continue outerLoop 60 } 61 } 62 fmt.Fprintln(out, destroyed) 63 return 64 } 65 }