diff --git a/Dockerfile b/Dockerfile index 2c6a1cea..f7d573cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ ARG SEED_ROOT=/opt/app-root/src/tackle2-seed + FROM registry.access.redhat.com/ubi9/go-toolset:latest as builder ENV GOPATH=$APP_ROOT COPY --chown=1001:0 . . @@ -15,6 +16,7 @@ FROM quay.io/konveyor/static-report as report FROM registry.access.redhat.com/ubi9/ubi-minimal ARG SEED_ROOT COPY --from=builder /opt/app-root/src/bin/hub /usr/local/bin/tackle-hub +COPY --from=builder /opt/app-root/src/bin/.build /etc/hub-build COPY --from=builder /opt/app-root/src/auth/roles.yaml /tmp/roles.yaml COPY --from=builder /opt/app-root/src/auth/users.yaml /tmp/users.yaml COPY --from=builder ${SEED_ROOT}/resources/ /tmp/seed diff --git a/Makefile b/Makefile index 77de6b71..32a72d97 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,7 @@ debug: generate fmt vet docker: vet go build $(BUILD) + git describe --always --match "v[0-9]*" --tags HEAD > bin/.build # Run against the configured Kubernetes cluster in ~/.kube/config run: fmt vet diff --git a/go.mod b/go.mod index 6ac197c8..b1a8a915 100644 --- a/go.mod +++ b/go.mod @@ -7,14 +7,14 @@ require ( github.com/PaesslerAG/gval v1.2.2 github.com/andygrunwald/go-jira v1.16.0 github.com/gin-gonic/gin v1.9.1 - github.com/go-logr/logr v1.2.4 + github.com/go-logr/logr v1.4.1 github.com/go-playground/validator/v10 v10.14.0 github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/google/uuid v1.3.0 - github.com/jortel/go-utils v0.1.2 + github.com/google/uuid v1.6.0 + github.com/jortel/go-utils v0.1.4 github.com/konveyor/tackle2-seed v0.0.0-20231025181853-8ce94f70f744 github.com/mattn/go-sqlite3 v1.14.17 - github.com/onsi/gomega v1.27.6 + github.com/onsi/gomega v1.31.1 github.com/prometheus/client_golang v1.15.0 github.com/swaggo/swag v1.16.1 golang.org/x/sys v0.19.0 @@ -54,7 +54,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/imdario/mergo v0.3.12 // indirect @@ -80,7 +80,7 @@ require ( github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/segmentio/ksuid v1.0.4 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/trivago/tgo v1.0.7 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect @@ -93,7 +93,7 @@ require ( golang.org/x/term v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/tools v0.16.1 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/go.sum b/go.sum index 8478cb16..aa42471d 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,8 @@ github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -113,16 +113,16 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -131,8 +131,8 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jortel/go-utils v0.1.2 h1:R0TcGRCcwoL793CymcKC5AF9idWXT2cR6eQ2xpBUsoI= -github.com/jortel/go-utils v0.1.2/go.mod h1:sl6vav63ODI0sUfSz8e0pImNmCVFnVsuOFhZmwe9GDk= +github.com/jortel/go-utils v0.1.4 h1:DzrID+gI9urEGkOoXYGYIKA/bozEIxmcYV/4cdVjW58= +github.com/jortel/go-utils v0.1.4/go.mod h1:7vzFYbnb91+ltjjAmCv2jVL4CKX7Onz1i2EQPAvw9Cs= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -177,9 +177,9 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= +github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= @@ -204,8 +204,8 @@ github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -258,7 +258,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -342,8 +342,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/seed/pkg.go b/seed/pkg.go index 114b9d5b..0438a15a 100644 --- a/seed/pkg.go +++ b/seed/pkg.go @@ -12,10 +12,17 @@ import ( "gorm.io/gorm" ) -var log = logr.WithName("seeding") +var ( + Settings = &settings.Settings + log = logr.WithName("seeding") +) -// SeedKey identifies the setting containing the applied seed digest. -const SeedKey = ".hub.db.seed" +const ( + // SeedKey identifies the setting containing the applied seed digest. + SeedKey = ".hub.db.seed" + // BuildKey identifies setting for the hub build that seeded. + BuildKey = SeedKey + ".build" +) // Seeder specifies an interface for seeding DB models. type Seeder interface { @@ -53,12 +60,12 @@ func Seed() (err error) { return } - match, err := compareChecksum(db, checksum) + skipped, err := skip(db, checksum) if err != nil { return } - if match { - log.Info("Seed checksum match.") + if skipped { + log.Info("Seeding skipped.") return } @@ -80,7 +87,31 @@ func Seed() (err error) { if err != nil { return } + err = saveBuild(tx) + if err != nil { + return + } return }) return } + +// skip returns true when seeding can be skipped. +func skip(db *gorm.DB, checksum []byte) (skip bool, err error) { + match, err := compareChecksum(db, checksum) + if err != nil { + return + } + if !match { + return + } + match, err = matchBuild(db) + if err != nil { + return + } + if !match { + return + } + skip = true + return +} diff --git a/seed/seed.go b/seed/seed.go index a674e1c7..feee0cd0 100644 --- a/seed/seed.go +++ b/seed/seed.go @@ -81,6 +81,7 @@ func compareChecksum(db *gorm.DB, checksum []byte) (match bool, err error) { } match = seededChecksum == fmt.Sprintf("%x", checksum) + log.Info("Seed checksum", "matched", match) return } @@ -115,3 +116,49 @@ func migrationVersion(db *gorm.DB) (version uint, err error) { version = uint(v.Version) return } + +// matchBuild +func matchBuild(db *gorm.DB) (matched bool, err error) { + build, err := getBuild(db) + if err != nil { + return + } + if build == "" { + return + } + matched = build == Settings.Hub.Build + log.Info("Seed build (version)", "matched", matched) + return +} + +// getBuild returns the hub build version that seeded. +func getBuild(db *gorm.DB) (version string, err error) { + setting := &model.Setting{ + Key: BuildKey, + } + db = db.Where("key", BuildKey) + err = db.FirstOrCreate(setting).Error + if err != nil { + err = liberr.Wrap(err) + return + } + if n, cast := setting.Value.(string); cast { + version = n + } + return +} + +// saveBuild update settings with current build that seeded. +func saveBuild(db *gorm.DB) (err error) { + setting := &model.Setting{ + Key: BuildKey, + Value: Settings.Hub.Build, + } + db = db.Where("key", BuildKey) + err = db.Updates(setting).Error + if err != nil { + err = liberr.Wrap(err) + return + } + return +} diff --git a/seed/target.go b/seed/target.go index 9c0ce4e1..e23bb25b 100644 --- a/seed/target.go +++ b/seed/target.go @@ -87,6 +87,7 @@ func (r *Target) Apply(db *gorm.DB) (err error) { target.Provider = t.Provider target.Choice = t.Choice target.ImageID = f.ID + target.Labels = []model.TargetLabel{} for _, l := range t.Labels { target.Labels = append(target.Labels, model.TargetLabel(l)) } diff --git a/settings/hub.go b/settings/hub.go index 176fc289..2dd3fcb4 100644 --- a/settings/hub.go +++ b/settings/hub.go @@ -1,6 +1,7 @@ package settings import ( + "bufio" "os" "os/user" "strconv" @@ -9,6 +10,7 @@ import ( const ( EnvNamespace = "NAMESPACE" + EnvBuild = "BUILD" EnvDbPath = "DB_PATH" EnvDbMaxCon = "DB_MAX_CONNECTION" EnvDbSeedPath = "DB_SEED_PATH" @@ -44,6 +46,8 @@ const ( ) type Hub struct { + // build version. + Build string // k8s namespace. Namespace string // DB settings. @@ -124,6 +128,10 @@ type Hub struct { func (r *Hub) Load() (err error) { var found bool + r.Build, err = r.build() + if err != nil { + return + } r.Namespace, err = r.namespace() if err != nil { return @@ -356,3 +364,30 @@ func (r *Hub) namespace() (ns string, err error) { return } + +// build returns the hub build version. +// This is expected to be the output of `git describe`. +// Examples: +// v0.6.0-ea89gcd +// v0.6.0 +func (r *Hub) build() (version string, err error) { + version, found := os.LookupEnv(EnvBuild) + if found { + return + } + f, err := os.Open("/etc/hub-build") + if err != nil { + if os.IsNotExist(err) { + err = nil + return + } + } + defer func() { + _ = f.Close() + }() + scanner := bufio.NewScanner(f) + if scanner.Scan() { + version = scanner.Text() + } + return +}