@@ -6,6 +6,8 @@ package main
66
77import (
88 "fmt"
9+ "io"
10+ "net/http"
911 "net/url"
1012 "os"
1113 "path/filepath"
@@ -87,7 +89,7 @@ func loadSDKVersionFromFile(file string) (string, error) {
8789
8890 sdkVersion := strings .TrimSpace (string (version ))
8991 if sdkVersion == "" {
90- return "" , fmt .Errorf ("sdk version cannot be empty: %s" , file )
92+ return "" , fmt .Errorf ("sdk version cannot be empty: %s" , f )
9193 }
9294
9395 return sdkVersion , nil
@@ -96,28 +98,53 @@ func loadSDKVersionFromFile(file string) (string, error) {
9698func loadAPIFromFile (file string ) (* openapi3.T , error ) {
9799 wd , err := os .Getwd ()
98100 if err != nil {
99- return nil , fmt .Errorf ("error getting current working directory: %v" , err )
100-
101+ return nil , fmt .Errorf ("error getting current working directory: %w" , err )
101102 }
103+
102104 p := filepath .Join (filepath .Dir (wd ), file )
103105 omicronVersion , err := os .ReadFile (p )
104106 if err != nil {
105- return nil , fmt .Errorf ("error retrieving Omicron version: %v" , err )
107+ return nil , fmt .Errorf ("error retrieving omicron version from %s : %w" , p , err )
106108 }
109+
107110 ov := strings .TrimSpace (string (omicronVersion ))
111+ if ov == "" {
112+ return nil , fmt .Errorf ("omicron version cannot be empty: %s" , p )
113+ }
114+
115+ rawURL := fmt .Sprintf ("https://raw.githubusercontent.com/oxidecomputer/omicron/%s" , ov )
116+ baseURL , err := url .Parse (rawURL )
117+ if err != nil {
118+ return nil , fmt .Errorf ("error parsing base url %q: %w" , rawURL , err )
119+ }
108120
109- // TODO: actually host the spec here.
110- // uri := "https://api.oxide.computer"
111- uri := fmt .Sprintf ("https://raw.githubusercontent.com/oxidecomputer/omicron/%s/openapi/nexus.json" , ov )
112- u , err := url .Parse (uri )
121+ latestURL := baseURL .JoinPath ("openapi" , "nexus" , "nexus-latest.json" )
122+ resp , err := http .DefaultClient .Get (latestURL .String ())
113123 if err != nil {
114- return nil , fmt .Errorf ("error parsing url %q: %v" , uri , err )
124+ return nil , fmt .Errorf ("error fetching latest openapi file from %q: %w" , latestURL , err )
125+ }
126+ defer resp .Body .Close ()
127+
128+ if resp .StatusCode != http .StatusOK {
129+ body , _ := io .ReadAll (io .LimitReader (resp .Body , 1024 ))
130+ return nil , fmt .Errorf ("unexpected status code %d fetching %q: %s" ,
131+ resp .StatusCode , latestURL , strings .TrimSpace (string (body )))
132+ }
133+
134+ var versionedFile strings.Builder
135+ if _ , err := io .Copy (& versionedFile , resp .Body ); err != nil {
136+ return nil , fmt .Errorf ("error reading versioned openapi filename from %q: %w" , latestURL , err )
137+ }
138+
139+ versioned := strings .TrimSpace (versionedFile .String ())
140+ if versioned == "" {
141+ return nil , fmt .Errorf ("versioned filename is empty in %q" , latestURL )
115142 }
116143
117- // Load the open API spec from the URI.
118- doc , err := openapi3 .NewLoader ().LoadFromURI (u )
144+ versionedURL := baseURL . JoinPath ( "openapi" , "nexus" , versioned )
145+ doc , err := openapi3 .NewLoader ().LoadFromURI (versionedURL )
119146 if err != nil {
120- return nil , fmt .Errorf ("error loading openAPI spec from %q: %v " , uri , err )
147+ return nil , fmt .Errorf ("error loading versioned openapi specification from %q: %w " , versionedURL , err )
121148 }
122149
123150 return doc , nil
0 commit comments