@@ -34,7 +34,7 @@ func (s *ApiService) ListInstances(ctx context.Context, request oapi.ListInstanc
3434 filter .State = & state
3535 }
3636 if request .Params .Metadata != nil {
37- filter .Metadata = * request .Params .Metadata
37+ filter .Metadata = toMapMetadata ( request .Params .Metadata )
3838 }
3939 }
4040
@@ -127,7 +127,7 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst
127127
128128 metadata := make (map [string ]string )
129129 if request .Body .Metadata != nil {
130- metadata = * request .Body .Metadata
130+ metadata = toMapMetadata ( request .Body .Metadata )
131131 }
132132
133133 // Parse network enabled (default: true)
@@ -288,6 +288,11 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst
288288 Code : "insufficient_resources" ,
289289 Message : err .Error (),
290290 }, nil
291+ case errors .Is (err , instances .ErrInvalidRequest ):
292+ return oapi.CreateInstance400JSONResponse {
293+ Code : "invalid_request" ,
294+ Message : err .Error (),
295+ }, nil
291296 default :
292297 log .ErrorContext (ctx , "failed to create instance" , "error" , err , "image" , request .Body .Image )
293298 return oapi.CreateInstance500JSONResponse {
@@ -791,23 +796,21 @@ func instanceToOAPI(inst instances.Instance) oapi.Instance {
791796 uploadBwStr = & s
792797 }
793798
794- // Build network object with ip/mac and bandwidth nested inside
795- netObj := & struct {
796- BandwidthDownload * string `json:"bandwidth_download,omitempty"`
797- BandwidthUpload * string `json:"bandwidth_upload,omitempty"`
798- Enabled * bool `json:"enabled,omitempty"`
799- Ip * string `json:"ip"`
800- Mac * string `json:"mac"`
801- Name * string `json:"name,omitempty"`
802- }{
803- Enabled : lo .ToPtr (inst .NetworkEnabled ),
804- BandwidthDownload : downloadBwStr ,
805- BandwidthUpload : uploadBwStr ,
799+ // Build network payload as JSON to avoid compile-time coupling to
800+ // generated anonymous struct tags in oapi.Instance.Network.
801+ networkPayload := map [string ]any {
802+ "enabled" : inst .NetworkEnabled ,
803+ }
804+ if downloadBwStr != nil {
805+ networkPayload ["bandwidth_download" ] = * downloadBwStr
806+ }
807+ if uploadBwStr != nil {
808+ networkPayload ["bandwidth_upload" ] = * uploadBwStr
806809 }
807810 if inst .NetworkEnabled {
808- netObj . Name = lo . ToPtr ( "default" )
809- netObj . Ip = lo . ToPtr ( inst .IP )
810- netObj . Mac = lo . ToPtr ( inst .MAC )
811+ networkPayload [ "name" ] = "default"
812+ networkPayload [ "ip" ] = inst .IP
813+ networkPayload [ "mac" ] = inst .MAC
811814 }
812815
813816 // Convert hypervisor type
@@ -831,7 +834,7 @@ func instanceToOAPI(inst instances.Instance) oapi.Instance {
831834 OverlaySize : lo .ToPtr (overlaySizeStr ),
832835 Vcpus : lo .ToPtr (inst .Vcpus ),
833836 DiskIoBps : diskIoBpsStr ,
834- Network : netObj ,
837+ Network : nil ,
835838 CreatedAt : inst .CreatedAt ,
836839 StartedAt : inst .StartedAt ,
837840 StoppedAt : inst .StoppedAt ,
@@ -840,6 +843,10 @@ func instanceToOAPI(inst instances.Instance) oapi.Instance {
840843 Hypervisor : & hvType ,
841844 }
842845
846+ if b , err := json .Marshal (networkPayload ); err == nil {
847+ _ = json .Unmarshal (b , & oapiInst .Network )
848+ }
849+
843850 if inst .ExitMessage != "" {
844851 oapiInst .ExitMessage = lo .ToPtr (inst .ExitMessage )
845852 }
@@ -849,7 +856,7 @@ func instanceToOAPI(inst instances.Instance) oapi.Instance {
849856 }
850857
851858 if len (inst .Metadata ) > 0 {
852- oapiInst .Metadata = & inst .Metadata
859+ oapiInst .Metadata = toOAPIMetadata ( inst .Metadata )
853860 }
854861
855862 // Convert volume attachments
0 commit comments