// GetUploadStatus returns status of upload file func GetUploadStatus(client *devicefarm.DeviceFarm, arn string) string { params := &devicefarm.GetUploadInput{ Arn: aws.String(arn), } resp, err := client.GetUpload(params) errors.Validate(err, "Failed to get status of upload") log.Println("Status of upload:", *resp.Upload.Status) return *resp.Upload.Status }
/* Get Upload Info */ func uploadInfo(svc *devicefarm.DeviceFarm, uploadArn string) { uploadReq := &devicefarm.GetUploadInput{ Arn: aws.String(uploadArn), } resp, err := svc.GetUpload(uploadReq) failOnErr(err, "error getting upload info") fmt.Println(awsutil.Prettify(resp)) }
/* Upload a file */ func uploadPut(svc *devicefarm.DeviceFarm, uploadFilePath string, uploadType string, projectArn string, uploadName string) (upload *devicefarm.Upload, err error) { debug := true // Read File file, err := os.Open(uploadFilePath) if err != nil { return nil, err fmt.Println(err) } defer file.Close() // Get file size fileInfo, _ := file.Stat() var fileSize int64 = fileInfo.Size() // read file content to buffer buffer := make([]byte, fileSize) file.Read(buffer) fileBytes := bytes.NewReader(buffer) // convert to io.ReadSeeker type // Prepare upload if uploadName == "" { uploadName = path.Base(uploadFilePath) } uploadReq := &devicefarm.CreateUploadInput{ Name: aws.String(uploadName), ProjectArn: aws.String(projectArn), Type: aws.String(uploadType), ContentType: aws.String("application/octet-stream"), } uploadResp, err := svc.CreateUpload(uploadReq) if err != nil { log.Fatal(err) return nil, err } uploadInfo := uploadResp.Upload upload_url := *uploadInfo.Url if debug { fmt.Println("- Upload Response result:") fmt.Println(awsutil.Prettify(uploadResp)) fmt.Println(upload_url) } req, err := http.NewRequest("PUT", upload_url, fileBytes) if err != nil { log.Fatal(err) return nil, err } // Remove Host and split to get [0] = path & [1] = querystring strippedUrl := strings.Split(strings.Replace(upload_url, "https://prod-us-west-2-uploads.s3-us-west-2.amazonaws.com/", "/", -1), "?") req.URL.Opaque = strippedUrl[0] req.URL.RawQuery = strippedUrl[1] req.Header.Set("Content-Type", "application/octet-stream") req.Header.Add("Content-Length", strconv.FormatInt(fileSize, 10)) // Debug Request to AWS if debug { fmt.Println("- HTTP Upload Request") debugHTTP(httputil.DumpRequestOut(req, false)) } client := &http.Client{} res, err := client.Do(req) if debug { fmt.Println("- HTTP Upload Response") dump, _ := httputil.DumpResponse(res, true) log.Printf("} -> %s\n", dump) } if err != nil { log.Fatal(err) return nil, err } defer res.Body.Close() status := "" for status != "SUCCEEDED" { fmt.Print(".") time.Sleep(4 * time.Second) uploadReq := &devicefarm.GetUploadInput{ Arn: uploadInfo.Arn, } resp, err := svc.GetUpload(uploadReq) if err != nil { return nil, err } status = *resp.Upload.Status } fmt.Println("uploadPut is succeeded") return uploadResp.Upload, nil }