// Run tests in archive against host func testHost(host string, deleteFiles bool, junitFilePrefix string, setupNode bool, ginkgoFlagsStr string) *TestResult { instance, err := computeService.Instances.Get(*project, *zone, host).Do() if err != nil { return &TestResult{ err: err, host: host, exitOk: false, } } if strings.ToUpper(instance.Status) != "RUNNING" { err = fmt.Errorf("instance %s not in state RUNNING, was %s.", host, instance.Status) return &TestResult{ err: err, host: host, exitOk: false, } } externalIp := getExternalIp(instance) if len(externalIp) > 0 { remote.AddHostnameIp(host, externalIp) } path, err := arc.getArchive() if err != nil { // Don't log fatal because we need to do any needed cleanup contained in "defer" statements return &TestResult{ err: fmt.Errorf("unable to create test archive %v.", err), } } output, exitOk, err := remote.RunRemote(path, host, deleteFiles, junitFilePrefix, setupNode, *testArgs, ginkgoFlagsStr) return &TestResult{ output: output, err: err, host: host, exitOk: exitOk, } }
// Provision a gce instance using image func createInstance(imageConfig *internalGCEImage) (string, error) { glog.V(1).Infof("Creating instance %+v", *imageConfig) name := imageToInstanceName(imageConfig) i := &compute.Instance{ Name: name, MachineType: machineType(imageConfig.machine), NetworkInterfaces: []*compute.NetworkInterface{ { AccessConfigs: []*compute.AccessConfig{ { Type: "ONE_TO_ONE_NAT", Name: "External NAT", }, }}, }, Disks: []*compute.AttachedDisk{ { AutoDelete: true, Boot: true, Type: "PERSISTENT", InitializeParams: &compute.AttachedDiskInitializeParams{ SourceImage: sourceImage(imageConfig.image, imageConfig.project), }, }, }, } i.Metadata = imageConfig.metadata op, err := computeService.Instances.Insert(*project, *zone, i).Do() if err != nil { return "", err } if op.Error != nil { return "", fmt.Errorf("could not create instance %s: %+v", name, op.Error) } instanceRunning := false for i := 0; i < 30 && !instanceRunning; i++ { if i > 0 { time.Sleep(time.Second * 20) } var instance *compute.Instance instance, err = computeService.Instances.Get(*project, *zone, name).Do() if err != nil { continue } if strings.ToUpper(instance.Status) != "RUNNING" { err = fmt.Errorf("instance %s not in state RUNNING, was %s.", name, instance.Status) continue } externalIp := getExternalIp(instance) if len(externalIp) > 0 { remote.AddHostnameIp(name, externalIp) } var output string output, err = remote.RunSshCommand("ssh", remote.GetHostnameOrIp(name), "--", "sudo", "docker", "version") if err != nil { err = fmt.Errorf("instance %s not running docker daemon - Command failed: %s", name, output) continue } if !strings.Contains(output, "Server") { err = fmt.Errorf("instance %s not running docker daemon - Server not found: %s", name, output) continue } instanceRunning = true } return name, err }