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
The goal of this project is to provide the means for running Qemu
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.
See the [project's home page](https://jdrupes.org/vm-operator/)
for details.

View file

@ -7,7 +7,8 @@ buildscript {
plugins {
id 'org.ajoberstar.grgit' version '5.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 'eclipse'
id "com.github.node-gradle.node" version "7.0.1"

View file

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

View file

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

View file

@ -9,7 +9,7 @@ plugins {
}
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 '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 'org.jgrapes:org.jgrapes.core:[1.19.0,2)'
implementation 'org.jgrapes:org.jgrapes.io:[2.7.0,3)'
implementation 'org.jgrapes:org.jgrapes.http:[3.1.0,4)'
implementation 'org.jgrapes:org.jgrapes.util:[1.34.0,2)'
implementation 'org.jgrapes:org.jgrapes.util:[1.36.0,2)'
implementation 'org.jgrapes:org.jgrapes.io:[2.11.0,3)'
implementation 'org.jgrapes:org.jgrapes.http:[3.5.0,4)'
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.rbac:[1.3.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconlet.oidclogin:[1.6.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.rbac:[1.4.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconlet.oidclogin:[1.7.0,2)'
implementation 'org.jgrapes:org.jgrapes.webconlet.markdowndisplay:[1.2.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('/', '-')
def registry = "${project.rootProject.properties['docker.registry']}"
def rootVersion = rootProject.version
task buildImage(type: Exec) {
dependsOn installDist
@ -70,7 +70,7 @@ task pushImage(type: Exec) {
task tagWithVersion(type: Exec) {
dependsOn pushImage
enabled = !project.version.contains("SNAPSHOT")
enabled = !rootVersion.contains("SNAPSHOT")
commandLine 'podman', 'push', \
"${project.name}:${project.gitBranch}",\
@ -80,9 +80,9 @@ task tagWithVersion(type: Exec) {
task tagAsLatest(type: Exec) {
dependsOn tagWithVersion
enabled = !project.version.contains("SNAPSHOT")
&& !project.version.contains("alpha") \
&& !project.version.contains("beta") \
enabled = !rootVersion.contains("SNAPSHOT")
&& !rootVersion.contains("alpha") \
&& !rootVersion.contains("beta") \
|| project.rootProject.properties['docker.testRegistry'] \
&& project.rootProject.properties['docker.registry'] \
== project.rootProject.properties['docker.testRegistry']

View file

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

View file

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

View file

@ -137,7 +137,8 @@
- [ "-device", "virtio-rng-pci,rng=objrng0,id=rng0" ]
# * Graphics and Audio Card
# 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" ]
# Network
<#assign nwCounter = 0/>

View file

@ -5,7 +5,7 @@ plugins {
dependencies {
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.jgwcvuecomponents:[1.2,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.chartjs:[1.2,2)'

View file

@ -5,7 +5,7 @@ plugins {
dependencies {
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.jgwcvuecomponents:[1.2,2)'
implementation 'org.jgrapes:org.jgrapes.webconsole.provider.chartjs:[1.2,2)'

View file

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

View file

@ -3,5 +3,8 @@ A Kubernetes operator for running VMs as pods.
VM-Operator
===========
The VM-operator is built on the [JGrapes](https://mnlipp.github.io/jgrapes/)
event driven framework.
The VM-operator enables you to easily run Qemu based VMs as pods
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('/', '-')
def registry = "${project.rootProject.properties['docker.registry']}"
def rootVersion = rootProject.version
task buildImage(type: Exec) {
inputs.files 'Containerfile'
@ -26,7 +27,7 @@ task pushImage(type: Exec) {
task tagWithVersion(type: Exec) {
dependsOn pushImage
enabled = !project.version.contains("SNAPSHOT")
enabled = !rootVersion.contains("SNAPSHOT")
commandLine 'podman', 'push', \
"${project.name}:${project.gitBranch}",\
@ -36,9 +37,9 @@ task tagWithVersion(type: Exec) {
task tagAsLatest(type: Exec) {
dependsOn tagWithVersion
enabled = !project.version.contains("SNAPSHOT")
&& !project.version.contains("alpha") \
&& !project.version.contains("beta") \
enabled = !rootVersion.contains("SNAPSHOT")
&& !rootVersion.contains("alpha") \
&& !rootVersion.contains("beta") \
|| project.rootProject.properties['docker.testRegistry'] \
&& project.rootProject.properties['docker.registry'] \
== project.rootProject.properties['docker.testRegistry']

View file

@ -18,8 +18,8 @@
<header>
<div>
<div style="float: left;">
<h1><a style="color: #222;" href="http://vm-operator.jdrupes.org">VM-Operator</a></h1>
<h3>By <a href="https://github.com/mnlipp">Michael N. Lipp</a></h3>
<div class="index-title"><a style="color: #222;" href="https://jdrupes.org/vm-operator/">VM-Operator</a></div>
<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"
src="https://img.shields.io/mastodon/follow/108843609567976408?domain=https%3A%2F%2Ffosstodon.org&style=social"></a></p>
</div>
@ -40,11 +40,11 @@
<ul style="margin-bottom: 0;" class="no-bullets">
<li><p class="part-entry"><a href="controller.html">The Controller</a></p></li>
</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">
<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>
</ulstyle="margin-bottom: 0;">
</ul>
<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>

View file

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

View file

@ -7,7 +7,7 @@
viewBox="0 0 331.50461 323.22329"
id="svg2"
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"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
@ -25,9 +25,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="245"
inkscape:cy="145.71429"
inkscape:zoom="1.4"
inkscape:cx="190.35714"
inkscape:cy="178.57143"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
@ -171,12 +171,12 @@
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"
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"
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
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"
inkscape:connector-curvature="0" />
</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
---

View file

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

View file

@ -2,23 +2,20 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
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"
width="93.557968mm"
height="91.220795mm"
viewBox="0 0 331.50461 323.22329"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="ML-Logo1.svg"
inkscape:export-filename="/home/mnl/Dokumente/mnl/ML-Logo1.png"
inkscape:export-xdpi="299.41104"
inkscape:export-ydpi="299.41104">
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="VM-Operator.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
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
id="defs4" />
<sodipodi:namedview
@ -29,20 +26,23 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="132.46074"
inkscape:cy="-297.07411"
inkscape:cx="245"
inkscape:cy="145.71429"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="1"
fit-margin-left="1"
fit-margin-right="1"
fit-margin-bottom="1"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1" />
inkscape:window-y="32"
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
id="metadata7">
<rdf:RDF>
@ -51,7 +51,6 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@ -59,30 +58,127 @@
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-175.34341,-117.71255)">
<text
xml:space="preserve"
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"
x="187.14285"
y="150.93362"
id="text3370"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3372"
x="187.14285"
y="150.93362"
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>
<text
xml:space="preserve"
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"
x="173.50081"
y="158.65659"
id="text3370-6"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3372-5"
x="173.50081"
y="158.65659"
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>
transform="translate(799.83239,410.74206)">
<g
id="path300"
inkscape:transform-center-x="-0.49891951"
inkscape:transform-center-y="-10.814906"
transform="matrix(0.93749998,0,0,0.93749998,-364.15225,128.12438)">
<path
sodipodi:type="star"
style="fill:#326de6;fill-opacity:1;stroke:#ffffff;stroke-linecap:square;stroke-miterlimit:0;paint-order:fill markers stroke"
id="path1033"
inkscape:flatsided="false"
sodipodi:sides="7"
sodipodi:cx="-790.008"
sodipodi:cy="-357.15076"
sodipodi:r1="221.23064"
sodipodi:r2="199.10757"
sodipodi:arg1="1.1215879"
sodipodi:arg2="1.5605315"
inkscape:rounded="0"
inkscape:randomized="0"
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"
transform="matrix(0.81788201,0,0,0.81788201,358.19384,-101.37507)"
inkscape:transform-center-x="1.2804791"
inkscape:transform-center-y="-8.9686433" />
</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>
</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
description: A Kubernetes operator for running virtual machines (notably Qemu VMs) in pods on Kubernetes
title: Run Qemu based VMs 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
---
# Welcome to VM-Operator
The goal of this project is to provide the means for running Qemu
based VMs in Kubernetes pods.
![Overview picture](index-pic.svg)
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
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
---
@ -7,7 +7,7 @@ layout: vm-operator
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)
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

View file

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

View file

@ -1,5 +1,5 @@
---
title: Upgrading
title: "VM-Operator: Upgrading — Issues to watch out for"
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
---
@ -99,7 +99,7 @@ spec:
spice:
port: 5930
server: 192.168.19.32
proxyUrl: http://lgpe-spice.some.host:1234
proxyUrl: http://vms-spice.some.host:1234
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
---
# 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
[JGrapes WebConsole](https://jgrapes.org/WebConsole.html)
project. Configuration of the GUI therefore follows the conventions
@ -31,7 +31,7 @@ from the
## 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,
it assumes that an OIDC provider is responsible for user authentication
and role management.