in cmd/wrapper/main.go [53:208]
func main() {
ctx := context.Background()
testTimeout, err := utils.GetMetadata(ctx, "instance", "attributes", "_cit_timeout")
if err != nil {
log.Fatalf("failed to get metadata _cit_timeout: %v", err)
}
d, err := time.ParseDuration(testTimeout)
if err != nil {
log.Fatalf("_cit_timeout %v is not a valid duration: %v", testTimeout, err)
}
ctx, cancel := context.WithTimeout(ctx, d)
defer cancel()
client, err := storage.NewClient(ctx)
if err != nil {
log.Fatalf("failed to create cloud storage client: %v", err)
}
log.Printf("FINISHED-BOOTING")
firstBootSpecialAttribute := checkFirstBootSpecialGA(ctx)
// firstBootSpecialGA should be true if we need to match a different guest attribute than the usual guest attribute
defer func(ctx context.Context, firstBootSpecialGA bool) {
var err error
if firstBootSpecialGA {
err = utils.PutMetadata(ctx, path.Join("instance", "guest-attributes", utils.GuestAttributeTestNamespace,
utils.FirstBootGAKey), "")
} else {
err = utils.PutMetadata(ctx, path.Join("instance", "guest-attributes", utils.GuestAttributeTestNamespace,
utils.GuestAttributeTestKey), "")
}
if err != nil {
log.Printf("could not place guest attribute key to end test: %v", err)
}
for f := 0; f < 5; f++ {
log.Printf("FINISHED-TEST")
time.Sleep(1 * time.Second)
}
}(ctx, firstBootSpecialAttribute)
testPackageURL, err := utils.GetMetadata(ctx, "instance", "attributes", "_test_package_url")
if err != nil {
log.Fatalf("failed to get metadata _test_package_url: %v", err)
}
resultsURL, err := utils.GetMetadata(ctx, "instance", "attributes", "_test_results_url")
if err != nil {
log.Fatalf("failed to get metadata _test_results_url: %v", err)
}
propertiesURL, err := utils.GetMetadata(ctx, "instance", "attributes", "_test_properties_url")
if err != nil {
log.Fatalf("failed to get metadata _test_properties_url: %v", err)
}
var testArguments = []string{"-test.v", "-test.timeout", testTimeout}
testRun, err := utils.GetMetadata(ctx, "instance", "attributes", "_test_run")
if err == nil && testRun != "" {
testArguments = append(testArguments, "-test.run", testRun)
}
testExcludeFilter, err := utils.GetMetadata(ctx, "instance", "attributes", "_exclude_discrete_tests")
if err == nil && testExcludeFilter != "" {
testArguments = append(testArguments, "-test.skip", testExcludeFilter)
}
testPackage, err := utils.GetMetadata(ctx, "instance", "attributes", "_test_package_name")
if err != nil {
log.Fatalf("failed to get metadata _test_package_name: %v", err)
}
testSuiteName, err := utils.GetMetadata(ctx, "instance", "attributes", "_test_suite_name")
if err != nil {
log.Fatalf("failed to get metadata _test_suite_name: %v", err)
}
machineType, err := utils.GetMetadata(ctx, "instance", "machine-type")
if err != nil {
log.Fatalf("failed to get metadata _machine_type: %v", err)
}
zone, err := utils.GetMetadata(ctx, "instance", "zone")
if err != nil {
log.Fatalf("failed to get metadata _zone: %v", err)
}
id, err := utils.GetMetadata(ctx, "instance", "id")
if err != nil {
log.Fatalf("failed to get metadata _id: %v", err)
}
name, err := utils.GetMetadata(ctx, "instance", "name")
if err != nil {
log.Fatalf("failed to get metadata _name: %v", err)
}
workDirPath := "/etc/"
if runtime.GOOS == "windows" {
workDirPath = "C:\\"
}
workDir, err := os.MkdirTemp(workDirPath, "image_test")
if err != nil {
log.Fatalf("failed to create work dir: %v", err)
}
workDir = workDir + "/"
if err = utils.DownloadGCSObjectToFile(ctx, client, testPackageURL, workDir+testPackage); err != nil {
log.Fatalf("failed to download object: %v", err)
}
client.Close()
log.Printf("sleep 30s to allow environment to stabilize")
time.Sleep(30 * time.Second)
out, err := executeCmd(workDir+testPackage, workDir, testArguments)
if err != nil {
if ee, ok := err.(*exec.ExitError); ok {
log.Printf("test package exited with error: %v stderr: %q", ee, ee.Stderr)
} else {
log.Fatalf("failed to execute test package: %v stdout: %q", err, out)
}
}
log.Printf("command output:\n%s\n", out)
client, err = storage.NewClient(ctx)
if err != nil {
log.Fatalf("failed to create cloud storage client: %v", err)
}
defer client.Close()
if err = uploadGCSObject(ctx, client, resultsURL, bytes.NewReader(out)); err != nil {
log.Fatalf("failed to upload test result: %v", err)
}
vmInfoProto := &vm_pb.Vm{
Test: &vm_pb.Vm_Test{
TestSuite: proto.String(testSuiteName),
TestRegex: proto.String(testRun),
},
Name: proto.String(name),
Id: proto.String(id),
Zone: proto.String(zone),
MachineType: proto.String(machineType),
}
vmInfo, err := proto.Marshal(vmInfoProto)
if err != nil {
log.Fatalf("failed to marshal vm info proto: %v", err)
}
if err = uploadGCSObject(ctx, client, propertiesURL, bytes.NewReader(vmInfo)); err != nil {
log.Fatalf("failed to upload vm info: %v", err)
}
}