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  }