| package input |
| |
| import ( |
| "bytes" |
| "encoding/json" |
| // "fmt" |
| "io/ioutil" |
| "log" |
| "net/http" |
| "path/filepath" |
| "strings" |
| ) |
| |
| const timeOut = "7200" |
| const imageFormat = "vmdk" |
| const name = "gcr.io/compute-image-tools/gce_vm_image_export:release" |
| |
| type Steps struct { |
| Args [6]string `json:"args"` |
| Name string `json:"name"` |
| Env [1]string `json:"env"` |
| } |
| |
| type GcePayload struct { |
| Timeout string `json:"timeout"` |
| Steps [1]Steps `json:"steps"` |
| Tags [2]string `json:"tags"` |
| } |
| |
| // gceExport calls the cloud build REST api that exports a public compute |
| // image to a specfic GCS bucket. |
| // Input: |
| // (string) projectID - project ID of the cloud project holding the image |
| // (string) bucket - name of the GCS bucket holding the COS Image |
| // (string) image - name of the source image to be exported |
| // Output: None |
| func gceExport(projectID, bucket, image string) error { |
| // API Variables |
| gceURL := "https://cloudbuild.googleapis.com/v1/projects/" + projectID + "/builds" |
| destURI := "gs://" + bucket + "/" + image + "." + imageFormat |
| args := [6]string{"-oauth=/usr/local/google/home/acueva/cos-googlesource/tools/src/cmd/cos_image_analyzer/internal/utilities/oauth.json", "-timeout=" + timeOut, "-source_image=" + image, "-client_id=api", "-format=" + imageFormat, "-destination_uri=" + destURI} |
| env := [1]string{"BUILD_ID=$BUILD_ID"} |
| tags := [2]string{"gce-daisy", "gce-daisy-image-export"} |
| |
| // Build API bodies |
| steps := [1]Steps{Steps{Args: args, Name: name, Env: env}} |
| payload := &GcePayload{ |
| Timeout: timeOut, |
| Steps: steps, |
| Tags: tags} |
| |
| requestBody, err := json.Marshal(payload) |
| if err != nil { |
| return err |
| } |
| log.Println(string(requestBody)) |
| |
| resp, err := http.Post(gceURL, "application/json", bytes.NewBuffer(requestBody)) |
| if err != nil { |
| return err |
| } |
| defer resp.Body.Close() |
| |
| body, err := ioutil.ReadAll(resp.Body) |
| if err != nil { |
| return err |
| } |
| |
| log.Println(string(body)) |
| return nil |
| } |
| |
| // GetCosImage calls the cloud build api to export a public COS image to a |
| // a GCS bucket and then calls GetGcsImage() to download that image from GCS. |
| // ADC is used for authorization. |
| // Input: |
| // (string) cosCloudPath - The "projectID/gcs-bucket/image" path of the |
| // source image to be exported |
| // Output: |
| // (string) imageDir - Path to the mounted directory of the COS Image |
| func GetCosImage(cosCloudPath string) (string, error) { |
| spiltPath := strings.Split(cosCloudPath, "/") |
| projectID, bucket, image := spiltPath[0], spiltPath[1], spiltPath[2] |
| |
| if err := gceExport(projectID, bucket, image); err != nil { |
| return "", err |
| } |
| |
| gcsPath := filepath.Join(bucket, image) |
| imageDir, err := GetGcsImage(gcsPath, 1) |
| if err != nil { |
| return "", err |
| } |
| |
| return imageDir, nil |
| } |