<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>The Wombelix Post - openSUSE</title><link href="https://dominik.wombacher.cc/" rel="alternate"/><link href="/feeds/tag_opensuse.atom.xml" rel="self"/><id>https://dominik.wombacher.cc/</id><updated>2024-11-22T00:00:00+01:00</updated><entry><title>SUSE Hack Week 2024 - Day 5</title><link href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-5.html" rel="alternate"/><published>2024-11-22T00:00:00+01:00</published><updated>2024-11-22T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2024-11-22:/posts/suse-hack-week-2024-day-5.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;The problem with a failing test was driving me nuts &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-4.html"&gt;yesterday&lt;/a&gt;.
And I made a classic Engineer mistake, I didn't take a step back to clear my head and recharge  ... &lt;a class="read-more" href="/posts/suse-hack-week-2024-day-5.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;The problem with a failing test was driving me nuts &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-4.html"&gt;yesterday&lt;/a&gt;.
And I made a classic Engineer mistake, I didn't take a step back to clear my head and recharge. I continued to work
on the same problem till 1 AM, of course without a result, before I gave up. After some sleep and getting back to
work with a structured approach, it took me less than 15 minutes today to validate my theory and figure out what
the problem was... Damn, I'm happy I found it but all the time I wasted last night... Whatever, chasing the
white rabbit and getting a bit lost happens to the best sometimes.&lt;/p&gt;
&lt;p&gt;So, what was the issue? I want to know if a method was called with a specific set of args by using
&lt;code&gt;assert_called_once_with&lt;/code&gt;. Visually, the expected and actual values match. But I pass an object of
&lt;code&gt;model.Project&lt;/code&gt; and Mock checks if it's the same instance of the object, not if the content matches.
I create a &lt;code&gt;project&lt;/code&gt; object in my tests, and &lt;code&gt;pagure.lib.tasks_services.trigger_ci_build()&lt;/code&gt; does
the same. Even though the keys and values look identical, there are two different objects and the assertion fails.&lt;/p&gt;
&lt;p&gt;To solve it, I have to Mock &lt;code&gt;pagure.lib.query.get_authorized_project()&lt;/code&gt; and inject the &lt;code&gt;project&lt;/code&gt; object
that's created in the test. Then the whole thing works as I want it. Next step: Refactoring to use &lt;code&gt;model.PullRequest&lt;/code&gt;
object with access to all pull request related information instead of &lt;code&gt;pull_request_id&lt;/code&gt; and &lt;code&gt;pull_request_uid&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That worked pretty well, writing the tests before the actual code feels weird at first but today that was a productivity
booster. It's much easier to focus on the next feature or refactoring, while I don't have to worry that silently
breaks something else. As long the other tests continue to pass, I'm still on track. I tried Test-Driven-Development
before, but I guess bad habits came back and I never went all-in with it for a longer session.&lt;/p&gt;
&lt;p&gt;This &lt;a class="reference external" href="https://pagure.io/pagure/pull-request/5511"&gt;Pull Request&lt;/a&gt; contains the current state and the outcome of my
Hack Week project. I finished around 2/3 of what was planned, I hope to get the rest done in the next week or two.&lt;/p&gt;
&lt;p&gt;I wrote a lot Python code before, including tests, but a couple days with an intensive focus helped a lot to
brush up my knowledge. Good chances that I not waste time with such a stupid problem next time ;) This week
re-affirmed that my passion is solving problems and writing code. I hope I can do that more regularly in future
and have the opportunity to free up time and attend SUSE Hack Week 25 as well.&lt;/p&gt;
</content><category term="Code"/><category term="SUSE"/><category term="openSUSE"/><category term="pagure"/><category term="HackWeek"/><category term="AWS"/><category term="CodePipeline"/><category term="Coding"/><category term="OpenSource"/></entry><entry><title>SUSE Hack Week 2024 - Day 4</title><link href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-4.html" rel="alternate"/><published>2024-11-21T00:00:00+01:00</published><updated>2024-11-21T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2024-11-21:/posts/suse-hack-week-2024-day-4.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today was the focus on writing the pagure ci plugin and fine-tune my design and architecture assumptions on the way.
Basically transferring the outcome of &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-3.html"&gt;day 3&lt;/a&gt; into some code  ... &lt;a class="read-more" href="/posts/suse-hack-week-2024-day-4.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today was the focus on writing the pagure ci plugin and fine-tune my design and architecture assumptions on the way.
Basically transferring the outcome of &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-3.html"&gt;day 3&lt;/a&gt; into some code.
I decided to use a Test-Driven approach and to keep a close eye on existing pagure ci related tests while
I have to refactor some existing code too.&lt;/p&gt;
&lt;p&gt;Before I started to write tests, I wanted to validate a couple of assumptions on my pagure dev instance.
Unfortunately I had to fix a couple errors over there (file permissions, pagure_worker runs as apache and
not git user, db scheme forgotten to upgrade...) before I finally could start. It's always a good opportunity,
you learn most when things are broken. But I lost quite some coding time that way...&lt;/p&gt;
&lt;p&gt;Speaking of coding, the main challenge was that some information I want/need in my generic plugin are currently not passed.&lt;/p&gt;
&lt;p&gt;What we currently have doesn't leaves much room for the plugin to get additional data:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="pygments-k"&gt;def&lt;/span&gt; &lt;span class="pygments-nf"&gt;trigger_build&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;project_path&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;url&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;job&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;token&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;branch&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;branch_to&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;cause&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;ci_username&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-n"&gt;ci_password&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-p"&gt;):&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;What I want in future to make things more flexible:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="pygments-k"&gt;def&lt;/span&gt; &lt;span class="pygments-nf"&gt;trigger_build&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;project&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-n"&gt;model&lt;/span&gt;&lt;span class="pygments-o"&gt;.&lt;/span&gt;&lt;span class="pygments-n"&gt;Project&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;ci_url&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;ci_job&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;ci_token&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;branch&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;branch_to&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;is_pull_request&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;bool&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-kc"&gt;False&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;is_commit&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;bool&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-kc"&gt;False&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;commit_hash&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;pull_request_id&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;pull_request_uid&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-nb"&gt;str&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;ci_username&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;        &lt;span class="pygments-n"&gt;ci_password&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt; &lt;span class="pygments-o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This could be further improved by passing &lt;code&gt;model.PullRequest&lt;/code&gt; instead of &lt;code&gt;pull_request_id&lt;/code&gt; and &lt;code&gt;pull_request_uid&lt;/code&gt;.
Then it's up to the pagure ci plugin to decide what data are needed, similar as with &lt;code&gt;project&lt;/code&gt;.
When I'm done with the &lt;code&gt;generic&lt;/code&gt; plugin then the existing &lt;code&gt;jenkins&lt;/code&gt; need some refactoring to work with the new parameters.&lt;/p&gt;
&lt;p&gt;I started to write the tests and iterate through the different plugin functionality.
All that went well until I hit a problem that still drives me crazy.
It shouldn't be hard to verify that a method was called with the expected args by using &lt;code&gt;assert_called_once_with&lt;/code&gt;.
But it throws a nice &lt;code&gt;AssertionError: expected call not found.&lt;/code&gt; even though &lt;code&gt;Expected&lt;/code&gt; and &lt;code&gt;Actual&lt;/code&gt; match:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="pygments-n"&gt;E&lt;/span&gt;           &lt;span class="pygments-ne"&gt;AssertionError&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-n"&gt;expected&lt;/span&gt; &lt;span class="pygments-n"&gt;call&lt;/span&gt; &lt;span class="pygments-ow"&gt;not&lt;/span&gt; &lt;span class="pygments-n"&gt;found&lt;/span&gt;&lt;span class="pygments-o"&gt;.&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-n"&gt;E&lt;/span&gt;           &lt;span class="pygments-n"&gt;Expected&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-n"&gt;trigger_build&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;project&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-n"&gt;Project&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-mi"&gt;1&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-n"&gt;test&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;namespace&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;url&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;is_fork&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;False&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;parent_id&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;),&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_url&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'https://ci.example.com/'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_job&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'pagure'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_token&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'random_token'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;branch&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'feature'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;branch_to&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'main'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;is_pull_request&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;True&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;is_commit&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;False&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;commit_hash&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;pull_request_id&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'1'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;pull_request_uid&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'720a0568c1274e74966e54b433b2003e'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_username&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_password&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-n"&gt;E&lt;/span&gt;           &lt;span class="pygments-n"&gt;Actual&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;   &lt;span class="pygments-n"&gt;trigger_build&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;project&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-n"&gt;Project&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-mi"&gt;1&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-n"&gt;test&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;namespace&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;url&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;is_fork&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;False&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;parent_id&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;),&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_url&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'https://ci.example.com/'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_job&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'pagure'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_token&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'random_token'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;branch&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'feature'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;branch_to&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'main'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;is_pull_request&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;True&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;is_commit&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;False&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;commit_hash&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;pull_request_id&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'1'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;pull_request_uid&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s1"&gt;'720a0568c1274e74966e54b433b2003e'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_username&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;ci_password&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I take a break and try it again tomorrow after some sleep. Maybe I'm tired and missing something obvious.
But for me both look the same and there shouldn't be an assertion error.&lt;/p&gt;
&lt;p&gt;Let's hope I can figure out tomorrow what's going wrong here...&lt;/p&gt;
</content><category term="Code"/><category term="SUSE"/><category term="openSUSE"/><category term="pagure"/><category term="HackWeek"/><category term="AWS"/><category term="CodePipeline"/><category term="Coding"/><category term="OpenSource"/></entry><entry><title>SUSE Hack Week 2024 - Day 3</title><link href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-3.html" rel="alternate"/><published>2024-11-20T00:00:00+01:00</published><updated>2024-11-20T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2024-11-20:/posts/suse-hack-week-2024-day-3.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I continued where I left off on the &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-2.html"&gt;second day&lt;/a&gt;,
I was thinking about my architecture last night. AWS CodePipeline requires a bit of a custom implementation
within the AWS  ... &lt;a class="read-more" href="/posts/suse-hack-week-2024-day-3.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I continued where I left off on the &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-2.html"&gt;second day&lt;/a&gt;,
I was thinking about my architecture last night. AWS CodePipeline requires a bit of a custom implementation
within the AWS Account, for example with AWS Lambda, to handle third party repos that are not GitHub, Gitlab or Bitbucket.
Maybe the pagure ci plugin should then a generic webhook style implementation. It defines the payload that is send and the expected
answer to update the PR status. But leaves the actual implementation up to the target system. That way, the plugin isn't
limited to one single service. I can use it to interact with AWS CodePipeline, or directly AWS CodeBuild, or any other system
were I can implement the server side logic myself.&lt;/p&gt;
&lt;p&gt;This shifts the scope of &lt;a class="reference external" href="https://hackweek.opensuse.org/projects/aws-codepipeline-ci-plugin-for-pagure-on-code-dot-opensuse-dot-org"&gt;my project&lt;/a&gt;
a little, but the outcome stays the same. I probably need two AWS Lambda functions, one to receive the webhook and trigger the build.
Another to receive status updates from CodeBuild phases and send them back to pagure. The AWS credentials for pagure need
permission to trigger the Lambda function for incoming requests. The function has permissions to interact with S3 and
CodePipeline / Codebuild. The outgoing Lambda uses the pagure ci token and gets it from a Env Var or AWS Secrets Manager.
Every component follows the least privilege principle.&lt;/p&gt;
&lt;p&gt;The pagure ci &lt;a class="reference external" href="https://pagure.io/pagure/blob/master/f/pagure/api/ci/jenkins.py#_33"&gt;jenkins plugin routes&lt;/a&gt; expect a &lt;code&gt;POST&lt;/code&gt;
request but the token is part of the URL. My plugin will use routes like &lt;code&gt;/ci/webhook/&amp;lt;repo&amp;gt;&lt;/code&gt; instead of
&lt;code&gt;/ci/jenkins/&amp;lt;repo&amp;gt;/&amp;lt;pagure_ci_token&amp;gt;/build-finished&lt;/code&gt;. The token has to be submitted as part of the request.
This keeps the token away from plain text logs, it's still a secret and should be treated like that.&lt;/p&gt;
&lt;p&gt;With the idea of a generic plugin in mind, Authentication becomes a challenge.
Calling an AWS Lambda on its function URL works best with a SIGv4 authentication request.
For any other, basic authentication seems the most common and reasonable way.
I have to figure out how to handle this properly. I don't want to add more fields to
pagure ci and the Web UI. First thing in mind: URI Scheme.
&lt;code&gt;https&lt;/code&gt; means plain request with basic auth based on &lt;code&gt;ci_username&lt;/code&gt; and &lt;code&gt;ci_password&lt;/code&gt;, if set.
&lt;code&gt;https+sigv4&lt;/code&gt; = AWS SIGv4 authentication request, uses &lt;code&gt;ci_username&lt;/code&gt; (Access Key) and &lt;code&gt;ci_password&lt;/code&gt; (Secret Key).&lt;/p&gt;
&lt;p&gt;I'll add the Lambda code and a IaC example (AWS CDK, AWS CloudFormation or OpenTofu/Terraform) to the pagure repo.
That way the end-to-end integration becomes a first-class citizen in pagure, not just the ci plugin.&lt;/p&gt;
&lt;p&gt;The time I could invest today was pretty limited and focused on further Architecture details.
I started with the pagure ci plugin, it is in an early stage but I'm confident that there is more to demonstrate tomorrow.&lt;/p&gt;
</content><category term="Code"/><category term="SUSE"/><category term="openSUSE"/><category term="pagure"/><category term="HackWeek"/><category term="AWS"/><category term="CodePipeline"/><category term="Coding"/><category term="OpenSource"/></entry><entry><title>SUSE Hack Week 2024 - Day 2</title><link href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-2.html" rel="alternate"/><published>2024-11-19T00:00:00+01:00</published><updated>2024-11-19T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2024-11-19:/posts/suse-hack-week-2024-day-2.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Second day, time to continue the work on
&lt;a class="reference external" href="https://hackweek.opensuse.org/projects/aws-codepipeline-ci-plugin-for-pagure-on-code-dot-opensuse-dot-org"&gt;my project&lt;/a&gt;
after a successful &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-1.html"&gt;first day&lt;/a&gt;.
The focus was on research, tests and design decisions for the AWS CodePipeline pagure ci  ... &lt;a class="read-more" href="/posts/suse-hack-week-2024-day-2.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Second day, time to continue the work on
&lt;a class="reference external" href="https://hackweek.opensuse.org/projects/aws-codepipeline-ci-plugin-for-pagure-on-code-dot-opensuse-dot-org"&gt;my project&lt;/a&gt;
after a successful &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-1.html"&gt;first day&lt;/a&gt;.
The focus was on research, tests and design decisions for the AWS CodePipeline pagure ci plugin.
I want to make the set up on the AWS side as easy and maintenance free as possible.
But keep the code and customization logic in pagure lightweight too.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html"&gt;Buildspec&lt;/a&gt;
that CodeBuild uses to run a build should be in the git repository and managed independently.
The current design and workflow I have in mind looks like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;User performs Git push to repository on pagure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;pagure ci triggers AWS Lambda through function URL&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;On commits and / or on pull-requests&lt;/li&gt;
&lt;li&gt;Payload contains: cause, repo, branch, branch_to&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;AWS Lambda gets buildspec from default branch and performs Git clone&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Clone branch depends on received payload&lt;/li&gt;
&lt;li&gt;Buildspec is used from default branch to reduce risk of untrusted Pull Requests&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;AWS Lambda inject payload data into buildspec, generates zip archive and uploads it to S3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;AWS CodePipeline detects changed file on S3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;AWS CodePipeline retrieves archive and triggers AWS CodeBuild&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;AWS CodeBuild gets pagure ci token from AWS Secrets Manager&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Injected as Environment Variable&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;AWS CodeBuild executes phases and reports status back to pagure ci&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;I still have to work out some details but I can start the implementation tomorrow.&lt;/p&gt;
&lt;p&gt;Another thing I stumbled across, interesting: The pagure ci code contains a &lt;code&gt;ci_username&lt;/code&gt;
and &lt;code&gt;ci_password&lt;/code&gt; field &lt;a class="reference external" href="https://pagure.io/pagure/c/9c6dee24463fdbfe88c21cfa4a6d7d3af87a5b7c?branch=master"&gt;since 5 years&lt;/a&gt;.
But for whatever reason, they were never added to the &lt;a class="reference external" href="https://pagure.io/pagure/blob/master/f/pagure/hooks/pagure_ci.py#_177"&gt;fields that are rendered in the Web UI&lt;/a&gt;.
Also, the WTForms field type for &lt;code&gt;ci_password&lt;/code&gt; was &lt;code&gt;StringField&lt;/code&gt;, it should be &lt;code&gt;PasswordField&lt;/code&gt; instead.&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;diff --git a/pagure/hooks/pagure_ci.py b/pagure/hooks/pagure_ci.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index 819b2a1b..38702a72 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/pagure/hooks/pagure_ci.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/pagure/hooks/pagure_ci.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -121,7 +121,7 &amp;#64;&amp;#64; class PagureCiForm(FlaskForm):&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       [wtforms.validators.Optional(), wtforms.validators.Length(max=255)],&lt;span class="pygments-w"&gt;
 &lt;/span&gt;   )&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    ci_password = wtforms.StringField(&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    ci_password = wtforms.PasswordField(&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       &amp;quot;Password to authenticate with if needed&amp;quot;,&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       [wtforms.validators.Optional(), wtforms.validators.Length(max=255)],&lt;span class="pygments-w"&gt;
 &lt;/span&gt;   )&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -174,7 +174,7 &amp;#64;&amp;#64; class PagureCi(BaseHook):&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;   form = PagureCiForm&lt;span class="pygments-w"&gt;
 &lt;/span&gt;   db_object = PagureCITable&lt;span class="pygments-w"&gt;
 &lt;/span&gt;   backref = &amp;quot;ci_hook&amp;quot;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    form_fields = [&amp;quot;ci_type&amp;quot;, &amp;quot;ci_url&amp;quot;, &amp;quot;ci_job&amp;quot;, &amp;quot;active_commit&amp;quot;, &amp;quot;active_pr&amp;quot;]&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    form_fields = [&amp;quot;ci_type&amp;quot;, &amp;quot;ci_url&amp;quot;, &amp;quot;ci_job&amp;quot;, &amp;quot;ci_username&amp;quot;, &amp;quot;ci_password&amp;quot;, &amp;quot;active_commit&amp;quot;, &amp;quot;active_pr&amp;quot;]&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;   runner = PagureCIRunner&lt;span class="pygments-w"&gt;

 &lt;/span&gt;   &amp;#64;classmethod&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Last but not least, when I &lt;a class="reference external" href="https://pagure.io/pagure/pull-request/5491"&gt;refactored the pagure ci code 5 months ago&lt;/a&gt;
one problem stayed unnoticed: To add routes to a Flask Blueprint, the modules need to be imported before the Blueprint is registered with the app.
This was the case before the refactoring, but now the import to add the routes didn't happen and at the time the pagure ci plugin is activated, it's too late.
I doubt that I came up with the most elegant solution, but at least a functional ;)&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;diff --git a/pagure/flask_app.py b/pagure/flask_app.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index e9baa507..c22ea72c 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/pagure/flask_app.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/pagure/flask_app.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -11,6 +11,8 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;from __future__ import absolute_import, unicode_literals&lt;span class="pygments-w"&gt;

&lt;/span&gt;import datetime&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+import importlib&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;import gc&lt;span class="pygments-w"&gt;
&lt;/span&gt;import logging&lt;span class="pygments-w"&gt;
&lt;/span&gt;import os&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -135,6 +137,14 &amp;#64;&amp;#64; def create_app(config=None):&lt;/span&gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;   from pagure.api import API  # noqa: E402&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    # Load all configured pagure ci plugins once to initiate routes&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    # Required before Blueprint registration&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    ci_plugins = {}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    for ci_type in pagure_config[&amp;quot;PAGURE_CI_SERVICES&amp;quot;]:&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        ci_plugins[ci_type] = importlib.import_module(&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;quot;pagure.api.ci.&amp;quot; + ci_type&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        )&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;   app.register_blueprint(API)&lt;span class="pygments-w"&gt;

 &lt;/span&gt;   from pagure.ui import UI_NS  # noqa: E402&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I iterate over all configured pagure ci plugins and import them immediately before the API Blueprint is registered.
That way the routes, required to receive status updates, are added, variable &lt;code&gt;ci_plugins&lt;/code&gt; is kind of a dummy and never used.&lt;/p&gt;
&lt;p&gt;I was hoping for a bit more progress today, troubleshooting the route import bug and planning took quite a while.
Three days left, I'm still on track and confident that I have something usable at the end of the week.&lt;/p&gt;
</content><category term="Code"/><category term="SUSE"/><category term="openSUSE"/><category term="pagure"/><category term="HackWeek"/><category term="AWS"/><category term="CodePipeline"/><category term="Coding"/><category term="OpenSource"/></entry><entry><title>SUSE Hack Week 2024 - Day 1</title><link href="https://dominik.wombacher.cc/posts/suse-hack-week-2024-day-1.html" rel="alternate"/><published>2024-11-18T00:00:00+01:00</published><updated>2024-11-18T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2024-11-18:/posts/suse-hack-week-2024-day-1.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I started the work on my project &lt;a class="reference external" href="https://hackweek.opensuse.org/projects/aws-codepipeline-ci-plugin-for-pagure-on-code-dot-opensuse-dot-org"&gt;AWS CodePipeline CI plugin for pagure on code.opensuse.org&lt;/a&gt;
with my nemesis, the mysterious &lt;code&gt;Unable to find object&lt;/code&gt; Exception that I couldn't  ... &lt;a class="read-more" href="/posts/suse-hack-week-2024-day-1.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I started the work on my project &lt;a class="reference external" href="https://hackweek.opensuse.org/projects/aws-codepipeline-ci-plugin-for-pagure-on-code-dot-opensuse-dot-org"&gt;AWS CodePipeline CI plugin for pagure on code.opensuse.org&lt;/a&gt;
with my nemesis, the mysterious &lt;code&gt;Unable to find object&lt;/code&gt; Exception that I couldn't solve in the past. This problem blocked my PR to
&lt;a class="reference external" href="https://pagure.io/pagure/pull-request/5508"&gt;Bump test containers to F40, bump pip version pinning to align with rpm versions, address some tech debts in dependencies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One observation I've made last time was that the Database Session is rolled back and new created in the middle of the failing test.
I started my troubleshooting there to understand which session was created and re-created during the test.
And which one is actually used by the celery task that throws the exception.&lt;/p&gt;
&lt;p&gt;Before the rollback (&lt;a class="reference external" href="https://pagure.io/pagure/blob/master/f/tests/test_pagure_flask_dump_load_ticket.py#_171"&gt;line 171 in test_pagure_flask_dump_load_ticket.py&lt;/a&gt;)
&lt;code&gt;self.session&lt;/code&gt; and &lt;code&gt;self.db_session&lt;/code&gt; are not identical, afterwards they are.
That was somehow suspicious, but after taking a closer look and playing around with the session and db_session value,
it doesn't seem to make any difference and is a dead end.&lt;/p&gt;
&lt;p&gt;Then I checked the error message and stack trace once more,
the mock patch that injects a lambda function as override for &lt;code&gt;_maybe_wait&lt;/code&gt;
seem to cause the issues, a detail I didn't notice before:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
tests/test_pagure_flask_dump_load_ticket.py:203:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pagure/lib/git.py:549: in update_ticket_from_git
    issue = pagure.lib.query.new_issue(
pagure/lib/query.py:1757: in new_issue
    pagure.lib.git.update_git(issue, repo=repo)
pagure/lib/git.py:165: in update_git
    _maybe_wait(queued)
/usr/lib/python3.12/site-packages/mock/mock.py:1100: in __call__
    return _mock_self._mock_call(*args, **kwargs)
/usr/lib/python3.12/site-packages/mock/mock.py:1104: in _mock_call
    return _mock_self._execute_mock_call(*args, **kwargs)
/usr/lib/python3.12/site-packages/mock/mock.py:1167: in _execute_mock_call
    result = effect(*args, **kwargs)
tests/test_pagure_flask_dump_load_ticket.py:43: in &amp;lt;lambda&amp;gt;
    mw.side_effect = lambda result: result.get()
/usr/lib/python3.12/site-packages/celery/result.py:1026: in get
    raise self.result if isinstance(
/usr/lib/python3.12/site-packages/celery/app/trace.py:477: in trace_task
    R = retval = fun(*args, **kwargs)
pagure/lib/tasks_utils.py:36: in decorated_function
    return function(self, session, *args, **kwargs)

&lt;/pre&gt;
&lt;p&gt;I checked older logs, they confirm that this trace came up earlier already...&lt;/p&gt;
&lt;p&gt;So what does &lt;code&gt;_maybe_wait&lt;/code&gt; do? well ...&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="pygments-k"&gt;def&lt;/span&gt; &lt;span class="pygments-nf"&gt;_maybe_wait&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;result&lt;/span&gt;&lt;span class="pygments-p"&gt;):&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-sd"&gt;&amp;quot;&amp;quot;&amp;quot;Function to patch if one wants to wait for finish.

    This function should only ever be overridden by a few tests that depend
    on counting and very precise timing.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;    &lt;span class="pygments-k"&gt;pass&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Seem to cover very few edge cases then?! How is it used by other tests?&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
tests/__init__.py:def create_maybe_waiter(method, getter):
tests/__init__.py:        self.app.get = create_maybe_waiter(self.app.get, self.app.get)
tests/__init__.py:        self.app.post = create_maybe_waiter(self.app.post, self.app.get)
tests/__init__.py:    &amp;quot;&amp;quot;&amp;quot;Helper function for definitely waiting in _maybe_wait.&amp;quot;&amp;quot;&amp;quot;
tests/test_pagure_flask_dump_load_ticket.py:    &amp;#64;patch(&amp;quot;pagure.lib.git._maybe_wait&amp;quot;)
tests/test_pagure_lib_drop_issue.py:    &amp;#64;patch(&amp;quot;pagure.lib.git._maybe_wait&amp;quot;, tests.definitely_wait)
tests/test_pagure_lib_drop_issue.py:    &amp;#64;patch(&amp;quot;pagure.lib.git._maybe_wait&amp;quot;, tests.definitely_wait)
tests/test_pagure_lib_git.py:        with patch(&amp;quot;pagure.lib.git._maybe_wait&amp;quot;, tests.definitely_wait):

&lt;/pre&gt;
&lt;p&gt;Twice in &lt;a class="reference external" href="https://pagure.io/pagure/blob/master/f/tests/test_pagure_lib_drop_issue.py"&gt;tests/test_pagure_lib_drop_issue.py&lt;/a&gt;,
once in &lt;a class="reference external" href="https://pagure.io/pagure/blob/master/f/tests/test_pagure_lib_git.py"&gt;tests/test_pagure_lib_git.py&lt;/a&gt;.
Always with &lt;code&gt;tests.definitely_wait&lt;/code&gt;, never in the way it's used in
&lt;a class="reference external" href="https://pagure.io/pagure/blob/master/f/tests/test_pagure_flask_dump_load_ticket.py"&gt;tests/test_pagure_flask_dump_load_ticket.py&lt;/a&gt;.
A test with &lt;code&gt;&amp;#64;patch(&amp;quot;pagure.lib.git._maybe_wait&amp;quot;, tests.definitely_wait)&lt;/code&gt; ended up in the same &lt;code&gt;Unable to find object&lt;/code&gt; exception.
After dropping the whole patch / mock,
&lt;a class="reference external" href="https://pagure.io/pagure/blob/master/f/tests/test_pagure_flask_dump_load_ticket.py#_40"&gt;tests/test_pagure_flask_dump_load_ticket.py::PagureFlaskDumpLoadTicketTests::test_dumping_reloading_ticket&lt;/a&gt;
is happy after all and passes.&lt;/p&gt;
&lt;p&gt;I have to admit, I still don't fully understand why the test was implemented like that.
My only explanation is, that some Celery behavior must have changed over time in a release.
And after removing / bumping the version pinning and using Fedora 40 it came up as a problem.&lt;/p&gt;
&lt;p&gt;Such tests are there to rely on, and if that one now passes without mocking, I'm fine with that.&lt;/p&gt;
&lt;p&gt;After finally fixing this annoying problem, one of four Goals that I have for the Hack Week is completed.&lt;/p&gt;
&lt;p&gt;Project Goals:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Resolve issues with outdated python dependencies to ensure pagure runs on Python 3.11 and current package versions.
At least Fedora 40 python and python package versions. Fedora 41 would be even better.
This will also satisfy openSUSE Tumbleweed and Leap 15.6 package versions used on code.opensuse.org&lt;/li&gt;
&lt;li&gt;Validate if &lt;a class="reference external" href="https://bugzilla.opensuse.org/show_bug.cgi?id=1229570"&gt;https://bugzilla.opensuse.org/show_bug.cgi?id=1229570&lt;/a&gt; is fixed for code.opensuse.org and that all
required packages / backports landed in openSUSE:infrastructure:pagure&lt;/li&gt;
&lt;li&gt;Develop AWS CodePipeline pagure CI plugin and create an upstream pull request&lt;/li&gt;
&lt;li&gt;Backport Plugin into openSUSE pagure package on OBS till new upstream release&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;While I was waiting for my pagure PR to be reviewed and merged, I worked on Goal 2.
Based on the Bugzilla Ticket, the problem with the unsatisfied runtime dependency on cffi
is solved for &lt;a class="reference external" href="https://build.opensuse.org/project/show/openSUSE:infrastructure:pagure"&gt;openSUSE:infrastructure:pagure&lt;/a&gt;.
And still pending for openSUSE Leap 15.6 / SLES 15 SP6 in general.
But for know I only care about pagure on &lt;a class="reference external" href="https://code.opensuse.org"&gt;code.opensuse.org&lt;/a&gt;.
The OBS project had two broken packages that I fixed. Nothing else to do, Goal 2 completed.&lt;/p&gt;
&lt;p&gt;In preparation for Day 2, I updated my pagure dev system to the latest master branch version,
including the Patch from my pending PR. This allows me to develop the actual pagure CI plugin
for AWS CodePipeline on the latest build. Avoids running into issues because of old code and
refactoring to get it included into the pagure code base.&lt;/p&gt;
&lt;p&gt;I'm pretty happy with the progress of the first Day, can't wait how things going tomorrow :)&lt;/p&gt;
</content><category term="Code"/><category term="SUSE"/><category term="openSUSE"/><category term="pagure"/><category term="HackWeek"/><category term="AWS"/><category term="CodePipeline"/><category term="Coding"/><category term="OpenSource"/></entry><entry><title>Recordings of my sessions at openSUSE Conference 2024 are online</title><link href="https://dominik.wombacher.cc/posts/recordings-of-my-sessions-at-opensuse-conference-2024-are-online.html" rel="alternate"/><published>2024-07-07T00:00:00+02:00</published><updated>2024-07-07T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2024-07-07:/posts/recordings-of-my-sessions-at-opensuse-conference-2024-are-online.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had the great opportunity to speak at &lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC24"&gt;openSUSE Conference 24&lt;/a&gt; in Nuremberg about
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC24/program/proposals/4587"&gt;Pagure CI integration with AWS CodePipeline&lt;/a&gt; and
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC24/program/proposals/4584"&gt;NeuVector Integration into AWS CodePipeline CI/CD workflow&lt;/a&gt;,
the  ... &lt;a class="read-more" href="/posts/recordings-of-my-sessions-at-opensuse-conference-2024-are-online.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had the great opportunity to speak at &lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC24"&gt;openSUSE Conference 24&lt;/a&gt; in Nuremberg about
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC24/program/proposals/4587"&gt;Pagure CI integration with AWS CodePipeline&lt;/a&gt; and
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC24/program/proposals/4584"&gt;NeuVector Integration into AWS CodePipeline CI/CD workflow&lt;/a&gt;,
the recordings are now online.&lt;/p&gt;
&lt;div class="section" id="session-1-pagure-ci-integration-with-aws-codepipeline"&gt;
&lt;h2&gt;Session 1: Pagure CI integration with AWS CodePipeline&lt;/h2&gt;
&lt;p&gt;Pagure is a lightweight git centered forge based on Python with a long usage history in the Fedora project.
It's well known in the openSUSE project too with an instance on code.opensuse.org.
I demonstrate in this talk the current state of the Pagure Plugin system.
How I implemented AWS CodePipeline as additional CI type.
And how this can serve as blueprint to optimize the Plugin system and add other CI types.
I will share the current status of my work to run Pagure on Kubernetes.
And some good-first-issues you can tackle if you want to contribute to Pagure.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Slides: &lt;a class="reference external" href="https://speakerdeck.com/wombelix/osc24-pagure-ci-integration-with-aws-codepipeline"&gt;https://speakerdeck.com/wombelix/osc24-pagure-ci-integration-with-aws-codepipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recording: &lt;a class="reference external" href="https://media.ccc.de/v/4587-pagure-ci-integration-with-aws-codepipeline"&gt;https://media.ccc.de/v/4587-pagure-ci-integration-with-aws-codepipeline&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="session-2-neuvector-integration-into-aws-codepipeline-ci-cd-workflow"&gt;
&lt;h2&gt;Session 2: NeuVector Integration into AWS CodePipeline CI/CD workflow&lt;/h2&gt;
&lt;p&gt;NeuVector is a open source container security platform.
Key strengths are vulnerability and runtime scanning.
I demonstrate in this talk how you ensure that only container images without
a detected vulnerability move to the next stage in your Pipeline.
How you define the baseline of allowed activities of your application.
And how you can block the deployment into production if an unexpected behavior
at runtime was detected in your testing stage. I'll use AWS CodePipeline,
AWS CodeDeploy and AWS CloudFormation. The procedure is applicable to other
toolset and Hybrid environments as well.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Slides: &lt;a class="reference external" href="https://speakerdeck.com/wombelix/osc24-neuvector-integration-into-aws-codepipeline-ci-and-cd-workflow"&gt;https://speakerdeck.com/wombelix/osc24-neuvector-integration-into-aws-codepipeline-ci-and-cd-workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recording: &lt;a class="reference external" href="https://media.ccc.de/v/4584-neuvector-integration-into-aws-codepipeline-ci-cd-workflow"&gt;https://media.ccc.de/v/4584-neuvector-integration-into-aws-codepipeline-ci-cd-workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="Misc"/><category term="openSUSE"/><category term="Speaking"/><category term="Event"/><category term="Session"/><category term="NeuVector"/><category term="Pagure"/><category term="AWS"/></entry><entry><title>Recordings of my sessions at openSUSE Conference 2023 are online</title><link href="https://dominik.wombacher.cc/posts/recordings-of-my-sessions-at-opensuse-conference-2023-are-online.html" rel="alternate"/><published>2023-07-13T00:00:00+02:00</published><updated>2023-07-13T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2023-07-13:/posts/recordings-of-my-sessions-at-opensuse-conference-2023-are-online.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had the great opportunity to speak at &lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC23"&gt;openSUSE Conference 23&lt;/a&gt; in Nuremberg about
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC23/program/proposals/4169"&gt;Rancher integration with AWS services: possibilities, challenges, outlook&lt;/a&gt; and
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC23/program/proposals/4163"&gt;openSUSE ALP prototype on AWS, experimental, but  ... &lt;/a&gt;&lt;a class="read-more" href="/posts/recordings-of-my-sessions-at-opensuse-conference-2023-are-online.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had the great opportunity to speak at &lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC23"&gt;openSUSE Conference 23&lt;/a&gt; in Nuremberg about
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC23/program/proposals/4169"&gt;Rancher integration with AWS services: possibilities, challenges, outlook&lt;/a&gt; and
&lt;a class="reference external" href="https://events.opensuse.org/conferences/oSC23/program/proposals/4163"&gt;openSUSE ALP prototype on AWS, experimental, but fun!&lt;/a&gt;, the recordings are now online.&lt;/p&gt;
&lt;div class="section" id="opensuse-alp-prototype-on-aws-experimental-but-fun-1"&gt;
&lt;h2&gt;openSUSE ALP prototype on AWS, experimental, but fun!&lt;/h2&gt;
&lt;p&gt;How does the latest prototype of the Adaptable Linux Platform behave on AWS? What is required to build
a EC2 compatible image via OBS? How does the workflow look like to go from OBS to an available and
deployable AMI? What is the state of integration with AWS compared to openSUSE Leap? And what has
SUSE NeuVector todo with all that? Let me take you on my journey and share my experiences,
thoughts and results with you.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Slides: &lt;a class="reference external" href="https://speakerdeck.com/wombelix/oc23-open-suse-alp-prototype-on-aws-experimental-but-fun"&gt;https://speakerdeck.com/wombelix/oc23-open-suse-alp-prototype-on-aws-experimental-but-fun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recording:&lt;ul&gt;
&lt;li&gt;&lt;a class="reference external" href="https://media.ccc.de/v/4163-opensuse-alp-prototype-on-aws-experimental-but-fun"&gt;https://media.ccc.de/v/4163-opensuse-alp-prototype-on-aws-experimental-but-fun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://youtu.be/FnenxBYSyvs"&gt;https://youtu.be/FnenxBYSyvs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="rancher-integration-with-aws-services-possibilities-challenges-outlook-1"&gt;
&lt;h2&gt;Rancher integration with AWS services: possibilities, challenges, outlook.&lt;/h2&gt;
&lt;p&gt;Rancher can deploy and manage your Kubernetes clusters on AWS EKS and EC2. But what about things like
Authentication, Logging, Monitoring or Backup? I will give an overview of AWS services for these four
pillars and talk about what’s already possible, which challenges some integrations might have and an
outlook what’s planned. Learn more about how the integrations are working under the hood and which
technologies and open-sources solutions are involved.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Slides: &lt;a class="reference external" href="https://speakerdeck.com/wombelix/rancher-integration-with-aws-services-possibilities-challenges-outlook"&gt;https://speakerdeck.com/wombelix/rancher-integration-with-aws-services-possibilities-challenges-outlook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recordings:&lt;ul&gt;
&lt;li&gt;&lt;a class="reference external" href="https://media.ccc.de/v/4169-rancher-integration-with-aws-services-possibilities-challenges-outlook"&gt;https://media.ccc.de/v/4169-rancher-integration-with-aws-services-possibilities-challenges-outlook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://youtu.be/khIg5MT4WGs"&gt;https://youtu.be/khIg5MT4WGs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="Misc"/><category term="openSUSE"/><category term="Speaking"/><category term="Event"/><category term="Session"/><category term="Rancher"/><category term="SUSE"/><category term="ALP"/></entry><entry><title>openSUSE Tumbleweed - Python 3.10 - No package metadata was found for vorta</title><link href="https://dominik.wombacher.cc/posts/opensuse_tumbleweed_python_3-10_no_package_metadata_was_found_for_vorta.html" rel="alternate"/><published>2022-07-17T00:00:00+02:00</published><updated>2022-07-17T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-07-17:/posts/opensuse_tumbleweed_python_3-10_no_package_metadata_was_found_for_vorta.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I'm using &lt;a class="reference external" href="https://vorta.borgbase.com"&gt;Vorta&lt;/a&gt;, a Desktop Client for &lt;a class="reference external" href="https://www.borgbackup.org"&gt;BorgBackup&lt;/a&gt;,
on my Notebook with openSUSE Tumbleweed, which stopped working after upgrading
Tumbleweed to a Version that started using Python 3.10 as  ... &lt;a class="read-more" href="/posts/opensuse_tumbleweed_python_3-10_no_package_metadata_was_found_for_vorta.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I'm using &lt;a class="reference external" href="https://vorta.borgbase.com"&gt;Vorta&lt;/a&gt;, a Desktop Client for &lt;a class="reference external" href="https://www.borgbackup.org"&gt;BorgBackup&lt;/a&gt;,
on my Notebook with openSUSE Tumbleweed, which stopped working after upgrading
Tumbleweed to a Version that started using Python 3.10 as default.&lt;/p&gt;
&lt;p&gt;Error message when starting vorta from the command line:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
vorta

Traceback (most recent call last):
  File &amp;quot;/usr/bin/vorta&amp;quot;, line 33, in &amp;lt;module&amp;gt;
    sys.exit(load_entry_point('vorta==0.8.2', 'gui_scripts', 'vorta')())
  File &amp;quot;/usr/bin/vorta&amp;quot;, line 22, in importlib_load_entry_point
    for entry_point in distribution(dist_name).entry_points
  File &amp;quot;/usr/lib64/python3.10/importlib/metadata/__init__.py&amp;quot;, line 957, in distribution
    return Distribution.from_name(distribution_name)
  File &amp;quot;/usr/lib64/python3.10/importlib/metadata/__init__.py&amp;quot;, line 548, in from_name
    raise PackageNotFoundError(name)
importlib.metadata.PackageNotFoundError: No package metadata was found for vorta

&lt;/pre&gt;
&lt;p&gt;I use the openSUSE Tumbleweed build from &lt;a class="reference external" href="https://copr.fedorainfracloud.org/coprs/luminoso/vorta/"&gt;https://copr.fedorainfracloud.org/coprs/luminoso/vorta/&lt;/a&gt;,
first tried to update it, but that dropped a dependency error:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo zypper up vorta

Loading repository data...
Reading installed packages...
Resolving package dependencies...

Problem: nothing provides 'python3-secretstorage' needed by the to be installed vorta-0.8.7-2.suse.tw.x86_64
 Solution 1: do not install vorta-0.8.7-2.suse.tw.x86_64
 Solution 2: break vorta-0.8.7-2.suse.tw.x86_64 by ignoring some of its dependencies

&lt;/pre&gt;
&lt;p&gt;Well, sure that there is no secretstorage package for python installed? Let's see:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo zypper se secretstorage

Loading repository data...
Reading installed packages...

S | Name                    | Summary                                              | Type
--+-------------------------+------------------------------------------------------+--------
i | python38-SecretStorage  | Python bindings to FreeDesktoporg Secret Service API | package
  | python39-SecretStorage  | Python bindings to FreeDesktoporg Secret Service API | package
i | python310-SecretStorage | Python bindings to FreeDesktoporg Secret Service API | package

&lt;/pre&gt;
&lt;p&gt;Looks good but the vorta package expects &lt;em&gt;&amp;quot;python3-secretstorage&amp;quot;&lt;/em&gt; and not &lt;em&gt;&amp;quot;python310-SecretStorage&amp;quot;&lt;/em&gt;,
let's ignore the zypper warning about missing dependencies and just install the latest version of vorta:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo zypper up vorta

Loading repository data...
Reading installed packages...
Resolving package dependencies...

Problem: nothing provides 'python3-secretstorage' needed by the to be installed vorta-0.8.7-2.suse.tw.x86_64
 Solution 1: do not install vorta-0.8.7-2.suse.tw.x86_64
 Solution 2: break vorta-0.8.7-2.suse.tw.x86_64 by ignoring some of its dependencies

Choose from above solutions by number or cancel [1/2/c/d/?] (c): 2
Resolving dependencies...
Resolving package dependencies...

The following package is going to be upgraded:
  vorta

1 package to upgrade.
Overall download size: 492.3 KiB. Already cached: 0 B. After the operation, additional 215.5 KiB will be used.
Continue? [y/n/v/...? shows all options] (y): y
Retrieving package vorta-0.8.7-2.suse.tw.x86_64                          (1/1), 492.3 KiB (  1.7 MiB unpacked)
Retrieving: vorta-0.8.7-2.suse.tw.x86_64.rpm ...........................................................[done]

Checking for file conflicts: ...........................................................................[done]
(1/1) Installing: vorta-0.8.7-2.suse.tw.x86_64 .........................................................[done]

&lt;/pre&gt;
&lt;p&gt;Great, started vorta again from the CLI, but now &lt;em&gt;&amp;quot;PyQt5&amp;quot;&lt;/em&gt; is missing:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
vorta

Traceback (most recent call last):
  File &amp;quot;/usr/bin/vorta&amp;quot;, line 33, in &amp;lt;module&amp;gt;
    sys.exit(load_entry_point('vorta==0.8.7', 'gui_scripts', 'vorta')())
  File &amp;quot;/usr/bin/vorta&amp;quot;, line 25, in importlib_load_entry_point
    return next(matches).load()
  File &amp;quot;/usr/lib64/python3.10/importlib/metadata/__init__.py&amp;quot;, line 171, in load
    module = import_module(match.group('module'))
  File &amp;quot;/usr/lib64/python3.10/importlib/__init__.py&amp;quot;, line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1050, in _gcd_import
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1027, in _find_and_load
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1006, in _find_and_load_unlocked
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 688, in _load_unlocked
  File &amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;, line 883, in exec_module
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 241, in _call_with_frames_removed
  File &amp;quot;/usr/lib/python3.10/site-packages/vorta/__main__.py&amp;quot;, line 7, in &amp;lt;module&amp;gt;
    from vorta.i18n import trans_late, translate
  File &amp;quot;/usr/lib/python3.10/site-packages/vorta/i18n/__init__.py&amp;quot;, line 7, in &amp;lt;module&amp;gt;
    from PyQt5.QtCore import QLocale, QTranslator
ModuleNotFoundError: No module named 'PyQt5'

&lt;/pre&gt;
&lt;p&gt;There is no rpm package so I installed it globally via pip:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo pip3 install PyQt5

Collecting PyQt5
  Downloading PyQt5-5.15.7-cp37-abi3-manylinux1_x86_64.whl (8.4 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.4/8.4 MB 29.4 MB/s eta 0:00:00
Collecting PyQt5-Qt5&amp;gt;=5.15.0
  Downloading PyQt5_Qt5-5.15.2-py3-none-manylinux2014_x86_64.whl (59.9 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 59.9/59.9 MB 26.1 MB/s eta 0:00:00
Collecting PyQt5-sip&amp;lt;13,&amp;gt;=12.11
  Downloading PyQt5_sip-12.11.0-cp310-cp310-manylinux1_x86_64.whl (359 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 359.7/359.7 KB 21.9 MB/s eta 0:00:00
Installing collected packages: PyQt5-Qt5, PyQt5-sip, PyQt5
Successfully installed PyQt5-5.15.7 PyQt5-Qt5-5.15.2 PyQt5-sip-12.11.0

&lt;/pre&gt;
&lt;p&gt;Afterwards &lt;code&gt;vorta&lt;/code&gt; could be started without issues,
immediatly created a backup and uploaded the files to &lt;a class="reference external" href="https://www.borgbase.com"&gt;BorgBase&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Overall not a big deal, the fact that the vorta rpm is expecting a dependency that can't be
found on openSUSE Tumbleweed, even though it's installed but with a different name,
is more of a cosmetic issue in my opinion, writing this blog post took probably longer
than fixing the actual problem ;)&lt;/p&gt;
</content><category term="Linux"/><category term="openSUSE"/><category term="Tumbleweed"/><category term="Vorta"/><category term="BorgBase"/><category term="BorgBackup"/></entry><entry><title>Customized openSUSE Images, to run on Proxmox VE out of the box, build on OBS</title><link href="https://dominik.wombacher.cc/posts/customized_opensuse_images_to_run_on_proxmox_ve_out_of_the_box_build_on_obs.html" rel="alternate"/><published>2022-04-26T00:00:00+02:00</published><updated>2023-07-02T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-04-26:/posts/customized_opensuse_images_to_run_on_proxmox_ve_out_of_the_box_build_on_obs.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I'm using openSUSE whenever possible but had some trouble to use the official images on &lt;a class="reference external" href="https://proxmox.com"&gt;Proxmox&lt;/a&gt;.
There is mostly a &lt;code&gt;kvm-and-xen&lt;/code&gt; image available, but that doesn't contain &lt;code&gt;cloud-init&lt;/code&gt;
and / or  ... &lt;a class="read-more" href="/posts/customized_opensuse_images_to_run_on_proxmox_ve_out_of_the_box_build_on_obs.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I'm using openSUSE whenever possible but had some trouble to use the official images on &lt;a class="reference external" href="https://proxmox.com"&gt;Proxmox&lt;/a&gt;.
There is mostly a &lt;code&gt;kvm-and-xen&lt;/code&gt; image available, but that doesn't contain &lt;code&gt;cloud-init&lt;/code&gt;
and / or &lt;code&gt;qemu-guest-agent&lt;/code&gt;, but for my use case, automated IPv6-only deployments, both are mandatory.&lt;/p&gt;
&lt;p&gt;Proxmox supports &lt;em&gt;cloud-init&lt;/em&gt; to configure basics like search domain, nameserver, user, password and ssh key.
If the &lt;em&gt;qemu-guest-agent&lt;/em&gt; is installed, the IPv6 address configured via SLAAC is available through the
API as soon the VM was booted.&lt;/p&gt;
&lt;p&gt;In regards to openSUSE MicroOS the situation was even worse, only the &lt;code&gt;OpenStack-Cloud&lt;/code&gt; image
includes &lt;em&gt;cloud-init&lt;/em&gt; but relies on the package &lt;code&gt;cloud-init-config-MicroOS&lt;/code&gt; which installs a
&lt;code&gt;/etc/cloud/cloud.cfg&lt;/code&gt; without a &lt;em&gt;default_user&lt;/em&gt; section and enabled root user.&lt;/p&gt;
&lt;p&gt;That way configuring a User account with sudo permissions via &lt;em&gt;cloud-init&lt;/em&gt; will just not work.&lt;/p&gt;
&lt;p&gt;So after some playing around with different approaches and especially due to the fact that I use a lot of different
openSUSE Images, I decided to branch the relevant projects / packages on &lt;a class="reference external" href="https://build.opensuse.org"&gt;https://build.opensuse.org&lt;/a&gt; and let OBS do the
heavy lifting for me to build and publish the different images.&lt;/p&gt;
&lt;p&gt;Leap 15.3 and 15.4 required also an adjustment of the OBS Project Config, most important for automation was
&lt;em&gt;staticlinks&lt;/em&gt; to ensure the same link will work even after a new build.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
%if &amp;quot;%_repository&amp;quot; == &amp;quot;images&amp;quot;
Type: kiwi
Repotype: staticlinks
Patterntype: none
%endif

# slsaprovenance - as described at https://slsa.dev/provenance/v0.2
BuildFlags: slsaprovenance

&lt;/pre&gt;
&lt;p&gt;After some further testing, let's see which of my changes might be possible to get included upstream.&lt;/p&gt;
&lt;p&gt;I'm also working on Proxmox VE &amp;quot;optimized&amp;quot; images for other Distributions like Rocky Linux or Debian,
I will probably pick a different approach to customize them, but that's something for another Post some day.&lt;/p&gt;
&lt;div class="contents local topic" id="contents"&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#opensuse-microos" id="toc-entry-1"&gt;openSUSE MicroOS&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference internal" href="#open-build-service-obs-project" id="toc-entry-2"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#download" id="toc-entry-3"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#customizations" id="toc-entry-4"&gt;Customizations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#opensuse-tubmleweed-jeos" id="toc-entry-5"&gt;openSUSE Tubmleweed JeOS&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference internal" href="#open-build-service-obs-project-1" id="toc-entry-6"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#download-1" id="toc-entry-7"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#customizations-1" id="toc-entry-8"&gt;Customizations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#opensuse-leap-15-3-jeos" id="toc-entry-9"&gt;openSUSE Leap 15.3 JeOS&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference internal" href="#open-build-service-obs-project-2" id="toc-entry-10"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#download-2" id="toc-entry-11"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#customizations-2" id="toc-entry-12"&gt;Customizations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#opensuse-leap-15-4-jeos" id="toc-entry-13"&gt;openSUSE Leap 15.4 JeOS&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference internal" href="#open-build-service-obs-project-3" id="toc-entry-14"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#download-3" id="toc-entry-15"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#customizations-3" id="toc-entry-16"&gt;Customizations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="opensuse-microos"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-1"&gt;openSUSE MicroOS&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="open-build-service-obs-project"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-2"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:devel:kubic:images/openSUSE-MicroOS"&gt;https://build.opensuse.org/package/show/home:wombelix:branches:devel:kubic:images/openSUSE-MicroOS&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="download"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-3"&gt;Download&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;openSUSE Mirror (Automatic Build / Sync): &lt;a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/devel:/kubic:/images/openSUSE_Tumbleweed/"&gt;https://download.opensuse.org/repositories/home:/wombelix:/branches:/devel:/kubic:/images/openSUSE_Tumbleweed/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="customizations"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-4"&gt;Customizations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;Index: _multibuild&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- _multibuild (revision 105)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ _multibuild (revision 8)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -1,8 +1,15 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;multibuild&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;flavor&amp;gt;pve&amp;lt;/flavor&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;flavor&amp;gt;ContainerHost-pve&amp;lt;/flavor&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;flavor&amp;gt;Kubic-kubeadm-pve&amp;lt;/flavor&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;flavor&amp;gt;k3s-pve&amp;lt;/flavor&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Special case: Pi2, VBox and onie only get plain MicroOS --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;!--&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;RaspberryPi2&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;VirtualBox&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;onie&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        --&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!--&lt;span class="pygments-w"&gt;
 &lt;/span&gt;                for a in kvm-and-xen VMware MS-HyperV OpenStack-Cloud Pine64 Rock64 RaspberryPi Vagrant hardware; do&lt;span class="pygments-w"&gt;
 &lt;/span&gt;                        for f in &amp;quot;&amp;quot; &amp;quot;ContainerHost-&amp;quot; &amp;quot;Kubic-kubeadm-&amp;quot;; do&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -10,6 +17,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;                        done&lt;span class="pygments-w"&gt;
 &lt;/span&gt;                done&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;!--&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;kvm-and-xen&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;ContainerHost-kvm-and-xen&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;Kubic-kubeadm-kvm-and-xen&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -48,4 +56,5 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;k3s-Vagrant&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;k3s-SelfInstall&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;flavor&amp;gt;k3s-DigitalOcean-Cloud&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        --&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;/multibuild&amp;gt;&lt;span class="pygments-w"&gt;


&lt;/span&gt;&lt;span class="pygments-gh"&gt;Index: config.sh&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- config.sh (revision 105)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ config.sh (revision 8)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -157,6 +157,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;ignition_platform='metal'&lt;span class="pygments-w"&gt;
 &lt;/span&gt;case &amp;quot;${kiwi_profiles}&amp;quot; in&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+     *pve*) ignition_platform='qemu' ;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;     *kvm*) ignition_platform='qemu' ;;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;     *DigitalOcean*) ignition_platform='digitalocean' ;;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;     *VMware*) ignition_platform='vmware' ;;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -281,3 +282,21 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        chmod 0600 /home/vagrant/.ssh/authorized_keys&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        chown -R vagrant /home/vagrant&lt;span class="pygments-w"&gt;
 &lt;/span&gt;fi&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+#======================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+# Configure PVE specifics&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+#--------------------------------------&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+if [[ &amp;quot;$kiwi_profiles&amp;quot; == *&amp;quot;pve&amp;quot;* ]]; then&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+     cat &amp;gt; /etc/cloud/cloud.cfg.d/default_user.cfg &amp;lt;&amp;lt;-EOF&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+             users:&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               - default&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+             disable_root: true&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+             system_info:&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               default_user:&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                 name: geeko&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                 lock_passwd: True&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                 groups: [cdrom, users]&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                 sudo: [&amp;quot;ALL=(ALL) NOPASSWD:ALL&amp;quot;]&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                 shell: /bin/bash&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+     EOF&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+fi&lt;/span&gt;&lt;span class="pygments-w"&gt;


&lt;/span&gt;&lt;span class="pygments-gh"&gt;Index: openSUSE-MicroOS.kiwi&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- openSUSE-MicroOS.kiwi (revision 105)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ openSUSE-MicroOS.kiwi (revision 8)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -13,6 +13,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;k3s&amp;quot; description=&amp;quot;MicroOS with k3s&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;Kubic-kubeadm&amp;quot; description=&amp;quot;MicroOS with CRI-O and kubeadm&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Platforms --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;profile name=&amp;quot;pve&amp;quot; description=&amp;quot;Proxmox VE (pve) for x86_64&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;kvm-and-xen&amp;quot; description=&amp;quot;kvm-and-xen&amp;quot; arch=&amp;quot;x86_64,aarch64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;VMware&amp;quot; description=&amp;quot;VMware for x86_64&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;MS-HyperV&amp;quot; description=&amp;quot;Hyper-V for x86_64&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -27,6 +28,10 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;SelfInstall&amp;quot; description=&amp;quot;Self Installing Image&amp;quot; arch=&amp;quot;x86_64,aarch64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;onie&amp;quot; description=&amp;quot;ONIE Installer Image&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Images (flavor + platform) --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;profile name=&amp;quot;ContainerHost-pve&amp;quot; description=&amp;quot;MicroOS with Podman for Proxmox VE (pve)&amp;quot; arch=&amp;quot;x86_64&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;requires profile=&amp;quot;pve&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;requires profile=&amp;quot;ContainerHost&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;/profile&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;ContainerHost-kvm-and-xen&amp;quot; description=&amp;quot;MicroOS with Podman for KVM and HVM Xen&amp;quot; arch=&amp;quot;x86_64,aarch64&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;kvm-and-xen&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;ContainerHost&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -59,6 +64,10 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;Vagrant&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;ContainerHost&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;/profile&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;profile name=&amp;quot;Kubic-kubeadm-pve&amp;quot; description=&amp;quot;kubeadm with CRI-O for Proxmox VE (pve)&amp;quot; arch=&amp;quot;x86_64&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;requires profile=&amp;quot;pve&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;requires profile=&amp;quot;Kubic-kubeadm&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;/profile&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;Kubic-kubeadm-kvm-and-xen&amp;quot; description=&amp;quot;kubeadm with CRI-O for KVM and HVM Xen&amp;quot; arch=&amp;quot;x86_64,aarch64&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;kvm-and-xen&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;Kubic-kubeadm&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -103,6 +112,10 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;SelfInstall&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;Kubic-kubeadm&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;/profile&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;profile name=&amp;quot;k3s-pve&amp;quot; description=&amp;quot;MicroOS with k3s for Proxmox VE (pve)&amp;quot; arch=&amp;quot;x86_64&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;requires profile=&amp;quot;pve&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;requires profile=&amp;quot;k3s&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;/profile&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;k3s-kvm-and-xen&amp;quot; description=&amp;quot;MicroOS with k3s for KVM and HVM Xen&amp;quot; arch=&amp;quot;x86_64,aarch64&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;kvm-and-xen&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;k3s&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -144,6 +157,39 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;            &amp;lt;requires profile=&amp;quot;k3s&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;/profile&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/profiles&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;preferences profiles=&amp;quot;pve&amp;quot; arch=&amp;quot;x86_64&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;version&amp;gt;16.0.0&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;bootloader-theme&amp;gt;openSUSE&amp;lt;/bootloader-theme&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;rpm-excludedocs&amp;gt;true&amp;lt;/rpm-excludedocs&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;locale&amp;gt;en_US&amp;lt;/locale&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;type&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            image=&amp;quot;vmx&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            filesystem=&amp;quot;btrfs&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            format=&amp;quot;qcow2&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            firmware=&amp;quot;uefi&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootpartition=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootkernel=&amp;quot;custom&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            devicepersistency=&amp;quot;by-uuid&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_root_is_snapshot=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_root_is_readonly_snapshot=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_quota_groups=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            spare_part=&amp;quot;5G&amp;quot; spare_part_mountpoint=&amp;quot;/var&amp;quot; spare_part_fs=&amp;quot;btrfs&amp;quot; spare_part_is_last=&amp;quot;true&amp;quot; spare_part_fs_attributes=&amp;quot;no-copy-on-write&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;bootloader name=&amp;quot;grub2&amp;quot; console=&amp;quot;gfxterm&amp;quot; /&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;home&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;root&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;opt&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;srv&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/i386-pc&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/x86_64-efi&amp;quot; mountpoint=&amp;quot;boot/grub2/x86_64-efi&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/writable&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;usr/local&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;/systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;size unit=&amp;quot;G&amp;quot;&amp;gt;20&amp;lt;/size&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;/type&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/preferences&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;preferences profiles=&amp;quot;kvm-and-xen&amp;quot; arch=&amp;quot;x86_64&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;version&amp;gt;16.0.0&amp;lt;/version&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -720,6 +766,10 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;patterns-containers-kubic_loadbalancer&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;patterns-containers-kubic_worker&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;qemu-guest-agent&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;patterns-microos-cloud&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/packages&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- KVM and Xen specific packages --&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xen-tools-domU&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="opensuse-tubmleweed-jeos"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-5"&gt;openSUSE Tubmleweed JeOS&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="open-build-service-obs-project-1"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-6"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Tumbleweed/kiwi-templates-JeOS"&gt;https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Tumbleweed/kiwi-templates-JeOS&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="download-1"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-7"&gt;Download&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;openSUSE Mirror (Automatic Build / Sync): &lt;a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Tumbleweed/images/"&gt;https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Tumbleweed/images/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="customizations-1"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-8"&gt;Customizations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;Index: JeOS.kiwi&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- JeOS.kiwi (revision 70)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ JeOS.kiwi (revision 2)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -9,6 +9,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;specification&amp;gt;openSUSE Tumbleweed JeOS&amp;lt;/specification&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/description&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;profiles&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;profile name=&amp;quot;pve&amp;quot; description=&amp;quot;JeOS for Proxmox VE (pve)&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Those two are only used as deps --&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;kvm-and-xen&amp;quot; description=&amp;quot;JeOS for KVM and Xen&amp;quot; arch=&amp;quot;aarch64,x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;VMware&amp;quot; description=&amp;quot;JeOS for VMware&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -17,6 +18,39 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;OpenStack-Cloud&amp;quot; description=&amp;quot;JeOS for OpenStack Cloud&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;RaspberryPi&amp;quot; description=&amp;quot;JeOS for the Raspberry Pi&amp;quot; arch=&amp;quot;aarch64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/profiles&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;preferences profiles=&amp;quot;pve&amp;quot; arch=&amp;quot;x86_64&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;version&amp;gt;15.1.0&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;bootloader-theme&amp;gt;openSUSE&amp;lt;/bootloader-theme&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;rpm-excludedocs&amp;gt;true&amp;lt;/rpm-excludedocs&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;type&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            image=&amp;quot;vmx&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            filesystem=&amp;quot;btrfs&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            format=&amp;quot;qcow2&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootloader=&amp;quot;grub2&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            firmware=&amp;quot;uefi&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            efipartsize=&amp;quot;33&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            kernelcmdline=&amp;quot;rw quiet systemd.show_status=1 console=ttyS0,115200 console=tty0&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootpartition=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootkernel=&amp;quot;custom&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            devicepersistency=&amp;quot;by-uuid&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_quota_groups=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_root_is_snapshot=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;home&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;root&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;opt&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;srv&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/i386-pc&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/x86_64-efi&amp;quot; mountpoint=&amp;quot;boot/grub2/x86_64-efi&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;usr/local&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;var&amp;quot; copy_on_write=&amp;quot;false&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;/systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;size unit=&amp;quot;G&amp;quot;&amp;gt;24&amp;lt;/size&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;/type&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/preferences&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;preferences profiles=&amp;quot;kvm-and-xen&amp;quot; arch=&amp;quot;x86_64&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;version&amp;gt;15.1.0&amp;lt;/version&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -284,6 +318,15 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;zypper-needs-restarting&amp;quot;/&amp;gt; &amp;lt;!-- Some deployment script use this (bsc#1173548) --&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;btrfsprogs&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;btrfsmaintenance&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;grub2-snapper-plugin&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;snapper-zypp-plugin&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;snapper&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;firewalld&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/packages&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;!-- Not needed in OpenStack as it uses XFS and cloud-init --&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,VMware,MS-HyperV,RaspberryPi&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Only for btrfs --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -305,7 +348,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;firewalld&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,VMware,MS-HyperV,OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,VMware,MS-HyperV,OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Shim for secure boot everywhere except for RPi --&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;shim&amp;quot; arch=&amp;quot;aarch64,x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -315,14 +358,14 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xen-libs&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;kernel-default-base&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;qemu-guest-agent&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;VMware&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;open-vm-tools&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;kernel-default-base&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;cloud-init&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;cloud-init-config-suse&amp;quot; /&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xfsprogs&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -360,7 +403,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;gzip&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;kvm-and-xen&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;kvm-and-xen,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;openSUSE-release-appliance-kvm&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;OpenStack-Cloud&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;


&lt;/span&gt;&lt;span class="pygments-gh"&gt;Index: _multibuild&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- _multibuild (revision 70)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ _multibuild (revision 2)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -1,7 +1,10 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;multibuild&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  &amp;lt;flavor&amp;gt;pve&amp;lt;/flavor&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  &amp;lt;!--&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;kvm-and-xen&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;VMware&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;MS-HyperV&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;OpenStack-Cloud&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;RaspberryPi&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  --&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;/multibuild&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="opensuse-leap-15-3-jeos"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-9"&gt;openSUSE Leap 15.3 JeOS&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="open-build-service-obs-project-2"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-10"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.3/kiwi-templates-JeOS"&gt;https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.3/kiwi-templates-JeOS&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="download-2"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-11"&gt;Download&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;openSUSE Mirror (Automatic Build / Sync): &lt;a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.3/images/"&gt;https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.3/images/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="customizations-2"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-12"&gt;Customizations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;Index: JeOS.kiwi&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- JeOS.kiwi (revision 13)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ JeOS.kiwi (revision 3)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -9,6 +9,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;specification&amp;gt;openSUSE Leap 15.3 JeOS&amp;lt;/specification&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/description&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;profiles&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;profile name=&amp;quot;pve&amp;quot; description=&amp;quot;JeOS for Proxmox VE (pve)&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;kvm-and-xen&amp;quot; description=&amp;quot;JeOS for KVM and Xen&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;kvm&amp;quot; description=&amp;quot;JeOS for KVM&amp;quot; arch=&amp;quot;aarch64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;VMware&amp;quot; description=&amp;quot;JeOS for VMware&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -16,6 +17,47 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;OpenStack-Cloud&amp;quot; description=&amp;quot;JeOS for OpenStack Cloud&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;RaspberryPi&amp;quot; description=&amp;quot;JeOS for the Raspberry Pi&amp;quot; arch=&amp;quot;aarch64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/profiles&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;preferences profiles=&amp;quot;pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;version&amp;gt;15.3&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;bootsplash-theme&amp;gt;openSUSE&amp;lt;/bootsplash-theme&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;bootloader-theme&amp;gt;openSUSE&amp;lt;/bootloader-theme&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;!-- those settings are applied by suseConfig in config.sh&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;locale&amp;gt;en_US&amp;lt;/locale&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;keytable&amp;gt;us.map.gz&amp;lt;/keytable&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;timezone&amp;gt;Europe/Berlin&amp;lt;/timezone&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;hwclock&amp;gt;utc&amp;lt;/hwclock&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    --&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;rpm-excludedocs&amp;gt;true&amp;lt;/rpm-excludedocs&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;type&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            image=&amp;quot;vmx&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            filesystem=&amp;quot;btrfs&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            format=&amp;quot;qcow2&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootloader=&amp;quot;grub2&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            firmware=&amp;quot;uefi&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            efipartsize=&amp;quot;33&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            kernelcmdline=&amp;quot;systemd.show_status=1 console=ttyS0,115200 console=tty0 quiet&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootpartition=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootkernel=&amp;quot;custom&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            devicepersistency=&amp;quot;by-uuid&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_quota_groups=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_root_is_snapshot=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;home&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;root&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;tmp&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;opt&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;srv&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/i386-pc&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/x86_64-efi&amp;quot; mountpoint=&amp;quot;boot/grub2/x86_64-efi&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;usr/local&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;var&amp;quot; copy_on_write=&amp;quot;false&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;/systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;size unit=&amp;quot;G&amp;quot;&amp;gt;24&amp;lt;/size&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;/type&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/preferences&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;preferences profiles=&amp;quot;kvm-and-xen&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;version&amp;gt;15.3&amp;lt;/version&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -296,10 +338,19 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;    &amp;lt;!-- Shim for secure boot everywhere except for RPi --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;shim&amp;quot; arch=&amp;quot;aarch64,x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;btrfsprogs&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;btrfsmaintenance&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;grub2-snapper-plugin&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;snapper-zypp-plugin&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;snapper&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;firewalld&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/packages&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;!-- Not needed in OpenStack as it uses XFS and cloud-init --&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,VMware,MS-HyperV,RaspberryPi&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Only for btrfs --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -322,17 +373,17 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xen-tools-domU&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xen-libs&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;kernel-default-base&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;qemu-guest-agent&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;VMware&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;open-vm-tools&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;kernel-default-base&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;cloud-init&amp;quot; /&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;cloud-init-config-suse&amp;quot; /&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xfsprogs&amp;quot; /&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -363,7 +414,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;openSUSE-release&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;kvm,kvm-and-xen&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;kvm,kvm-and-xen,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;openSUSE-release-appliance-kvm&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;OpenStack-Cloud&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;


&lt;/span&gt;&lt;span class="pygments-gh"&gt;Index: _multibuild&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- _multibuild (revision 13)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ _multibuild (revision 3)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -1,8 +1,11 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;multibuild&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  &amp;lt;flavor&amp;gt;pve&amp;lt;/flavor&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  &amp;lt;!--&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;kvm-and-xen&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;kvm&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;VMware&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;MS-HyperV&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;OpenStack-Cloud&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;RaspberryPi&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  --&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;/multibuild&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="opensuse-leap-15-4-jeos"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-13"&gt;openSUSE Leap 15.4 JeOS&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="open-build-service-obs-project-3"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-14"&gt;Open Build Service (OBS) Project&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.4/kiwi-templates-JeOS"&gt;https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.4/kiwi-templates-JeOS&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="download-3"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-15"&gt;Download&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;openSUSE Mirror (Automatic Build / Sync): &lt;a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.4/images/"&gt;https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.4/images/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="customizations-3"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-16"&gt;Customizations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;Index: JeOS.kiwi&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- JeOS.kiwi (revision 2)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ JeOS.kiwi (revision 3)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -9,6 +9,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;specification&amp;gt;openSUSE Leap 15.4 JeOS&amp;lt;/specification&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/description&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;profiles&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;profile name=&amp;quot;pve&amp;quot; description=&amp;quot;JeOS for Proxmox VE (pve)&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;kvm-and-xen&amp;quot; description=&amp;quot;JeOS for KVM and Xen&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;kvm&amp;quot; description=&amp;quot;JeOS for KVM&amp;quot; arch=&amp;quot;aarch64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;VMware&amp;quot; description=&amp;quot;JeOS for VMware&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -16,6 +17,47 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;OpenStack-Cloud&amp;quot; description=&amp;quot;JeOS for OpenStack Cloud&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;profile name=&amp;quot;RaspberryPi&amp;quot; description=&amp;quot;JeOS for the Raspberry Pi&amp;quot; arch=&amp;quot;aarch64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/profiles&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;preferences profiles=&amp;quot;pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;version&amp;gt;15.4&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;bootsplash-theme&amp;gt;openSUSE&amp;lt;/bootsplash-theme&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;bootloader-theme&amp;gt;openSUSE&amp;lt;/bootloader-theme&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;!-- those settings are applied by suseConfig in config.sh&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;locale&amp;gt;en_US&amp;lt;/locale&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;keytable&amp;gt;us.map.gz&amp;lt;/keytable&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;timezone&amp;gt;Europe/Berlin&amp;lt;/timezone&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;hwclock&amp;gt;utc&amp;lt;/hwclock&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    --&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;rpm-excludedocs&amp;gt;true&amp;lt;/rpm-excludedocs&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;type&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            image=&amp;quot;vmx&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            filesystem=&amp;quot;btrfs&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            format=&amp;quot;qcow2&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootloader=&amp;quot;grub2&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            firmware=&amp;quot;uefi&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            efipartsize=&amp;quot;33&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            kernelcmdline=&amp;quot;rw systemd.show_status=1 console=ttyS0,115200 console=tty0 quiet&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootpartition=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            bootkernel=&amp;quot;custom&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            devicepersistency=&amp;quot;by-uuid&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_quota_groups=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            btrfs_root_is_snapshot=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;home&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;root&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;tmp&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;opt&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;srv&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/i386-pc&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;boot/grub2/x86_64-efi&amp;quot; mountpoint=&amp;quot;boot/grub2/x86_64-efi&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;usr/local&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                &amp;lt;volume name=&amp;quot;var&amp;quot; copy_on_write=&amp;quot;false&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;/systemdisk&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+            &amp;lt;size unit=&amp;quot;G&amp;quot;&amp;gt;24&amp;lt;/size&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;/type&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/preferences&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;preferences profiles=&amp;quot;kvm-and-xen&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;version&amp;gt;15.4&amp;lt;/version&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;packagemanager&amp;gt;zypper&amp;lt;/packagemanager&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -298,10 +340,19 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;    &amp;lt;!-- Shim for secure boot everywhere except for RPi --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;shim&amp;quot; arch=&amp;quot;aarch64,x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;btrfsprogs&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;btrfsmaintenance&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;grub2-snapper-plugin&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;snapper-zypp-plugin&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;snapper&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        &amp;lt;package name=&amp;quot;firewalld&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;/packages&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;!-- Not needed in OpenStack as it uses XFS and cloud-init --&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,VMware,MS-HyperV,RaspberryPi&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;!-- Only for btrfs --&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -324,17 +375,17 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xen-tools-domU&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xen-libs&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;kernel-default-base&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;kvm-and-xen,kvm,OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;qemu-guest-agent&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;VMware&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;open-vm-tools&amp;quot; arch=&amp;quot;x86_64&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;kernel-default-base&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;OpenStack-Cloud&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;image&amp;quot; profiles=&amp;quot;OpenStack-Cloud,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;cloud-init&amp;quot; /&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;cloud-init-config-suse&amp;quot; /&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;xfsprogs&amp;quot; /&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -365,7 +416,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;openSUSE-release&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;kvm,kvm-and-xen&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;kvm,kvm-and-xen,pve&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;lt;package name=&amp;quot;openSUSE-release-appliance-kvm&amp;quot;/&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;/packages&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;lt;packages type=&amp;quot;bootstrap&amp;quot; profiles=&amp;quot;OpenStack-Cloud&amp;quot;&amp;gt;&lt;span class="pygments-w"&gt;


&lt;/span&gt;&lt;span class="pygments-gh"&gt;Index: _multibuild&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;===================================================================&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- _multibuild (revision 2)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ _multibuild (revision 3)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -1,8 +1,11 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;multibuild&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  &amp;lt;flavor&amp;gt;pve&amp;lt;/flavor&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  &amp;lt;!--&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;kvm-and-xen&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;kvm&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;VMware&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;MS-HyperV&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;OpenStack-Cloud&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;  &amp;lt;flavor&amp;gt;RaspberryPi&amp;lt;/flavor&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+  --&amp;gt;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&amp;lt;/multibuild&amp;gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Getting started with OBS took a while but then it's really amazing how easy it is to branch existing
packages, doesn't matter if it's classic rpm, vm or container images, apply changes and get results.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Linux"/><category term="openSUSE"/><category term="OBS"/><category term="Proxmox"/><category term="Linux"/><category term="cloud-init"/></entry><entry><title>Import 'protective MBR' GPT disk images like SUSE or openSUSE to LVM-Thin with disabled zeroing cause corruption</title><link href="https://dominik.wombacher.cc/posts/import_protective-mbr_gpt_disk_images_like_suse_or_opensuse_to_lvm-thin_with_disabled_zeroing_cause_corruption.html" rel="alternate"/><published>2022-04-14T00:00:00+02:00</published><updated>2022-04-15T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-04-14:/posts/import_protective-mbr_gpt_disk_images_like_suse_or_opensuse_to_lvm-thin_with_disabled_zeroing_cause_corruption.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Any available SUSE and openSUSE KVM Image I tried, ended in a VM that stuck on boot
with the message "a start job is running for /dev/disk/by-uuid"
or  ... &lt;a class="read-more" href="/posts/import_protective-mbr_gpt_disk_images_like_suse_or_opensuse_to_lvm-thin_with_disabled_zeroing_cause_corruption.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Any available SUSE and openSUSE KVM Image I tried, ended in a VM that stuck on boot
with the message &amp;quot;a start job is running for /dev/disk/by-uuid&amp;quot;
or dropped into the dracut emergency shell after a timeout.&lt;/p&gt;
&lt;p&gt;No partitions could be found, only &amp;quot;/dev/sda&amp;quot; was visible from inside the VM,
gdisk dropped a lot of warnings and errors as well:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
Caution! After loading partitions, the CRC doesn't check out!
Warning! Main and backup partition tables differ! Use the 'c' and 'e' options
on the recovery &amp;amp; transformation menu to examine the two tables.

Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: OK
Main partition table: ERROR
Backup partition table: ERROR

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: damaged

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************

Warning! Secondary partition table overlaps the last partition by
18315034227491254276 blocks!
You will need to delete this partition or resize it in another utility.

&lt;/pre&gt;
&lt;p&gt;I tried it on a Proxmox VE Host with a LVM-Thin Datastore, a closer look at the
LVM-Thin Device of one of the affected VMs confirmed the missing partitions:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
fdisk -l /dev/mapper/pve-vm--9181--disk--0
Disk /dev/mapper/pve-vm--9181--disk--0: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 524288 bytes
Disklabel type: dos
Disk identifier: 0x406b6f28

Device                                  Boot Start      End  Sectors Size Id Type
/dev/mapper/pve-vm--9181--disk--0-part1          1 50331647 50331647  24G ee GPT

Partition 1 does not start on physical sector boundary.

&lt;/pre&gt;
&lt;p&gt;I chased that issue down for weeks and almost gave up because I didn't found any clue,
it just felt like no one ever faced a similar issue before.
After lot of different tests on multiple systems and configurations,
my LVM-Thin Storage seemed to cause the issue and by accident I finally found a hint in the
&lt;a class="reference external" href="https://forum.proxmox.com/threads/corrupt-gpt-after-restore-on-pve-7-0-from-backup-on-pve-6-4-qemu-vm-lvm-thin-storage-ovmf.94785/"&gt;Proxmox Forum&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220414194037/https://forum.proxmox.com/threads/corrupt-gpt-after-restore-on-pve-7-0-from-backup-on-pve-6-4-qemu-vm-lvm-thin-storage-ovmf.94785/"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.04.14-194050/https://forum.proxmox.com/threads/corrupt-gpt-after-restore-on-pve-7-0-from-backup-on-pve-6-4-qemu-vm-lvm-thin-storage-ovmf.94785/"&gt;[2]&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Indeed, no Idea why but I disabled zeroing on the LV during conversion to Thin:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
lvconvert --type thin-pool pve/lv_test -Zn -y

&lt;/pre&gt;
&lt;p&gt;The official &lt;a class="reference external" href="https://pve.proxmox.com/wiki/Storage:_LVM_Thin"&gt;Proxmox Documentation&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220312200416/https://pve.proxmox.com/wiki/Storage:_LVM_Thin"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.04.14-194733/https://pve.proxmox.com/wiki/LVM2"&gt;[2]&lt;/a&gt;)
doesn't mention the Parameter &lt;code&gt;-Zn&lt;/code&gt;, obviously because of very good reasons.&lt;/p&gt;
&lt;p&gt;Tests with a new LVM-Thin with enabled zeroing (default) confirmed that all issues I faced earlier seem to be caused by that.
A new VM based on the same &lt;code&gt;qcow2&lt;/code&gt; image as before is now starting without any issue,
delay or timeout, just as expected, also the partition table looks way better:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
fdisk -l /dev/mapper/pve-vm--9181--disk--0
Disk /dev/mapper/pve-vm--9181--disk--0: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 65536 bytes / 65536 bytes
Disklabel type: gpt
Disk identifier: 0D13903E-0408-4963-9C0D-A455B37C6062

Device                                  Start      End  Sectors Size Type
/dev/mapper/pve-vm--9181--disk--0-part1  2048     6143     4096   2M BIOS boot
/dev/mapper/pve-vm--9181--disk--0-part2  6144    73727    67584  33M EFI System
/dev/mapper/pve-vm--9181--disk--0-part3 73728 50331614 50257887  24G Linux filesystem

&lt;/pre&gt;
&lt;p&gt;I installed some VMs &amp;quot;normally&amp;quot; by booting a .iso files, also importing qcow2 images with a &amp;quot;flat&amp;quot; / &amp;quot;oldschool&amp;quot; Partition Layout,
like the Rocky Linux Generic Cloud Image, which comes with a single XFS formatted MBR Partition, was working without the above problems.&lt;/p&gt;
&lt;p&gt;So it looks like that's something specific to disk images with 'protective MBR' GPT and EFI Partitions.
So far only SUSE and openSUSE Images seem to use such a Layout by default.&lt;/p&gt;
&lt;p&gt;To be perfectly honest, I didn't have a fully technical explanation why disabled zeroing on LVM-Thin
has such an impact when importing PMBR disks. I can only assume that during the LV creation and &lt;code&gt;qcow2&lt;/code&gt;
import as well as conversion to &lt;code&gt;raw&lt;/code&gt; there is some messing around with the first few sectors.&lt;/p&gt;
&lt;p&gt;Fact is: I enabled zeroing on the LVM-Thin LV, everything got back to normal and the pre-build images behave now as they are supposed to.&lt;/p&gt;
</content><category term="Linux"/><category term="Linux"/><category term="Proxmox"/><category term="SUSE"/><category term="openSUSE"/><category term="LVM. GPT"/></entry><entry><title>openSUSE Leap 15.3 on VMware vSphere 6.7: Get Guest Customization working</title><link href="https://dominik.wombacher.cc/posts/opensuse_leap_15-3_on_vmware_vsphere_6-7_get_guest_customization_working.html" rel="alternate"/><published>2022-03-10T00:00:00+01:00</published><updated>2022-03-10T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-03-10:/posts/opensuse_leap_15-3_on_vmware_vsphere_6-7_get_guest_customization_working.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Technically &lt;em&gt;openSUSE Leap 15.3&lt;/em&gt; is equal to &lt;em&gt;SUSE Linux Enterprise Server 15 SP3&lt;/em&gt;, both share the same code and binary packages,
the only difference is community vs. commercial support  ... &lt;a class="read-more" href="/posts/opensuse_leap_15-3_on_vmware_vsphere_6-7_get_guest_customization_working.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Technically &lt;em&gt;openSUSE Leap 15.3&lt;/em&gt; is equal to &lt;em&gt;SUSE Linux Enterprise Server 15 SP3&lt;/em&gt;, both share the same code and binary packages,
the only difference is community vs. commercial support. It's even possible to quickly
&lt;a class="reference external" href="https://en.opensuse.org/SDB:How_to_migrate_to_SLE#Migration_from_openSUSE_Leap_to_SUSE_Linux_Enterprise_Server"&gt;migrate from Leap 15.3 to SLES 15 SP3&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220210180820/https://en.opensuse.org/SDB:How_to_migrate_to_SLE"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.10-225629/https://en.opensuse.org/SDB:How_to_migrate_to_SLE"&gt;[2]&lt;/a&gt;)
if you decide vendor support is preferred at a later point.&lt;/p&gt;
&lt;p&gt;VMWare still doesn't officially support Leap 15.3 as VM on vSphere neither allows Guest Customization,
but for sure, when you run SLES 15 SP3 it's not a problem and fully supported?!&lt;/p&gt;
&lt;p&gt;As explained &lt;a class="reference external" href="https://cstan.io/?p=12416&amp;amp;lang=en"&gt;here&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20210420173348/https://cstan.io/?p=12416&amp;amp;lang=en"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.10-225051/https://cstan.io/?p=12416&amp;amp;lang=en"&gt;[2]&lt;/a&gt;) in regards to Leap 15.2,
one option is to replace to content of &lt;code&gt;/etc/issue&lt;/code&gt; with &lt;code&gt;SUSE Linux Enterprise Server 15&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Keep in mind that &lt;code&gt;/etc/issue&lt;/code&gt; is a symlink to &lt;code&gt;/run/issue&lt;/code&gt;, a &lt;em&gt;volatile and temporary file&lt;/em&gt;,
managed by systemd service &lt;code&gt;issue-generator&lt;/code&gt;. So you have to remove the symlink and create a new
&lt;code&gt;/etc/issue&lt;/code&gt; file, otherwise your changes will be lost after the next reboot.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo rm /etc/issue &amp;amp;&amp;amp; echo &amp;quot;SUSE Linux Enterprise Server 15&amp;quot; &amp;gt; /etc/issue

&lt;/pre&gt;
&lt;p&gt;In addition I had to change the OS Type in the VM Settings on vSphere to &amp;quot;SUSE Linux Enterprise Server 15&amp;quot; as well,
otherwise the Guest Customization couldn't even be started without an error message.&lt;/p&gt;
&lt;p&gt;I like the generated issue file and the additional information, so after the new deployed VM is up and running, let's just revert the change:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo rm /etc/issue &amp;amp;&amp;amp; ln -s /run/issue /etc/issue

&lt;/pre&gt;
&lt;p&gt;Little more complicated, but also possible, is to replace &lt;code&gt;/etc/os-release&lt;/code&gt; with the content
from a SLES 15 SP3 System. It has the same effect as changing &lt;code&gt;/etc/issue&lt;/code&gt;, the Guest
Customization will think it's a SUSE Linux Enterprise Server and apply all settings.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
NAME=&amp;quot;SLES&amp;quot;
VERSION=&amp;quot;15-SP3&amp;quot;
VERSION_ID=&amp;quot;15.3&amp;quot;
PRETTY_NAME=&amp;quot;SUSE Linux Enterprise Server 15 SP3&amp;quot;
ID=&amp;quot;sles&amp;quot;
ID_LIKE=&amp;quot;suse&amp;quot;
ANSI_COLOR=&amp;quot;0;32&amp;quot;
CPE_NAME=&amp;quot;cpe:/o:suse:sles:15:sp3&amp;quot;

&lt;/pre&gt;
</content><category term="Linux"/><category term="openSUSE"/><category term="Leap"/><category term="VMWare"/><category term="vSphere"/></entry><entry><title>Uyuni Test Environment with sumaform on local libvirt host (openSUSE Tumbleweed)</title><link href="https://dominik.wombacher.cc/posts/uyuni_test_environment_with_sumaform_on_local_libvirt_host_opensuse_tumbleweed.html" rel="alternate"/><published>2022-03-08T00:00:00+01:00</published><updated>2022-03-08T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-03-08:/posts/uyuni_test_environment_with_sumaform_on_local_libvirt_host_opensuse_tumbleweed.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;A convenient way to quickly setup a local Uyuni Instance inclusive Clients, either for Development or Testing, is sumaform.
It supports different backends and provides a ton of options, check  ... &lt;a class="read-more" href="/posts/uyuni_test_environment_with_sumaform_on_local_libvirt_host_opensuse_tumbleweed.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;A convenient way to quickly setup a local Uyuni Instance inclusive Clients, either for Development or Testing, is sumaform.
It supports different backends and provides a ton of options, check it out: &lt;a class="reference external" href="https://github.com/uyuni-project/sumaform"&gt;https://github.com/uyuni-project/sumaform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just want to run a Uyuni Server and a few Clients (openSUSE, EL, Debian) on my Laptop so I can verify reported bugs,
try some configs as well as deploy and test changes during development, without investing much time.&lt;/p&gt;
&lt;p&gt;Following a overview of the, in my case, relevant steps, examples of my config and some Ansible snippets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo zypper addrepo http://download.opensuse.org/repositories/systemsmanagement:/sumaform/openSUSE_Tumbleweed/systemsmanagement:sumaform.repo
sudo zypper install git-core
sudo zypper install --from systemsmanagement_sumaform terraform terraform-provider-libvirt
git clone https://github.com/uyuni-project/sumaform.git

&lt;/pre&gt;
&lt;p&gt;Follow the &lt;em&gt;First-time configuration (libvirt)&lt;/em&gt; instructions in the
&lt;a class="reference external" href="https://github.com/uyuni-project/sumaform/blob/2082e344b9cdde5c3befb11fc358d80eb50de346/backend_modules/libvirt/README.md"&gt;README&lt;/a&gt;,
but use the uyuni example file instead: &lt;code&gt;copy main.tf.uyuni.example to main.tf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Config &amp;amp; Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
vim main.tf

terraform init
terraform validate
terraform apply

&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;My terraform main.cf based on the uyuni example file&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code shell literal-block"&gt;
terraform&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&lt;span class="pygments-nv"&gt;required_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;1.0.10&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;required_providers&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
   &lt;/span&gt;&lt;span class="pygments-nv"&gt;libvirt&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
     &lt;/span&gt;&lt;span class="pygments-nv"&gt;version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;0.6.3&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
   &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;provider&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;libvirt&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;base&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;cc_username&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;cc_password&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;images&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;[&lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;centos7&amp;quot;&lt;/span&gt;,&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;opensuse153o&amp;quot;&lt;/span&gt;,&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;ubuntu1804&amp;quot;&lt;/span&gt;&lt;span class="pygments-o"&gt;]&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;base_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.base.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;product_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;uyuni-master&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;name&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;image&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;opensuse153o&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;use_os_released_updates&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_first_user&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;auto_accept&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;skip_changelog_import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;mgr_sync_autologin&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_sample_channel&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_sample_activation_key&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_sample_bootstrap_script&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;publish_private_ssl_key&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;java_debugging&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;provider_settings&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;memory&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;8192&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;vcpu&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;4&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;redhat-minion&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;base_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.base.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;product_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;uyuni-master&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;name&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;minion-centos7&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;image&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;centos7&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;server_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.server.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;provider_settings&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;memory&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;1024&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;auto_connect_to_master&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;debian-minion&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;base_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.base.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;product_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;uyuni-master&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;name&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;minion-ubuntu1804&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;image&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;ubuntu1804&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;server_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.server.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;provider_settings&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;memory&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;1024&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;auto_connect_to_master&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ansible Snippets for the Setup steps&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Import systemsmanagement:/sumaform RPM Key&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;rpm_key&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;key&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;https://download.opensuse.org/repositories/systemsmanagement:/sumaform/openSUSE_Tumbleweed/repodata/repomd.xml.key&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;present&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Add systemsmanagement:/sumaform RPM Repository&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;community.general.zypper_repository&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;systemsmanagement_sumaform&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;description&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Using Terraform to create a SUSE Manager test environment (openSUSE_Tumbleweed)&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;repo&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;https://download.opensuse.org/repositories/systemsmanagement:/sumaform/openSUSE_Tumbleweed/&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;priority&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;90&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;present&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;ignore_errors&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Package Installation (Uyuni Development - sumaform)&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;community.general.zypper&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;terraform&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;terraform-provider-libvirt&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;git-core&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;allow_vendor_change&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;force_resolution&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;force&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;latest&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
</content><category term="Linux"/><category term="uyuni"/><category term="sumaform"/><category term="terraform"/><category term="libvirt"/><category term="openSUSE"/></entry><entry><title>Release: MoinMoin Wiki Container, powered by PyPy2</title><link href="https://dominik.wombacher.cc/posts/release-moinmoin-wiki-container-powered-by-pypy2.html" rel="alternate"/><published>2021-10-09T00:00:00+02:00</published><updated>2021-10-09T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2021-10-09:/posts/release-moinmoin-wiki-container-powered-by-pypy2.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I published the first version of &lt;strong&gt;moinmoin-pypy2-container&lt;/strong&gt;,
a ready to use image to run MoinMoin Wiki, based on openSUSE Leap.&lt;/p&gt;
&lt;p&gt;It contains some enhancements regarding the intial wiki setup  ... &lt;a class="read-more" href="/posts/release-moinmoin-wiki-container-powered-by-pypy2.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I published the first version of &lt;strong&gt;moinmoin-pypy2-container&lt;/strong&gt;,
a ready to use image to run MoinMoin Wiki, based on openSUSE Leap.&lt;/p&gt;
&lt;p&gt;It contains some enhancements regarding the intial wiki setup to make it
easier to get started and already ships with a pre-configured nginx.&lt;/p&gt;
&lt;p&gt;Latest stable release of &lt;a class="reference external" href="https://moinmo.in"&gt;MoinMoin&lt;/a&gt;
was 8th November 2020 and requires Python 2, development of the successor
&lt;a class="reference external" href="https://github.com/moinwiki/moin"&gt;moin2&lt;/a&gt; is ongoing but wasn't released yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;moin2&lt;/strong&gt; supports Python 3, but there is still a lot to do and the Project could use some
&lt;a class="reference external" href="https://github.com/moinwiki/moin/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22"&gt;help&lt;/a&gt;,
what about a &lt;a class="reference external" href="https://github.com/moinwiki/moin/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22"&gt;good first issue&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;It might be that User still want to keep using the latest stable
release and wait with the migration for a while.&lt;/p&gt;
&lt;p&gt;Besides minor enhancements, the main goal of &lt;strong&gt;moinmoin-pypy2-container&lt;/strong&gt;
is to provide a easy to use alternative to keep using MoinMoin.&lt;/p&gt;
&lt;p&gt;The official Python 2 Runtime is &lt;a class="reference external" href="https://www.python.org/doc/sunset-python-2/"&gt;End-of-Life&lt;/a&gt;.
But PyPy will support Python 2 &lt;a class="reference external" href="https://doc.pypy.org/en/latest/faq.html#how-long-will-pypy-support-python2"&gt;&amp;quot;forever&amp;quot;&lt;/a&gt;
and still provide updates in future.&lt;/p&gt;
&lt;p&gt;Please check the &lt;strong&gt;README&lt;/strong&gt; in the below linked Source code Repository
for further details about the &lt;em&gt;features&lt;/em&gt; and &lt;em&gt;usage&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The repository is available on
&lt;a class="reference external" href="https://codeberg.org/wombelix/moinmoin-pypy2-container"&gt;Codeberg&lt;/a&gt; (Primary),
&lt;a class="reference external" href="https://gitlab.com/wombelix/moinmoin-pypy2-container"&gt;Gitlab&lt;/a&gt; (Mirror),
&lt;a class="reference external" href="https://github.com/wombelix/moinmoin-pypy2-container"&gt;Github&lt;/a&gt; (Mirror).&lt;/p&gt;
&lt;p&gt;Pre-build Container Images can be downloaded from
&lt;a class="reference external" href="https://quay.io/repository/wombelix/moinmoin-pypy2?tab=info"&gt;quay.io&lt;/a&gt;.&lt;/p&gt;
</content><category term="Code"/><category term="MoinMoin"/><category term="Wiki"/><category term="Container"/><category term="PyPy"/><category term="Python"/><category term="openSUSE"/></entry><entry><title>openSUSE Tumbleweed: Issues on resume from hibernate / suspend to disk</title><link href="https://dominik.wombacher.cc/posts/opensuse-tumbleweed-issues-on-resume-from-hibernate-suspend-to-disk.html" rel="alternate"/><published>2021-10-03T00:00:00+02:00</published><updated>2021-10-03T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2021-10-03:/posts/opensuse-tumbleweed-issues-on-resume-from-hibernate-suspend-to-disk.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;So far I always used &lt;strong&gt;sleep&lt;/strong&gt; when closing the lid of my Notebook,
was ok even though you risk that your battery runs empty and your system shutdown.
Wanted to  ... &lt;a class="read-more" href="/posts/opensuse-tumbleweed-issues-on-resume-from-hibernate-suspend-to-disk.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;So far I always used &lt;strong&gt;sleep&lt;/strong&gt; when closing the lid of my Notebook,
was ok even though you risk that your battery runs empty and your system shutdown.
Wanted to activate &lt;strong&gt;hibernate&lt;/strong&gt; which then would also support &lt;strong&gt;hybrid sleep&lt;/strong&gt;,
what seem to be compareable with what Apple does to achieve a massive &lt;em&gt;standby&lt;/em&gt; and short wakeup time on the MacBook.&lt;/p&gt;
&lt;p&gt;During the Setup I already created a Swap Partition equal to the size of my Memory,
so I thought this should all work out of the box, but didn't.&lt;/p&gt;
&lt;p&gt;Found a &lt;a class="reference external" href="https://www.reddit.com/r/openSUSE/comments/hjec9g/resume_from_hibernation_is_not_working/"&gt;Post on reddit&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://archive.today/2021.10.03-102238/https://www.reddit.com/r/openSUSE/comments/hjec9g/resume_from_hibernation_is_not_working/"&gt;[1]&lt;/a&gt;)
and a related &lt;a class="reference external" href="https://bugzilla.suse.com/show_bug.cgi?id=1187381"&gt;Bug Report&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20211003103337/https://bugzilla.suse.com/show_bug.cgi?id=1187381"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2021.10.03-103302/https://bugzilla.suse.com/show_bug.cgi?id=1187381"&gt;[2]&lt;/a&gt;), both contained contrary information.
Based on Reddit the &lt;em&gt;resume&lt;/em&gt; module would be missing in &lt;em&gt;initrd&lt;/em&gt; and should be included.
The Bug makes clear that &lt;em&gt;systemd-hibernate-resume&lt;/em&gt; is used and _not_ the &lt;em&gt;resume&lt;/em&gt; module that could be added by &lt;em&gt;dracut&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I trust the Bug Report more, but adding &lt;em&gt;resume=/dev/mapper/system-swap&lt;/em&gt;
(Has to be the path to your Swap Partition and might differ)
to &lt;strong&gt;/etc/default/grub&lt;/strong&gt; didn't solved the issue.
So I generated a new &lt;em&gt;initramfs&lt;/em&gt; by running &lt;em&gt;dracut -f&lt;/em&gt;, without modifying any config,
afterwards &lt;strong&gt;hibernate&lt;/strong&gt; and &lt;strong&gt;hybrid sleep&lt;/strong&gt; were working.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
grep resume /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;splash=silent mitigations=auto quiet resume=/dev/mapper/system-swap&amp;quot;

sudo grub2-mkconfig -o /boot/efi/EFI/opensuse/grub.cfg

sudo dracut -f

&lt;/pre&gt;
&lt;p&gt;No Idea why I had to rebuild the &lt;em&gt;initramfs&lt;/em&gt;, should already be done (automatically) during the last Kernel Upgrade,
anyway, I can now use &lt;strong&gt;hybrid sleep&lt;/strong&gt; which looks actually very good so far.
Roughtly 30 - 60 sec until sleep after closing the lid, resume just a few seconds,
not really different to &lt;strong&gt;sleep&lt;/strong&gt; as far I can see.&lt;/p&gt;
</content><category term="Linux"/><category term="openSUSE"/><category term="Tumbleweed"/><category term="Linux"/></entry><entry><title>ScummVM did the trick!</title><link href="https://dominik.wombacher.cc/posts/scummvm-did-the-trick.html" rel="alternate"/><published>2020-04-03T15:43:00+02:00</published><updated>2020-04-03T15:43:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2020-04-03:/posts/scummvm-did-the-trick.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;After playing around with DOSBox a while ago i gave ScummVM a try and actually it couldn't be easier.
I picked Discworld II and after adding it i could just  ... &lt;a class="read-more" href="/posts/scummvm-did-the-trick.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;After playing around with DOSBox a while ago i gave ScummVM a try and actually it couldn't be easier.
I picked Discworld II and after adding it i could just start it without changing any settings at all, impressive.&lt;/p&gt;
&lt;p&gt;I'm quite sure it will work very well with other old Games of my collection, we will see.&lt;/p&gt;
</content><category term="Games"/><category term="Discworld"/><category term="Linux"/><category term="openSUSE"/><category term="ScummVM"/><category term="Tumbleweed"/></entry><entry><title>Accessing SMB Share on old NAS failed from Linux</title><link href="https://dominik.wombacher.cc/posts/accessing-smb-share-on-old-nas-failed-from-linux.html" rel="alternate"/><published>2019-12-24T13:33:00+01:00</published><updated>2019-12-24T13:33:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2019-12-24:/posts/accessing-smb-share-on-old-nas-failed-from-linux.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Sometimes it can be challenging to use some old Hardware.
In my case I found an old &lt;em&gt;Buffalo LinkStation LS-WTGL&lt;/em&gt; NAS from around 2008.&lt;/p&gt;
&lt;p&gt;Connecting from an up-to-date openSUSE System  ... &lt;a class="read-more" href="/posts/accessing-smb-share-on-old-nas-failed-from-linux.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Sometimes it can be challenging to use some old Hardware.
In my case I found an old &lt;em&gt;Buffalo LinkStation LS-WTGL&lt;/em&gt; NAS from around 2008.&lt;/p&gt;
&lt;p&gt;Connecting from an up-to-date openSUSE System surprisingly failed with the Error Message:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Unable to initialize messaging context. protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;But what's the issue? I was able to connect to my &lt;em&gt;QNAP TS-253A&lt;/em&gt; NAS without problems.
So i played around with different parameters of the smbclient cli tool, no success.&lt;/p&gt;
&lt;p&gt;After a while the Hint in a &lt;a class="reference external" href="https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077"&gt;Ask Fedora!&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20210225143935/https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077/4"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="http://archive.today/2021.02.25-143929/https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077/1"&gt;[2]&lt;/a&gt;)
Thread from eeijlar put me into the right Direction.
The workaround, also mentioned in &lt;a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1768117"&gt;Red Hat Bug 1768117&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20201111203350/https://bugzilla.redhat.com/show_bug.cgi?id=1768117"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="http://archive.today/2021.02.25-144057/https://bugzilla.redhat.com/show_bug.cgi?id=1768117"&gt;[2]&lt;/a&gt;),
solved the issue and i was able to mount my SMB Shares from the old Buffalo NAS.&lt;/p&gt;
&lt;p&gt;eeijlar:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt; Update /etc/samba/smb.conf with:
&amp;gt; [global]
&amp;gt; client min protocol = NT1
&lt;/pre&gt;
&lt;p&gt;For security reasons, the SMB1 / NT1 protocol is disabled by default in Samba 4.11 and higher.
But some old NAS only support these outdated protocol.&lt;/p&gt;
&lt;p&gt;I highly suggest that you only enable it temporary and migrate your files.&lt;/p&gt;
</content><category term="Linux"/><category term="NAS"/><category term="openSUSE"/><category term="Samba"/><category term="smb"/><category term="Linux"/></entry><entry><title>No Sound in DOSBox on Linux</title><link href="https://dominik.wombacher.cc/posts/no-sound-in-dosbox-on-linux.html" rel="alternate"/><published>2019-12-06T18:53:00+01:00</published><updated>2019-12-06T18:53:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2019-12-06:/posts/no-sound-in-dosbox-on-linux.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I installed DOSBox to play some old DOS Games like Discworld on Linux (openSUSE Tumbleweed) but didn't had sound prior figure out the correct MIDI Port and adjusting the dosbox  ... &lt;a class="read-more" href="/posts/no-sound-in-dosbox-on-linux.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I installed DOSBox to play some old DOS Games like Discworld on Linux (openSUSE Tumbleweed) but didn't had sound prior figure out the correct MIDI Port and adjusting the dosbox config accordingly.&lt;/p&gt;
&lt;p&gt;Due to the fact that i installed Unreal Tournament from 1999 already (successful!) on my Linux Notebook, it's obvious that i had to do the same with some even older Games too :D&lt;/p&gt;
&lt;p&gt;I thought executing &amp;quot;pmidi -l&amp;quot; would show the correct MIDI Port, but at least in my case, further steps were necessary.&lt;/p&gt;
&lt;p&gt;The troubleshooting approach described in the &lt;a class="reference external" href="https://askubuntu.com/questions/79944/dosbox-has-no-sound"&gt;AskUbuntu Forum&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20180102021001/https://askubuntu.com/questions/79944/dosbox-has-no-sound"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="http://archive.today/2021.02.25-232132/https://askubuntu.com/questions/79944/dosbox-has-no-sound"&gt;[2]&lt;/a&gt;)
is my favorite and did the trick.&lt;/p&gt;
&lt;p&gt;You have to Download a test MIDI File, start a MIDI Server, start the playback and if you have audio, put the correct Port into your dosbox config.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
zypper install timidity
zypper install pmidi

cd /tmp
wget http://www.angelfire.com/fl/herky/images/teddybear.mid

pmidi -l
#    Port     Client name                       Port name
#    14:0     Midi Through                      Midi Through Port-0

timidity -iA
#    Requested buffer size 32768, fragment size 8192
#    ALSA pcm 'default' set buffer size 32768, period size 8192 bytes
#    TiMidity starting in ALSA server mode
#    Opening sequencer port: 128:0 128:1 128:2 128:3

pmidi -p 128:0 teddybear.mid

&lt;/pre&gt;
&lt;p&gt;In my case, pmidi identified Port &amp;quot;14:0&amp;quot; but based on the test with timidity i have to use &amp;quot;128:0&amp;quot; instead.&lt;/p&gt;
&lt;p&gt;So i changed the corresponding parameter in my dosbox config:&lt;/p&gt;
&lt;pre class="code ini literal-block"&gt;
&lt;span class="pygments-k"&gt;[midi]&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-na"&gt;midiconfig&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-s"&gt;128:0&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;When you start dosbox from the console, you should see something like the following an hear the nicest MIDI sound when starting an old Game ;)&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
ALSA:Client initialised [128:0]
MIDI:Opened device:alsa

&lt;/pre&gt;
&lt;p&gt;I will play around with ScummVM as well within the next days, so i'm quite sure further Posts regarding some sort of gaming on Linux will follow soon!&lt;/p&gt;
</content><category term="Linux"/><category term="Audio"/><category term="DOSBox"/><category term="Midi"/><category term="Sound"/><category term="Games"/><category term="Linux"/><category term="openSUSE"/><category term="Tumbleweed"/><category term="Discworld"/></entry><entry><title>Unreal Tournament (UT99) on openSUSE Tumbleweed Linux</title><link href="https://dominik.wombacher.cc/posts/unreal-tournament-ut99-on-opensuse-tumbleweed-linux.html" rel="alternate"/><published>2019-12-05T13:38:00+01:00</published><updated>2021-02-26T21:52:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2019-12-05:/posts/unreal-tournament-ut99-on-opensuse-tumbleweed-linux.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;To be honest, i didn't played Unreal Tournament from 1999 for years but after i found the Game CD, i just had to install and play it on my Linux  ... &lt;a class="read-more" href="/posts/unreal-tournament-ut99-on-opensuse-tumbleweed-linux.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;To be honest, i didn't played Unreal Tournament from 1999 for years but after i found the Game CD, i just had to install and play it on my Linux Notebook :D&lt;/p&gt;
&lt;div class="section" id="tl-dr"&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Summary how to install Unreal Tournament (Classic / 1999) on openSUSE Tumbleweed Linux:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Add &lt;strong&gt;games&lt;/strong&gt; Repository and install package &lt;strong&gt;gtk&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;either via YaST or through the &lt;a class="reference external" href="https://software.opensuse.org/package/gtk"&gt;openSUSE Software repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;pre class="code text literal-block"&gt;
zypper addrepo https://download.opensuse.org/repositories/games/openSUSE_Tumbleweed/games.repo
zypper refresh
zypper install gtk

&lt;/pre&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;Install missing 32bit libraries&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code text literal-block"&gt;
zypper install libX11-6-32bit
zypper install libXext6-32bit
zypper install libglvnd-32bit
zypper install Mesa-libGL1-32bit
zypper install pulseaudio-utils-32bit

&lt;/pre&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;Download and run the UT99 installer&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Update 2021-02-26: The address used by wget below - pointing to &lt;strong&gt;liflg.org&lt;/strong&gt; - isn't working anymore and redirect to Github, you can use &lt;a class="reference external" href="https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run"&gt;archive.org #2&lt;/a&gt; instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;pre class="code text literal-block"&gt;
# wget https://liflg.org/?what=dl&amp;amp;catid=6&amp;amp;gameid=51&amp;amp;filename=unreal.tournament_436-multilanguage.run

wget https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run
chmod +x unreal.tournament_436-multilanguage.run
./unreal.tournament_436-multilanguage.run

&lt;/pre&gt;
&lt;ol class="arabic simple" start="4"&gt;
&lt;li&gt;Enjoy UT99&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code text literal-block"&gt;
padsp &amp;lt;InstallPath&amp;gt;/ut

&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="the-whole-journey"&gt;
&lt;h2&gt;The whole journey&lt;/h2&gt;
&lt;p&gt;I own a &lt;a class="reference external" href="https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/10-14-inch/TUXEDO-InfinityBook-Pro-14-v5.tuxedo"&gt;TUXEDO InfinityBook Pro 14 v5&lt;/a&gt;
(Archive: &lt;a class="reference external" href="http://archive.today/2021.02.20-153838/https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/10-14-inch/TUXEDO-InfinityBook-Pro-14-v5.tuxedo"&gt;[1]&lt;/a&gt;)
with an Intel UHD Graphics 620 Chip, running openSUSE Tumbleweed Linux, should hopefully be sufficient to play an 20 year old Game ;)&lt;/p&gt;
&lt;div class="section" id="linux-installer"&gt;
&lt;h3&gt;Linux Installer&lt;/h3&gt;
&lt;p&gt;The Installer can be downloaded from &lt;a class="reference external" href="https://liflg.org/?catid=6&amp;amp;amp;gameid=51"&gt;Linux Installers for Linux Games&lt;/a&gt;,
i picked &lt;code&gt;unreal.tournament_436-multilanguage.run&lt;/code&gt; and &lt;code&gt;unreal.tournament.official.bonus.pack.collection.run&lt;/code&gt; - the other one available is for the &lt;em&gt;Game of the Year&lt;/em&gt; (goty) Edition.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Update 2021-02-26: The above link to &lt;strong&gt;Linux Installers for Linux Games&lt;/strong&gt; isn't working anymore and redirect to Github, you can use the following Backup Links instead:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;liflg.org&lt;/strong&gt; Page: &lt;a class="reference external" href="https://web.archive.org/web/20181027111203/https://www.liflg.org/?catid=6&amp;amp;gameid=51"&gt;archive.org #1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;UT99 Installer: &lt;a class="reference external" href="https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run"&gt;archive.org #2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;UT99 BonusPack: &lt;a class="reference external" href="https://web.archive.org/web/20171203202118if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament.official.bonus.pack.collection.run"&gt;archive.org #3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="troubleshooting"&gt;
&lt;h3&gt;Troubleshooting&lt;/h3&gt;
&lt;p&gt;GTK in Version 1 is required by both installer, after some research i found the package in the &lt;a class="reference external" href="https://software.opensuse.org/package/gtk"&gt;openSUSE Software repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After installing the GTK package and inserting the Game CD into my external Drive, i just started the installer, adjusted the Install Path and started the installation.&lt;/p&gt;
&lt;p&gt;Seems just too easy!?&lt;/p&gt;
&lt;p&gt;Yep, after starting UT, i received an error message that &lt;code&gt;libX11.so.6 is missing&lt;/code&gt;.
Looks like the 32bit version is not installed by default, &lt;code&gt;zypper install libX11-6-32bit&lt;/code&gt; solved that problem.
Same with the next missing library &lt;strong&gt;libXext.so.6&lt;/strong&gt;, &lt;code&gt;zypper install libXext6-32bit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Well, next Error:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
Signal: SIGIOT [iot trap]
Aborting.

&lt;/pre&gt;
&lt;p&gt;Let's take a look into the log file by running &lt;code&gt;cat ~/.loki/ut/System/UnrealTournament.log&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
Log: binding libGL.so.1
Critical: appError called:
Critical: Could not load OpenGL library

&lt;/pre&gt;
&lt;p&gt;Ok, different kind of error message but after some research same as above, there is a 32bit version of &lt;strong&gt;libGL.so.1&lt;/strong&gt; but, for sure, i only had the 64bit one installed by default.
Running &lt;code&gt;zypper install libglvnd-32bit&lt;/code&gt; solved that issue too.&lt;/p&gt;
&lt;p&gt;Hmm but again the &lt;strong&gt;SIGIOT&lt;/strong&gt; error occurred, let's take a look into the log files:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
Log: OpenGL
Critical: appError called:
Critical: Couldn't set video mode: Couldn't find matching GLX visual

&lt;/pre&gt;
&lt;p&gt;Lesson learned, to get a 20 year old game running on a bleeding edge Distribution in 2019, you have to install a bunch of 32bit libraries ;)
This time &lt;strong&gt;Mesa-libGL1-32bit&lt;/strong&gt; was missing and need to be installed.&lt;/p&gt;
&lt;p&gt;And voila, it's starting! without sound :O ... Quite sure it's a missing 32bit lib again ...
I found some hints regarding PulseAudio in the &lt;a class="reference external" href="https://wiki.debian.org/Games/UT99"&gt;Debian Wiki&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20201112021136/https://wiki.debian.org/Games/UT99"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="http://archive.today/2017.11.01-215614/https://wiki.debian.org/Games/UT99"&gt;[2]&lt;/a&gt;).
So i installed &lt;strong&gt;pulseaudio-utils-32bit&lt;/strong&gt; and after starting the game with &lt;code&gt;padsp ut&lt;/code&gt; instead just &lt;code&gt;ut&lt;/code&gt; i had sound :D&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="audio-issues"&gt;
&lt;h3&gt;Audio Issues&lt;/h3&gt;
&lt;p&gt;To get rid of delays in the Audio Output, it was necessary to adjust one line in the config file &lt;code&gt;~/.loki/ut/System/UnrealTournament.ini&lt;/code&gt; as well:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
# Change this:
AudioDevice=ALAudio.ALAudioSubsystem

# To that:
AudioDevice=Audio.GenericAudioSubsystem

&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="play-online"&gt;
&lt;h3&gt;Play Online&lt;/h3&gt;
&lt;p&gt;It looks like that lot of audio sample rates which are required to play Online are not supported using the GenericAudioSubsystem.
Connection to most of the UT Server fail and you find an Error about &lt;strong&gt;unsupported Rate&lt;/strong&gt; in your &lt;strong&gt;UnrealTournament.log&lt;/strong&gt; file.
The workaround so far was to use the ALAudioSubsystem with a delay in the Audio Output :(&lt;/p&gt;
&lt;p&gt;Also lot Public Server require an installed NPLoader.
Lot of different Version can be found at: &lt;a class="reference external" href="http://utgl.unrealadmin.org/NPLoader/"&gt;http://utgl.unrealadmin.org/NPLoader/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You have to Download either the &lt;em&gt;Linux.tar.gz&lt;/em&gt; or the &lt;em&gt;.dll&lt;/em&gt;, &lt;em&gt;.so&lt;/em&gt; as well &lt;em&gt;.u&lt;/em&gt; file and copy all of them in your &lt;em&gt;System&lt;/em&gt; folder of your UT Installation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="well-done"&gt;
&lt;h3&gt;Well done&lt;/h3&gt;
&lt;p&gt;Even if i had to look around for some time to locate and fix most of the issues, install a bunch of 32bit libraries, adjust something in the config as well start the game with an extra parameter, it's worth it!
Didn't know the exact FPS count but look and feel is like 20 years ago and i love it!&lt;/p&gt;
&lt;p&gt;Btw. installing the Bonus Pack was very straight forward with the &lt;code&gt;unreal.tournament.official.bonus.pack.collection.run&lt;/code&gt; script.&lt;/p&gt;
&lt;p&gt;Enjoy Unreal Tournament from 1999 on your Linux Machine!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Games"/><category term="Linux"/><category term="openSUSE"/><category term="UT"/></entry><entry><title>Merge PDF Files on Linux</title><link href="https://dominik.wombacher.cc/posts/merge-pdf-files-on-linux.html" rel="alternate"/><published>2019-10-28T15:38:00+01:00</published><updated>2019-10-28T15:38:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2019-10-28:/posts/merge-pdf-files-on-linux.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had to use Cups-PDF and "Print" bunch of Pages to Single PDF Files due to the fact that no Download as PDF was possible.
But how to Merge tons  ... &lt;a class="read-more" href="/posts/merge-pdf-files-on-linux.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had to use Cups-PDF and &amp;quot;Print&amp;quot; bunch of Pages to Single PDF Files due to the fact that no Download as PDF was possible.
But how to Merge tons of files named as &lt;strong&gt;Pagetitle-job_id&amp;lt;Number&amp;gt;&lt;/strong&gt; on Linux via command line in a fast and easy way?&lt;/p&gt;
&lt;p&gt;After some testing, &lt;code&gt;pdfunite&lt;/code&gt; - included in &lt;em&gt;Poppler&lt;/em&gt; and already installed on openSUSE Tumbleweed - did the job,
but the result with &lt;code&gt;pdftk&lt;/code&gt; - included in &lt;em&gt;Ghostscript&lt;/em&gt; - was nearly identical and worked the same way.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
pdfunite $(ls -cr *.pdf) output.pdf

&lt;/pre&gt;
&lt;p&gt;With &lt;code&gt;$()&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt; will executed and the results are added to the &lt;code&gt;pdfunite&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;All PDF Files in the same Folder will be merged to a single &lt;strong&gt;output.pdf&lt;/strong&gt; File.&lt;/p&gt;
&lt;p&gt;The Parameter &lt;code&gt;-cr&lt;/code&gt; sorts by creation time in reverse order.&lt;/p&gt;
&lt;p&gt;That was necessary for me because the Job IDs were from 36 till 223, all other parameter mixed up the order and the merged PDF wasn't as expected.&lt;/p&gt;
</content><category term="Linux"/><category term="Bash"/><category term="CUPS"/><category term="PDF"/><category term="openSUSE"/></entry><entry><title>Apple AirPods on Linux?</title><link href="https://dominik.wombacher.cc/posts/apple-airpods-on-linux.html" rel="alternate"/><published>2019-10-26T12:55:00+02:00</published><updated>2019-10-26T12:55:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2019-10-26:/posts/apple-airpods-on-linux.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I was wondering if my Apple AirPods would work on openSUSE Linux out of the Box.
Just enable pairing mode, click on connect and all fine? Not exactly, it failed  ... &lt;a class="read-more" href="/posts/apple-airpods-on-linux.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I was wondering if my Apple AirPods would work on openSUSE Linux out of the Box.
Just enable pairing mode, click on connect and all fine? Not exactly, it failed with the default settings and some additional Steps were necessary.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Set &lt;code&gt;ControllerMode = dual&lt;/code&gt; in config File &lt;strong&gt;/etc/bluetooth/main.conf&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;On openSUSE Tumbleweed (Patch Level 10/2019) the config file doesn't seem exist by default. I copied the example of the bluez Package located in &lt;strong&gt;/usr/share/doc/packages/bluez/&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code text literal-block"&gt;
sudo cp /usr/share/doc/packages/bluez/main.conf /etc/bluetooth/main.conf
sudo vim /etc/bluetooth/main.conf

# Restricts all controllers to the specified transport. Default value
# is &amp;quot;dual&amp;quot;, i.e. both BR/EDR and LE enabled (when supported by the HW).
# Possible values: &amp;quot;dual&amp;quot;, &amp;quot;bredr&amp;quot;, &amp;quot;le&amp;quot;
ControllerMode = dual

sudo systemctl restart bluetooth

&lt;/pre&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;Add Parameter &lt;code&gt;--noplugin=avrcp&lt;/code&gt; at the end of &lt;code&gt;ExecStart&lt;/code&gt; in &lt;strong&gt;bluetooth.service&lt;/strong&gt;, otherwise the AirPods running with poor Sound Quality and very low volume&lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Source: &lt;a class="reference external" href="https://wiki.archlinux.org/index.php/Bluetooth_headset#Apple_Airpods_have_low_volume"&gt;https://wiki.archlinux.org/index.php/Bluetooth_headset#Apple_Airpods_have_low_volume&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20190908054157/https://wiki.archlinux.org/index.php/Bluetooth_headset"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="http://archive.today/2021.02.25-235417/https://wiki.archlinux.org/index.php/Bluetooth_headset%23Apple_Airpods_have_low_volume"&gt;[2]&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code text literal-block"&gt;
sudo systemctl edit --full bluetooth.service

[...]
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=avrcp
[...]

sudo systemctl restart bluetooth

&lt;/pre&gt;
&lt;p&gt;After those few adjustments they actually working quite good as Headphone.
The Microphone is not working yet, maybe i will take a look into that later.&lt;/p&gt;
</content><category term="Linux"/><category term="AirPods"/><category term="Apple"/><category term="Bluetooth"/><category term="Linux"/><category term="openSUSE"/></entry></feed>