diff --git a/Makefile b/Makefile index eae820a85..97da5e1c0 100644 --- a/Makefile +++ b/Makefile @@ -117,6 +117,7 @@ build: go test -c -tags=integration -o osbuild-weldr-tests ./internal/client/ go test -c -tags=integration -o osbuild-dnf-json-tests ./cmd/osbuild-dnf-json-tests/main_test.go go test -c -tags=integration -o osbuild-image-tests ./cmd/osbuild-image-tests/ + go test -c -tags=integration -o osbuild-composer-koji-tests ./cmd/osbuild-composer-koji-tests/main_test.go .PHONY: install install: diff --git a/cmd/osbuild-composer-koji-tests/main_test.go b/cmd/osbuild-composer-koji-tests/main_test.go new file mode 100644 index 000000000..554234298 --- /dev/null +++ b/cmd/osbuild-composer-koji-tests/main_test.go @@ -0,0 +1,45 @@ +// +build integration + +package main + +import ( + "context" + "net/http" + "testing" + + "github.com/osbuild/osbuild-composer/internal/kojiapi" + "github.com/stretchr/testify/require" +) + +func TestKoji(t *testing.T) { + client, err := kojiapi.NewClientWithResponses("http://127.0.0.1:8701/") + if err != nil { + panic(err) + } + + response, err := client.PostComposeWithResponse(context.Background(), kojiapi.PostComposeJSONRequestBody{ + Distribution: "fedora-32", + ImageRequests: []kojiapi.ImageRequest{ + { + Architecture: "x86_64", + ImageType: "qcow2", + Repositories: []kojiapi.Repository{ + { + Baseurl: "http://download.fedoraproject.org/pub/fedora/linux/releases/32/Everything/x86_64/os/", + Gpgkey: "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF1RVqsBEADWMBqYv/G1r4PwyiPQCfg5fXFGXV1FCZ32qMi9gLUTv1CX7rYy\nH4Inj93oic+lt1kQ0kQCkINOwQczOkm6XDkEekmMrHknJpFLwrTK4AS28bYF2RjL\nM+QJ/dGXDMPYsP0tkLvoxaHr9WTRq89A+AmONcUAQIMJg3JxXAAafBi2UszUUEPI\nU35MyufFt2ePd1k/6hVAO8S2VT72TxXSY7Ha4X2J0pGzbqQ6Dq3AVzogsnoIi09A\n7fYutYZPVVAEGRUqavl0th8LyuZShASZ38CdAHBMvWV4bVZghd/wDV5ev3LXUE0o\nitLAqNSeiDJ3grKWN6v0qdU0l3Ya60sugABd3xaE+ROe8kDCy3WmAaO51Q880ZA2\niXOTJFObqkBTP9j9+ZeQ+KNE8SBoiH1EybKtBU8HmygZvu8ZC1TKUyL5gwGUJt8v\nergy5Bw3Q7av520sNGD3cIWr4fBAVYwdBoZT8RcsnU1PP67NmOGFcwSFJ/LpiOMC\npZ1IBvjOC7KyKEZY2/63kjW73mB7OHOd18BHtGVkA3QAdVlcSule/z68VOAy6bih\nE6mdxP28D4INsts8w6yr4G+3aEIN8u0qRQq66Ri5mOXTyle+ONudtfGg3U9lgicg\nz6oVk17RT0jV9uL6K41sGZ1sH/6yTXQKagdAYr3w1ix2L46JgzC+/+6SSwARAQAB\ntDFGZWRvcmEgKDMyKSA8ZmVkb3JhLTMyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJdUVarAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBsEwJtEslE0LdAD/wKdAMtfzr7O2y06/sOPnrb3D39Y2DXbB8y0iEmRdBL29Bq\n5btxwmAka7JZRJVFxPsOVqZ6KARjS0/oCBmJc0jCRANFCtM4UjVHTSsxrJfuPkel\nvrlNE9tcR6OCRpuj/PZgUa39iifF/FTUfDgh4Q91xiQoLqfBxOJzravQHoK9VzrM\nNTOu6J6l4zeGzY/ocj6DpT+5fdUO/3HgGFNiNYPC6GVzeiA3AAVR0sCyGENuqqdg\nwUxV3BIht05M5Wcdvxg1U9x5I3yjkLQw+idvX4pevTiCh9/0u+4g80cT/21Cxsdx\n7+DVHaewXbF87QQIcOAing0S5QE67r2uPVxmWy/56TKUqDoyP8SNsV62lT2jutsj\nLevNxUky011g5w3bc61UeaeKrrurFdRs+RwBVkXmtqm/i6g0ZTWZyWGO6gJd+HWA\nqY1NYiq4+cMvNLatmA2sOoCsRNmE9q6jM/ESVgaH8hSp8GcLuzt9/r4PZZGl5CvU\neldOiD221u8rzuHmLs4dsgwJJ9pgLT0cUAsOpbMPI0JpGIPQ2SG6yK7LmO6HFOxb\nAkz7IGUt0gy1MzPTyBvnB+WgD1I+IQXXsJbhP5+d+d3mOnqsd6oDM/grKBzrhoUe\noNadc9uzjqKlOrmrdIR3Bz38SSiWlde5fu6xPqJdmGZRNjXtcyJlbSPVDIloxw==\n=QWRO\n-----END PGP PUBLIC KEY BLOCK-----\n", + }, + }, + }, + }, + }) + require.NoError(t, err) + + require.Equalf(t, http.StatusCreated, response.StatusCode(), "Error: got non-201 status. Full response: %v", string(response.Body)) + + require.NotNil(t, response.JSON201) + + response2, err := client.GetComposeIdWithResponse(context.Background(), response.JSON201.Id) + require.NoError(t, err) + + require.Equalf(t, response2.StatusCode(), 200, "Error: got non-200 status. Full response: %v", response2.Body) +} diff --git a/cmd/osbuild-composer/main.go b/cmd/osbuild-composer/main.go index 917c4cd4c..deb88546c 100644 --- a/cmd/osbuild-composer/main.go +++ b/cmd/osbuild-composer/main.go @@ -13,6 +13,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/distro/fedora32" "github.com/osbuild/osbuild-composer/internal/distro/rhel8" "github.com/osbuild/osbuild-composer/internal/jobqueue/fsjobqueue" + "github.com/osbuild/osbuild-composer/internal/kojiapi" "github.com/osbuild/osbuild-composer/internal/common" "github.com/osbuild/osbuild-composer/internal/distro" @@ -148,6 +149,24 @@ func main() { common.PanicOnError(err) }() + // Optionally run Koji API + if kojiListeners, exists := listeners["osbuild-composer-koji.socket"]; exists { + if len(kojiListeners) != 1 { + // Use Fatal to call os.Exit with non-zero return value + log.Fatal("The osbuild-composer-koji.socket unit is misconfigured. It should contain only one socket.") + } + kojiListener := kojiListeners[0] + + kojiServer := kojiapi.NewServer(workers, rpm, distros) + + go func() { + err = kojiServer.Serve(kojiListener) + + // If the koji server fails, take down the whole process, not just a single goroutine + log.Fatal("osbuild-composer-koji.socket failed: ", err) + }() + } + if remoteWorkerListeners, exists := listeners["osbuild-remote-worker.socket"]; exists { for _, listener := range remoteWorkerListeners { log.Printf("Starting remote listener\n") diff --git a/distribution/osbuild-composer-koji.socket b/distribution/osbuild-composer-koji.socket new file mode 100644 index 000000000..672155840 --- /dev/null +++ b/distribution/osbuild-composer-koji.socket @@ -0,0 +1,9 @@ +[Unit] +Description=OSBuild Composer Koji API socket + +[Socket] +Service=osbuild-composer.service +ListenStream=8701 + +[Install] +WantedBy=sockets.target diff --git a/osbuild-composer.spec b/osbuild-composer.spec index 0da052b2a..32ad7346d 100644 --- a/osbuild-composer.spec +++ b/osbuild-composer.spec @@ -113,45 +113,52 @@ go test -c -tags=integration -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-tests %{ go test -c -tags=integration -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-dnf-json-tests %{goipath}/cmd/osbuild-dnf-json-tests go test -c -tags=integration -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-weldr-tests %{goipath}/internal/client/ go test -c -tags=integration -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-image-tests %{goipath}/cmd/osbuild-image-tests +go test -c -tags=integration -ldflags="${TEST_LDFLAGS}" -o _bin/osbuild-composer-koji-tests %{goipath}/cmd/osbuild-composer-koji-tests %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 dnf-json %{buildroot}%{_libexecdir}/osbuild-composer/ +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 dnf-json %{buildroot}%{_libexecdir}/osbuild-composer/ -install -m 0755 -vd %{buildroot}%{_datadir}/osbuild-composer/repositories -install -m 0644 -vp repositories/* %{buildroot}%{_datadir}/osbuild-composer/repositories/ +install -m 0755 -vd %{buildroot}%{_datadir}/osbuild-composer/repositories +install -m 0644 -vp repositories/* %{buildroot}%{_datadir}/osbuild-composer/repositories/ -install -m 0755 -vd %{buildroot}%{_unitdir} -install -m 0644 -vp distribution/*.{service,socket} %{buildroot}%{_unitdir}/ +install -m 0755 -vd %{buildroot}%{_unitdir} +install -m 0644 -vp distribution/osbuild-composer.service %{buildroot}%{_unitdir}/ +install -m 0644 -vp distribution/osbuild-composer.socket %{buildroot}%{_unitdir}/ +install -m 0644 -vp distribution/osbuild-remote-worker.socket %{buildroot}%{_unitdir}/ +install -m 0644 -vp distribution/osbuild-remote-worker@.service %{buildroot}%{_unitdir}/ +install -m 0644 -vp distribution/osbuild-worker@.service %{buildroot}%{_unitdir}/ +install -m 0644 -vp distribution/osbuild-composer-koji.socket %{buildroot}%{_unitdir}/ -install -m 0755 -vd %{buildroot}%{_sysusersdir} -install -m 0644 -vp distribution/osbuild-composer.conf %{buildroot}%{_sysusersdir}/ +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}%{_localstatedir}/cache/osbuild-composer/dnf-cache %if %{with tests} || 0%{?rhel} -install -m 0755 -vd %{buildroot}%{_libexecdir}/tests/osbuild-composer -install -m 0755 -vp _bin/osbuild-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ -install -m 0755 -vp _bin/osbuild-weldr-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ -install -m 0755 -vp _bin/osbuild-dnf-json-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ -install -m 0755 -vp _bin/osbuild-image-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ -install -m 0755 -vp tools/image-info %{buildroot}%{_libexecdir}/osbuild-composer/ +install -m 0755 -vd %{buildroot}%{_libexecdir}/tests/osbuild-composer +install -m 0755 -vp _bin/osbuild-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ +install -m 0755 -vp _bin/osbuild-weldr-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ +install -m 0755 -vp _bin/osbuild-dnf-json-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ +install -m 0755 -vp _bin/osbuild-image-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ +install -m 0755 -vp _bin/osbuild-composer-koji-tests %{buildroot}%{_libexecdir}/tests/osbuild-composer/ +install -m 0755 -vp tools/image-info %{buildroot}%{_libexecdir}/osbuild-composer/ -install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer -install -m 0644 -vp test/azure-deployment-template.json %{buildroot}%{_datadir}/tests/osbuild-composer/ +install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer +install -m 0644 -vp test/azure-deployment-template.json %{buildroot}%{_datadir}/tests/osbuild-composer/ -install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/cases -install -m 0644 -vp test/cases/* %{buildroot}%{_datadir}/tests/osbuild-composer/cases/ -install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/keyring -install -m 0600 -vp test/keyring/* %{buildroot}%{_datadir}/tests/osbuild-composer/keyring/ +install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/cases +install -m 0644 -vp test/cases/* %{buildroot}%{_datadir}/tests/osbuild-composer/cases/ +install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/keyring +install -m 0600 -vp test/keyring/* %{buildroot}%{_datadir}/tests/osbuild-composer/keyring/ -install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/cloud-init -install -m 0644 -vp test/cloud-init/* %{buildroot}%{_datadir}/tests/osbuild-composer/cloud-init/ +install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/cloud-init +install -m 0644 -vp test/cloud-init/* %{buildroot}%{_datadir}/tests/osbuild-composer/cloud-init/ %endif @@ -241,5 +248,31 @@ Integration tests to be run on a pristine-dedicated system to test the osbuild-c %endif +%package koji +Summary: osbuild-composer for pushing images to Koji +Requires: %{name} = %{version}-%{release} + +# remove in F34 +Obsoletes: golang-github-osbuild-composer-rcm < %{version}-%{release} +Provides: golang-github-osbuild-composer-rcm = %{version}-%{release} +# remove in the future +Obsoletes: osbuild-composer-rcm < %{version}-%{release} +Provides: osbuild-composer-rcm = %{version}-%{release} + +%description koji +osbulid-composer specifically for pushing images to Koji. + +%files koji +%{_unitdir}/osbuild-composer-koji.socket + +%post koji +%systemd_post osbuild-composer-koji.socket + +%preun koji +%systemd_preun osbuild-composer-koji.socket + +%postun koji +%systemd_postun_with_restart osbuild-composer-koji.socket + %changelog # the changelog is distribution-specific, therefore it doesn't make sense to have it upstream