From cf3b6a66417d5833fcc3ebf470c97885ccacd217 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 17 Jan 2025 10:03:13 +0100 Subject: [PATCH 1/5] go.mod: move to latest images --- bib/go.mod | 18 +++++++++--------- bib/go.sum | 50 +++++++++++++++++++++++++------------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/bib/go.mod b/bib/go.mod index 083e3637a..7f60de412 100644 --- a/bib/go.mod +++ b/bib/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/uuid v1.6.0 github.com/hashicorp/go-version v1.7.0 github.com/mattn/go-isatty v0.0.20 - github.com/osbuild/images v0.108.0 + github.com/osbuild/images v0.109.1-0.20250117082457-97ca7c62eb09 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 @@ -115,13 +115,13 @@ require ( go.opentelemetry.io/otel v1.29.0 // indirect go.opentelemetry.io/otel/metric v1.29.0 // indirect go.opentelemetry.io/otel/trace v1.29.0 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/protobuf v1.35.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect + google.golang.org/grpc v1.67.3 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/bib/go.sum b/bib/go.sum index 92faeefea..ae57accf6 100644 --- a/bib/go.sum +++ b/bib/go.sum @@ -225,8 +225,8 @@ github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/osbuild/images v0.108.0 h1:I6Ol6KsbsvCfJnipKKuGnt4todY2NvNt742Bx7y+f+Y= -github.com/osbuild/images v0.108.0/go.mod h1:4bNmMQOVadIKVC1q8zsLO8tdEQFH90zIp+MQBQUnCiE= +github.com/osbuild/images v0.109.1-0.20250117082457-97ca7c62eb09 h1:9ABt4zMJ6tNp1+AHI4FrDq1Fxy/l5uYuDXs6EOR6QJ0= +github.com/osbuild/images v0.109.1-0.20250117082457-97ca7c62eb09/go.mod h1:58tzp7jV50rjaH9gMpvmQdVati0c4TaC5Op7wmSD/tY= github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f h1:/UDgs8FGMqwnHagNDPGOlts35QkhAZ8by3DR7nMih7M= github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -319,8 +319,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkE go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= -go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= @@ -328,8 +328,8 @@ go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v8 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= @@ -349,16 +349,16 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -368,14 +368,14 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -395,18 +395,18 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20241007155032-5fefd90f89a9 h1:nFS3IivktIU5Mk6KQa+v6RKkHUpdQpphqGNLxqNnbEk= -google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f h1:jTm13A2itBi3La6yTGqn8bVSrc3ZZ1r8ENHlIXBfnRA= -google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f/go.mod h1:CLGoBuH1VHxAUXVPP8FfPwPEVJB6lz3URE5mY2SuayE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 h1:Df6WuGvthPzc+JiQ/G+m+sNX24kc0aTBqoDN/0yyykE= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.67.3 h1:OgPcDAFKHnH8X3O4WcO4XUc8GRDeKsKReqbQtiCj7N8= +google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -416,8 +416,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 506c0077cc3ad753a89da588e00030108a10b7a0 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 17 Jan 2025 10:04:31 +0100 Subject: [PATCH 2/5] image: port to latest images API change The NewAnacondaContainerInstaller renamed SquashfsCompression to RootfsCompression. --- bib/cmd/bootc-image-builder/image.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bib/cmd/bootc-image-builder/image.go b/bib/cmd/bootc-image-builder/image.go index c34bb93fc..3a3f54310 100644 --- a/bib/cmd/bootc-image-builder/image.go +++ b/bib/cmd/bootc-image-builder/image.go @@ -434,7 +434,7 @@ func manifestForISO(c *ManifestConfig, rng *rand.Rand) (*manifest.Manifest, erro // in time img := image.NewAnacondaContainerInstaller(containerSource, "") img.ContainerRemoveSignatures = true - img.SquashfsCompression = "zstd" + img.RootfsCompression = "zstd" img.Product = c.SourceInfo.OSRelease.Name img.OSVersion = c.SourceInfo.OSRelease.VersionID From 6e800aaeee61cdd038cda0a6dcdab8d8685ea5a1 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 8 Jan 2025 08:52:05 +0100 Subject: [PATCH 3/5] main: add new `--use-librepo` switch This commit adds a new `--use-librepo` switch that will enable librepo based downloading so that people can play with the new backend. But not turn it on by default yet. --- bib/cmd/bootc-image-builder/image.go | 3 ++ bib/cmd/bootc-image-builder/main.go | 20 ++++--- bib/cmd/bootc-image-builder/main_test.go | 68 +++++++++++++----------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/bib/cmd/bootc-image-builder/image.go b/bib/cmd/bootc-image-builder/image.go index 3a3f54310..4d0d362fc 100644 --- a/bib/cmd/bootc-image-builder/image.go +++ b/bib/cmd/bootc-image-builder/image.go @@ -62,6 +62,9 @@ type ManifestConfig struct { // RootFSType specifies the filesystem type for the root partition RootFSType string + + // use librepo ad the rpm downlaod backend + UseLibrepo bool } func Manifest(c *ManifestConfig) (*manifest.Manifest, error) { diff --git a/bib/cmd/bootc-image-builder/main.go b/bib/cmd/bootc-image-builder/main.go index bc734f5ca..ceecc13c1 100644 --- a/bib/cmd/bootc-image-builder/main.go +++ b/bib/cmd/bootc-image-builder/main.go @@ -21,6 +21,7 @@ import ( "github.com/osbuild/images/pkg/container" "github.com/osbuild/images/pkg/dnfjson" "github.com/osbuild/images/pkg/manifest" + "github.com/osbuild/images/pkg/osbuild" "github.com/osbuild/images/pkg/rpmmd" "github.com/osbuild/bootc-image-builder/bib/internal/buildconfig" @@ -103,20 +104,20 @@ func getContainerSize(imgref string) (uint64, error) { } func makeManifest(c *ManifestConfig, solver *dnfjson.Solver, cacheRoot string) (manifest.OSBuildManifest, map[string][]rpmmd.RepoConfig, error) { - manifest, err := Manifest(c) + mani, err := Manifest(c) if err != nil { return nil, nil, fmt.Errorf("cannot get manifest: %w", err) } // depsolve packages - depsolvedSets := make(map[string][]rpmmd.PackageSpec) + depsolvedSets := make(map[string]dnfjson.DepsolveResult) depsolvedRepos := make(map[string][]rpmmd.RepoConfig) - for name, pkgSet := range manifest.GetPackageSetChains() { + for name, pkgSet := range mani.GetPackageSetChains() { res, err := solver.Depsolve(pkgSet, 0) if err != nil { return nil, nil, fmt.Errorf("cannot depsolve: %w", err) } - depsolvedSets[name] = res.Packages + depsolvedSets[name] = *res depsolvedRepos[name] = res.Repos } @@ -131,7 +132,7 @@ func makeManifest(c *ManifestConfig, solver *dnfjson.Solver, cacheRoot string) ( resolver := container.NewResolver(c.Architecture.String()) containerSpecs := make(map[string][]container.Spec) - for plName, sourceSpecs := range manifest.GetContainerSourceSpecs() { + for plName, sourceSpecs := range mani.GetContainerSourceSpecs() { for _, c := range sourceSpecs { resolver.Add(c) } @@ -147,7 +148,11 @@ func makeManifest(c *ManifestConfig, solver *dnfjson.Solver, cacheRoot string) ( containerSpecs[plName] = specs } - mf, err := manifest.Serialize(depsolvedSets, containerSpecs, nil, depsolvedRepos) + var opts manifest.SerializeOptions + if c.UseLibrepo { + opts.RpmDownloader = osbuild.RpmDownloaderLibrepo + } + mf, err := mani.Serialize(depsolvedSets, containerSpecs, nil, &opts) if err != nil { return nil, nil, fmt.Errorf("[ERROR] manifest serialization failed: %s", err.Error()) } @@ -192,6 +197,7 @@ func manifestFromCobra(cmd *cobra.Command, args []string, pbar progress.Progress tlsVerify, _ := cmd.Flags().GetBool("tls-verify") localStorage, _ := cmd.Flags().GetBool("local") rootFs, _ := cmd.Flags().GetString("rootfs") + useLibrepo, _ := cmd.Flags().GetBool("use-librepo") if targetArch != "" && arch.FromString(targetArch) != arch.Current() { // TODO: detect if binfmt_misc for target arch is @@ -317,6 +323,7 @@ func manifestFromCobra(cmd *cobra.Command, args []string, pbar progress.Progress DistroDefPaths: distroDefPaths, SourceInfo: sourceinfo, RootFSType: rootfsType, + UseLibrepo: useLibrepo, } manifest, repos, err := makeManifest(manifestConfig, solver, rpmCacheRoot) @@ -665,6 +672,7 @@ func buildCobraCmdline() (*cobra.Command, error) { manifestCmd.Flags().StringArray("type", []string{"qcow2"}, fmt.Sprintf("image types to build [%s]", imagetypes.Available())) manifestCmd.Flags().Bool("local", false, "use a local container rather than a container from a registry") manifestCmd.Flags().String("rootfs", "", "Root filesystem type. If not given, the default configured in the source container image is used.") + manifestCmd.Flags().Bool("use-librepo", false, "(experimenal) switch to librepo for pkg download, needs new enough osbuild") // --config is only useful for developers who run bib outside // of a container to generate a manifest. so hide it by // default from users. diff --git a/bib/cmd/bootc-image-builder/main_test.go b/bib/cmd/bootc-image-builder/main_test.go index 5cb5d97b9..3ff836b40 100644 --- a/bib/cmd/bootc-image-builder/main_test.go +++ b/bib/cmd/bootc-image-builder/main_test.go @@ -17,6 +17,7 @@ import ( "github.com/osbuild/images/pkg/arch" "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/container" + "github.com/osbuild/images/pkg/dnfjson" "github.com/osbuild/images/pkg/manifest" "github.com/osbuild/images/pkg/rpmmd" @@ -63,7 +64,7 @@ func TestCanChownInPathCannotChange(t *testing.T) { type manifestTestCase struct { config *main.ManifestConfig imageTypes imagetypes.ImageTypes - packages map[string][]rpmmd.PackageSpec + depsolved map[string]dnfjson.DepsolveResult containers map[string][]container.Spec expStages map[string][]string notExpectedStages map[string][]string @@ -228,39 +229,46 @@ func TestManifestSerialization(t *testing.T) { containerSpec, }, } - isoPackages := map[string][]rpmmd.PackageSpec{ + isoPackages := map[string]dnfjson.DepsolveResult{ "build": { - { - Name: "package", - Version: "113", - Checksum: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + Packages: []rpmmd.PackageSpec{ + { + Name: "package", + Version: "113", + Checksum: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + }, }, }, "anaconda-tree": { - { - Name: "kernel", - Version: "10.11", - Checksum: "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - }, - { - Name: "package", - Version: "113", - Checksum: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + Packages: []rpmmd.PackageSpec{ + { + Name: "kernel", + Version: "10.11", + Checksum: "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + }, + { + Name: "package", + Version: "113", + Checksum: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + }, }, }, } - pkgsNoBuild := map[string][]rpmmd.PackageSpec{ + pkgsNoBuild := map[string]dnfjson.DepsolveResult{ "anaconda-tree": { - { - Name: "kernel", - Version: "10.11", - Checksum: "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - }, - { - Name: "package", - Version: "113", - Checksum: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + Packages: []rpmmd.PackageSpec{ + + { + Name: "kernel", + Version: "10.11", + Checksum: "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + }, + { + Name: "package", + Version: "113", + Checksum: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + }, }, }, } @@ -368,7 +376,7 @@ func TestManifestSerialization(t *testing.T) { config: userConfig, imageTypes: []string{"iso"}, containers: isoContainers, - packages: isoPackages, + depsolved: isoPackages, expStages: map[string][]string{ "build": {"org.osbuild.rpm"}, "bootiso-tree": {"org.osbuild.skopeo"}, // adds the container to the ISO tree @@ -378,13 +386,13 @@ func TestManifestSerialization(t *testing.T) { config: userConfig, imageTypes: []string{"iso"}, containers: isoContainers, - packages: pkgsNoBuild, + depsolved: pkgsNoBuild, err: "serialization not started", }, "iso-nocontainer": { config: userConfig, imageTypes: []string{"iso"}, - packages: isoPackages, + depsolved: isoPackages, err: "missing ostree, container, or ospipeline parameters in ISO tree pipeline", }, "ami-nocontainer": { @@ -421,11 +429,11 @@ func TestManifestSerialization(t *testing.T) { if tc.err != nil { assert.PanicsWithValue(tc.err, func() { - _, err := mf.Serialize(tc.packages, tc.containers, nil, nil) + _, err := mf.Serialize(tc.depsolved, tc.containers, nil, nil) assert.NoError(err) }) } else { - manifestJson, err := mf.Serialize(tc.packages, tc.containers, nil, nil) + manifestJson, err := mf.Serialize(tc.depsolved, tc.containers, nil, nil) assert.NoError(err) assert.NoError(checkStages(manifestJson, tc.expStages, tc.notExpectedStages)) } From 09b487c2c9e0199ae9e251bd3b9663bc66099d14 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 8 Jan 2025 09:06:04 +0100 Subject: [PATCH 4/5] test: enable librepo as part of the test cases This commit make the use of librepo part of the testcases and enables it for the problematic testcases like fedora and centos-10. Eventually we should switch entirely to librepo but there is a regression risk with secrets so for now make it optional. --- test/test_build.py | 3 ++- test/test_manifest.py | 20 ++++++++++++++++++++ test/testcases.py | 5 +++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/test/test_build.py b/test/test_build.py index c8ab91516..c9944a20b 100644 --- a/test/test_build.py +++ b/test/test_build.py @@ -442,7 +442,8 @@ def build_images(shared_tmpdir, build_container, request, force_aws_upload, gpg_ *target_arch_args, *tc.bib_rootfs_args(), "--local" if tc.local else "--local=false", - "--tls-verify=false" if tc.sign else "--tls-verify=true" + "--tls-verify=false" if tc.sign else "--tls-verify=true", + f"--use-librepo={tc.use_librepo}", ]) # print the build command for easier tracing diff --git a/test/test_manifest.py b/test/test_manifest.py index 4ad3af1a8..ac02351c0 100644 --- a/test/test_manifest.py +++ b/test/test_manifest.py @@ -731,3 +731,23 @@ def test_manifest_disk_customization_lvm_swap(tmp_path, build_container): osbuild_manifest_path = tmp_path / "manifest.json" osbuild_manifest_path.write_bytes(output) subprocess.run(["osbuild", osbuild_manifest_path.as_posix()], check=True) + + +@pytest.mark.parametrize("use_librepo", [False, True]) +def test_iso_manifest_use_librepo(build_container, use_librepo): + # no need to parameterize this test, --use-librepo behaves same for all containers + container_ref = "quay.io/centos-bootc/centos-bootc:stream9" + + output = subprocess.check_output([ + *testutil.podman_run_common, + build_container, + "manifest", + "--type=anaconda-iso", + container_ref, + f"--use-librepo={use_librepo}", + ]) + manifest = json.loads(output) + if use_librepo: + assert "org.osbuild.librepo" in manifest["sources"] + else: + assert "org.osbuild.curl" in manifest["sources"] diff --git a/test/testcases.py b/test/testcases.py index 4cf76751c..ac2b9f442 100644 --- a/test/testcases.py +++ b/test/testcases.py @@ -27,6 +27,8 @@ class TestCase: sign: bool = False # use special disk_config like "lvm" disk_config: str = "" + # use librepo for the downloading + use_librepo: bool = False def bib_rootfs_args(self): if self.rootfs: @@ -45,12 +47,14 @@ def __str__(self): class TestCaseFedora(TestCase): container_ref: str = "quay.io/fedora/fedora-bootc:40" rootfs: str = "btrfs" + use_librepo: bool = True @dataclasses.dataclass class TestCaseFedora42(TestCase): container_ref: str = "quay.io/fedora/fedora-bootc:42" rootfs: str = "btrfs" + use_librepo: bool = True @dataclasses.dataclass @@ -65,6 +69,7 @@ class TestCaseC10S(TestCase): container_ref: str = os.getenv( "BIB_TEST_BOOTC_CONTAINER_TAG", "quay.io/centos-bootc/centos-bootc:stream10") + use_librepo: bool = True def test_testcase_nameing(): From 03a23f9fb267d60c416ff6a2b0443a37fa085fd6 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 17 Jan 2025 11:49:31 +0100 Subject: [PATCH 5/5] README.md: encourage to use librepo Document `--use-librepo` in the README and encourage its usage in the default example. It should be fine for centos and this way we hopefully get more exposure and bugreport (if there are issues). --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4f8c90b4f..d7cd3edc6 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ sudo podman run \ quay.io/centos-bootc/bootc-image-builder:latest \ --type qcow2 \ --local \ + --use-librepo=True \ quay.io/centos-bootc/centos-bootc:stream9 ``` @@ -153,6 +154,7 @@ Global Flags: | --target-arch | [Target arch](#-target-architecture) to build | ❌ | | --log-level | Change log level (debug, info, error) | `error` | | -v,--verbose | Switch output/progress to verbose mode (implies --log-level=info) | `false` | +| --use-librepo | Download rpms using librepo (faster and more robust) | `false` | The `--type` parameter can be given multiple times and multiple outputs will be produced. Note that comma or space separating the