diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index 547c1a4..f47366a 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -22,10 +22,10 @@ jobs:
fetch-depth: 0
- name: Install graphviz
run: sudo apt-get install graphviz
- - name: Set up JDK 17
+ - name: Set up JDK 21
uses: actions/setup-java@v3
with:
- java-version: '17'
+ java-version: '21'
distribution: 'temurin'
- name: Build with Gradle
- run: ./gradlew -Prepo.access.token=${{ secrets.REPO_ACCESS_TOKEN }} stage
+ run: ./gradlew -Pwebsite.push.token=${{ secrets.WEBSITE_PUSH_TOKEN }} stage
diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml
new file mode 100644
index 0000000..d0e4ec9
--- /dev/null
+++ b/.github/workflows/jekyll.yml
@@ -0,0 +1,89 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+# Sample workflow for building and deploying a Jekyll site to GitHub Pages
+name: Deploy Jekyll site to Pages
+
+on:
+ # Runs on pushes targeting the default branch
+ push:
+ branches: ["main"]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between
+# the run in-progress and latest queued. However, do NOT cancel
+# in-progress runs as we want to allow these production deployments
+# to complete.
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '3.3' # Not needed with a .ruby-version file
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
+ cache-version: 0 # Increment this number if you need to re-download cached gems
+ working-directory: webpages
+ - name: Setup Pages
+ id: pages
+ uses: actions/configure-pages@v5
+ - name: Build with Jekyll
+ # Outputs to the './_site' directory by default
+ run: cd webpages && bundle exec jekyll build
+ env:
+ JEKYLL_ENV: production
+ - name: Install graphviz
+ run: sudo apt-get install graphviz
+ - name: Set up JDK 21
+ uses: actions/setup-java@v3
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ - name: Build apidocs
+ run: ./gradlew apidocs
+ - name: Copy javadoc
+ run: cp -a build/javadoc webpages/_site/
+ - name: Generate the sitemap
+ uses: cicirello/generate-sitemap@v1
+ with:
+ path-to-root: webpages/_site
+ base-url-path: https://vm-operator.jdrupes.org
+ - name: Index pagefind
+ run: cd webpages && npx pagefind --source "_site"
+ - name: Upload artifact
+ # Automatically uploads an artifact from the './_site' directory by default
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: './webpages/_site'
+
+ # Deployment job
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e99ee03..beab0c4 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -31,10 +31,10 @@ jobs:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- - name: Set up JDK 17
+ - name: Set up JDK 21
uses: actions/setup-java@v3
with:
- java-version: '17'
+ java-version: '21'
distribution: 'temurin'
- name: Push with Gradle
- run: ./gradlew -Prepo.access.token=${{ secrets.REPO_ACCESS_TOKEN }} -Pdocker.registry=ghcr.io/${{ github.actor }} stage pushImages
+ run: ./gradlew -Pwebsite.push.token=${{ secrets.WEBSITE_PUSH_TOKEN }} -Pdocker.registry=ghcr.io/${{ github.actor }} stage publishImage
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
deleted file mode 100644
index 70654cc..0000000
--- a/.gitlab-ci.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-default:
- # Template project: https://gitlab.com/pages/jekyll
- # Docs: https://docs.gitlab.com/ee/pages/
- image: ruby:3.2
- before_script:
- - git fetch origin gh-pages
- - git checkout gh-pages
- - gem install bundler
- - bundle install
-variables:
- JEKYLL_ENV: production
- LC_ALL: C.UTF-8
-test:
- stage: test
- script:
- - bundle exec jekyll build -d test
- artifacts:
- paths:
- - test
-
-pages:
- stage: deploy
- script:
- - bundle exec jekyll build -d public
- artifacts:
- paths:
- - public
- environment: production
diff --git a/.markdownlint.yaml b/.markdownlint.yaml
new file mode 100644
index 0000000..6ed5002
--- /dev/null
+++ b/.markdownlint.yaml
@@ -0,0 +1,30 @@
+# See [rules](https://github.com/DavidAnson/markdownlint/blob/main/schema/.markdownlint.yaml)
+
+# Default state for all rules
+default: true
+
+# MD007/ul-indent : Unordered list indentation :
+# https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md007.md
+MD007:
+ # Spaces for indent
+ indent: 2
+ # Whether to indent the first level of the list
+ start_indented: true
+ # Spaces for first level indent (when start_indented is set)
+ start_indent: 2
+
+# MD025/single-title/single-h1 : Multiple top-level headings in the same document :
+# https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md025.md
+MD025:
+ # Heading level
+ level: 1
+ # RegExp for matching title in front matter (disable)
+ front_matter_title: ""
+
+# MD036/no-emphasis-as-heading : Emphasis used instead of a heading :
+# https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md036.md
+MD036: false
+
+# MD043/required-headings : Required heading structure :
+# https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md043.md
+MD043: false
diff --git a/.woodpecker/build.yaml b/.woodpecker/build.yaml
new file mode 100644
index 0000000..56a575c
--- /dev/null
+++ b/.woodpecker/build.yaml
@@ -0,0 +1,38 @@
+when:
+- event: push
+ evaluate: 'CI_SYSTEM_HOST == "woodpecker.mnl.de"'
+
+clone:
+- name: git
+ image: woodpeckerci/plugin-git
+ settings:
+ partial: false
+ tags: true
+ depth: 0
+
+steps:
+- name: prepare
+ image: alpine
+ commands:
+ # Because we run the next step as user 1000 to make podman work:
+ - mkdir /woodpecker/workflow
+ - chown 1000:1000 /woodpecker/workflow
+ - chown -R 1000:1000 $CI_WORKSPACE
+
+- name: build-jars
+ image: registry.mnl.de/mnl/jdk21-builder:v4
+ environment:
+ HOME: /woodpecker/workflow
+ REGISTRY: registry.mnl.de
+ REGISTRY_USER: mnl
+ REGISTRY_TOKEN:
+ from_secret: REGISTRY_TOKEN
+ commands:
+ - echo $REGISTRY_TOKEN | podman login -u $REGISTRY_USER --password-stdin $REGISTRY
+ - ./gradlew -Pdocker.registry=$REGISTRY/$REGISTRY_USER build apidocs publishImage
+ backend_options:
+ kubernetes:
+ securityContext:
+ privileged: true
+ runAsUser: 1000
+ runAsGroup: 1000
diff --git a/README.md b/README.md
index 176437a..09fcd25 100644
--- a/README.md
+++ b/README.md
@@ -3,10 +3,23 @@


-# Run Qemu in Kubernetes Pods
+# Run QEMU/KVM in Kubernetes Pods
-The goal of this project is to provide the means for running Qemu
-based VMs in Kubernetes pods.
+
-See the [project's home page](https://mnlipp.github.io/VM-Operator/)
+This project provides an easy to use and flexible solution for running
+QEMU/KVM based VMs in Kubernetes pods.
+
+The central component of this solution is the kubernetes operator that
+manages "runners". These run in pods and are used to start and manage
+the QEMU/KVM process for the VMs (optionally together with a SW-TPM).
+
+A web GUI for administrators provides an overview of the VMs together
+with some basic control over the VMs. A web GUI for users provides an
+interface to access and optionally start, stop and reset the VMs.
+
+Advanced features of the operator include pooling of VMs and automatic
+login.
+
+See the [project's home page](https://vm-operator.jdrupes.org/)
for details.
diff --git a/build.gradle b/build.gradle
index 1a11881..eb8e59a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,9 +5,10 @@ buildscript {
}
plugins {
- id 'org.ajoberstar.grgit' version '5.2.0' apply false
+ id 'org.ajoberstar.grgit' version '5.2.0'
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"
@@ -18,7 +19,7 @@ allprojects {
}
task stage {
- description = 'To be executed by CI, build and update JavaDoc.'
+ description = 'To be executed by CI.'
group = 'build'
// Build everything first
@@ -26,11 +27,6 @@ task stage {
dependsOn subprojects.tasks.collect {
tc -> tc.findByName("build") }.flatten()
}
-
- if (JavaVersion.current() == JavaVersion.VERSION_17) {
- // Publish JavaDoc
- dependsOn gitPublishPush
- }
}
eclipse {
diff --git a/buildSrc/.settings/org.eclipse.jdt.core.prefs b/buildSrc/.settings/org.eclipse.jdt.core.prefs
index 68fda12..b25073a 100644
--- a/buildSrc/.settings/org.eclipse.jdt.core.prefs
+++ b/buildSrc/.settings/org.eclipse.jdt.core.prefs
@@ -1,9 +1,7 @@
+#
+#Wed Oct 02 14:48:43 CEST 2024
eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=21
@@ -11,12 +9,5 @@ org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
-org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=21
diff --git a/buildSrc/.settings/org.eclipse.jdt.groovy.core.prefs b/buildSrc/.settings/org.eclipse.jdt.groovy.core.prefs
index bf0ca13..71b5e37 100644
--- a/buildSrc/.settings/org.eclipse.jdt.groovy.core.prefs
+++ b/buildSrc/.settings/org.eclipse.jdt.groovy.core.prefs
@@ -1,3 +1,3 @@
eclipse.preferences.version=1
-groovy.compiler.level=40
+groovy.compiler.level=-1
groovy.script.filters=**/*.dsld,y,**/*.gradle,n
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index a9fb634..4a5db6d 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -1,9 +1,3 @@
-/*
- * This file was generated by the Gradle 'init' task.
- *
- * This project uses @Incubating APIs which are subject to change.
- */
-
plugins {
// Support convention plugins written in Groovy. Convention plugins
// are build scripts in 'src/main' that automatically become available
@@ -14,52 +8,24 @@ plugins {
id 'eclipse'
}
-repositories {
- // Use the plugin portal to apply community plugins in convention plugins.
- gradlePluginPortal()
-}
-
sourceSets {
- main {
- groovy {
- srcDirs = ['src']
- }
- }
-
- test {
- groovy {
- srcDirs = ['test']
- }
- }
+ main {
+ groovy {
+ srcDirs = ['src']
+ }
+ resources {
+ srcDirs = ['resources']
+ }
+ }
}
eclipse {
- project {
- file {
- // closure executed after .project content is loaded from existing file
- // and before gradle build information is merged
- beforeMerged { project ->
- project.natures.clear()
- project.buildCommands.clear()
- }
-
- project.natures += 'org.eclipse.buildship.core.gradleprojectnature'
- // Don't build, result not used by Eclipse anyway
- // project.buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
- }
- }
-
- classpath {
- downloadJavadoc = true
- downloadSources = true
- }
-
jdt {
file {
withProperties { properties ->
def formatterPrefs = new Properties()
- rootProject.file("gradle/org.eclipse.jdt.core.formatter.prefs")
+ rootProject.file("../gradle/org.eclipse.jdt.core.formatter.prefs")
.withInputStream { formatterPrefs.load(it) }
properties.putAll(formatterPrefs)
}
diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle
deleted file mode 100644
index 3f67e42..0000000
--- a/buildSrc/settings.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * This file was generated by the Gradle 'init' task.
- *
- * This settings file is used to specify which projects to include in your build-logic build.
- */
-
-rootProject.name = 'buildSrc'
diff --git a/buildSrc/src/org.jdrupes.vmoperator.java-common-conventions.gradle b/buildSrc/src/org.jdrupes.vmoperator.java-common-conventions.gradle
index 5185041..605dc09 100644
--- a/buildSrc/src/org.jdrupes.vmoperator.java-common-conventions.gradle
+++ b/buildSrc/src/org.jdrupes.vmoperator.java-common-conventions.gradle
@@ -55,21 +55,25 @@ sourceSets {
java {
toolchain {
- languageVersion = JavaLanguageVersion.of(17)
+ languageVersion = JavaLanguageVersion.of(21)
}
}
jar {
manifest {
- inputs.property("gitDescriptor", { grgit.describe(always: true) })
+ def matchExpr = [ project.tagName + "*" ]
+
+ inputs.property("gitDescriptor",
+ { grgit.describe(always: true, match: matchExpr) })
// Set Git revision information in the manifests of built bundles
+ def gitDesc = grgit.describe(always: true, match: matchExpr)
attributes([
"Implementation-Title": project.name,
- "Implementation-Version": "$project.version (built from ${grgit.describe(always: true)})",
+ "Implementation-Version": "$project.version (built from ${gitDesc})",
"Implementation-Vendor": grgit.repository.jgit.repository.config.getString("user", null, "name")
+ " (" + grgit.repository.jgit.repository.config.getString("user", null, "email") + ")",
- "Git-Descriptor": grgit.describe(always: true),
+ "Git-Descriptor": gitDesc,
"Git-SHA": grgit.head().id,
])
}
diff --git a/buildSrc/src/org.jdrupes.vmoperator.java-doc-conventions.gradle b/buildSrc/src/org.jdrupes.vmoperator.java-doc-conventions.gradle
index 95d7eff..6af8fa7 100644
--- a/buildSrc/src/org.jdrupes.vmoperator.java-doc-conventions.gradle
+++ b/buildSrc/src/org.jdrupes.vmoperator.java-doc-conventions.gradle
@@ -22,31 +22,28 @@ configurations {
}
dependencies {
- markdownDoclet "org.jdrupes.mdoclet:doclet:3.1.0"
- javadocTaglets "org.jdrupes.taglets:plantuml-taglet:2.1.0"
-}
-
-task javadocResources(type: Copy) {
- into file(docDestinationDir)
- from ("${rootProject.rootDir}/misc") {
- include '*.woff2'
- }
+ markdownDoclet "org.jdrupes.mdoclet:doclet:4.0.0"
+ javadocTaglets "org.jdrupes.taglets:plantuml-taglet:3.0.0"
}
task apidocs (type: JavaExec) {
// Does not work on JitPack, no /usr/bin/dot
- enabled = JavaVersion.current() == JavaVersion.VERSION_17
-
- dependsOn javadocResources
+ enabled = JavaVersion.current() == JavaVersion.VERSION_21
outputs.dir(docDestinationDir)
inputs.file rootProject.file('overview.md')
- inputs.file "${rootProject.rootDir}/misc/stylesheet.css"
+ inputs.file "${rootProject.rootDir}/misc/javadoc-overwrites.css"
- jvmArgs = ['--add-exports=jdk.javadoc/jdk.javadoc.internal.tool=ALL-UNNAMED',
- '--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED']
- main = 'jdk.javadoc.internal.tool.Main'
+ jvmArgs = ['--add-exports=jdk.compiler/com.sun.tools.doclint=ALL-UNNAMED',
+ '--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED',
+ '--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED',
+ '--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED',
+ '--add-exports=jdk.javadoc/jdk.javadoc.internal.tool=ALL-UNNAMED',
+ '--add-exports=jdk.javadoc/jdk.javadoc.internal.doclets.toolkit=ALL-UNNAMED',
+ '--add-opens=jdk.javadoc/jdk.javadoc.internal.doclets.toolkit.resources.releases=ALL-UNNAMED',
+ '-Duser.language=en', '-Duser.region=US']
+ mainClass = 'jdk.javadoc.internal.tool.Main'
gradle.projectsEvaluated {
// Make sure that other projects' compileClasspaths are resolved
@@ -69,8 +66,8 @@ task apidocs (type: JavaExec) {
'-package',
'-use',
'-linksource',
- '-link', 'https://docs.oracle.com/en/java/javase/17/docs/api/',
- '-link', 'https://mnlipp.github.io/jgrapes/latest-release/javadoc/',
+ '-link', 'https://docs.oracle.com/en/java/javase/21/docs/api/',
+ '-link', 'https://jgrapes.org/latest-release/javadoc/',
'-link', 'https://freemarker.apache.org/docs/api/',
'--add-exports', 'jdk.javadoc/jdk.javadoc.internal.tool=ALL-UNNAMED',
'--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED',
@@ -88,7 +85,7 @@ task apidocs (type: JavaExec) {
'-bottom', rootProject.file("misc/javadoc.bottom.txt").text,
'--allow-script-in-comments',
'-Xdoclint:-html',
- '--main-stylesheet', "${rootProject.rootDir}/misc/stylesheet.css",
+ '--add-stylesheet', "${rootProject.rootDir}/misc/javadoc-overwrites.css",
'--add-exports=jdk.javadoc/jdk.javadoc.internal.doclets.formats.html=ALL-UNNAMED',
'-quiet'
]
@@ -97,34 +94,27 @@ task apidocs (type: JavaExec) {
ignoreExitValue true
}
+task testJavadoc(type: Javadoc) {
+ enabled = JavaVersion.current() == JavaVersion.VERSION_21
+
+ source = fileTree(dir: 'testfiles', include: '**/*.java')
+ destinationDir = project.file("build/testfiles-gradle")
+ options.docletpath = configurations.markdownDoclet.files.asType(List)
+ options.doclet = 'org.jdrupes.mdoclet.MDoclet'
+ options.overview = 'testfiles/overview.md'
+ options.addStringOption('Xdoclint:-html', '-quiet')
+
+ options.setJFlags([
+ '--add-exports=jdk.compiler/com.sun.tools.doclint=ALL-UNNAMED',
+ '--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED',
+ '--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED',
+ '--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED',
+ '--add-exports=jdk.javadoc/jdk.javadoc.internal.tool=ALL-UNNAMED',
+ '--add-exports=jdk.javadoc/jdk.javadoc.internal.doclets.toolkit=ALL-UNNAMED',
+ '--add-opens=jdk.javadoc/jdk.javadoc.internal.doclets.toolkit.resources.releases=ALL-UNNAMED'])
+}
// Prepare github authentication for plugins
if (System.properties['org.ajoberstar.grgit.auth.username'] == null) {
System.setProperty('org.ajoberstar.grgit.auth.username',
- project.rootProject.properties['repo.access.token'] ?: "nouser")
-}
-
-gitPublish {
- repoUri = 'https://github.com/mnlipp/VM-Operator.git'
- branch = 'gh-pages'
- contents {
- from("${rootProject.buildDir}/javadoc") {
- into 'javadoc'
- }
- if (!findProject(':org.jdrupes.vmoperator.runner.qemu').isSnapshot
- && !findProject(':org.jdrupes.vmoperator.manager').isSnapshot) {
- from("${rootProject.buildDir}/javadoc") {
- into 'latest-release/javadoc'
- }
- }
- }
- preserve { include '**/*' }
- commitMessage = "Updated."
-}
-
-gradle.projectsEvaluated {
- tasks.gitPublishReset.mustRunAfter subprojects.tasks
- .collect { tc -> tc.findByName("build") }.flatten()
- tasks.gitPublishReset.mustRunAfter subprojects.tasks
- .collect { tc -> tc.findByName("test") }.flatten()
- tasks.gitPublishCopy.dependsOn apidocs
+ project.rootProject.properties['website.push.token'] ?: "nouser")
}
diff --git a/buildSrc/src/org.jdrupes.vmoperator.versioning-conventions.gradle b/buildSrc/src/org.jdrupes.vmoperator.versioning-conventions.gradle
index 40ced48..49b6f74 100644
--- a/buildSrc/src/org.jdrupes.vmoperator.versioning-conventions.gradle
+++ b/buildSrc/src/org.jdrupes.vmoperator.versioning-conventions.gradle
@@ -11,22 +11,25 @@ plugins {
id 'pl.allegro.tech.build.axion-release'
}
+def shortened = project.name.startsWith(project.group + ".") ?
+ project.name.substring(project.group.length() + 1) : project.name
+if (shortened == "manager") {
+ shortened = "manager-app";
+}
+var tagName = shortened.replace('.', '-') + "-"
+if (grgit.branch.current.name != "main"
+ && grgit.branch.current.name != "HEAD"
+ && !grgit.branch.current.name.startsWith("testing")
+ && !grgit.branch.current.name.startsWith("release")
+ && !grgit.branch.current.name.startsWith("develop")) {
+ tagName = tagName + grgit.branch.current.name.replace('/', '-') + "-"
+}
+project.ext.tagName = tagName
+
scmVersion {
versionIncrementer 'incrementMinor'
tag {
- def shortened = project.name.startsWith(project.group + ".") ?
- project.name.substring(project.group.length() + 1) : project.name
- if (shortened == "manager") {
- shortened = "manager-app";
- }
- var p = shortened.replace('.', '-') + "-"
- if (grgit.branch.current.name != "main"
- && grgit.branch.current.name != "HEAD"
- && !grgit.branch.current.name.startsWith("release")
- && !grgit.branch.current.name.startsWith("develop")) {
- p = p + grgit.branch.current.name.replace('/', '-') + "-"
- }
- prefix = p
+ prefix = project.tagName
}
}
project.version = scmVersion.version
diff --git a/deploy/crds/vmpools-crd.yaml b/deploy/crds/vmpools-crd.yaml
new file mode 100644
index 0000000..2144940
--- /dev/null
+++ b/deploy/crds/vmpools-crd.yaml
@@ -0,0 +1,74 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ name: vmpools.vmoperator.jdrupes.org
+spec:
+ group: vmoperator.jdrupes.org
+ # list of versions supported by this CustomResourceDefinition
+ versions:
+ - name: v1
+ served: true
+ storage: true
+ schema:
+ openAPIV3Schema:
+ type: object
+ properties:
+ spec:
+ type: object
+ properties:
+ retention:
+ description: >-
+ Defines the timeout for assignments. The time may be
+ specified as ISO 8601 time or duration. When specifying
+ a duration, it will be added to the last time the VM's
+ console was used to obtain the timeout.
+ type: string
+ pattern: '^(?:\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,9})?(?:Z|[+-](?:[01]\d|2[0-3])(?:|:?[0-5]\d))|P(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?:\d+[Hh])?(?:\d+[Mm])?(?:\d+(?:\.\d{1,9})?[Ss])?)?)$'
+ default: "PT1h"
+ loginOnAssignment:
+ description: >-
+ If set to true, the user will be automatically logged in
+ to the VM's console when the VM is assigned to him.
+ type: boolean
+ default: false
+ permissions:
+ type: array
+ description: >-
+ Defines permissions for accessing and manipulating the Pool.
+ items:
+ type: object
+ description: >-
+ Permissions can be granted to a user or to a role.
+ oneOf:
+ - required:
+ - user
+ - required:
+ - role
+ properties:
+ user:
+ type: string
+ role:
+ type: string
+ may:
+ type: array
+ items:
+ type: string
+ enum:
+ - start
+ - stop
+ - reset
+ - accessConsole
+ - "*"
+ default: ["accessConsole"]
+ required:
+ - permissions
+ # either Namespaced or Cluster
+ scope: Namespaced
+ names:
+ # plural name to be used in the URL: /apis/