func startAnalyzers(sourceDir string, images []string, dind bool) (containers []string, errs []error) { var wg sync.WaitGroup for id, fullImage := range images { wg.Add(1) go func(id int, image string) { analyzerContainer, port := getContainerAndAddress(image, id) if docker.ImageMatches(image, analyzerContainer) { glog.Infof("Reusing analyzer %v started at localhost:%d", image, port) } else { glog.Infof("Found no analyzer container (%v) to reuse for %v", analyzerContainer, image) // Analyzer is either running with the wrong image version, or not running // Stopping in case it's the first case result := docker.Stop(analyzerContainer, 0, true) if result.Err != nil { glog.Infof("Failed to stop %v (may not be running)", analyzerContainer) } result = docker.RunAnalyzer(image, analyzerContainer, sourceDir, localLogs, port, dind) if result.Err != nil { glog.Infof("Could not start %v at localhost:%d: %v, stderr: %v", image, port, result.Err.Error(), result.Stderr) errs = append(errs, result.Err) } else { glog.Infof("Analyzer %v started at localhost:%d", image, port) containers = append(containers, analyzerContainer) } } wg.Done() }(id, fullImage) } if len(images) > 0 { glog.Info("Waiting for dockerized analyzers to start up...") wg.Wait() glog.Info("Analyzers up") } return containers, errs }
// startShipshapeService ensures that there is a service started with the given image and // attached analyzers that can analyze the directory at absRoot (an absolute path). If a // service is not started up that can do this, it will shut down the existing one and start // a new one. // The methods returns the (ready) client, the relative path from the docker container's mapped // volume to the absRoot that we are analyzing, and any errors from attempting to run the service. // TODO(ciera): This *should* check the analyzers that are connected, but does not yet // do so. func startShipshapeService(image, absRoot string, analyzers []string, dind bool) (*client.Client, string, error) { glog.Infof("Starting shipshape...") container := "shipping_container" // subPath is the relatve path from the mapped volume on shipping container // to the directory we are analyzing (absRoot) isMapped, subPath := docker.MappedVolume(absRoot, container) // Stop and restart the container if: // 1: The container is not using the latest image OR // 2: The container is not mapped to the right directory OR // 3: The container is not linked to the right analyzer containers // Otherwise, use the existing container if !docker.ImageMatches(image, container) || !isMapped || !docker.ContainsLinks(container, analyzers) { glog.Infof("Restarting container with %s", image) stop(container, 0) result := docker.RunService(image, container, absRoot, localLogs, analyzers, dind) subPath = "" printStreams(result) if result.Err != nil { return nil, "", result.Err } } glog.Infof("Image %s running in service mode", image) c := client.NewHTTPClient("localhost:10007") return c, subPath, c.WaitUntilReady(10 * time.Second) }