# Do not build with tests by default
# Pass --with tests to rpmbuild to override
%bcond_with tests

# When --with relax_requires is specified osbuild-composer-tests
# will require osbuild-composer only by name, excluding version/release
# This is used internally during nightly pipeline testing!
%bcond_with relax_requires

# The minimum required osbuild version
%global min_osbuild_version 129

%global goipath         github.com/osbuild/osbuild-composer

Version:        127

%gometa

%global common_description %{expand:
A service for building customized OS artifacts, such as VM images and OSTree
commits, that uses osbuild under the hood. Besides building images for local
usage, it can also upload images directly to cloud.

It is compatible with composer-cli and cockpit-composer clients.
}

Name:           osbuild-composer
Release:        1.20241211082051121413.main.1.gf6d320886%{?dist}
Summary:        An image building service based on osbuild

# osbuild-composer doesn't have support for building i686 and armv7hl images
ExcludeArch:    i686 armv7hl

# Upstream license specification: Apache-2.0
License:        Apache-2.0
URL:            %{gourl}
Source0:        osbuild-composer-127.tar.gz


BuildRequires:  %{?go_compiler:compiler(go-compiler)}%{!?go_compiler:golang}
BuildRequires:  systemd
BuildRequires:  krb5-devel
BuildRequires:  python3-docutils
BuildRequires:  make
# Build requirements of 'theproglottis/gpgme' package
BuildRequires:  gpgme-devel
BuildRequires:  libassuan-devel
# Build requirements of 'github.com/containers/storage' package
BuildRequires:  device-mapper-devel
%if 0%{?fedora}
BuildRequires:  systemd-rpm-macros
BuildRequires:  git
# Build requirements of 'github.com/containers/storage' package
BuildRequires:  btrfs-progs-devel
# DO NOT REMOVE the BUNDLE_START and BUNDLE_END markers as they are used by 'tools/rpm_spec_add_provides_bundle.sh' to generate the Provides: bundled list
# BUNDLE_START
Provides: bundled(golang(cel.dev/expr)) = 0.16.1
Provides: bundled(golang(cloud.google.com/go)) = 0.116.0
Provides: bundled(golang(cloud.google.com/go/auth)) = 0.9.8
Provides: bundled(golang(cloud.google.com/go/auth/oauth2adapt)) = 0.2.4
Provides: bundled(golang(cloud.google.com/go/compute)) = 1.28.1
Provides: bundled(golang(cloud.google.com/go/compute/metadata)) = 0.5.2
Provides: bundled(golang(cloud.google.com/go/iam)) = 1.2.1
Provides: bundled(golang(cloud.google.com/go/monitoring)) = 1.21.1
Provides: bundled(golang(cloud.google.com/go/storage)) = 1.44.0
Provides: bundled(golang(dario.cat/mergo)) = 1.0.0
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go)) = 68.0.0+incompatible
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go/sdk/azcore)) = 1.14.0
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go/sdk/azidentity)) = 1.7.0
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go/sdk/internal)) = 1.10.0
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5)) = 5.7.0
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources)) = 1.2.0
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage)) = 1.6.0
Provides: bundled(golang(github.com/Azure/azure-sdk-for-go/sdk/storage/azblob)) = 1.4.1
Provides: bundled(golang(github.com/Azure/go-autorest)) = 14.2.0+incompatible
Provides: bundled(golang(github.com/Azure/go-autorest/autorest)) = 0.11.29
Provides: bundled(golang(github.com/Azure/go-autorest/autorest/adal)) = 0.9.22
Provides: bundled(golang(github.com/Azure/go-autorest/autorest/azure/auth)) = 0.5.13
Provides: bundled(golang(github.com/Azure/go-autorest/autorest/azure/cli)) = 0.4.6
Provides: bundled(golang(github.com/Azure/go-autorest/autorest/date)) = 0.3.0
Provides: bundled(golang(github.com/Azure/go-autorest/autorest/to)) = 0.4.0
Provides: bundled(golang(github.com/Azure/go-autorest/autorest/validation)) = 0.3.1
Provides: bundled(golang(github.com/Azure/go-autorest/logger)) = 0.2.1
Provides: bundled(golang(github.com/Azure/go-autorest/tracing)) = 0.6.0
Provides: bundled(golang(github.com/AzureAD/microsoft-authentication-library-for-go)) = 1.2.2
Provides: bundled(golang(github.com/BurntSushi/toml)) = 1.4.0
Provides: bundled(golang(github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp)) = 1.24.1
Provides: bundled(golang(github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric)) = 0.48.1
Provides: bundled(golang(github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping)) = 0.48.1
Provides: bundled(golang(github.com/Microsoft/go-winio)) = 0.6.2
Provides: bundled(golang(github.com/Microsoft/hcsshim)) = 0.12.5
Provides: bundled(golang(github.com/VividCortex/ewma)) = 1.2.0
Provides: bundled(golang(github.com/acarl005/stripansi)) = 5a71ef0
Provides: bundled(golang(github.com/asaskevich/govalidator)) = a9d515a
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2)) = 1.30.4
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream)) = 1.6.4
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/config)) = 1.27.31
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/credentials)) = 1.17.30
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/feature/ec2/imds)) = 1.16.12
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/feature/s3/manager)) = 1.17.16
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/internal/configsources)) = 1.3.16
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/internal/endpoints/v2)) = 2.6.16
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/internal/ini)) = 1.8.1
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/internal/v4a)) = 1.3.16
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/autoscaling)) = 1.43.5
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/ec2)) = 1.177.0
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding)) = 1.11.4
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/internal/checksum)) = 1.3.18
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/internal/presigned-url)) = 1.11.18
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/internal/s3shared)) = 1.17.16
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/s3)) = 1.61.0
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/sso)) = 1.22.5
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/ssooidc)) = 1.26.5
Provides: bundled(golang(github.com/aws/aws-sdk-go-v2/service/sts)) = 1.30.5
Provides: bundled(golang(github.com/aws/smithy-go)) = 1.20.4
Provides: bundled(golang(github.com/aymerick/douceur)) = 0.2.0
Provides: bundled(golang(github.com/beorn7/perks)) = 1.0.1
Provides: bundled(golang(github.com/cenkalti/backoff/v4)) = 4.2.1
Provides: bundled(golang(github.com/census-instrumentation/opencensus-proto)) = 0.4.1
Provides: bundled(golang(github.com/cespare/xxhash/v2)) = 2.3.0
Provides: bundled(golang(github.com/cncf/xds/go)) = b4127c9
Provides: bundled(golang(github.com/containerd/cgroups/v3)) = 3.0.3
Provides: bundled(golang(github.com/containerd/errdefs)) = 0.1.0
Provides: bundled(golang(github.com/containerd/stargz-snapshotter/estargz)) = 0.15.1
Provides: bundled(golang(github.com/containers/common)) = 0.60.4
Provides: bundled(golang(github.com/containers/image/v5)) = 5.32.2
Provides: bundled(golang(github.com/containers/libtrust)) = c1716e8
Provides: bundled(golang(github.com/containers/ocicrypt)) = 1.2.0
Provides: bundled(golang(github.com/containers/storage)) = 1.55.0
Provides: bundled(golang(github.com/coreos/go-semver)) = 0.3.1
Provides: bundled(golang(github.com/coreos/go-systemd)) = d3cd4ed
Provides: bundled(golang(github.com/cyberphone/json-canonicalization)) = ba74d44
Provides: bundled(golang(github.com/cyphar/filepath-securejoin)) = 0.3.1
Provides: bundled(golang(github.com/davecgh/go-spew)) = d8f796a
Provides: bundled(golang(github.com/deepmap/oapi-codegen)) = 1.8.2
Provides: bundled(golang(github.com/dimchansky/utfbom)) = 1.1.1
Provides: bundled(golang(github.com/distribution/reference)) = 0.6.0
Provides: bundled(golang(github.com/docker/distribution)) = 2.8.3+incompatible
Provides: bundled(golang(github.com/docker/docker)) = 27.1.1+incompatible
Provides: bundled(golang(github.com/docker/docker-credential-helpers)) = 0.8.2
Provides: bundled(golang(github.com/docker/go-connections)) = 0.5.0
Provides: bundled(golang(github.com/docker/go-units)) = 0.5.0
Provides: bundled(golang(github.com/dougm/pretty)) = 2ee9d74
Provides: bundled(golang(github.com/envoyproxy/go-control-plane)) = 0.13.0
Provides: bundled(golang(github.com/envoyproxy/protoc-gen-validate)) = 1.1.0
Provides: bundled(golang(github.com/felixge/httpsnoop)) = 1.0.4
Provides: bundled(golang(github.com/getkin/kin-openapi)) = 0.93.0
Provides: bundled(golang(github.com/getsentry/sentry-go)) = 0.28.1
Provides: bundled(golang(github.com/ghodss/yaml)) = 1.0.0
Provides: bundled(golang(github.com/go-jose/go-jose/v4)) = 4.0.2
Provides: bundled(golang(github.com/go-logr/logr)) = 1.4.2
Provides: bundled(golang(github.com/go-logr/stdr)) = 1.2.2
Provides: bundled(golang(github.com/go-openapi/analysis)) = 0.23.0
Provides: bundled(golang(github.com/go-openapi/errors)) = 0.22.0
Provides: bundled(golang(github.com/go-openapi/jsonpointer)) = 0.21.0
Provides: bundled(golang(github.com/go-openapi/jsonreference)) = 0.21.0
Provides: bundled(golang(github.com/go-openapi/loads)) = 0.22.0
Provides: bundled(golang(github.com/go-openapi/runtime)) = 0.28.0
Provides: bundled(golang(github.com/go-openapi/spec)) = 0.21.0
Provides: bundled(golang(github.com/go-openapi/strfmt)) = 0.23.0
Provides: bundled(golang(github.com/go-openapi/swag)) = 0.23.0
Provides: bundled(golang(github.com/go-openapi/validate)) = 0.24.0
Provides: bundled(golang(github.com/gobwas/glob)) = 0.2.3
Provides: bundled(golang(github.com/gogo/protobuf)) = 1.3.2
Provides: bundled(golang(github.com/golang-jwt/jwt)) = 3.2.2+incompatible
Provides: bundled(golang(github.com/golang-jwt/jwt/v4)) = 4.5.0
Provides: bundled(golang(github.com/golang-jwt/jwt/v5)) = 5.2.1
Provides: bundled(golang(github.com/golang/glog)) = 1.2.2
Provides: bundled(golang(github.com/golang/groupcache)) = 41bb18b
Provides: bundled(golang(github.com/golang/protobuf)) = 1.5.4
Provides: bundled(golang(github.com/google/go-cmp)) = 0.6.0
Provides: bundled(golang(github.com/google/go-containerregistry)) = 0.20.0
Provides: bundled(golang(github.com/google/go-intervals)) = 0.0.2
Provides: bundled(golang(github.com/google/s2a-go)) = 0.1.8
Provides: bundled(golang(github.com/google/uuid)) = 1.6.0
Provides: bundled(golang(github.com/googleapis/enterprise-certificate-proxy)) = 0.3.4
Provides: bundled(golang(github.com/googleapis/gax-go/v2)) = 2.13.0
Provides: bundled(golang(github.com/gophercloud/gophercloud)) = 1.14.0
Provides: bundled(golang(github.com/gorilla/css)) = 1.0.0
Provides: bundled(golang(github.com/gorilla/mux)) = 1.8.1
Provides: bundled(golang(github.com/hashicorp/errwrap)) = 1.1.0
Provides: bundled(golang(github.com/hashicorp/go-cleanhttp)) = 0.5.2
Provides: bundled(golang(github.com/hashicorp/go-multierror)) = 1.1.1
Provides: bundled(golang(github.com/hashicorp/go-retryablehttp)) = 0.7.7
Provides: bundled(golang(github.com/hashicorp/go-version)) = 1.7.0
Provides: bundled(golang(github.com/inconshreveable/mousetrap)) = 1.1.0
Provides: bundled(golang(github.com/jackc/chunkreader/v2)) = 2.0.1
Provides: bundled(golang(github.com/jackc/pgconn)) = 1.14.3
Provides: bundled(golang(github.com/jackc/pgio)) = 1.0.0
Provides: bundled(golang(github.com/jackc/pgpassfile)) = 1.0.0
Provides: bundled(golang(github.com/jackc/pgproto3/v2)) = 2.3.3
Provides: bundled(golang(github.com/jackc/pgservicefile)) = 091c0ba
Provides: bundled(golang(github.com/jackc/pgtype)) = 1.14.3
Provides: bundled(golang(github.com/jackc/pgx/v4)) = 4.18.3
Provides: bundled(golang(github.com/jackc/puddle)) = 1.3.0
Provides: bundled(golang(github.com/jmespath/go-jmespath)) = 0.4.0
Provides: bundled(golang(github.com/josharian/intern)) = 1.0.0
Provides: bundled(golang(github.com/json-iterator/go)) = 1.1.12
Provides: bundled(golang(github.com/julienschmidt/httprouter)) = 1.3.0
Provides: bundled(golang(github.com/klauspost/compress)) = 1.17.9
Provides: bundled(golang(github.com/klauspost/pgzip)) = 1.2.6
Provides: bundled(golang(github.com/kolo/xmlrpc)) = a4b6fa1
Provides: bundled(golang(github.com/kr/text)) = 0.2.0
Provides: bundled(golang(github.com/kylelemons/godebug)) = 1.1.0
Provides: bundled(golang(github.com/labstack/echo/v4)) = 4.12.0
Provides: bundled(golang(github.com/labstack/gommon)) = 0.4.2
Provides: bundled(golang(github.com/letsencrypt/boulder)) = 89b07f4
Provides: bundled(golang(github.com/mailru/easyjson)) = 0.7.7
Provides: bundled(golang(github.com/mattn/go-colorable)) = 0.1.13
Provides: bundled(golang(github.com/mattn/go-isatty)) = 0.0.20
Provides: bundled(golang(github.com/mattn/go-runewidth)) = 0.0.16
Provides: bundled(golang(github.com/mattn/go-sqlite3)) = 1.14.22
Provides: bundled(golang(github.com/microcosm-cc/bluemonday)) = 1.0.23
Provides: bundled(golang(github.com/miekg/pkcs11)) = 1.1.1
Provides: bundled(golang(github.com/mistifyio/go-zfs/v3)) = 3.0.1
Provides: bundled(golang(github.com/mitchellh/go-homedir)) = 1.1.0
Provides: bundled(golang(github.com/mitchellh/mapstructure)) = 1.5.0
Provides: bundled(golang(github.com/moby/docker-image-spec)) = 1.3.1
Provides: bundled(golang(github.com/moby/sys/mountinfo)) = 0.7.2
Provides: bundled(golang(github.com/moby/sys/user)) = 0.2.0
Provides: bundled(golang(github.com/modern-go/concurrent)) = bacd9c7
Provides: bundled(golang(github.com/modern-go/reflect2)) = 1.0.2
Provides: bundled(golang(github.com/munnerz/goautoneg)) = a7dc8b6
Provides: bundled(golang(github.com/oklog/ulid)) = 1.3.1
Provides: bundled(golang(github.com/opencontainers/go-digest)) = 1.0.0
Provides: bundled(golang(github.com/opencontainers/image-spec)) = 1.1.0
Provides: bundled(golang(github.com/opencontainers/runtime-spec)) = 1.2.0
Provides: bundled(golang(github.com/opencontainers/selinux)) = 1.11.0
Provides: bundled(golang(github.com/openshift-online/ocm-sdk-go)) = 0.1.438
Provides: bundled(golang(github.com/oracle/oci-go-sdk/v54)) = 54.0.0
Provides: bundled(golang(github.com/osbuild/images)) = 0.105.0
Provides: bundled(golang(github.com/osbuild/osbuild-composer/pkg/splunk_logger)) = 0239db5
Provides: bundled(golang(github.com/osbuild/pulp-client)) = 0.1.0
Provides: bundled(golang(github.com/ostreedev/ostree-go)) = 719684c
Provides: bundled(golang(github.com/pkg/browser)) = 5ac0b6a
Provides: bundled(golang(github.com/pkg/errors)) = 0.9.1
Provides: bundled(golang(github.com/planetscale/vtprotobuf)) = 0393e58
Provides: bundled(golang(github.com/pmezard/go-difflib)) = 5d4384e
Provides: bundled(golang(github.com/proglottis/gpgme)) = 0.1.3
Provides: bundled(golang(github.com/prometheus/client_golang)) = 1.20.2
Provides: bundled(golang(github.com/prometheus/client_model)) = 0.6.1
Provides: bundled(golang(github.com/prometheus/common)) = 0.55.0
Provides: bundled(golang(github.com/prometheus/procfs)) = 0.15.1
Provides: bundled(golang(github.com/rivo/uniseg)) = 0.4.7
Provides: bundled(golang(github.com/secure-systems-lab/go-securesystemslib)) = 0.8.0
Provides: bundled(golang(github.com/segmentio/ksuid)) = 1.0.4
Provides: bundled(golang(github.com/sigstore/fulcio)) = 1.4.5
Provides: bundled(golang(github.com/sigstore/rekor)) = 1.3.6
Provides: bundled(golang(github.com/sigstore/sigstore)) = 1.8.4
Provides: bundled(golang(github.com/sirupsen/logrus)) = 1.9.3
Provides: bundled(golang(github.com/skratchdot/open-golang)) = eef8423
Provides: bundled(golang(github.com/sony/gobreaker)) = dd874f9
Provides: bundled(golang(github.com/spf13/cobra)) = 1.8.1
Provides: bundled(golang(github.com/spf13/pflag)) = 1.0.5
Provides: bundled(golang(github.com/stefanberger/go-pkcs11uri)) = 7828495
Provides: bundled(golang(github.com/stretchr/testify)) = 1.9.0
Provides: bundled(golang(github.com/sylabs/sif/v2)) = 2.18.0
Provides: bundled(golang(github.com/syndtr/gocapability)) = 42c35b4
Provides: bundled(golang(github.com/tchap/go-patricia/v2)) = 2.3.1
Provides: bundled(golang(github.com/titanous/rocacheck)) = afe7314
Provides: bundled(golang(github.com/ubccr/kerby)) = 412be7b
Provides: bundled(golang(github.com/ulikunitz/xz)) = 0.5.12
Provides: bundled(golang(github.com/valyala/bytebufferpool)) = 1.0.0
Provides: bundled(golang(github.com/valyala/fasttemplate)) = 1.2.2
Provides: bundled(golang(github.com/vbatts/tar-split)) = 0.11.5
Provides: bundled(golang(github.com/vbauerster/mpb/v8)) = 8.7.5
Provides: bundled(golang(github.com/vmware/govmomi)) = 0.42.0
Provides: bundled(golang(go.mongodb.org/mongo-driver)) = 1.14.0
Provides: bundled(golang(go.mozilla.org/pkcs7)) = 33d0574
Provides: bundled(golang(go.opencensus.io)) = 0.24.0
Provides: bundled(golang(go.opentelemetry.io/contrib/detectors/gcp)) = 1.29.0
Provides: bundled(golang(go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc)) = 0.54.0
Provides: bundled(golang(go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp)) = 0.54.0
Provides: bundled(golang(go.opentelemetry.io/otel)) = 1.29.0
Provides: bundled(golang(go.opentelemetry.io/otel/metric)) = 1.29.0
Provides: bundled(golang(go.opentelemetry.io/otel/sdk)) = 1.29.0
Provides: bundled(golang(go.opentelemetry.io/otel/sdk/metric)) = 1.29.0
Provides: bundled(golang(go.opentelemetry.io/otel/trace)) = 1.29.0
Provides: bundled(golang(golang.org/x/crypto)) = 0.28.0
Provides: bundled(golang(golang.org/x/exp)) = 8a7402a
Provides: bundled(golang(golang.org/x/mod)) = 0.20.0
Provides: bundled(golang(golang.org/x/net)) = 0.30.0
Provides: bundled(golang(golang.org/x/oauth2)) = 0.23.0
Provides: bundled(golang(golang.org/x/sync)) = 0.8.0
Provides: bundled(golang(golang.org/x/sys)) = 0.26.0
Provides: bundled(golang(golang.org/x/term)) = 0.25.0
Provides: bundled(golang(golang.org/x/text)) = 0.19.0
Provides: bundled(golang(golang.org/x/time)) = 0.7.0
Provides: bundled(golang(golang.org/x/tools)) = 0.24.0
Provides: bundled(golang(google.golang.org/api)) = 0.201.0
Provides: bundled(golang(google.golang.org/genproto)) = 5fefd90
Provides: bundled(golang(google.golang.org/genproto/googleapis/api)) = af27646
Provides: bundled(golang(google.golang.org/genproto/googleapis/rpc)) = 5fefd90
Provides: bundled(golang(google.golang.org/grpc)) = 1.67.1
Provides: bundled(golang(google.golang.org/grpc/stats/opentelemetry)) = 3ffb98b
Provides: bundled(golang(google.golang.org/protobuf)) = 1.35.1
Provides: bundled(golang(gopkg.in/ini.v1)) = 1.67.0
Provides: bundled(golang(gopkg.in/yaml.v2)) = 2.4.0
Provides: bundled(golang(gopkg.in/yaml.v3)) = 3.0.1
# BUNDLE_END
%endif

Requires: %{name}-core = %{version}-%{release}
Requires: %{name}-worker = %{version}-%{release}
Requires: systemd

Provides: weldr

%description
%{common_description}

%prep
%if 0%{?rhel}
%forgeautosetup -p1
%else
%goprep -k
%endif

%build
export GOFLAGS="-buildmode=pie"
%if 0%{?rhel}
GO_BUILD_PATH=$PWD/_build
install -m 0755 -vd $(dirname $GO_BUILD_PATH/src/%{goipath})
ln -fs $PWD $GO_BUILD_PATH/src/%{goipath}
cd $GO_BUILD_PATH/src/%{goipath}
install -m 0755 -vd _bin
export PATH=$PWD/_bin${PATH:+:$PATH}
export GOPATH=$GO_BUILD_PATH:%{gopath}
export GOFLAGS+=" -mod=vendor"
%endif
%if 0%{?fedora}
# Fedora disables Go modules by default, but we want to use them.
# Undefine the macro which disables it to use the default behavior.
%undefine gomodulesmode
%endif

# btrfs-progs-devel is not available on RHEL
%if 0%{?rhel}
GOTAGS="exclude_graphdriver_btrfs"
%endif

# Set the commit hash so that composer can report what source version
# was used to build it. This has to be set explicitly when calling rpmbuild,
# this script will not attempt to automatically discover it.
%if %{?commit:1}0
export LDFLAGS="${LDFLAGS} -X 'github.com/osbuild/osbuild-composer/internal/common.GitRev=%{commit}'"
%endif
export LDFLAGS="${LDFLAGS} -X 'github.com/osbuild/osbuild-composer/internal/common.RpmVersion=%{name}-%{?epoch:%epoch:}%{version}-%{release}.%{_arch}'"

%gobuild ${GOTAGS:+-tags=$GOTAGS} -o _bin/osbuild-composer %{goipath}/cmd/osbuild-composer
%gobuild ${GOTAGS:+-tags=$GOTAGS} -o _bin/osbuild-worker %{goipath}/cmd/osbuild-worker
%gobuild ${GOTAGS:+-tags=$GOTAGS} -o _bin/osbuild-worker-executor %{goipath}/cmd/osbuild-worker-executor
%gobuild ${GOTAGS:+-tags=$GOTAGS} -o _bin/osbuild-jobsite-manager %{goipath}/cmd/osbuild-jobsite-manager
%gobuild ${GOTAGS:+-tags=$GOTAGS} -o _bin/osbuild-jobsite-builder %{goipath}/cmd/osbuild-jobsite-builder

make man

%if %{with tests} || 0%{?rhel}

# Build test binaries with `go test -c`, so that they can take advantage of
# golang's testing package. The golang rpm macros don't support building them
# directly. Thus, do it manually, taking care to also include a build id.
#
# On Fedora, also turn off go modules and set the path to the one into which
# the golang-* packages install source code.
%if 0%{?fedora}
export GO111MODULE=off
export GOPATH=%{gobuilddir}:%{gopath}
%endif

TEST_LDFLAGS="${LDFLAGS:-} -B 0x$(od -N 20 -An -tx1 -w100 /dev/urandom | tr -d ' ')"

%if 0%{?rhel}
GOTAGS="${GOTAGS:+$GOTAGS,}rhel%{rhel}"
%endif

go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-composer-cli-tests %{goipath}/cmd/osbuild-composer-cli-tests
go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-dnf-json-tests %{goipath}/cmd/osbuild-dnf-json-tests
go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-weldr-tests %{goipath}/internal/client/
go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-image-tests %{goipath}/cmd/osbuild-image-tests
go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-auth-tests %{goipath}/cmd/osbuild-auth-tests
go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-koji-tests %{goipath}/cmd/osbuild-koji-tests
go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-composer-dbjobqueue-tests %{goipath}/cmd/osbuild-composer-dbjobqueue-tests
go test -c -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-service-maintenance-tests %{goipath}/cmd/osbuild-service-maintenance
go build -tags="integration${GOTAGS:+,$GOTAGS}" -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-mock-openid-provider %{goipath}/cmd/osbuild-mock-openid-provider

%endif

%install
install -m 0755 -vd                                                %{buildroot}%{_libexecdir}/osbuild-composer
install -m 0755 -vp _bin/osbuild-composer                          %{buildroot}%{_libexecdir}/osbuild-composer/
install -m 0755 -vp _bin/osbuild-worker                            %{buildroot}%{_libexecdir}/osbuild-composer/
install -m 0755 -vp _bin/osbuild-worker-executor                   %{buildroot}%{_libexecdir}/osbuild-composer/
install -m 0755 -vp _bin/osbuild-jobsite-manager                   %{buildroot}%{_libexecdir}/osbuild-composer/
install -m 0755 -vp _bin/osbuild-jobsite-builder                   %{buildroot}%{_libexecdir}/osbuild-composer/

# Only include repositories for the distribution and release
install -m 0755 -vd                                                %{buildroot}%{_datadir}/osbuild-composer/repositories

# CentOS also defines rhel so we check for centos first
%if 0%{?centos}

# Latest CentOS supports building all CentOS versions
%if 0%{?centos} >= 10
install -m 0644 -vp repositories/centos-*                          %{buildroot}%{_datadir}/osbuild-composer/repositories/

%else
# All other CentOS versions support building for the same version
install -m 0644 -vp repositories/centos-%{centos}*                 %{buildroot}%{_datadir}/osbuild-composer/repositories/
install -m 0644 -vp repositories/centos-stream-%{centos}*          %{buildroot}%{_datadir}/osbuild-composer/repositories/
%endif

%else

%if 0%{?rhel}
# RHEL 10 supports building all RHEL versions
%if 0%{?rhel} >= 10
for REPO_FILE in $(ls repositories/rhel-* | grep -v 'no-aux-key'); do
    install -m 0644 -vp ${REPO_FILE}                               %{buildroot}%{_datadir}/osbuild-composer/repositories/$(basename ${REPO_FILE})
done

# RHEL-8 auxiliary key is signed using SHA-1, which is not enabled by default on RHEL-10 and later
for REPO_FILE in $(ls repositories/rhel-8*-no-aux-key.json); do
    install -m 0644 -vp ${REPO_FILE}                               %{buildroot}%{_datadir}/osbuild-composer/repositories/$(basename ${REPO_FILE} | sed 's/-no-aux-key//g')
done

%else
# All other RHEL versions support building for the same version
for REPO_FILE in $(ls repositories/rhel-%{rhel}* | grep -v 'no-aux-key'); do
    install -m 0644 -vp ${REPO_FILE}                               %{buildroot}%{_datadir}/osbuild-composer/repositories/$(basename ${REPO_FILE})
done

# RHEL 9 supports building also for RHEL 8
%if 0%{?rhel} == 9
for REPO_FILE in $(ls repositories/rhel-8* | grep -v 'no-aux-key'); do
    install -m 0644 -vp ${REPO_FILE}                               %{buildroot}%{_datadir}/osbuild-composer/repositories/$(basename ${REPO_FILE})
done
%endif

%endif
%endif
%endif

# Fedora can build for all included fedora releases
%if 0%{?fedora}
install -m 0644 -vp repositories/fedora-*                          %{buildroot}%{_datadir}/osbuild-composer/repositories/
%endif

install -m 0755 -vd                                                %{buildroot}%{_unitdir}
install -m 0644 -vp distribution/*.{service,socket}                %{buildroot}%{_unitdir}/

install -m 0755 -vd                                                %{buildroot}%{_sysusersdir}
install -m 0644 -vp distribution/osbuild-composer.conf             %{buildroot}%{_sysusersdir}/

install -m 0755 -vd                                                %{buildroot}%{_localstatedir}/cache/osbuild-composer/dnf-cache

install -m 0755 -vd                                                %{buildroot}%{_mandir}/man7
install -m 0644 -vp docs/*.7                                       %{buildroot}%{_mandir}/man7/

%if %{with tests} || 0%{?rhel}

install -m 0755 -vd                                                %{buildroot}%{_libexecdir}/osbuild-composer-test
install -m 0755 -vp _bin/osbuild-composer-cli-tests                %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-weldr-tests                       %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-dnf-json-tests                    %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-image-tests                       %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-auth-tests                        %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-koji-tests                        %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-composer-dbjobqueue-tests         %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-service-maintenance-tests         %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp _bin/osbuild-mock-openid-provider              %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/define-compose-url.sh                    %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/provision.sh                             %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/gen-certs.sh                             %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/gen-ssh.sh                               %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/image-info                               %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/run-koji-container.sh                    %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/koji-compose.py                          %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/libvirt_test.sh                          %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/s3_test.sh                               %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/generic_s3_test.sh                       %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/generic_s3_https_test.sh                 %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/run-mock-auth-servers.sh                 %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vp tools/set-env-variables.sh                     %{buildroot}%{_libexecdir}/osbuild-composer-test/
install -m 0755 -vd                                                %{buildroot}%{_libexecdir}/tests/osbuild-composer
install -m 0755 -vp test/cases/*.sh                                %{buildroot}%{_libexecdir}/tests/osbuild-composer/

install -m 0755 -vd                                                %{buildroot}%{_libexecdir}/tests/osbuild-composer/api
install -m 0755 -vp test/cases/api/*.sh                            %{buildroot}%{_libexecdir}/tests/osbuild-composer/api/

install -m 0755 -vd                                                %{buildroot}%{_libexecdir}/tests/osbuild-composer/api/common
install -m 0755 -vp test/cases/api/common/*.sh                     %{buildroot}%{_libexecdir}/tests/osbuild-composer/api/common/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/ansible
install -m 0644 -vp test/data/ansible/*                            %{buildroot}%{_datadir}/tests/osbuild-composer/ansible/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/azure
install -m 0644 -vp test/data/azure/*                              %{buildroot}%{_datadir}/tests/osbuild-composer/azure/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/manifests
install -m 0644 -vp test/data/manifests/*                          %{buildroot}%{_datadir}/tests/osbuild-composer/manifests/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/cloud-init
install -m 0644 -vp test/data/cloud-init/*                         %{buildroot}%{_datadir}/tests/osbuild-composer/cloud-init/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/composer
install -m 0644 -vp test/data/composer/*                           %{buildroot}%{_datadir}/tests/osbuild-composer/composer/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/worker
install -m 0644 -vp test/data/worker/*                             %{buildroot}%{_datadir}/tests/osbuild-composer/worker/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/repositories
install -m 0644 -vp test/data/repositories/*                       %{buildroot}%{_datadir}/tests/osbuild-composer/repositories/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/kerberos
install -m 0644 -vp test/data/kerberos/*                           %{buildroot}%{_datadir}/tests/osbuild-composer/kerberos/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/keyring
install -m 0644 -vp test/data/keyring/id_rsa.pub                   %{buildroot}%{_datadir}/tests/osbuild-composer/keyring/
install -m 0600 -vp test/data/keyring/id_rsa                       %{buildroot}%{_datadir}/tests/osbuild-composer/keyring/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/koji
install -m 0644 -vp test/data/koji/*                               %{buildroot}%{_datadir}/tests/osbuild-composer/koji/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/x509
install -m 0644 -vp test/data/x509/*                               %{buildroot}%{_datadir}/tests/osbuild-composer/x509/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/schemas
install -m 0644 -vp pkg/jobqueue/dbjobqueue/schemas/*              %{buildroot}%{_datadir}/tests/osbuild-composer/schemas/

install -m 0755 -vd                                                %{buildroot}%{_datadir}/tests/osbuild-composer/rhel-upgrade
install -m 0644 -vp test/data/rhel-upgrade/*                       %{buildroot}%{_datadir}/tests/osbuild-composer/rhel-upgrade/

%endif

%check
export GOFLAGS="-buildmode=pie"
%if 0%{?rhel}
export GOFLAGS+=" -mod=vendor -tags=exclude_graphdriver_btrfs"
export GOPATH=$PWD/_build:%{gopath}
# cd inside GOPATH, otherwise go with GO111MODULE=off ignores vendor directory
cd $PWD/_build/src/%{goipath}
%gotest ./...
%else
%gocheck
%endif

%post
%systemd_post osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-composer-prometheus.socket osbuild-remote-worker.socket

%preun
%systemd_preun osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-composer-prometheus.socket osbuild-remote-worker.socket

%postun
%systemd_postun_with_restart osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-composer-prometheus.socket osbuild-remote-worker.socket

%files
%license LICENSE
%doc README.md
%{_mandir}/man7/%{name}.7*
%{_unitdir}/osbuild-composer.service
%{_unitdir}/osbuild-composer.socket
%{_unitdir}/osbuild-composer-api.socket
%{_unitdir}/osbuild-composer-prometheus.socket
%{_unitdir}/osbuild-local-worker.socket
%{_unitdir}/osbuild-remote-worker.socket
%{_sysusersdir}/osbuild-composer.conf

%package core
Summary:    The core osbuild-composer binary
Requires:   osbuild-depsolve-dnf >= %{min_osbuild_version}
# This version needs to get bumped everytime the osbuild-depsolve-dnf json
# API changes in incompatible ways
Requires:   osbuild-dnf-json-api = 7
Provides:   %{name}-dnf-json = %{version}-%{release}
Obsoletes:  %{name}-dnf-json < %{version}-%{release}

%description core
The core osbuild-composer binary. This is suitable both for spawning in containers and by systemd.

%files core
%{_libexecdir}/osbuild-composer/osbuild-composer
%{_datadir}/osbuild-composer/

%package worker
Summary:    The worker for osbuild-composer
Requires:   systemd
Requires:   qemu-img
Requires:   osbuild >= %{min_osbuild_version}
Requires:   osbuild-ostree >= %{min_osbuild_version}
Requires:   osbuild-lvm2 >= %{min_osbuild_version}
Requires:   osbuild-luks2 >= %{min_osbuild_version}
Requires:   osbuild-depsolve-dnf >= %{min_osbuild_version}
Provides:   %{name}-dnf-json = %{version}-%{release}
Obsoletes:  %{name}-dnf-json < %{version}-%{release}

%description worker
The worker for osbuild-composer

%files worker
%{_libexecdir}/osbuild-composer/osbuild-worker
%{_libexecdir}/osbuild-composer/osbuild-worker-executor
%{_libexecdir}/osbuild-composer/osbuild-jobsite-manager
%{_libexecdir}/osbuild-composer/osbuild-jobsite-builder
%{_unitdir}/osbuild-worker@.service
%{_unitdir}/osbuild-remote-worker@.service

%post worker
%systemd_post osbuild-worker@.service osbuild-remote-worker@.service

%preun worker
# systemd_preun uses systemctl disable --now which doesn't work well with template services.
# See https://github.com/systemd/systemd/issues/15620
# The following lines mimicks its behaviour by running two commands.
# The scriptlet is supposed to run only when the package is being removed.
if [ $1 -eq 0 ] && [ -d /run/systemd/system ]; then
    # disable and stop all the worker services
    systemctl --no-reload disable osbuild-worker@.service osbuild-remote-worker@.service
    systemctl stop "osbuild-worker@*.service" "osbuild-remote-worker@*.service"
fi

%postun worker
# restart all the worker services
%systemd_postun_with_restart "osbuild-worker@*.service" "osbuild-remote-worker@*.service"

%if %{with tests} || 0%{?rhel}

%package tests
Summary:    Integration tests
%if %{with relax_requires}
Requires:   %{name}
%else
Requires:   %{name} = %{version}-%{release}
%endif
Requires:   composer-cli
Requires:   createrepo_c
Requires:   xorriso
Requires:   qemu-kvm-core
Requires:   systemd-container
Requires:   jq
Requires:   unzip
Requires:   container-selinux
Requires:   dnsmasq
Requires:   krb5-workstation
Requires:   podman
Requires:   python3
Requires:   sssd-krb5
Requires:   libvirt-client libvirt-daemon
Requires:   libvirt-daemon-config-network
Requires:   libvirt-daemon-config-nwfilter
Requires:   libvirt-daemon-driver-interface
Requires:   libvirt-daemon-driver-network
Requires:   libvirt-daemon-driver-nodedev
Requires:   libvirt-daemon-driver-nwfilter
Requires:   libvirt-daemon-driver-qemu
Requires:   libvirt-daemon-driver-secret
Requires:   libvirt-daemon-driver-storage
Requires:   libvirt-daemon-driver-storage-disk
Requires:   libvirt-daemon-kvm
Requires:   qemu-img
Requires:   qemu-kvm
Requires:   rpmdevtools
Requires:   virt-install
Requires:   expect
Requires:   python3-lxml
Requires:   httpd
Requires:   mod_ssl
Requires:   openssl
Requires:   firewalld
# podman-plugins has been deprecated since podman version 5.0.0,
# which is in Fedora 40+ and in c10s / el10
%if (0%{?rhel} && 0%{?rhel} < 10) || (0%{?fedora} && 0%{?fedora} < 40)
Requires:   podman-plugins
%endif
Requires:   dnf-plugins-core
Requires:   skopeo
Requires:   make
Requires:   python3-pip
%if 0%{?fedora}
# koji and ansible are not in RHEL repositories. Depending on them breaks RHEL
# gating (see OSCI-1541). The test script must enable EPEL and install those
# packages manually.
Requires:   koji
Requires:   ansible
%endif
%ifarch %{arm}
Requires:   edk2-aarch64
%endif

%description tests
Integration tests to be run on a pristine-dedicated system to test the osbuild-composer package.

%files tests
%{_libexecdir}/osbuild-composer-test/
%{_libexecdir}/tests/osbuild-composer/
%{_datadir}/tests/osbuild-composer/

%endif

%changelog
# the changelog is distribution-specific, therefore there's just one entry
# to make rpmlint happy.

* Wed Dec 11 2024 Packit <hello@packit.dev> - 127-1.20241211082051121413.main.1.gf6d320886
- Post release version bump (schutzbot)

* Wed Sep 11 2019 Image Builder team <osbuilders@redhat.com> - 0-1
- On this day, this project was born.