cloudapi: Use distro repos if none included in imageRequest

In order to support cloudapi blueprint requests from the cmdline using
composer-cli it needs to select the repositories based on the selected
distribution instead of requiring the user to include them with the
request.

If the image request includes repositories they are used, which matches
the current behavior. If the repository list is empty it will use the
distribution name to select from the repositories shipped with
osbuild-composer.
This commit is contained in:
Brian C. Lane 2024-02-02 17:17:49 -08:00 committed by Brian C. Lane
parent 01ba674cac
commit 57ebfb4011
4 changed files with 49 additions and 12 deletions

View file

@ -4,16 +4,17 @@ package v2
import (
"crypto/rand"
"fmt"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/rhsm/facts"
"github.com/osbuild/osbuild-composer/internal/target"
"math"
"math/big"
"reflect"
"github.com/osbuild/images/pkg/disk"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/reporegistry"
"github.com/osbuild/images/pkg/rhsm/facts"
"github.com/osbuild/images/pkg/subscription"
"github.com/osbuild/osbuild-composer/internal/blueprint"
"github.com/osbuild/osbuild-composer/internal/target"
)
// Return the string representation of the partitioning mode
@ -944,7 +945,7 @@ func (request *ComposeRequest) GetPartitioningMode() (disk.PartitioningMode, err
// GetImageRequests converts a composeRequest structure from the API to an intermediate imageRequest structure
// that's used for generating manifests and orchestrating worker jobs.
func (request *ComposeRequest) GetImageRequests(distroFactory *distrofactory.Factory) ([]imageRequest, error) {
func (request *ComposeRequest) GetImageRequests(distroFactory *distrofactory.Factory, repoRegistry *reporegistry.RepoRegistry) ([]imageRequest, error) {
distribution := distroFactory.GetDistro(request.Distribution)
if distribution == nil {
return nil, HTTPError(ErrorUnsupportedDistribution)
@ -1002,6 +1003,15 @@ func (request *ComposeRequest) GetImageRequests(distroFactory *distrofactory.Fac
return nil, err
}
// If no repositories are included with the imageRequest use the defaults for the distro
if len(ir.Repositories) == 0 {
dr, err := repoRegistry.ReposByImageTypeName(request.Distribution, arch.Name(), imageType.Name())
if err != nil {
return nil, err
}
repos = append(repos, dr...)
}
// Get the initial ImageOptions with image size set
imageOptions := ir.GetImageOptions(imageType, bp)

View file

@ -1,14 +1,15 @@
package v2
import (
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/osbuild-composer/internal/target"
"testing"
"github.com/osbuild/images/pkg/disk"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/reporegistry"
"github.com/osbuild/images/pkg/subscription"
"github.com/osbuild/osbuild-composer/internal/blueprint"
"github.com/osbuild/osbuild-composer/internal/common"
"github.com/osbuild/osbuild-composer/internal/target"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -647,6 +648,7 @@ func TestGetImageRequests_ImageTypeConversion(t *testing.T) {
expectedTargetName: target.TargetNameAWSS3,
},
}
for _, tt := range tests {
t.Run(string(tt.requestedImageType), func(t *testing.T) {
for _, d := range tt.requestedDistros {
@ -657,16 +659,42 @@ func TestGetImageRequests_ImageTypeConversion(t *testing.T) {
Architecture: "x86_64",
ImageType: tt.requestedImageType,
UploadOptions: &uo,
Repositories: []Repository{
Repository{
Baseurl: common.ToPtr("http://example.org/pub/linux/repo"),
},
},
},
}
got, err := request.GetImageRequests(distrofactory.NewDefault())
// NOTE: repoRegistry can be nil as long as ImageRequest.Repositories has data
got, err := request.GetImageRequests(distrofactory.NewDefault(), nil)
assert.NoError(t, err)
assert.Len(t, got, 1)
require.Len(t, got, 1)
assert.Equal(t, tt.expectedImageType, got[0].imageType.Name())
assert.Len(t, got[0].targets, 1)
require.Len(t, got[0].targets, 1)
assert.Equal(t, tt.expectedTargetName, got[0].targets[0].Name)
}
})
}
}
func TestGetImageRequests_NoRepositories(t *testing.T) {
uo := UploadOptions(struct{}{})
request := &ComposeRequest{
Distribution: "fedora-40",
ImageRequest: &ImageRequest{
Architecture: "x86_64",
ImageType: ImageTypesAws,
UploadOptions: &uo,
Repositories: []Repository{},
},
}
// NOTE: current directory is the location of this file, back up so it can use ./repositories/
rr, err := reporegistry.New([]string{"../../../"})
require.NoError(t, err)
got, err := request.GetImageRequests(distrofactory.NewDefault(), rr)
assert.NoError(t, err)
require.Len(t, got, 1)
assert.Greater(t, len(got[0].repositories), 0)
}

View file

@ -4,7 +4,6 @@ package v2
import (
"encoding/json"
"fmt"
"github.com/osbuild/osbuild-composer/internal/blueprint"
"net/http"
"os"
"strconv"
@ -17,6 +16,7 @@ import (
"github.com/osbuild/images/pkg/manifest"
"github.com/osbuild/images/pkg/osbuild"
"github.com/osbuild/images/pkg/rpmmd"
"github.com/osbuild/osbuild-composer/internal/blueprint"
"github.com/osbuild/osbuild-composer/internal/common"
"github.com/osbuild/osbuild-composer/internal/target"
"github.com/osbuild/osbuild-composer/internal/worker"
@ -153,7 +153,7 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error {
return HTTPErrorWithInternal(ErrorTenantNotFound, err)
}
irs, err := request.GetImageRequests(h.server.distros)
irs, err := request.GetImageRequests(h.server.distros, h.server.repos)
if err != nil {
return err
}

View file

@ -35,7 +35,6 @@ func newV2Server(t *testing.T, dir string, depsolveChannels []string, enableJWT
distros := distrofactory.NewTestDefault()
require.NotNil(t, distros)
// TODO pass it a real path?
repos, err := reporegistry.NewTestedDefault()
require.Nil(t, err)
require.NotNil(t, repos)