Merge remote-tracking branch 'origin/release/v3.2.x' into release/v3.x

This commit is contained in:
Michael Lipp 2024-08-10 13:36:06 +02:00
commit bdcf6a60b3
29 changed files with 7568 additions and 121 deletions

View file

@ -5,8 +5,8 @@
# Run Qemu in Kubernetes Pods # Run Qemu in Kubernetes Pods
The goal of this project is to provide the means for running Qemu The goal of this project is to provide easy to use and flexible components
based VMs in Kubernetes pods. for running Qemu based VMs in Kubernetes pods.
See the [project's home page](https://jdrupes.org/vm-operator/) See the [project's home page](https://jdrupes.org/vm-operator/)
for details. for details.

View file

@ -7,7 +7,8 @@ buildscript {
plugins { plugins {
id 'org.ajoberstar.grgit' version '5.2.0' apply false id 'org.ajoberstar.grgit' version '5.2.0' apply false
id 'org.ajoberstar.git-publish' version '4.2.0' apply false id 'org.ajoberstar.git-publish' version '4.2.0' apply false
id 'pl.allegro.tech.build.axion-release' version '1.15.0' apply false id 'pl.allegro.tech.build.axion-release' version '1.17.2' apply false
id 'org.jdrupes.vmoperator.versioning-conventions'
id 'org.jdrupes.vmoperator.java-doc-conventions' id 'org.jdrupes.vmoperator.java-doc-conventions'
id 'eclipse' id 'eclipse'
id "com.github.node-gradle.node" version "7.0.1" id "com.github.node-gradle.node" version "7.0.1"

View file

@ -1410,6 +1410,9 @@ spec:
display: display:
type: object type: object
properties: properties:
outputs:
type: integer
default: 1
spice: spice:
type: object type: object
properties: properties:

View file

@ -85,7 +85,7 @@ public class K8sObserver<O extends KubernetesObject,
api = new GenericKubernetesApi<>(objectClass, objectListClass, api = new GenericKubernetesApi<>(objectClass, objectListClass,
context.getGroup(), context.getPreferredVersion(), context.getGroup(), context.getPreferredVersion(),
context.getResourcePlural(), client); context.getResourcePlural(), client);
thread = new Thread(() -> { thread = Thread.ofVirtual().unstarted(() -> {
try { try {
logger.config(() -> "Watching " + context.getResourcePlural() logger.config(() -> "Watching " + context.getResourcePlural()
+ " (" + context.getPreferredVersion() + ")" + " (" + context.getPreferredVersion() + ")"
@ -100,7 +100,7 @@ public class K8sObserver<O extends KubernetesObject,
while (changed.hasNext()) { while (changed.hasNext()) {
handler.accept(client, changed.next()); handler.accept(client, changed.next());
} }
} catch (ApiException e) { } catch (ApiException | RuntimeException e) {
logger.log(Level.FINE, e, () -> "Problem watching" logger.log(Level.FINE, e, () -> "Problem watching"
+ " (will retry): " + e.getMessage()); + " (will retry): " + e.getMessage());
delayRestart(startedAt); delayRestart(startedAt);
@ -117,7 +117,6 @@ public class K8sObserver<O extends KubernetesObject,
} }
} }
}); });
thread.setDaemon(true);
} }
@SuppressWarnings("PMD.AvoidLiteralsInIfCondition") @SuppressWarnings("PMD.AvoidLiteralsInIfCondition")

View file

@ -9,7 +9,7 @@ plugins {
} }
dependencies { dependencies {
api 'org.jgrapes:org.jgrapes.core:[1.19.0,2)' api 'org.jgrapes:org.jgrapes.core:[1.21.0,2)'
api project(':org.jdrupes.vmoperator.common') api project(':org.jdrupes.vmoperator.common')
api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:[2.16.1,3]' api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:[2.16.1,3]'
} }

View file

@ -13,15 +13,14 @@ dependencies {
implementation 'commons-cli:commons-cli:1.5.0' implementation 'commons-cli:commons-cli:1.5.0'
implementation 'org.jgrapes:org.jgrapes.core:[1.19.0,2)' implementation 'org.jgrapes:org.jgrapes.util:[1.36.0,2)'
implementation 'org.jgrapes:org.jgrapes.io:[2.7.0,3)' implementation 'org.jgrapes:org.jgrapes.io:[2.11.0,3)'
implementation 'org.jgrapes:org.jgrapes.http:[3.1.0,4)' implementation 'org.jgrapes:org.jgrapes.http:[3.5.0,4)'
implementation 'org.jgrapes:org.jgrapes.util:[1.34.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.base:[1.7.0,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.base:[1.8.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.vuejs:[1.5.0,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.vuejs:[1.5.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.rbac:[1.3.0,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.rbac:[1.4.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconlet.oidclogin:[1.6.0,2)' implementation 'org.jgrapes:org.jgrapes.webconlet.oidclogin:[1.7.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconlet.markdowndisplay:[1.2.0,2)' implementation 'org.jgrapes:org.jgrapes.webconlet.markdowndisplay:[1.2.0,2)'
runtimeOnly 'org.jgrapes:org.jgrapes.webconlet.sysinfo:[1.4.0,2)' runtimeOnly 'org.jgrapes:org.jgrapes.webconlet.sysinfo:[1.4.0,2)'
@ -47,6 +46,7 @@ application {
project.ext.gitBranch = grgit.branch.current.name.replace('/', '-') project.ext.gitBranch = grgit.branch.current.name.replace('/', '-')
def registry = "${project.rootProject.properties['docker.registry']}" def registry = "${project.rootProject.properties['docker.registry']}"
def rootVersion = rootProject.version
task buildImage(type: Exec) { task buildImage(type: Exec) {
dependsOn installDist dependsOn installDist
@ -70,7 +70,7 @@ task pushImage(type: Exec) {
task tagWithVersion(type: Exec) { task tagWithVersion(type: Exec) {
dependsOn pushImage dependsOn pushImage
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
commandLine 'podman', 'push', \ commandLine 'podman', 'push', \
"${project.name}:${project.gitBranch}",\ "${project.name}:${project.gitBranch}",\
@ -80,9 +80,9 @@ task tagWithVersion(type: Exec) {
task tagAsLatest(type: Exec) { task tagAsLatest(type: Exec) {
dependsOn tagWithVersion dependsOn tagWithVersion
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
&& !project.version.contains("alpha") \ && !rootVersion.contains("alpha") \
&& !project.version.contains("beta") \ && !rootVersion.contains("beta") \
|| project.rootProject.properties['docker.testRegistry'] \ || project.rootProject.properties['docker.testRegistry'] \
&& project.rootProject.properties['docker.registry'] \ && project.rootProject.properties['docker.registry'] \
== project.rootProject.properties['docker.testRegistry'] == project.rootProject.properties['docker.testRegistry']

View file

@ -201,6 +201,9 @@ data:
</#list> </#list>
display: display:
<#if cr.spec.vm.display.outputs?? >
outputs: ${ cr.spec.vm.display.outputs.asInt?c }
</#if>
<#if cr.spec.vm.display.spice??> <#if cr.spec.vm.display.spice??>
spice: spice:
port: ${ cr.spec.vm.display.spice.port.asInt?c } port: ${ cr.spec.vm.display.spice.port.asInt?c }

View file

@ -9,10 +9,10 @@ plugins {
} }
dependencies { dependencies {
implementation 'org.jgrapes:org.jgrapes.core:[1.19.0,2)' implementation 'org.jgrapes:org.jgrapes.core:[1.21.0,2)'
implementation 'org.jgrapes:org.jgrapes.io:[2.7.0,3)' implementation 'org.jgrapes:org.jgrapes.util:[1.36.0,2)'
implementation 'org.jgrapes:org.jgrapes.http:[3.1.0,4)' implementation 'org.jgrapes:org.jgrapes.io:[2.11.0,3)'
implementation 'org.jgrapes:org.jgrapes.util:[1.31.0,2)' implementation 'org.jgrapes:org.jgrapes.http:[3.5.0,4)'
implementation project(':org.jdrupes.vmoperator.common') implementation project(':org.jdrupes.vmoperator.common')
implementation 'commons-cli:commons-cli:1.5.0' implementation 'commons-cli:commons-cli:1.5.0'
@ -33,6 +33,7 @@ application {
project.ext.gitBranch = grgit.branch.current.name.replace('/', '-') project.ext.gitBranch = grgit.branch.current.name.replace('/', '-')
def registry = "${project.rootProject.properties['docker.registry']}" def registry = "${project.rootProject.properties['docker.registry']}"
def rootVersion = rootProject.version
task buildImageArch(type: Exec) { task buildImageArch(type: Exec) {
dependsOn installDist dependsOn installDist
@ -54,7 +55,7 @@ task pushImageArch(type: Exec) {
task tagWithVersionArch(type: Exec) { task tagWithVersionArch(type: Exec) {
dependsOn pushImageArch dependsOn pushImageArch
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
commandLine 'podman', 'push', \ commandLine 'podman', 'push', \
"${project.name}-arch:${project.gitBranch}",\ "${project.name}-arch:${project.gitBranch}",\
@ -64,9 +65,9 @@ task tagWithVersionArch(type: Exec) {
task tagAsLatestArch(type: Exec) { task tagAsLatestArch(type: Exec) {
dependsOn tagWithVersionArch dependsOn tagWithVersionArch
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
&& !project.version.contains("alpha") \ && !rootVersion.contains("alpha") \
&& !project.version.contains("beta") \ && !rootVersion.contains("beta") \
|| project.rootProject.properties['docker.testRegistry'] \ || project.rootProject.properties['docker.testRegistry'] \
&& project.rootProject.properties['docker.registry'] \ && project.rootProject.properties['docker.registry'] \
== project.rootProject.properties['docker.testRegistry'] == project.rootProject.properties['docker.testRegistry']
@ -96,7 +97,7 @@ task pushImageAlpine(type: Exec) {
task tagWithVersionAlpine(type: Exec) { task tagWithVersionAlpine(type: Exec) {
dependsOn pushImageAlpine dependsOn pushImageAlpine
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
commandLine 'podman', 'push', \ commandLine 'podman', 'push', \
"${project.name}-alpine:${project.gitBranch}",\ "${project.name}-alpine:${project.gitBranch}",\
@ -106,9 +107,9 @@ task tagWithVersionAlpine(type: Exec) {
task tagAsLatestAlpine(type: Exec) { task tagAsLatestAlpine(type: Exec) {
dependsOn tagWithVersionAlpine dependsOn tagWithVersionAlpine
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
&& !project.version.contains("alpha") \ && !rootVersion.contains("alpha") \
&& !project.version.contains("beta") \ && !rootVersion.contains("beta") \
|| project.rootProject.properties['docker.testRegistry'] \ || project.rootProject.properties['docker.testRegistry'] \
&& project.rootProject.properties['docker.registry'] \ && project.rootProject.properties['docker.registry'] \
== project.rootProject.properties['docker.testRegistry'] == project.rootProject.properties['docker.testRegistry']

View file

@ -1 +1 @@
+30 +1800

View file

@ -245,6 +245,9 @@ public class Configuration implements Dto {
*/ */
public static class Display implements Dto { public static class Display implements Dto {
/** The number of outputs. */
public int outputs = 1;
/** The spice. */ /** The spice. */
public Spice spice; public Spice spice;
} }

View file

@ -137,7 +137,8 @@
- [ "-device", "virtio-rng-pci,rng=objrng0,id=rng0" ] - [ "-device", "virtio-rng-pci,rng=objrng0,id=rng0" ]
# * Graphics and Audio Card # * Graphics and Audio Card
# This is the only video "card" without a flickering cursor. # This is the only video "card" without a flickering cursor.
- [ "-device", "virtio-vga,id=video0,max_outputs=1" ] - [ "-device", "virtio-vga,id=video0,max_outputs=${ vm.display.outputs },\
max_hostmem=${ (vm.display.outputs * 256 * 1024 * 1024)?c }" ]
- [ "-device", "ich9-intel-hda,id=sound0" ] - [ "-device", "ich9-intel-hda,id=sound0" ]
# Network # Network
<#assign nwCounter = 0/> <#assign nwCounter = 0/>

View file

@ -5,7 +5,7 @@ plugins {
dependencies { dependencies {
implementation project(':org.jdrupes.vmoperator.manager.events') implementation project(':org.jdrupes.vmoperator.manager.events')
implementation 'org.jgrapes:org.jgrapes.webconsole.base:[1.3.0,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.base:[1.8.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.vue:[1,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.provider.vue:[1,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.jgwcvuecomponents:[1.2,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.provider.jgwcvuecomponents:[1.2,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.chartjs:[1.2,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.provider.chartjs:[1.2,2)'

View file

@ -5,7 +5,7 @@ plugins {
dependencies { dependencies {
implementation project(':org.jdrupes.vmoperator.manager.events') implementation project(':org.jdrupes.vmoperator.manager.events')
implementation 'org.jgrapes:org.jgrapes.webconsole.base:[1.7.0,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.base:[1.8.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.vue:[1,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.provider.vue:[1,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.jgwcvuecomponents:[1.2,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.provider.jgwcvuecomponents:[1.2,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.chartjs:[1.2,2)' implementation 'org.jgrapes:org.jgrapes.webconsole.provider.chartjs:[1.2,2)'

View file

@ -72,6 +72,7 @@
position: absolute; position: absolute;
animation: spin 2s linear infinite; animation: spin 2s linear infinite;
z-index: 100; z-index: 100;
pointer-events: none;
} }
} }

View file

@ -3,5 +3,8 @@ A Kubernetes operator for running VMs as pods.
VM-Operator VM-Operator
=========== ===========
The VM-operator is built on the [JGrapes](https://mnlipp.github.io/jgrapes/) The VM-operator enables you to easily run Qemu based VMs as pods
event driven framework. in Kubernetes. It is built on the
[JGrapes](https://mnlipp.github.io/jgrapes/) event driven framework.
See the project's [home page](https://jdrupes.org/vm-operator/) for details.

View file

@ -7,6 +7,7 @@ dependencies {
project.ext.gitBranch = grgit.branch.current.name.replace('/', '-') project.ext.gitBranch = grgit.branch.current.name.replace('/', '-')
def registry = "${project.rootProject.properties['docker.registry']}" def registry = "${project.rootProject.properties['docker.registry']}"
def rootVersion = rootProject.version
task buildImage(type: Exec) { task buildImage(type: Exec) {
inputs.files 'Containerfile' inputs.files 'Containerfile'
@ -26,7 +27,7 @@ task pushImage(type: Exec) {
task tagWithVersion(type: Exec) { task tagWithVersion(type: Exec) {
dependsOn pushImage dependsOn pushImage
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
commandLine 'podman', 'push', \ commandLine 'podman', 'push', \
"${project.name}:${project.gitBranch}",\ "${project.name}:${project.gitBranch}",\
@ -36,9 +37,9 @@ task tagWithVersion(type: Exec) {
task tagAsLatest(type: Exec) { task tagAsLatest(type: Exec) {
dependsOn tagWithVersion dependsOn tagWithVersion
enabled = !project.version.contains("SNAPSHOT") enabled = !rootVersion.contains("SNAPSHOT")
&& !project.version.contains("alpha") \ && !rootVersion.contains("alpha") \
&& !project.version.contains("beta") \ && !rootVersion.contains("beta") \
|| project.rootProject.properties['docker.testRegistry'] \ || project.rootProject.properties['docker.testRegistry'] \
&& project.rootProject.properties['docker.registry'] \ && project.rootProject.properties['docker.registry'] \
== project.rootProject.properties['docker.testRegistry'] == project.rootProject.properties['docker.testRegistry']

View file

@ -18,8 +18,8 @@
<header> <header>
<div> <div>
<div style="float: left;"> <div style="float: left;">
<h1><a style="color: #222;" href="http://vm-operator.jdrupes.org">VM-Operator</a></h1> <div class="index-title"><a style="color: #222;" href="https://jdrupes.org/vm-operator/">VM-Operator</a></div>
<h3>By <a href="https://github.com/mnlipp">Michael N. Lipp</a></h3> <div class="index-subtitle">By <a href="https://github.com/mnlipp/">Michael N. Lipp</a></div>
<p><a rel="me" href="https://fosstodon.org/@mnl"><img alt="Mastodon Follow" <p><a rel="me" href="https://fosstodon.org/@mnl"><img alt="Mastodon Follow"
src="https://img.shields.io/mastodon/follow/108843609567976408?domain=https%3A%2F%2Ffosstodon.org&style=social"></a></p> src="https://img.shields.io/mastodon/follow/108843609567976408?domain=https%3A%2F%2Ffosstodon.org&style=social"></a></p>
</div> </div>
@ -40,11 +40,11 @@
<ul style="margin-bottom: 0;" class="no-bullets"> <ul style="margin-bottom: 0;" class="no-bullets">
<li><p class="part-entry"><a href="controller.html">The Controller</a></p></li> <li><p class="part-entry"><a href="controller.html">The Controller</a></p></li>
</ul> </ul>
<p class="part-list-title"><a href="webgui.html">The Web-GUI</a></p> <p class="part-list-title"><a href="webgui.html">Web interface</a></p>
<ul style="margin-bottom: 0;" class="no-bullets"> <ul style="margin-bottom: 0;" class="no-bullets">
<li><p class="part-entry"><a href="admin-gui.html">For Admins</a></p></li> <li><p class="part-entry"><a href="admin-gui.html">For Admins</a></p></li>
<li><p class="part-entry"><a href="user-gui.html">For Users</a></p></li> <li><p class="part-entry"><a href="user-gui.html">For Users</a></p></li>
</ulstyle="margin-bottom: 0;"> </ul>
<p class="part-list-title"><a href="upgrading.html">Upgrading</a></p> <p class="part-list-title"><a href="upgrading.html">Upgrading</a></p>
<p class="part-list-title"><a href="latest-release/javadoc/index.html">Javadoc</a></p> <p class="part-list-title"><a href="latest-release/javadoc/index.html">Javadoc</a></p>

View file

@ -5,7 +5,7 @@ body {
color:#595959; color:#595959;
} }
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6, .index-title, .index-subtitle {
color:#222; color:#222;
margin:0 0 20px; margin:0 0 20px;
} }
@ -14,11 +14,11 @@ p, ul, ol, table, pre, dl {
margin:0 0 20px; margin:0 0 20px;
} }
h1, h2, h3 { h1, h2, h3, .index-title, .index-subtitle {
line-height:1.1; line-height:1.1;
} }
h1 { h1, .index-title {
font-size:28px; font-size:28px;
font-weight: 500; font-weight: 500;
} }
@ -28,11 +28,15 @@ h2 {
font-weight: 500; font-weight: 500;
} }
h3, h4, h5, h6 { h3, h4, h5, h6, .index-subtitle {
color:#494949; color:#494949;
font-weight: 500; font-weight: 500;
} }
.index-subtitle {
font-size: 1.17em;
}
a { a {
color:#39c; color:#39c;
text-decoration:none; text-decoration:none;

View file

@ -7,7 +7,7 @@
viewBox="0 0 331.50461 323.22329" viewBox="0 0 331.50461 323.22329"
id="svg2" id="svg2"
version="1.1" version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="VM-Operator.svg" sodipodi:docname="VM-Operator.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
@ -25,9 +25,9 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="0.7" inkscape:zoom="1.4"
inkscape:cx="245" inkscape:cx="190.35714"
inkscape:cy="145.71429" inkscape:cy="178.57143"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false" showgrid="false"
@ -171,12 +171,12 @@
cy="-109.05605" cy="-109.05605"
r="9.2055216" /> r="9.2055216" />
<g <g
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:180px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:0px;word-spacing:0px;fill:#238220;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:180px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:0px;word-spacing:0px;fill:#238220;fill-opacity:1;stroke:#ffffff;stroke-width:5.28893486;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
id="flowRoot4814" id="flowRoot4814"
transform="matrix(0.25165808,0,0,0.24991064,-709.96916,-218.52595)"> transform="matrix(0.32800241,0,0,0.32572486,-723.34527,-233.01684)">
<path <path
d="m 210.10352,57.161102 h 25.92773 V 138.7236 q 0,15.9961 -2.8125,24.60938 -3.7793,11.25 -13.71094,18.10547 -9.93164,6.76757 -26.1914,6.76757 -19.07227,0 -29.35547,-10.63476 -10.28321,-10.72266 -10.3711,-31.37696 l 24.52149,-2.8125 q 0.43945,11.07422 3.25195,15.64454 4.21875,6.94336 12.83203,6.94336 8.70117,0 12.30469,-4.92188 3.60352,-5.00977 3.60352,-20.6543 z" d="m 210.10352,57.161102 h 25.92773 V 138.7236 q 0,15.9961 -2.8125,24.60938 -3.7793,11.25 -13.71094,18.10547 -9.93164,6.76757 -26.1914,6.76757 -19.07227,0 -29.35547,-10.63476 -10.28321,-10.72266 -10.3711,-31.37696 l 24.52149,-2.8125 q 0.43945,11.07422 3.25195,15.64454 4.21875,6.94336 12.83203,6.94336 8.70117,0 12.30469,-4.92188 3.60352,-5.00977 3.60352,-20.6543 z"
style="fill:#238220;fill-opacity:1;stroke:#ffffff;stroke-opacity:1" style="fill:#238220;fill-opacity:1;stroke:#ffffff;stroke-width:5.28893486;stroke-dasharray:none;stroke-opacity:1"
id="path4823" id="path4823"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
</g> </g>

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Before After
Before After

View file

@ -1,5 +1,5 @@
--- ---
title: VM-Operator Web-GUI for Admins title: "VM-Operator: Administrator View — Provides an overview of running VMs"
layout: vm-operator layout: vm-operator
--- ---

View file

@ -1,5 +1,5 @@
--- ---
title: VM-Operator Controller title: "VM-Operator: Controller — Reconciles the VM CRs"
layout: vm-operator layout: vm-operator
--- ---

View file

@ -2,23 +2,20 @@
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" width="93.557968mm"
xmlns:cc="http://creativecommons.org/ns#" height="91.220795mm"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" viewBox="0 0 331.50461 323.22329"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="10.64148mm"
height="12.555316mm"
viewBox="0 0 37.706033 44.487341"
id="svg2" id="svg2"
version="1.1" version="1.1"
inkscape:version="0.91 r13725" inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="ML-Logo1.svg" sodipodi:docname="VM-Operator.svg"
inkscape:export-filename="/home/mnl/Dokumente/mnl/ML-Logo1.png" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-xdpi="299.41104" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
inkscape:export-ydpi="299.41104"> xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs <defs
id="defs4" /> id="defs4" />
<sodipodi:namedview <sodipodi:namedview
@ -29,20 +26,23 @@
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="0.7" inkscape:zoom="0.7"
inkscape:cx="132.46074" inkscape:cx="245"
inkscape:cy="-297.07411" inkscape:cy="145.71429"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false" showgrid="false"
fit-margin-top="1"
fit-margin-left="1"
fit-margin-right="1"
fit-margin-bottom="1"
inkscape:window-width="1920" inkscape:window-width="1920"
inkscape:window-height="1016" inkscape:window-height="1011"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="27" inkscape:window-y="32"
inkscape:window-maximized="1" /> inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata <metadata
id="metadata7"> id="metadata7">
<rdf:RDF> <rdf:RDF>
@ -51,7 +51,6 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work> </cc:Work>
</rdf:RDF> </rdf:RDF>
</metadata> </metadata>
@ -59,30 +58,127 @@
inkscape:label="Ebene 1" inkscape:label="Ebene 1"
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
transform="translate(-175.34341,-117.71255)"> transform="translate(799.83239,410.74206)">
<text <g
xml:space="preserve" id="path300"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" inkscape:transform-center-x="-0.49891951"
x="187.14285" inkscape:transform-center-y="-10.814906"
y="150.93362" transform="matrix(0.93749998,0,0,0.93749998,-364.15225,128.12438)">
id="text3370" <path
sodipodi:linespacing="125%"><tspan sodipodi:type="star"
sodipodi:role="line" style="fill:#326de6;fill-opacity:1;stroke:#ffffff;stroke-linecap:square;stroke-miterlimit:0;paint-order:fill markers stroke"
id="tspan3372" id="path1033"
x="187.14285" inkscape:flatsided="false"
y="150.93362" sodipodi:sides="7"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono'">M</tspan></text> sodipodi:cx="-790.008"
<text sodipodi:cy="-357.15076"
xml:space="preserve" sodipodi:r1="221.23064"
style="font-style:normal;font-weight:normal;font-size:51.30387497px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" sodipodi:r2="199.10757"
x="173.50081" sodipodi:arg1="1.1215879"
y="158.65659" sodipodi:arg2="1.5605315"
id="text3370-6" inkscape:rounded="0"
sodipodi:linespacing="125%"><tspan inkscape:randomized="0"
sodipodi:role="line" d="m -693.93801,-157.86816 -94.02622,-0.18551 -97.95052,0.26412 -58.47935,-73.62832 -61.2776,-76.41613 21.10362,-91.6275 21.53854,-95.55347 84.79518,-40.6293 88.13578,-42.7371 84.6342,40.96358 88.36497,42.26117 20.74194,91.71007 22.05354,95.43592 -58.76943,73.39699 z"
id="tspan3372-5" transform="matrix(0.81788201,0,0,0.81788201,358.19384,-101.37507)"
x="173.50081" inkscape:transform-center-x="1.2804791"
y="158.65659" inkscape:transform-center-y="-8.9686433" />
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono'">L</tspan></text> </g>
<g
aria-label="VM"
id="text300"
style="font-size:16.6665px;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#ffffff;stroke-width:1.04165">
<g
id="path305">
<path
style="color:#000000;-inkscape-font-specification:'Nimbus Sans Narrow, Bold Semi-Condensed';fill:#ff6600;stroke:none;-inkscape-stroke:none"
d="m -698.0792,-217.35754 -25.39961,-109.59835 h -26.39961 l 39.59941,143.59784 h 23.39965 l 39.99939,-143.59784 h -25.59961 z"
id="path312" />
<path
style="color:#000000;-inkscape-font-specification:'Nimbus Sans Narrow, Bold Semi-Condensed';fill:#ffffff;stroke:none;-inkscape-stroke:none"
d="m -750.5625,-327.47656 39.88672,144.63867 h 24.19141 l 40.29101,-144.63867 h -26.69922 l -25.18554,107.82226 -24.98633,-107.82226 z m 1.36719,1.04101 h 25.30273 l 25.30664,109.19532 1.01367,0.002 25.50586,-109.19727 h 24.50196 l -39.71094,142.55664 h -22.60742 z"
id="path325" />
</g>
<g
id="path307">
<path
style="color:#000000;-inkscape-font-specification:'Nimbus Sans Narrow, Bold Semi-Condensed';fill:#ff6600;stroke:none;-inkscape-stroke:none"
d="m -518.28172,-326.95589 h -35.39947 l -21.19968,113.99829 -21.59968,-113.99829 h -35.79946 v 143.59784 h 22.79966 v -121.79817 l 21.79967,121.79817 h 24.19963 l 22.39967,-121.79817 v 121.79817 h 22.79966 z"
id="path318" />
<path
style="color:#000000;-inkscape-font-specification:'Nimbus Sans Narrow, Bold Semi-Condensed';fill:#ffffff;stroke:none;-inkscape-stroke:none"
d="m -632.80078,-327.47656 v 144.63867 h 23.8418 v -116.45313 l 20.84179,116.45313 h 25.07032 l 21.44531,-116.60742 v 116.60742 h 23.83984 v -144.63867 h -0.51953 -35.83203 l -20.77149,111.69726 -21.16406,-111.69726 z m 1.04101,1.04101 h 34.84766 l 21.51953,113.57422 1.02344,-0.002 21.12109,-113.57227 h 34.44532 v 142.55664 h -21.75782 v -121.27734 l -1.0332,-0.0937 -22.32031,121.37109 h -23.33008 l -21.72266,-121.36914 -1.03515,0.0918 v 121.27734 h -21.75782 z"
id="path320" />
</g>
</g>
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136"
cx="-691.58337"
cy="-161.52753"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-8"
cx="-671.12665"
cy="-161.52753"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-1"
cx="-650.66992"
cy="-161.52753"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-2"
cx="-630.2132"
cy="-161.52753"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-8-8"
cx="-681.66187"
cy="-144.03705"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-1-9"
cx="-661.20514"
cy="-144.03705"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-2-3"
cx="-640.74841"
cy="-144.03705"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-8-6"
cx="-671.53577"
cy="-126.23969"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-1-8"
cx="-651.07904"
cy="-126.23969"
r="9.2055216" />
<circle
style="fill:#6606b5;fill-opacity:1;stroke:#ffffff;stroke-width:1.07634;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4136-2-0"
cx="-661.61426"
cy="-109.05605"
r="9.2055216" />
<g
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:180px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:0px;word-spacing:0px;fill:#238220;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot4814"
transform="matrix(0.25165808,0,0,0.24991064,-709.96916,-218.52595)">
<path
d="m 210.10352,57.161102 h 25.92773 V 138.7236 q 0,15.9961 -2.8125,24.60938 -3.7793,11.25 -13.71094,18.10547 -9.93164,6.76757 -26.1914,6.76757 -19.07227,0 -29.35547,-10.63476 -10.28321,-10.72266 -10.3711,-31.37696 l 24.52149,-2.8125 q 0.43945,11.07422 3.25195,15.64454 4.21875,6.94336 12.83203,6.94336 8.70117,0 12.30469,-4.92188 3.60352,-5.00977 3.60352,-20.6543 z"
style="fill:#238220;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
id="path4823"
inkscape:connector-curvature="0" />
</g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 588 KiB

View file

@ -1,13 +1,15 @@
--- ---
title: VM-Operator by mnlipp title: Run Qemu based VMs on Kubernetes
description: A Kubernetes operator for running virtual machines (notably Qemu VMs) in pods on Kubernetes description: A Kubernetes operator for running virtual machines (notably Qemu VMs) in pods on Kubernetes with a web interface for admins and users.
layout: vm-operator layout: vm-operator
--- ---
# Welcome to VM-Operator # Welcome to VM-Operator
The goal of this project is to provide the means for running Qemu ![Overview picture](index-pic.svg)
based VMs in Kubernetes pods.
The goal of this project is to provide easy to use and flexible components
for running Qemu based VMs in Kubernetes pods.
The image used for the VM pods combines Qemu and a control program The image used for the VM pods combines Qemu and a control program
for starting and managing the Qemu process. This application is called for starting and managing the Qemu process. This application is called

View file

@ -1,5 +1,5 @@
--- ---
title: VM-Operator Manager title: "VM-Operator: The Manager — Provides the controller and a web user interface"
layout: vm-operator layout: vm-operator
--- ---
@ -7,7 +7,7 @@ layout: vm-operator
The Manager is the program that provides the controller from the The Manager is the program that provides the controller from the
[operator pattern](https://github.com/cncf/tag-app-delivery/blob/eece8f7307f2970f46f100f51932db106db46968/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md#operator-components-in-kubernetes) [operator pattern](https://github.com/cncf/tag-app-delivery/blob/eece8f7307f2970f46f100f51932db106db46968/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md#operator-components-in-kubernetes)
together with a Web-GUI. It should be run in a container in the cluster. together with a web user interface. It should be run in a container in the cluster.
## Installation ## Installation

View file

@ -1,5 +1,5 @@
--- ---
title: VM-Operator Runner title: "VM-Operator: The Runner — Starts and monitors a VM"
layout: vm-operator layout: vm-operator
--- ---

View file

@ -1,5 +1,5 @@
--- ---
title: Upgrading title: "VM-Operator: Upgrading — Issues to watch out for"
layout: vm-operator layout: vm-operator
--- ---

View file

@ -1,5 +1,5 @@
--- ---
title: VM-Operator Web-GUI for Users title: "VM-Operator: User View — Allows users to manage their own VMs"
layout: vm-operator layout: vm-operator
--- ---
@ -99,7 +99,7 @@ spec:
spice: spice:
port: 5930 port: 5930
server: 192.168.19.32 server: 192.168.19.32
proxyUrl: http://lgpe-spice.some.host:1234 proxyUrl: http://vms-spice.some.host:1234
generateSecret: true generateSecret: true
``` ```

View file

@ -1,11 +1,11 @@
--- ---
title: VM-Operator Web-GUI title: "VM-Operator: Web user interface — Provides easy access to VM management"
layout: vm-operator layout: vm-operator
--- ---
# The Web-GUI # Web user interface
The manager component provides a GUI via a web server. The web GUI is The manager component provides a GUI via a web server. This web user interface is
implemented using components from the implemented using components from the
[JGrapes WebConsole](https://jgrapes.org/WebConsole.html) [JGrapes WebConsole](https://jgrapes.org/WebConsole.html)
project. Configuration of the GUI therefore follows the conventions project. Configuration of the GUI therefore follows the conventions
@ -31,7 +31,7 @@ from the
## User Access ## User Access
Access to the web GUI is controlled by the login conlet. The framework Access to the web user interface is controlled by the login conlet. The framework
does not include sophisticated components for user management. Rather, does not include sophisticated components for user management. Rather,
it assumes that an OIDC provider is responsible for user authentication it assumes that an OIDC provider is responsible for user authentication
and role management. and role management.