mirror of
https://github.com/siderolabs/image-factory.git
synced 2025-09-21 22:01:09 +02:00
Pull in fixes from Talos, rekres, add a test for overlay installer generation. Due to the nature of the fixes, the first fully working installer should come with the next release of Talos Linux. Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package http
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/blang/semver/v4"
|
|
"github.com/julienschmidt/httprouter"
|
|
"github.com/siderolabs/gen/xslices"
|
|
"github.com/siderolabs/talos/pkg/machinery/imager/quirks"
|
|
|
|
"github.com/siderolabs/image-factory/internal/artifacts"
|
|
"github.com/siderolabs/image-factory/pkg/client"
|
|
)
|
|
|
|
// handleVersions handles list of Talos versions available.
|
|
func (f *Frontend) handleVersions(ctx context.Context, w http.ResponseWriter, _ *http.Request, _ httprouter.Params) error {
|
|
versions, err := f.artifactsManager.GetTalosVersions(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return json.NewEncoder(w).Encode(
|
|
xslices.Map(versions, func(v semver.Version) string {
|
|
return "v" + v.String()
|
|
}),
|
|
)
|
|
}
|
|
|
|
// handleOfficialExtensions handles list of available official extensions per Talos version.
|
|
func (f *Frontend) handleOfficialExtensions(ctx context.Context, w http.ResponseWriter, _ *http.Request, p httprouter.Params) error {
|
|
versionTag := p.ByName("version")
|
|
if !strings.HasPrefix(versionTag, "v") {
|
|
versionTag = "v" + versionTag
|
|
}
|
|
|
|
version, err := semver.Parse(versionTag[1:])
|
|
if err != nil {
|
|
return fmt.Errorf("error parsing version: %w", err)
|
|
}
|
|
|
|
extensions, err := f.artifactsManager.GetOfficialExtensions(ctx, version.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return json.NewEncoder(w).Encode(
|
|
xslices.Map(extensions, func(e artifacts.ExtensionRef) client.ExtensionInfo {
|
|
return client.ExtensionInfo{
|
|
Name: e.TaggedReference.RepositoryStr(),
|
|
Ref: e.TaggedReference.String(),
|
|
Digest: e.Digest,
|
|
Author: e.Author,
|
|
Description: e.Description,
|
|
}
|
|
}),
|
|
)
|
|
}
|
|
|
|
// handleOfficialOverlays handles list of available official overlays per Talos version.
|
|
func (f *Frontend) handleOfficialOverlays(ctx context.Context, w http.ResponseWriter, _ *http.Request, p httprouter.Params) error {
|
|
versionTag := p.ByName("version")
|
|
if !strings.HasPrefix(versionTag, "v") {
|
|
versionTag = "v" + versionTag
|
|
}
|
|
|
|
version, err := semver.Parse(versionTag[1:])
|
|
if err != nil {
|
|
return fmt.Errorf("error parsing version: %w", err)
|
|
}
|
|
|
|
if !quirks.New(version.String()).SupportsOverlay() {
|
|
return json.NewEncoder(w).Encode([]client.OverlayInfo{})
|
|
}
|
|
|
|
overlays, err := f.artifactsManager.GetOfficialOverlays(ctx, version.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return json.NewEncoder(w).Encode(
|
|
xslices.Map(overlays, func(e artifacts.OverlayRef) client.OverlayInfo {
|
|
return client.OverlayInfo{
|
|
Name: e.Name,
|
|
Image: e.TaggedReference.RepositoryStr(),
|
|
Ref: e.TaggedReference.String(),
|
|
Digest: e.Digest,
|
|
}
|
|
}),
|
|
)
|
|
}
|