diff --git a/cmd/hauler/cli/store/sync.go b/cmd/hauler/cli/store/sync.go index 7d5834dc..a58da426 100644 --- a/cmd/hauler/cli/store/sync.go +++ b/cmd/hauler/cli/store/sync.go @@ -16,7 +16,6 @@ import ( "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" tchart "hauler.dev/go/hauler/pkg/collection/chart" "hauler.dev/go/hauler/pkg/collection/imagetxt" - "hauler.dev/go/hauler/pkg/collection/k3s" "hauler.dev/go/hauler/pkg/consts" "hauler.dev/go/hauler/pkg/content" "hauler.dev/go/hauler/pkg/cosign" @@ -211,21 +210,6 @@ func processContent(ctx context.Context, fi *os.File, o *flags.SyncOpts, s *stor } } - case v1alpha1.K3sCollectionKind: - var cfg v1alpha1.K3s - if err := yaml.Unmarshal(doc, &cfg); err != nil { - return err - } - - k, err := k3s.NewK3s(cfg.Spec.Version) - if err != nil { - return err - } - - if _, err := s.AddOCICollection(ctx, k); err != nil { - return err - } - case v1alpha1.ChartsCollectionKind: var cfg v1alpha1.ThickCharts if err := yaml.Unmarshal(doc, &cfg); err != nil { diff --git a/pkg/apis/hauler.cattle.io/v1alpha1/k3s.go b/pkg/apis/hauler.cattle.io/v1alpha1/k3s.go deleted file mode 100644 index da2fec4f..00000000 --- a/pkg/apis/hauler.cattle.io/v1alpha1/k3s.go +++ /dev/null @@ -1,19 +0,0 @@ -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -const K3sCollectionKind = "K3s" - -type K3s struct { - *metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec K3sSpec `json:"spec,omitempty"` -} - -type K3sSpec struct { - Version string `json:"version"` - Arch string `json:"arch"` -} diff --git a/pkg/collection/k3s/k3s.go b/pkg/collection/k3s/k3s.go deleted file mode 100644 index 79ab4b5f..00000000 --- a/pkg/collection/k3s/k3s.go +++ /dev/null @@ -1,175 +0,0 @@ -package k3s - -import ( - "bufio" - "encoding/json" - "errors" - "fmt" - "net/http" - "net/url" - "path" - "strings" - - "hauler.dev/go/hauler/pkg/artifacts" - "hauler.dev/go/hauler/pkg/artifacts/file" - "hauler.dev/go/hauler/pkg/artifacts/file/getter" - "hauler.dev/go/hauler/pkg/artifacts/image" - "hauler.dev/go/hauler/pkg/reference" -) - -var _ artifacts.OCICollection = (*k3s)(nil) - -const ( - releaseUrl = "https://github.com/k3s-io/k3s/releases/download" - channelUrl = "https://update.k3s.io/v1-release/channels" - bootstrapUrl = "https://get.k3s.io" -) - -var ( - ErrImagesNotFound = errors.New("k3s dependent images not found") - ErrFetchingImages = errors.New("failed to fetch k3s dependent images") - ErrExecutableNotfound = errors.New("k3s executable not found") - ErrChannelNotFound = errors.New("desired k3s channel not found") -) - -type k3s struct { - version string - arch string - - computed bool - contents map[string]artifacts.OCI - channels map[string]string - client *getter.Client -} - -func NewK3s(version string) (artifacts.OCICollection, error) { - return &k3s{ - version: version, - contents: make(map[string]artifacts.OCI), - }, nil -} - -func (k *k3s) Contents() (map[string]artifacts.OCI, error) { - if err := k.compute(); err != nil { - return nil, err - } - return k.contents, nil -} - -func (k *k3s) compute() error { - if k.computed { - return nil - } - - if err := k.fetchChannels(); err == nil { - if version, ok := k.channels[k.version]; ok { - k.version = version - } - } - - if err := k.images(); err != nil { - return err - } - - if err := k.executable(); err != nil { - return err - } - - if err := k.bootstrap(); err != nil { - return err - } - - k.computed = true - return nil -} - -func (k *k3s) executable() error { - n := "k3s" - if k.arch != "" && k.arch != "amd64" { - n = fmt.Sprintf("name-%s", k.arch) - } - fref := k.releaseUrl(n) - - resp, err := http.Head(fref) - if resp.StatusCode != http.StatusOK || err != nil { - return ErrExecutableNotfound - } - - f := file.NewFile(fref) - - ref := fmt.Sprintf("%s/k3s:%s", reference.DefaultNamespace, k.dnsCompliantVersion()) - k.contents[ref] = f - return nil -} - -func (k *k3s) bootstrap() error { - c := getter.NewClient(getter.ClientOptions{NameOverride: "k3s-init.sh"}) - f := file.NewFile(bootstrapUrl, file.WithClient(c)) - - ref := fmt.Sprintf("%s/k3s-init.sh:%s", reference.DefaultNamespace, reference.DefaultTag) - k.contents[ref] = f - return nil -} - -func (k *k3s) images() error { - resp, err := http.Get(k.releaseUrl("k3s-images.txt")) - if resp.StatusCode != http.StatusOK { - return ErrFetchingImages - } else if err != nil { - return ErrImagesNotFound - } - defer resp.Body.Close() - - scanner := bufio.NewScanner(resp.Body) - for scanner.Scan() { - reference := scanner.Text() - o, err := image.NewImage(reference) - if err != nil { - return err - } - - k.contents[reference] = o - } - return nil -} - -func (k *k3s) releaseUrl(artifact string) string { - u, _ := url.Parse(releaseUrl) - complete := []string{u.Path} - u.Path = path.Join(append(complete, []string{k.version, artifact}...)...) - return u.String() -} - -func (k *k3s) dnsCompliantVersion() string { - return strings.ReplaceAll(k.version, "+", "-") -} - -func (k *k3s) fetchChannels() error { - resp, err := http.Get(channelUrl) - if err != nil { - return err - } - - var c channel - if err := json.NewDecoder(resp.Body).Decode(&c); err != nil { - return err - } - - channels := make(map[string]string) - for _, ch := range c.Data { - channels[ch.Name] = ch.Latest - } - - k.channels = channels - return nil -} - -type channel struct { - Data []channelData `json:"data"` -} - -type channelData struct { - ID string `json:"id"` - Name string `json:"name"` - Latest string `json:"latest"` -}