Skip to content

Commit aa27d6f

Browse files
committed
fix: support versioned nexus openapi specification files
Updated the generator binary to support versioned Nexus OpenAPI specification files, as introduced in oxidecomputer/omicron#9430. Closes SSE-129.
1 parent 24ae859 commit aa27d6f

File tree

4 files changed

+518
-40
lines changed

4 files changed

+518
-40
lines changed

VERSION_OMICRON

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
01bb8750
1+
60f225c

internal/generate/main.go

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ package main
66

77
import (
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) {
9698
func 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

Comments
 (0)