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 (s *S) TestContainerAsUnit(c *check.C) { app := provisiontest.NewFakeApp("myapp", "python", 1) expected := provision.Unit{ ID: "c-id", AppName: "myapp", Type: "python", Ip: "192.168.50.4", Status: provision.StatusBuilding, ProcessName: "web", Address: &url.URL{Scheme: "http", Host: "192.168.50.4:8080"}, } container := Container{ ID: "c-id", HostAddr: "192.168.50.4", HostPort: "8080", ProcessName: "web", } got := container.AsUnit(app) c.Assert(got, check.DeepEquals, expected) container.Type = "ruby" container.Status = provision.StatusStarted.String() got = container.AsUnit(app) expected.Status = provision.StatusStarted expected.Type = "ruby" c.Assert(got, check.DeepEquals, expected) }
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, u, unit) units = append(units, unit) } } p.saveBootstrapMachine(out.Machines[0]) return units, err }