From 91b86a13690657b478bbdf138f500555a1c0d07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Budai?= Date: Fri, 28 Aug 2020 13:11:39 +0200 Subject: [PATCH] osbuild-composer: add a socket for Koji API Add a systemd socket for Koji API. If enabled when osbuild-composer.service is started, the service will also listen on the socket and serve Koji API there. Note that Koji API doesn't upload to Koji yet, this still needs to be hooked up. Based on a patch from Tom Gundersen, thanks! --- Makefile | 1 + cmd/osbuild-composer-koji-tests/main_test.go | 45 +++++++++++ cmd/osbuild-composer/main.go | 19 +++++ distribution/osbuild-composer-koji.socket | 9 +++ osbuild-composer.spec | 83 ++++++++++++++------ 5 files changed, 132 insertions(+), 25 deletions(-) create mode 100644 cmd/osbuild-composer-koji-tests/main_test.go create mode 100644 distribution/osbuild-composer-koji.socket 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