Compare commits

...

15 commits

Author SHA1 Message Date
d6a0cc6220 Improve state feedback.
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-05 21:10:05 +02:00
9180323618 Update. 2024-06-04 22:09:54 +02:00
08f4a818da Add HTTPConnector to diagrams. 2024-06-04 21:57:15 +02:00
bab0db48d1 Fix typo. 2024-06-04 11:25:21 +02:00
85d9278e2e Update diagrams. 2024-06-04 11:20:12 +02:00
ebead17193 Minor update.
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-04 09:43:27 +02:00
fefd2737f3 Widen selection box. 2024-06-03 23:12:22 +02:00
a4bd129252 Minor updates. 2024-06-03 23:10:35 +02:00
4617d8d3ba Make byte[] to String conversion null-safe.
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-01 14:59:08 +02:00
6c250d4656 Fix release versions.
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-01 14:28:57 +02:00
2403f5db64 Undo previous commit (is implied by fetch-depth: 0). 2024-06-01 13:57:21 +02:00
c66e304de4 Fetch all tags to make axion release plugin work properly.
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-01 13:44:53 +02:00
2cb8c90357 Try to fix version issue when building release.
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-01 13:26:47 +02:00
837ee043aa Checkout triggering version (is default).
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-01 12:28:28 +02:00
a20602f671 Plain tags for development branches.
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
2024-06-01 11:54:23 +02:00
9 changed files with 74 additions and 51 deletions

View file

@ -18,10 +18,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
ref: main
- name: Install graphviz - name: Install graphviz
run: sudo apt-get install graphviz run: sudo apt-get install graphviz
- name: Install podman - name: Install podman

View file

@ -5,6 +5,11 @@
*/ */
plugins { plugins {
// Apply the common versioning conventions.
// Put this at the start, because accessing project.version before
// this is applied makes things fail.
id 'org.jdrupes.vmoperator.versioning-conventions'
// Apply the java Plugin to add support for Java. // Apply the java Plugin to add support for Java.
id 'java' id 'java'
@ -13,9 +18,6 @@ plugins {
// Access to git information // Access to git information
id 'org.ajoberstar.grgit' id 'org.ajoberstar.grgit'
// Apply the common versioning conventions.
id 'org.jdrupes.vmoperator.versioning-conventions'
} }
repositories { repositories {

View file

@ -21,11 +21,13 @@ scmVersion {
} }
var p = shortened.replace('.', '-') + "-" var p = shortened.replace('.', '-') + "-"
if (grgit.branch.current.name != "main" if (grgit.branch.current.name != "main"
&& !grgit.branch.current.name.startsWith("release")) { && grgit.branch.current.name != "HEAD"
&& !grgit.branch.current.name.startsWith("release")
&& !grgit.branch.current.name.startsWith("develop")) {
p = p + grgit.branch.current.name.replace('/', '-') + "-" p = p + grgit.branch.current.name.replace('/', '-') + "-"
} }
prefix = p prefix = p
} }
} }
version = scmVersion.version project.version = scmVersion.version
ext.isSnapshot = version.endsWith('-SNAPSHOT') ext.isSnapshot = version.endsWith('-SNAPSHOT')

View file

@ -45,7 +45,7 @@
body { body {
background-color:#ffffff; background-color:#ffffff;
color:#353833; color:#353833;
font: normal 16px/1.5 "DejaVu Serif", serif; font: normal 16px/1.5 "DejaVu Sans", Arial, Helvetica, sans-serif;
margin:0; margin:0;
padding:0; padding:0;
height:100%; height:100%;
@ -71,37 +71,33 @@ a[name] {
color:#353833; color:#353833;
} }
pre { pre {
font-family: "DejaVu Sans Mono", monospace; font-family:'DejaVu Sans Mono', monospace;
} }
h1 { h1 {
font-family: "DejaVu Sans", sans;
font-size:20px; font-size:20px;
} }
h2 { h2 {
font-family: "DejaVu Sans", sans;
font-size:18px; font-size:18px;
} }
h3 { h3 {
font-family: "DejaVu Sans", sans; font-size:17px;
font-size:16px;
} }
h4 { h4 {
font-family: "DejaVu Sans", sans; font-size:16px;
font-size:15px; margin-top: 1rem;
margin-bottom: 1rem;
} }
h5 { h5 {
font-family: "DejaVu Sans", sans;
font-size:14px; font-size:14px;
} }
h6 { h6 {
font-family: "DejaVu Sans", sans;
font-size:13px; font-size:13px;
} }
ul { ul {
list-style-type:disc; list-style-type:disc;
} }
code, tt { code, tt {
font-family: "DejaVu Sans Mono", monospace; font-family:'DejaVu Sans Mono', monospace;
} }
:not(h1, h2, h3, h4, h5, h6) > code, :not(h1, h2, h3, h4, h5, h6) > code,
:not(h1, h2, h3, h4, h5, h6) > tt { :not(h1, h2, h3, h4, h5, h6) > tt {
@ -111,12 +107,12 @@ code, tt {
line-height:1.4em; line-height:1.4em;
} }
dt code { dt code {
font-family: "DejaVu Sans Mono", monospace; font-family:'DejaVu Sans Mono', monospace;
font-size:14px; font-size:14px;
padding-top:4px; padding-top:4px;
} }
.summary-table dt code { .summary-table dt code {
font-family: "DejaVu Sans Mono", monospace; font-family:'DejaVu Sans Mono', monospace;
font-size:14px; font-size:14px;
vertical-align:top; vertical-align:top;
padding-top:4px; padding-top:4px;
@ -124,7 +120,9 @@ dt code {
sup { sup {
font-size:8px; font-size:8px;
} }
button {
font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
}
/* /*
* Styles for HTML generated by javadoc. * Styles for HTML generated by javadoc.
* *
@ -185,7 +183,6 @@ sup {
min-height:2.8em; min-height:2.8em;
padding-top:10px; padding-top:10px;
overflow:hidden; overflow:hidden;
font-family: "DejaVu Sans", sans;
font-size:80%; font-size:80%;
} }
.sub-nav { .sub-nav {
@ -193,7 +190,6 @@ sup {
float:left; float:left;
width:100%; width:100%;
overflow:hidden; overflow:hidden;
font-family: "DejaVu Sans", sans;
font-size:80%; font-size:80%;
} }
.sub-nav div { .sub-nav div {
@ -311,13 +307,16 @@ main {
position:relative; position:relative;
} }
dl.notes > dt { dl.notes > dt {
font-family: "DejaVu Sans", sans; font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
/* font-size:12px; */
font-weight:bold; font-weight:bold;
margin:10px 0 0 0; margin:10px 0 0 0;
color:#4E4E4E; color:#4E4E4E;
} }
dl.notes > dd { dl.notes > dd {
margin:5px 10px 10px 0; margin:5px 10px 0 0;
/* font-size:14px; */
font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
} }
dl.name-value > dt { dl.name-value > dt {
margin-left:1px; margin-left:1px;
@ -389,6 +388,11 @@ ul.see-list-long li:not(:last-child):after {
border-bottom:1px solid #EEE; border-bottom:1px solid #EEE;
padding:0; padding:0;
} }
.summary-table .col-first {
font-family: "DejaVu Sans Mono", monospace;
}
.caption { .caption {
position:relative; position:relative;
text-align:left; text-align:left;
@ -402,7 +406,6 @@ ul.see-list-long li:not(:last-child):after {
padding-left:1px; padding-left:1px;
margin:0; margin:0;
white-space:pre; white-space:pre;
font-family: 'DejaVu Sans';
} }
.caption a:link, .caption a:visited { .caption a:link, .caption a:visited {
color:#1f389c; color:#1f389c;
@ -450,9 +453,6 @@ div.table-tabs > button.table-tab {
display: grid; display: grid;
grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, auto); grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, auto);
} }
#method-summary-table .three-column-summary {
grid-template-columns: minmax(10%, 20%) minmax(15%, max-content) minmax(15%, auto);
}
.four-column-summary { .four-column-summary {
display: grid; display: grid;
grid-template-columns: minmax(10%, max-content) minmax(10%, max-content) minmax(10%, max-content) minmax(10%, auto); grid-template-columns: minmax(10%, max-content) minmax(10%, max-content) minmax(10%, max-content) minmax(10%, auto);
@ -490,7 +490,6 @@ div.table-tabs > button.table-tab {
} }
.table-header { .table-header {
background:#dee3e9; background:#dee3e9;
font-family: 'DejaVu Sans';
font-weight: bold; font-weight: bold;
} }
/* /*
@ -508,7 +507,6 @@ div.table-tabs > button.table-tab {
.col-last { .col-last {
white-space:normal; white-space:normal;
} }
/*
.col-first a:link, .col-first a:visited, .col-first a:link, .col-first a:visited,
.col-second a:link, .col-second a:visited, .col-second a:link, .col-second a:visited,
.col-first a:link, .col-first a:visited, .col-first a:link, .col-first a:visited,
@ -520,7 +518,6 @@ div.table-tabs > button.table-tab {
.all-packages-container a:link, .all-packages-container a:visited { .all-packages-container a:link, .all-packages-container a:visited {
font-weight:bold; font-weight:bold;
} }
*/
.table-sub-heading-color { .table-sub-heading-color {
background-color:#EEEEFF; background-color:#EEEEFF;
} }
@ -537,12 +534,9 @@ div.table-tabs > button.table-tab {
margin:0; margin:0;
padding:10px 0; padding:10px 0;
} }
/*
div.block { div.block {
font-size:14px;
font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
} }
*/
.col-last div { .col-last div {
padding-top:0; padding-top:0;
} }
@ -553,8 +547,7 @@ div.block {
.package-signature, .package-signature,
.type-signature, .type-signature,
.member-signature { .member-signature {
font-family: "DejaVu Sans Mono", monospace; font-family:'DejaVu Sans Mono', monospace;
/* font-size:14px; */
margin:14px 0; margin:14px 0;
white-space: pre-wrap; white-space: pre-wrap;
} }
@ -593,13 +586,8 @@ h1.hidden {
.deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, .deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link,
.module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, .module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type,
.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { .package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label {
font-family: "DejaVu Sans", sans;
font-weight:bold; font-weight:bold;
} }
.sub-title, .inheritance, .all-packages-table-tab1.col-first,
.summary-table .col-first {
font-family: "DejaVu Sans", sans;
}
.deprecation-comment, .help-footnote, .preview-comment { .deprecation-comment, .help-footnote, .preview-comment {
font-style:italic; font-style:italic;
} }
@ -658,6 +646,7 @@ main, nav, header, footer, section {
ul.ui-autocomplete { ul.ui-autocomplete {
position:fixed; position:fixed;
z-index:999999; z-index:999999;
background-color: #FFFFFF;
} }
ul.ui-autocomplete li { ul.ui-autocomplete li {
float:left; float:left;
@ -667,6 +656,9 @@ ul.ui-autocomplete li {
.result-highlight { .result-highlight {
font-weight:bold; font-weight:bold;
} }
.ui-autocomplete .result-item {
font-size: inherit;
}
#search-input { #search-input {
background-image:url('resources/glass.png'); background-image:url('resources/glass.png');
background-size:13px; background-size:13px;

View file

@ -33,6 +33,7 @@ import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Scanner; import java.util.Scanner;
import java.util.logging.Level; import java.util.logging.Level;
import static org.jdrupes.vmoperator.common.Constants.APP_NAME; import static org.jdrupes.vmoperator.common.Constants.APP_NAME;
@ -180,7 +181,8 @@ public class DisplaySecretMonitor
// Check validity // Check validity
var model = stub.model().get(); var model = stub.model().get();
@SuppressWarnings("PMD.StringInstantiation") @SuppressWarnings("PMD.StringInstantiation")
var expiry = new String(model.getData().get(DATA_PASSWORD_EXPIRY)); var expiry = Optional.ofNullable(model.getData()
.get(DATA_PASSWORD_EXPIRY)).map(b -> new String(b)).orElse(null);
if (model.getData().get(DATA_DISPLAY_PASSWORD) != null if (model.getData().get(DATA_DISPLAY_PASSWORD) != null
&& stillValid(expiry)) { && stillValid(expiry)) {
event.setResult( event.setResult(

View file

@ -57,7 +57,7 @@
* ``` * ```
* *
* Developers may also be interested in the usage of channels * Developers may also be interested in the usage of channels
* by the application's component: * by the application's components:
* *
* ![Main channels](app-channels.svg) * ![Main channels](app-channels.svg)
* *
@ -74,6 +74,8 @@
* *
* Component NioDispatcher as NioDispatcher <<internal>> * Component NioDispatcher as NioDispatcher <<internal>>
* [Manager] *-up- [NioDispatcher] * [Manager] *-up- [NioDispatcher]
* Component HttpConnector as HttpConnector <<internal>>
* [Manager] *-up- [HttpConnector]
* Component FileSystemWatcher as FileSystemWatcher <<internal>> * Component FileSystemWatcher as FileSystemWatcher <<internal>>
* [Manager] *-up- [FileSystemWatcher] * [Manager] *-up- [FileSystemWatcher]
* Component YamlConfigurationStore as YamlConfigurationStore <<internal>> * Component YamlConfigurationStore as YamlConfigurationStore <<internal>>
@ -119,6 +121,7 @@
* [WebConsole] *-- [RoleConfigurator] * [WebConsole] *-- [RoleConfigurator]
* [WebConsole] *-- [RoleConletFilter] * [WebConsole] *-- [RoleConletFilter]
* [WebConsole] *-left- [LoginConlet] * [WebConsole] *-left- [LoginConlet]
* [WebConsole] *-right- [OidcClient]
* *
* Component "ComponentCollector\nfor page resources" as cpr <<internal>> * Component "ComponentCollector\nfor page resources" as cpr <<internal>>
* [WebConsole] *-- [cpr] * [WebConsole] *-- [cpr]
@ -147,21 +150,35 @@
* () "guiTransport" as hT * () "guiTransport" as hT
* hT .up. [GuiSocketServer:8080] * hT .up. [GuiSocketServer:8080]
* hT .down. [GuiHttpServer] * hT .down. [GuiHttpServer]
* hT .right[hidden]. [HttpConnector]
* *
* [YamlConfigurationStore] -right[hidden]- hT * [YamlConfigurationStore] -right[hidden]- hT
* *
* () "guiHttp" as http * () "guiHttp" as http
* http .up. [GuiHttpServer] * http .up. [GuiHttpServer]
* http .up. [HttpConnector]
* note top of [HttpConnector]: transport layer com-\nponents omitted
* *
* [PreferencesStore] .right. http * [PreferencesStore] .. http
* [OidcClient] .up. http
* [LanguageSelector] .left. http
* [InMemorySessionManager] .up. http * [InMemorySessionManager] .up. http
* [LanguageSelector] .up. http
* *
* package "Conceptual WebConsole" { * package "Conceptual WebConsole" {
* [ConsoleWeblet] .left. http * [ConsoleWeblet] .right. http
* [ConsoleWeblet] *-down- [WebConsole] * [ConsoleWeblet] *-down- [WebConsole]
* } * }
* *
* [Controller] .down[hidden]. [ConsoleWeblet]
*
* () "console" as console
* console .. WebConsole
*
* [OidcClient] .. console
* [LoginConlet] .right. console
*
* note right of console: More conlets\nconnect here
*
* @enduml * @enduml
*/ */
package org.jdrupes.vmoperator.manager; package org.jdrupes.vmoperator.manager;

View file

@ -52,12 +52,14 @@
v-html="controller.breakBeforeDots(entry[key])"></span> v-html="controller.breakBeforeDots(entry[key])"></span>
</td> </td>
<td class="jdrupes-vmoperator-vmconlet-view-action-list"> <td class="jdrupes-vmoperator-vmconlet-view-action-list">
<span role="button" v-if="entry.spec.vm.state != 'Running'" <span role="button"
v-if="entry.spec.vm.state != 'Running' && !entry['running']"
tabindex="0" class="fa fa-play" :title="localize('Start VM')" tabindex="0" class="fa fa-play" :title="localize('Start VM')"
v-on:click="vmAction(entry.name, 'start')"></span> v-on:click="vmAction(entry.name, 'start')"></span>
<span role="button" v-else class="fa fa-play" <span role="button" v-else class="fa fa-play"
aria-disabled="true" :title="localize('Start VM')"></span> aria-disabled="true" :title="localize('Start VM')"></span>
<span role="button" v-if="entry.spec.vm.state != 'Stopped'" <span role="button"
v-if="entry.spec.vm.state != 'Stopped' && entry['running']"
tabindex="0" class="fa fa-stop" :title="localize('Stop VM')" tabindex="0" class="fa fa-stop" :title="localize('Stop VM')"
v-on:click="vmAction(entry.name, 'stop')"></span> v-on:click="vmAction(entry.name, 'stop')"></span>
<span role="button" v-else class="fa fa-stop" <span role="button" v-else class="fa fa-stop"

View file

@ -92,13 +92,15 @@ window.orgJDrupesVmOperatorVmViewer.initPreview = (previewDom: HTMLElement,
:title="localize('Open console')"></td> :title="localize('Open console')"></td>
<td v-if="vmDef.spec" <td v-if="vmDef.spec"
class="jdrupes-vmoperator-vmviewer-preview-action-list"> class="jdrupes-vmoperator-vmviewer-preview-action-list">
<span role="button" v-if="vmDef.spec.vm.state != 'Running'" <span role="button"
v-if="vmDef.spec.vm.state != 'Running' && !vmDef.running"
:aria-disabled="!vmDef.userPermissions.includes('start')" :aria-disabled="!vmDef.userPermissions.includes('start')"
tabindex="0" class="fa fa-play" :title="localize('Start VM')" tabindex="0" class="fa fa-play" :title="localize('Start VM')"
v-on:click="vmAction(vmDef.name, 'start')"></span> v-on:click="vmAction(vmDef.name, 'start')"></span>
<span role="button" v-else class="fa fa-play" <span role="button" v-else class="fa fa-play"
aria-disabled="true" :title="localize('Start VM')"></span> aria-disabled="true" :title="localize('Start VM')"></span>
<span role="button" v-if="vmDef.spec.vm.state != 'Stopped'" <span role="button"
v-if="vmDef.spec.vm.state != 'Stopped' && vmDef.running"
:aria-disabled="!vmDef.userPermissions.includes('stop')" :aria-disabled="!vmDef.userPermissions.includes('stop')"
tabindex="0" class="fa fa-stop" :title="localize('Stop VM')" tabindex="0" class="fa fa-stop" :title="localize('Stop VM')"
v-on:click="vmAction(vmDef.name, 'stop')"></span> v-on:click="vmAction(vmDef.name, 'stop')"></span>

View file

@ -43,3 +43,8 @@
white-space: nowrap; white-space: nowrap;
} }
.jdrupes-vmoperator-vmviewer-edit {
select {
width: 15em;
}
}