func Run()

in container_images/gce-img-resource/check/check_command.go [36:121]


func Run(request Request) (Response, error) {
	ctx := context.Background()
	computeService, err := compute.NewService(ctx)
	if err != nil {
		return Response{}, err
	}

	call := computeService.Images.List(request.Source.Project)

	var filter []string

	if request.Source.ReadyOnly {
		filter = append(filter, "(status = READY)")
	}

	if request.Source.Family != "" {
		filter = append(filter, fmt.Sprintf("(family = %s)", request.Source.Family))
	}

	if len(filter) > 0 {
		call = call.Filter(strings.Join(filter, " "))
	}

	var images []*compute.Image
	var token string
	for il, err := call.PageToken(token).Do(); ; il, err = call.PageToken(token).Do() {
		if err != nil {
			return Response{}, err
		}
		images = append(images, il.Items...)
		if il.NextPageToken == "" {
			break
		}
		token = il.NextPageToken
	}

	// "By default, results are returned in alphanumerical order based on the resource name."
	// - https://cloud.google.com/compute/docs/reference/rest/v1/images/list

	// "[the] check script...must print the array of new versions, in chronological order (oldest first)"
	// - https://concourse-ci.org/implementing-resource-types.html

	sort.Slice(images, func(i, j int) bool {
		// image.CreationTimestamp is a string in rfc3339 format.
		itime, _ := time.Parse(time.RFC3339, images[i].CreationTimestamp)
		jtime, _ := time.Parse(time.RFC3339, images[j].CreationTimestamp)

		return itime.Unix() < jtime.Unix()
	})

	// No version specified, return only the latest image.
	if request.Version.Name == "" && len(images) > 0 {
		image := images[len(images)-1]

		version, err := mkVersion(image.Name, image.CreationTimestamp)
		if err != nil {
			return Response{}, err
		}

		return Response{version}, nil
	}

	// Requested version must at least be included in the response.
	response := Response{request.Version}

	var start bool
	for _, image := range images {
		if image.Name == request.Version.Name {
			// Start appending from the image after the matching version, aka 'newer'.
			start = true
			continue
		}
		if image.Deprecated != nil && image.Deprecated.State == "DEPRECATED" {
			continue
		}
		if start {
			version, err := mkVersion(image.Name, image.CreationTimestamp)
			if err != nil {
				return Response{}, err
			}
			response = append(response, version)
		}
	}

	return response, nil
}