summaryrefslogtreecommitdiffstats
path: root/fedoracoreos/fcos.go
diff options
context:
space:
mode:
Diffstat (limited to 'fedoracoreos/fcos.go')
-rw-r--r--fedoracoreos/fcos.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/fedoracoreos/fcos.go b/fedoracoreos/fcos.go
new file mode 100644
index 0000000..9fc2b3e
--- /dev/null
+++ b/fedoracoreos/fcos.go
@@ -0,0 +1,60 @@
+// Package fedoracoreos contains APIs defining well-known
+// streams for Fedora CoreOS and a method to retrieve
+// the URL for a stream endpoint.
+package fedoracoreos
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "net/http"
+ "net/url"
+
+ "github.com/coreos/stream-metadata-go/fedoracoreos/internals"
+ "github.com/coreos/stream-metadata-go/stream"
+)
+
+const (
+ // StreamStable is the default stream
+ StreamStable = "stable"
+ // StreamTesting is what is intended to land in stable
+ StreamTesting = "testing"
+ // StreamNext usually tracks the next Fedora major version
+ StreamNext = "next"
+)
+
+// GetStreamURL returns the URL for the given stream
+func GetStreamURL(stream string) url.URL {
+ u := internals.GetBaseURL()
+ u.Path = fmt.Sprintf("streams/%s.json", stream)
+ return u
+}
+
+func getStream(u url.URL) (*stream.Stream, error) {
+ resp, err := http.Get(u.String())
+ if err != nil {
+ return nil, err
+ }
+ body, err := io.ReadAll(resp.Body)
+ resp.Body.Close()
+ if err != nil {
+ return nil, err
+ }
+
+ var s stream.Stream
+ err = json.Unmarshal(body, &s)
+ if err != nil {
+ return nil, err
+ }
+ return &s, nil
+}
+
+// FetchStream fetches and parses stream metadata for a stream
+func FetchStream(streamName string) (*stream.Stream, error) {
+ u := GetStreamURL(streamName)
+ s, err := getStream(u)
+ if err != nil {
+ return nil, fmt.Errorf("failed to fetch stream %s: %w", streamName, err)
+ }
+ return s, nil
+}