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 }