Add mirrors
This commit is contained in:
113
pkg/chart/chart.go
Normal file
113
pkg/chart/chart.go
Normal file
@ -0,0 +1,113 @@
|
||||
package chart
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.badhouseplants.net/allanger/shoebill/internal/utils/helmhelper"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/mirror"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/repository"
|
||||
"github.com/sirupsen/logrus"
|
||||
"k8s.io/utils/strings/slices"
|
||||
)
|
||||
type Chart struct {
|
||||
// Internal name of the chart
|
||||
Name string
|
||||
// Official name of the chart
|
||||
Chart string
|
||||
// Name of the repository to pull from
|
||||
// Defined in repositories
|
||||
Repository string
|
||||
// Version of a chart
|
||||
Version string
|
||||
Mirrors []string
|
||||
// Private fields that should be pupulated during the run-time
|
||||
RepositoryObj *repository.Repository `yaml:"-"`
|
||||
MirrorObjs mirror.Mirrors `yaml:"-"`
|
||||
}
|
||||
|
||||
type Charts []*Chart
|
||||
|
||||
// Possible version placeholders
|
||||
const (
|
||||
VERSION_LATEST = "latest"
|
||||
)
|
||||
|
||||
func (r *Chart) MirrorObjsFromName(mirrors mirror.Mirrors) {
|
||||
var mirObj mirror.Mirrors
|
||||
for _, mir := range mirrors{
|
||||
if slices.Contains(r.Mirrors, mir.Name){
|
||||
mirObj = append(mirObj, mir)
|
||||
}
|
||||
}
|
||||
r.MirrorObjs = mirObj
|
||||
}
|
||||
|
||||
func (ch *Chart) SyncMirrors(workDir string, mirrors mirror.Mirrors, hh helmhelper.Helmhelper) error {
|
||||
if len(ch.Mirrors) > 0 {
|
||||
ch.MirrorObjsFromName(mirrors)
|
||||
_, err := hh.PullChart(workDir, ch.ToHelmReleaseData())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, mr := range ch.MirrorObjs {
|
||||
|
||||
err := hh.PushChart(workDir, mr.OCI.URL, mr.OCI.Prefix, "", "", ch.ToHelmReleaseData())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// RepositoryObjFromName gather the whole repository object by its name
|
||||
func (r *Chart) RepositoryObjFromName(repos repository.Repositories) error {
|
||||
for _, repo := range repos {
|
||||
if repo.Name == r.Repository {
|
||||
r.RepositoryObj = repo
|
||||
}
|
||||
}
|
||||
if r.RepositoryObj == nil {
|
||||
return fmt.Errorf("couldn't gather the RepositoryObj for %s", r.Repository)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (chs *Charts) PopulateRepositories(repos repository.Repositories) error {
|
||||
for _, ch := range *chs {
|
||||
if err := ch.RepositoryObjFromName(repos); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// Replace the version placeholder with the fixed version
|
||||
func (r *Chart) VersionHandler(dir string, hh helmhelper.Helmhelper) error {
|
||||
if len(r.Version) == 0 {
|
||||
r.Version = VERSION_LATEST
|
||||
}
|
||||
switch r.Version {
|
||||
case VERSION_LATEST:
|
||||
version, err := hh.FindLatestVersion(dir, r.ToHelmReleaseData())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
r.Version = version
|
||||
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Chart) ToHelmReleaseData() *helmhelper.ChartData {
|
||||
// valuesData =
|
||||
// for _, data := range r.DestValues {
|
||||
|
||||
// }
|
||||
logrus.Info(r)
|
||||
return &helmhelper.ChartData{
|
||||
Name: r.Chart,
|
||||
Version: r.Version,
|
||||
RepositoryName: r.RepositoryObj.Name,
|
||||
RepositoryURL: r.RepositoryObj.URL,
|
||||
RepositoryKind: r.RepositoryObj.Kind,
|
||||
}
|
||||
}
|
@ -3,7 +3,9 @@ package config
|
||||
import (
|
||||
"os"
|
||||
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/chart"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/cluster"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/mirror"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/release"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/repository"
|
||||
"github.com/sirupsen/logrus"
|
||||
@ -14,6 +16,8 @@ type Config struct {
|
||||
Repositories repository.Repositories
|
||||
Releases release.Releases
|
||||
Clusters cluster.Clusters
|
||||
Charts chart.Charts
|
||||
Mirrors mirror.Mirrors
|
||||
ConfigPath string `yaml:"-"`
|
||||
SopsBin string `yaml:"-"`
|
||||
}
|
||||
|
22
pkg/mirror/mirror.go
Normal file
22
pkg/mirror/mirror.go
Normal file
@ -0,0 +1,22 @@
|
||||
package mirror
|
||||
|
||||
import (
|
||||
"git.badhouseplants.net/allanger/shoebill/internal/utils/helmhelper"
|
||||
)
|
||||
|
||||
type Mirror struct {
|
||||
Name string
|
||||
OCI *OCIMirror
|
||||
}
|
||||
|
||||
type OCIMirror struct {
|
||||
URL string
|
||||
Prefix string
|
||||
}
|
||||
|
||||
type Mirrors []*Mirror
|
||||
|
||||
func (m *Mirror) Auth(dir string, hh helmhelper.Helmhelper) error{
|
||||
|
||||
return nil
|
||||
}
|
@ -9,7 +9,9 @@ import (
|
||||
|
||||
"git.badhouseplants.net/allanger/shoebill/internal/utils/helmhelper"
|
||||
"git.badhouseplants.net/allanger/shoebill/internal/utils/sopshelper"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/chart"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/lockfile"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/mirror"
|
||||
"git.badhouseplants.net/allanger/shoebill/pkg/repository"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
@ -29,8 +31,11 @@ type Release struct {
|
||||
Values []string
|
||||
// Secrets SOPS encrypted
|
||||
Secrets []string
|
||||
Mirror string
|
||||
// Private fields that should be pupulated during the run-time
|
||||
RepositoryObj *repository.Repository `yaml:"-"`
|
||||
ChartObj *chart.Chart `yaml:"-"`
|
||||
MirrorObj *mirror.Mirror `yaml:"-"`
|
||||
DestValues ValuesHolders `yaml:"-"`
|
||||
DestSecrets ValuesHolders `yaml:"-"`
|
||||
}
|
||||
@ -82,28 +87,39 @@ func (r *Release) RepositoryObjFromName(repos repository.Repositories) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// RepositoryObjFromName gather the whole repository object by its name
|
||||
func (r *Release) MirrorObjFromName(mirrors mirror.Mirrors) error {
|
||||
for _, mir := range mirrors {
|
||||
if mir.Name == r.Mirror {
|
||||
r.RepositoryObj = &repository.Repository{
|
||||
Name: mir.Name,
|
||||
URL: fmt.Sprintf("%s/%s", mir.OCI.URL, mir.OCI.Prefix),
|
||||
}
|
||||
}
|
||||
}
|
||||
if r.RepositoryObj == nil {
|
||||
return fmt.Errorf("couldn't gather the RepositoryObj for %s", r.Repository)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Release) ChartObjFromName(chs chart.Charts) error {
|
||||
for _, ch := range chs {
|
||||
if ch.Name == r.Chart {
|
||||
r.ChartObj = ch
|
||||
}
|
||||
}
|
||||
if r.ChartObj == nil {
|
||||
return fmt.Errorf("couldn't gather the ChartObj for %s", r.Chart)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Possible version placeholders
|
||||
const (
|
||||
VERSION_LATEST = "latest"
|
||||
)
|
||||
|
||||
// Replace the version placeholder with the fixed version
|
||||
func (r *Release) VersionHandler(dir string, hh helmhelper.Helmhelper) error {
|
||||
if len(r.Version) == 0 {
|
||||
r.Version = VERSION_LATEST
|
||||
}
|
||||
switch r.Version {
|
||||
case VERSION_LATEST:
|
||||
version, err := hh.FindLatestVersion(dir, r.ToHelmReleaseData())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
r.Version = version
|
||||
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Release) ValuesHandler(dir string) error {
|
||||
for i := range r.Values {
|
||||
r.Values[i] = fmt.Sprintf("%s/%s", dir, strings.ReplaceAll(r.Values[i], "./", ""))
|
||||
@ -241,3 +257,12 @@ func (rs *Releases) PopulateRepositories(repos repository.Repositories) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rs *Releases) PopulateCharts(chs chart.Charts) error {
|
||||
for _, r := range *rs {
|
||||
if err := r.ChartObjFromName(chs); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user