forked from TrueCloudLab/frostfs-node
81 lines
1.9 KiB
Go
81 lines
1.9 KiB
Go
package morph
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"code.gitea.io/sdk/gitea"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func downloadContracts(cmd *cobra.Command, url string) (io.ReadCloser, error) {
|
|
cmd.Printf("Downloading contracts archive from '%s'\n", url)
|
|
|
|
// HTTP client with connect timeout
|
|
client := http.Client{
|
|
Transport: &http.Transport{
|
|
DialContext: (&net.Dialer{
|
|
Timeout: 10 * time.Second,
|
|
}).DialContext,
|
|
},
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(cmd.Context(), 60*time.Second)
|
|
defer cancel()
|
|
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("can't create request: %w", err)
|
|
}
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("can't fetch contracts archive: %w", err)
|
|
}
|
|
return resp.Body, nil
|
|
}
|
|
|
|
func downloadContractsFromRepository(cmd *cobra.Command) (io.ReadCloser, error) {
|
|
client, err := gitea.NewClient("https://git.frostfs.info")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("can't initialize repository client: %w", err)
|
|
}
|
|
|
|
releases, _, err := client.ListReleases("TrueCloudLab", "frostfs-contract", gitea.ListReleasesOptions{})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("can't fetch release information: %w", err)
|
|
}
|
|
|
|
var latestRelease *gitea.Release
|
|
for _, r := range releases {
|
|
if !r.IsDraft && !r.IsPrerelease {
|
|
latestRelease = r
|
|
break
|
|
}
|
|
}
|
|
|
|
if latestRelease == nil {
|
|
return nil, fmt.Errorf("attempt to fetch contracts archive from the offitial repository failed: no releases found")
|
|
}
|
|
|
|
cmd.Printf("Found release %s (%s)\n", latestRelease.TagName, latestRelease.Title)
|
|
|
|
var url string
|
|
for _, a := range latestRelease.Attachments {
|
|
if strings.HasPrefix(a.Name, "frostfs-contract") {
|
|
url = a.DownloadURL
|
|
break
|
|
}
|
|
}
|
|
if url == "" {
|
|
return nil, errors.New("can't find contracts archive in the latest release")
|
|
}
|
|
|
|
return downloadContracts(cmd, url)
|
|
}
|