func (p *JujuProvisioner) CollectStatus() ([]provision.Unit, error) { output, err := execWithTimeout(30e9, "juju", "status") if err != nil { return nil, &provision.Error{Reason: string(output), Err: err} } var out jujuOutput err = goyaml.Unmarshal(output, &out) if err != nil { return nil, &provision.Error{Reason: `"juju status" returned invalid data`, Err: err} } var units []provision.Unit for name, service := range out.Services { for unitName, u := range service.Units { machine := out.Machines[u.Machine] unit := provision.Unit{ Name: unitName, AppName: name, Machine: u.Machine, InstanceId: machine.InstanceId, Ip: machine.IpAddress, } typeRegexp := regexp.MustCompile(`^(local:)?(\w+)/(\w+)-\d+$`) matchs := typeRegexp.FindStringSubmatch(service.Charm) if len(matchs) > 3 { unit.Type = matchs[3] } unit.Status = unitStatus(machine.InstanceState, u.AgentState, machine.AgentState) units = append(units, unit) } } return units, nil }
func collectUnit(container container, units chan<- provision.Unit, wg *sync.WaitGroup) { defer wg.Done() unit := provision.Unit{ Name: container.ID, AppName: container.AppName, Type: container.Type, } switch container.Status { case "error": unit.Status = provision.StatusError units <- unit return case "created": return } unit.Ip = container.HostAddr if ip, hostPort, err := container.networkInfo(); err == nil && (hostPort != container.HostPort || ip != container.IP) { err = fixContainer(&container, ip, hostPort) if err != nil { log.Printf("error on fix container hostport for [container %s]", container.ID) return } } addr := strings.Replace(container.getAddress(), "http://", "", 1) conn, err := net.Dial("tcp", addr) if err != nil { unit.Status = provision.StatusInstalling } else { conn.Close() unit.Status = provision.StatusStarted } log.Printf("collected data for [container %s] - [app %s]", container.ID, container.AppName) units <- unit }
func (p *JujuProvisioner) collectStatus() ([]provision.Unit, error) { out, err := p.getOutput() if err != nil { return nil, err } var units []provision.Unit for name, service := range out.Services { for unitName, u := range service.Units { machine := out.Machines[u.Machine] unit := provision.Unit{ Name: unitName, AppName: name, Machine: u.Machine, InstanceId: machine.InstanceId, Ip: machine.IpAddress, } typeRegexp := regexp.MustCompile(`^(local:)?(\w+)/(\w+)-\d+$`) matchs := typeRegexp.FindStringSubmatch(service.Charm) if len(matchs) > 3 { unit.Type = matchs[3] } unit.Status = unitStatus(machine.InstanceState, u.AgentState, machine.AgentState) units = append(units, unit) } } p.saveBootstrapMachine(out.Machines[0]) return units, err }
func collectUnit(container container, units chan<- provision.Unit, wg *sync.WaitGroup) { defer wg.Done() unit := provision.Unit{ Name: container.ID, AppName: container.AppName, Type: container.Type, } if container.Status == "error" { unit.Status = provision.StatusDown units <- unit return } if container.Status == "running" { unit.Ip = container.HostAddr ip, hostPort, err := container.networkInfo() if err == nil && (hostPort != container.HostPort || ip != container.IP) { err = fixContainer(&container, ip, hostPort) if err != nil { log.Errorf("error on fix container hostport for [container %s]", container.ID) return } } addr := strings.Replace(container.getAddress(), "http://", "", 1) conn, err := net.Dial("tcp", addr) if err != nil { unit.Status = provision.StatusUnreachable } else { conn.Close() unit.Status = provision.StatusStarted } log.Debugf("collected data for [container %s] - [app %s]", container.ID, container.AppName) units <- unit } }
func collectUnit(container container, units chan<- provision.Unit, errs chan<- error, wg *sync.WaitGroup) { defer wg.Done() docker, _ := config.GetString("docker:binary") unit := provision.Unit{ Name: container.Id, AppName: container.AppName, Type: container.Type, } switch container.Status { case "error": unit.Status = provision.StatusError units <- unit fallthrough case "created": return } out, err := runCmd(docker, "inspect", container.Id) if err != nil { errs <- err return } var c map[string]interface{} err = json.Unmarshal([]byte(out), &c) if err != nil { errs <- err return } unit.Ip = c["NetworkSettings"].(map[string]interface{})["IpAddress"].(string) if hostPort, err := container.hostPort(); err == nil && hostPort != container.HostPort { err = fixContainer(&container, unit.Ip, hostPort) if err != nil { errs <- err return } } addr := fmt.Sprintf("%s:%s", unit.Ip, container.Port) conn, err := net.Dial("tcp", addr) if err != nil { unit.Status = provision.StatusInstalling } else { conn.Close() unit.Status = provision.StatusStarted } units <- unit }
func collectUnit(container container, units chan<- provision.Unit, wg *sync.WaitGroup) { defer wg.Done() unit := provision.Unit{ Name: container.ID, AppName: container.AppName, Type: container.Type, } switch container.Status { case "error": unit.Status = provision.StatusError units <- unit return case "created": return } dockerContainer, err := dockerCluster().InspectContainer(container.ID) if err != nil { log.Printf("error on inspecting [container %s] for collect data", container.ID) return } unit.Ip = dockerContainer.NetworkSettings.IPAddress if hostPort, err := container.hostPort(); err == nil && hostPort != container.HostPort { err = fixContainer(&container, unit.Ip, hostPort) if err != nil { log.Printf("error on fix container hostport for [container %s]", container.ID) return } } addr := fmt.Sprintf("%s:%s", unit.Ip, container.Port) conn, err := net.Dial("tcp", addr) if err != nil { unit.Status = provision.StatusInstalling } else { conn.Close() unit.Status = provision.StatusStarted } log.Printf("collected data for [container %s] - [app %s]", container.ID, container.AppName) units <- unit }
func (p *LocalProvisioner) Provision(app provision.App) error { go func(p *LocalProvisioner, app provision.App) { c := container{name: app.GetName()} log.Printf("creating container %s", c.name) u := provision.Unit{ Name: app.GetName(), AppName: app.GetName(), Type: app.GetFramework(), Machine: 0, InstanceId: app.GetName(), Status: provision.StatusCreating, Ip: "", } log.Printf("inserting container unit %s in the database", app.GetName()) err := p.collection().Insert(u) if err != nil { log.Print(err) } err = c.create() if err != nil { log.Printf("error on create container %s", app.GetName()) log.Print(err) } err = c.start() if err != nil { log.Printf("error on start container %s", app.GetName()) log.Print(err) } ip := c.ip() u.Ip = ip u.Status = provision.StatusInstalling err = p.collection().Update(bson.M{"name": u.Name}, u) if err != nil { log.Print(err) } err = p.setup(ip, app.GetFramework()) if err != nil { log.Printf("error on setup container %s", app.GetName()) log.Print(err) } err = p.install(ip) if err != nil { log.Printf("error on install container %s", app.GetName()) log.Print(err) } err = p.start(ip) if err != nil { log.Printf("error on start app for container %s", app.GetName()) log.Print(err) } err = AddRoute(app.GetName(), ip) if err != nil { log.Printf("error on add route for %s with ip %s", app.GetName(), ip) log.Print(err) } err = RestartRouter() if err != nil { log.Printf("error on restart router") log.Print(err) } u.Status = provision.StatusStarted err = p.collection().Update(bson.M{"name": u.Name}, u) if err != nil { log.Print(err) } }(p, app) return nil }
func (p *LXCProvisioner) Provision(app provision.App) error { go func(p *LXCProvisioner, app provision.App) { c := container{name: app.GetName()} log.Printf("creating container %s", c.name) u := provision.Unit{ Name: app.GetName(), AppName: app.GetName(), Type: app.GetPlatform(), Machine: 0, InstanceId: app.GetName(), Status: provision.StatusCreating, Ip: "", } log.Printf("inserting container unit %s in the database", app.GetName()) err := p.collection().Insert(u) if err != nil { log.Print(err) } err = c.create() if err != nil { log.Printf("error on create container %s", app.GetName()) log.Print(err) } err = c.start() if err != nil { log.Printf("error on start container %s", app.GetName()) log.Print(err) } u.Ip = c.IP() u.Status = provision.StatusInstalling err = p.collection().Update(bson.M{"name": u.Name}, u) if err != nil { log.Print(err) } err = c.waitForNetwork() if err != nil { log.Print(err) } err = p.setup(c.IP(), app.GetPlatform()) if err != nil { log.Printf("error on setup container %s", app.GetName()) log.Print(err) } err = p.install(c.IP()) if err != nil { log.Printf("error on install container %s", app.GetName()) log.Print(err) } err = p.start(c.IP()) if err != nil { log.Printf("error on start app for container %s", app.GetName()) log.Print(err) } err = p.start(c.IP()) r, err := p.router() if err != nil { log.Print(err) return } err = r.AddBackend(app.GetName()) if err != nil { log.Printf("error on add backend for %s", app.GetName()) log.Print(err) return } err = r.AddRoute(app.GetName(), c.IP()) if err != nil { log.Printf("error on add route for %s with ip %s", app.GetName(), c.IP()) log.Print(err) } u.Status = provision.StatusStarted err = p.collection().Update(bson.M{"name": u.Name}, u) if err != nil { log.Print(err) } }(p, app) return nil }