Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions cmd/api/api/builds.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func (s *ApiService) ListBuilds(ctx context.Context, request oapi.ListBuildsRequ

oapiBuilds := make([]oapi.Build, 0, len(domainBuilds))
for _, b := range domainBuilds {
if b == nil || !matchesMetadataFilter(b.Metadata, request.Params.Metadata) {
if b == nil || !matchesTagsFilter(b.Tags, request.Params.Tags) {
continue
}
oapiBuilds = append(oapiBuilds, buildToOAPI(b))
Expand All @@ -50,7 +50,7 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe
var timeoutSeconds, memoryMB, cpus int
var isAdminBuild bool
var secrets []builds.SecretRef
var metadata map[string]string
var resourceTags map[string]string

for {
part, err := request.Body.NextPart()
Expand Down Expand Up @@ -174,22 +174,22 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe
}, nil
}
imageName = string(data)
case "metadata":
case "tags":
data, err := io.ReadAll(part)
if err != nil {
return oapi.CreateBuild400JSONResponse{
Code: "invalid_request",
Message: "failed to read metadata field",
Message: "failed to read tags field",
}, nil
}
parsed, err := parseMetadataJSON(string(data))
parsed, err := parseTagsJSON(string(data))
if err != nil {
return oapi.CreateBuild400JSONResponse{
Code: "invalid_request",
Message: "metadata must be a JSON object with string key-value pairs",
Message: "tags must be a JSON object with string key-value pairs",
}, nil
}
metadata = parsed
resourceTags = parsed
}
part.Close()
}
Expand Down Expand Up @@ -224,7 +224,7 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe
IsAdminBuild: isAdminBuild,
GlobalCacheKey: globalCacheKey,
ImageName: imageName,
Metadata: metadata,
Tags: resourceTags,
}

// Apply build policy if any field was provided
Expand All @@ -245,7 +245,7 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe
build, err := s.BuildManager.CreateBuild(ctx, domainReq, sourceData)
if err != nil {
switch {
case errors.Is(err, tags.ErrInvalidMetadata):
case errors.Is(err, tags.ErrInvalidTags):
return oapi.CreateBuild400JSONResponse{
Code: "invalid_request",
Message: err.Error(),
Expand Down Expand Up @@ -386,7 +386,7 @@ func buildToOAPI(b *builds.Build) oapi.Build {
oapiBuild := oapi.Build{
Id: b.ID,
Status: oapi.BuildStatus(b.Status),
Metadata: toOAPIMetadata(b.Metadata),
Tags: toOAPITags(b.Tags),
QueuePosition: b.QueuePosition,
ImageDigest: b.ImageDigest,
ImageRef: b.ImageRef,
Expand Down
8 changes: 4 additions & 4 deletions cmd/api/api/devices.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (s *ApiService) ListDevices(ctx context.Context, request oapi.ListDevicesRe

result := make([]oapi.Device, 0, len(deviceList))
for _, d := range deviceList {
if !matchesMetadataFilter(d.Metadata, request.Params.Metadata) {
if !matchesTagsFilter(d.Tags, request.Params.Tags) {
continue
}
result = append(result, deviceToOAPI(d))
Expand Down Expand Up @@ -57,13 +57,13 @@ func (s *ApiService) CreateDevice(ctx context.Context, request oapi.CreateDevice
req := devices.CreateDeviceRequest{
Name: name,
PCIAddress: request.Body.PciAddress,
Metadata: toMapMetadata(request.Body.Metadata),
Tags: toMapTags(request.Body.Tags),
}

device, err := s.DeviceManager.CreateDevice(ctx, req)
if err != nil {
switch {
case errors.Is(err, tags.ErrInvalidMetadata):
case errors.Is(err, tags.ErrInvalidTags):
return oapi.CreateDevice400JSONResponse{
Code: "invalid_request",
Message: err.Error(),
Expand Down Expand Up @@ -152,7 +152,7 @@ func deviceToOAPI(d devices.Device) oapi.Device {
Id: d.Id,
Name: &d.Name,
Type: deviceType,
Metadata: toOAPIMetadata(d.Metadata),
Tags: toOAPITags(d.Tags),
PciAddress: d.PCIAddress,
VendorId: d.VendorID,
DeviceId: d.DeviceID,
Expand Down
12 changes: 6 additions & 6 deletions cmd/api/api/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func (s *ApiService) ListImages(ctx context.Context, request oapi.ListImagesRequ

oapiImages := make([]oapi.Image, 0, len(domainImages))
for _, img := range domainImages {
if !matchesMetadataFilter(img.Metadata, request.Params.Metadata) {
if !matchesTagsFilter(img.Tags, request.Params.Tags) {
continue
}
oapiImages = append(oapiImages, imageToOAPI(img))
Expand All @@ -37,14 +37,14 @@ func (s *ApiService) CreateImage(ctx context.Context, request oapi.CreateImageRe
log := logger.FromContext(ctx)

domainReq := images.CreateImageRequest{
Name: request.Body.Name,
Metadata: toMapMetadata(request.Body.Metadata),
Name: request.Body.Name,
Tags: toMapTags(request.Body.Tags),
}

img, err := s.ImageManager.CreateImage(ctx, domainReq)
if err != nil {
switch {
case errors.Is(err, tags.ErrInvalidMetadata):
case errors.Is(err, tags.ErrInvalidTags):
return oapi.CreateImage400JSONResponse{
Code: "invalid_request",
Message: err.Error(),
Expand Down Expand Up @@ -126,8 +126,8 @@ func imageToOAPI(img images.Image) oapi.Image {
if len(img.Env) > 0 {
oapiImg.Env = &img.Env
}
if len(img.Metadata) > 0 {
oapiImg.Metadata = toOAPIMetadata(img.Metadata)
if len(img.Tags) > 0 {
oapiImg.Tags = toOAPITags(img.Tags)
}
if img.WorkingDir != "" {
oapiImg.WorkingDir = &img.WorkingDir
Expand Down
10 changes: 5 additions & 5 deletions cmd/api/api/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func (s *ApiService) ListIngresses(ctx context.Context, request oapi.ListIngress

oapiIngresses := make([]oapi.Ingress, 0, len(ingresses))
for _, ing := range ingresses {
if !matchesMetadataFilter(ing.Metadata, request.Params.Metadata) {
if !matchesTagsFilter(ing.Tags, request.Params.Tags) {
continue
}
oapiIngresses = append(oapiIngresses, ingressToOAPI(ing))
Expand All @@ -40,9 +40,9 @@ func (s *ApiService) CreateIngress(ctx context.Context, request oapi.CreateIngre

// Convert OAPI request to domain request
domainReq := ingress.CreateIngressRequest{
Name: request.Body.Name,
Metadata: toMapMetadata(request.Body.Metadata),
Rules: make([]ingress.IngressRule, len(request.Body.Rules)),
Name: request.Body.Name,
Tags: toMapTags(request.Body.Tags),
Rules: make([]ingress.IngressRule, len(request.Body.Rules)),
}

for i, rule := range request.Body.Rules {
Expand Down Expand Up @@ -184,7 +184,7 @@ func ingressToOAPI(ing ingress.Ingress) oapi.Ingress {
return oapi.Ingress{
Id: ing.ID,
Name: ing.Name,
Metadata: toOAPIMetadata(ing.Metadata),
Tags: toOAPITags(ing.Tags),
Rules: rules,
CreatedAt: ing.CreatedAt,
}
Expand Down
20 changes: 10 additions & 10 deletions cmd/api/api/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,20 @@ import (
"github.com/samber/lo"
)

// ListInstances lists instances, optionally filtered by state and/or metadata.
// ListInstances lists instances, optionally filtered by state and/or tags.
func (s *ApiService) ListInstances(ctx context.Context, request oapi.ListInstancesRequestObject) (oapi.ListInstancesResponseObject, error) {
log := logger.FromContext(ctx)

// Convert OAPI params to domain filter
var filter *instances.ListInstancesFilter
if request.Params.State != nil || request.Params.Metadata != nil {
if request.Params.State != nil || request.Params.Tags != nil {
filter = &instances.ListInstancesFilter{}
if request.Params.State != nil {
state := instances.State(*request.Params.State)
filter.State = &state
}
if request.Params.Metadata != nil {
filter.Metadata = toMapMetadata(request.Params.Metadata)
if request.Params.Tags != nil {
filter.Tags = toMapTags(request.Params.Tags)
}
}

Expand Down Expand Up @@ -125,9 +125,9 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst
env = *request.Body.Env
}

metadata := make(map[string]string)
if request.Body.Metadata != nil {
metadata = toMapMetadata(request.Body.Metadata)
resourceTags := make(map[string]string)
if request.Body.Tags != nil {
resourceTags = toMapTags(request.Body.Tags)
}

// Parse network enabled (default: true)
Expand Down Expand Up @@ -253,7 +253,7 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst
NetworkBandwidthDownload: networkBandwidthDownload,
NetworkBandwidthUpload: networkBandwidthUpload,
Env: env,
Metadata: metadata,
Tags: resourceTags,
NetworkEnabled: networkEnabled,
Devices: deviceRefs,
Volumes: volumes,
Expand Down Expand Up @@ -855,8 +855,8 @@ func instanceToOAPI(inst instances.Instance) oapi.Instance {
oapiInst.Env = &inst.Env
}

if len(inst.Metadata) > 0 {
oapiInst.Metadata = toOAPIMetadata(inst.Metadata)
if len(inst.Tags) > 0 {
oapiInst.Tags = toOAPITags(inst.Tags)
}

// Convert volume attachments
Expand Down
26 changes: 13 additions & 13 deletions cmd/api/api/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,35 +8,35 @@ import (
"github.com/kernel/hypeman/lib/tags"
)

func toMapMetadata(metadata *oapi.MetadataTags) map[string]string {
if metadata == nil {
func toMapTags(resourceTags *oapi.Tags) map[string]string {
if resourceTags == nil {
return nil
}
return tags.Clone(map[string]string(*metadata))
return tags.Clone(map[string]string(*resourceTags))
}

func toOAPIMetadata(metadata map[string]string) *oapi.MetadataTags {
if len(metadata) == 0 {
func toOAPITags(resourceTags map[string]string) *oapi.Tags {
if len(resourceTags) == 0 {
return nil
}
cloned := oapi.MetadataTags(tags.Clone(metadata))
cloned := oapi.Tags(tags.Clone(resourceTags))
return &cloned
}

func matchesMetadataFilter(metadata map[string]string, filter *oapi.MetadataTags) bool {
func matchesTagsFilter(resourceTags map[string]string, filter *oapi.Tags) bool {
if filter == nil {
return true
}
return tags.Matches(metadata, map[string]string(*filter))
return tags.Matches(resourceTags, map[string]string(*filter))
}

func parseMetadataJSON(raw string) (map[string]string, error) {
func parseTagsJSON(raw string) (map[string]string, error) {
if raw == "" {
return nil, nil
}
var metadata map[string]string
if err := json.Unmarshal([]byte(raw), &metadata); err != nil {
return nil, fmt.Errorf("parse metadata JSON: %w", err)
var resourceTags map[string]string
if err := json.Unmarshal([]byte(raw), &resourceTags); err != nil {
return nil, fmt.Errorf("parse tags JSON: %w", err)
}
return metadata, nil
return resourceTags, nil
}
14 changes: 7 additions & 7 deletions cmd/api/api/snapshots.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ func (s *ApiService) CreateInstanceSnapshot(ctx context.Context, request oapi.Cr
}

result, err := s.InstanceManager.CreateSnapshot(ctx, inst.Id, instances.CreateSnapshotRequest{
Kind: instances.SnapshotKind(request.Body.Kind),
Name: name,
Metadata: toMapMetadata(request.Body.Metadata),
Kind: instances.SnapshotKind(request.Body.Kind),
Name: name,
Tags: toMapTags(request.Body.Tags),
})
if err != nil {
log := logger.FromContext(ctx)
Expand Down Expand Up @@ -105,10 +105,10 @@ func (s *ApiService) ListSnapshots(ctx context.Context, request oapi.ListSnapsho
if request.Params.Name != nil {
filter.Name = request.Params.Name
}
if request.Params.Metadata != nil {
filter.Metadata = toMapMetadata(request.Params.Metadata)
if request.Params.Tags != nil {
filter.Tags = toMapTags(request.Params.Tags)
}
if filter.SourceInstanceID == nil && filter.Kind == nil && filter.Name == nil && len(filter.Metadata) == 0 {
if filter.SourceInstanceID == nil && filter.Kind == nil && filter.Name == nil && len(filter.Tags) == 0 {
filter = nil
}

Expand Down Expand Up @@ -199,7 +199,7 @@ func snapshotToOAPI(snapshot instances.Snapshot) oapi.Snapshot {
out := oapi.Snapshot{
Id: snapshot.Id,
Kind: kind,
Metadata: toOAPIMetadata(snapshot.Metadata),
Tags: toOAPITags(snapshot.Tags),
SourceInstanceId: snapshot.SourceInstanceID,
SourceInstanceName: snapshot.SourceName,
SourceHypervisor: sourceHypervisor,
Expand Down
24 changes: 12 additions & 12 deletions cmd/api/api/volumes.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (s *ApiService) ListVolumes(ctx context.Context, request oapi.ListVolumesRe

oapiVols := make([]oapi.Volume, 0, len(domainVols))
for _, vol := range domainVols {
if !matchesMetadataFilter(vol.Metadata, request.Params.Metadata) {
if !matchesTagsFilter(vol.Tags, request.Params.Tags) {
continue
}
oapiVols = append(oapiVols, volumeToOAPI(vol))
Expand All @@ -47,10 +47,10 @@ func (s *ApiService) CreateVolume(ctx context.Context, request oapi.CreateVolume
}

domainReq := volumes.CreateVolumeRequest{
Name: request.Body.Name,
SizeGb: request.Body.SizeGb,
Id: request.Body.Id,
Metadata: toMapMetadata(request.Body.Metadata),
Name: request.Body.Name,
SizeGb: request.Body.SizeGb,
Id: request.Body.Id,
Tags: toMapTags(request.Body.Tags),
}

vol, err := s.VolumeManager.CreateVolume(ctx, domainReq)
Expand All @@ -61,7 +61,7 @@ func (s *ApiService) CreateVolume(ctx context.Context, request oapi.CreateVolume
Message: "volume with this ID already exists",
}, nil
}
if errors.Is(err, tags.ErrInvalidMetadata) {
if errors.Is(err, tags.ErrInvalidTags) {
return oapi.CreateVolume400JSONResponse{
Code: "invalid_request",
Message: err.Error(),
Expand Down Expand Up @@ -99,10 +99,10 @@ func (s *ApiService) CreateVolumeFromArchive(ctx context.Context, request oapi.C

// Create the volume from archive - stream directly without buffering
domainReq := volumes.CreateVolumeFromArchiveRequest{
Name: request.Params.Name,
SizeGb: request.Params.SizeGb,
Id: request.Params.Id,
Metadata: toMapMetadata(request.Params.Metadata),
Name: request.Params.Name,
SizeGb: request.Params.SizeGb,
Id: request.Params.Id,
Tags: toMapTags(request.Params.Tags),
}

vol, err := s.VolumeManager.CreateVolumeFromArchive(ctx, domainReq, request.Body)
Expand All @@ -119,7 +119,7 @@ func (s *ApiService) CreateVolumeFromArchive(ctx context.Context, request oapi.C
Message: "volume with this ID already exists",
}, nil
}
if errors.Is(err, tags.ErrInvalidMetadata) {
if errors.Is(err, tags.ErrInvalidTags) {
return oapi.CreateVolumeFromArchive400JSONResponse{
Code: "invalid_request",
Message: err.Error(),
Expand Down Expand Up @@ -186,7 +186,7 @@ func volumeToOAPI(vol volumes.Volume) oapi.Volume {
Id: vol.Id,
Name: vol.Name,
SizeGb: vol.SizeGb,
Metadata: toOAPIMetadata(vol.Metadata),
Tags: toOAPITags(vol.Tags),
CreatedAt: vol.CreatedAt,
}

Expand Down
Loading
Loading