func FetchAmigoBakePackages()

in resources/services/table.go [56:135]


func FetchAmigoBakePackages(_ context.Context, meta schema.ClientMeta, _ *schema.Resource, res chan<- any) error {
	cl := meta.(*client.Client)
	s3Store := cl.S3Store
	bakesTable := cl.BakesTable
	recipesTable := cl.RecipesTable
	baseImagesTable := cl.BaseImagesTable

	allBakes := bakesTable.ListAll()

	allRecipes := map[string]AmigoRecipe{}
	for _, recipe := range recipesTable.ListAll() {
		id := recipe["id"].(*types.AttributeValueMemberS).Value
		baseName := recipe["baseImageId"].(*types.AttributeValueMemberS).Value
		allRecipes[id] = AmigoRecipe{
			RecipeId: id,
			BaseName: baseName,
		}
	}

	allBaseImages := map[string]AmigoBaseImage{}
	for _, baseImgAttribs := range baseImagesTable.ListAll() {
		baseImage := toAmigoBaseImage(baseImgAttribs)
		allBaseImages[baseImage.BaseName] = baseImage
	}

	records := map[string]AmigoBakePackage{}
	for _, bake := range allBakes {
		recipeId := bake["recipeId"].(*types.AttributeValueMemberS).Value
		bakeNumber, err := strconv.Atoi(bake["buildNumber"].(*types.AttributeValueMemberN).Value)
		if err != nil {
			log.Printf("Failed to convert buildNumber to int: %v", err)
			continue
		}
		status := bake["status"].(*types.AttributeValueMemberS).Value
		startedAt := bake["startedAt"].(*types.AttributeValueMemberS).Value
		startedBy := bake["startedBy"].(*types.AttributeValueMemberS).Value

		// Skip if bake doesn't have an AMI ID
		var amiId string
		if amiIdAttrib, ok := bake["amiId"]; ok {
			amiId = amiIdAttrib.(*types.AttributeValueMemberS).Value
		} else {
			log.Printf("Skipping bake without AMI ID: recipeId: '%v', bakeId: '%v', status: '%v'\n", recipeId, bakeNumber, status)
			continue
		}

		recipe := allRecipes[recipeId]
		baseImage := allBaseImages[recipe.BaseName]

		// Fetch corresponding package file from S3
		packages, err := fetchBakePackages(recipeId, bakeNumber, s3Store)
		if err != nil {
			log.Fatalf("Error fetching bake packages for recipe '%s', bake '%d': %v", recipeId, bakeNumber, err)
		}

		// Create a record for each package
		for _, pkg := range packages {
			key := fmt.Sprintf("%s--%d--%s--%s", recipeId, bakeNumber, amiId, pkg.PackageName)
			bakePackage := AmigoBakePackage{
				BaseName:       recipe.BaseName,
				BaseAmiId:      baseImage.BaseAmiId,
				BaseEolDate:    baseImage.BaseEolDate,
				RecipeId:       recipeId,
				BakeNumber:     bakeNumber,
				SourceAmiId:    amiId,
				StartedBy:      startedBy,
				PackageName:    pkg.PackageName,
				PackageVersion: pkg.PackageVersion,
			}
			bakePackage.SetStartedAt(startedAt)
			records[key] = bakePackage
		}
	}

	for _, record := range records {
		res <- record
	}

	return nil
}