github.com/inflatablewoman/deis@v1.0.1-0.20141111034523-a4511c46a6ce/deisctl/backend/fleet/create.go (about)

     1  package fleet
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"sync"
     7  	"time"
     8  
     9  	"github.com/coreos/fleet/job"
    10  	"github.com/coreos/fleet/schema"
    11  	"github.com/coreos/fleet/unit"
    12  )
    13  
    14  // Create schedules unit files for the given components.
    15  func (c *FleetClient) Create(
    16  	targets []string, wg *sync.WaitGroup, outchan chan string, errchan chan error) {
    17  
    18  	units := make([]*schema.Unit, len(targets))
    19  
    20  	for i, target := range targets {
    21  		unitName, unitFile, err := c.createUnitFile(target)
    22  		if err != nil {
    23  			errchan <- err
    24  			return
    25  		}
    26  		units[i] = &schema.Unit{
    27  			Name:    unitName,
    28  			Options: schema.MapUnitFileToSchemaUnitOptions(unitFile),
    29  		}
    30  	}
    31  
    32  	for _, unit := range units {
    33  		wg.Add(1)
    34  		go doCreate(c, unit, wg, outchan, errchan)
    35  	}
    36  }
    37  
    38  func doCreate(c *FleetClient, unit *schema.Unit, wg *sync.WaitGroup, outchan chan string, errchan chan error) {
    39  	defer wg.Done()
    40  
    41  	// create unit definition
    42  	if err := c.Fleet.CreateUnit(unit); err != nil {
    43  		// ignore units that already exist
    44  		if err.Error() != "job already exists" {
    45  			errchan <- err
    46  			return
    47  		}
    48  	}
    49  
    50  	desiredState := string(job.JobStateLoaded)
    51  	out := fmt.Sprintf("\033[0;33m%v:\033[0m loaded                                 \r", unit.Name)
    52  
    53  	// schedule the unit
    54  	if err := c.Fleet.SetUnitTargetState(unit.Name, desiredState); err != nil {
    55  		errchan <- err
    56  		return
    57  	}
    58  
    59  	// loop until the unit actually exists in unit states
    60  outerLoop:
    61  	for {
    62  		time.Sleep(250 * time.Millisecond)
    63  		unitStates, err := cAPI.UnitStates()
    64  		if err != nil {
    65  			errchan <- err
    66  		}
    67  		for _, us := range unitStates {
    68  			if strings.HasPrefix(us.Name, unit.Name) {
    69  				break outerLoop
    70  			}
    71  		}
    72  	}
    73  
    74  	outchan <- out
    75  }
    76  
    77  func (c *FleetClient) createUnitFile(target string) (unitName string, uf *unit.UnitFile, err error) {
    78  	component, num, err := splitTarget(target)
    79  	if err != nil {
    80  		return
    81  	}
    82  	unitName, uf, err = c.createServiceUnit(component, num)
    83  	if err != nil {
    84  		return unitName, uf, err
    85  	}
    86  	return
    87  }
    88  
    89  // Create normal service unit
    90  func (c *FleetClient) createServiceUnit(component string, num int) (name string, uf *unit.UnitFile, err error) {
    91  	name, err = formatUnitName(component, num)
    92  	if err != nil {
    93  		return "", nil, err
    94  	}
    95  	uf, err = NewUnit(component)
    96  	if err != nil {
    97  		return
    98  	}
    99  	return name, uf, nil
   100  }