Deploy pod instead of stateful set
This commit is contained in:
parent
525696ffe9
commit
83908b7cfd
23 changed files with 762 additions and 155 deletions
|
|
@ -10,6 +10,7 @@ plugins {
|
|||
|
||||
dependencies {
|
||||
api project(':org.jdrupes.vmoperator.util')
|
||||
api 'org.jgrapes:org.jgrapes.core:[1.22.1,2)'
|
||||
api 'io.kubernetes:client-java:[19.0.0,20.0.0)'
|
||||
api 'org.yaml:snakeyaml'
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ import java.time.Instant;
|
|||
import java.util.function.BiConsumer;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import org.jgrapes.core.Components;
|
||||
|
||||
/**
|
||||
* An observer that watches namespaced resources in a given context and
|
||||
|
|
@ -73,7 +74,7 @@ public class K8sObserver<O extends KubernetesObject,
|
|||
*/
|
||||
@SuppressWarnings({ "PMD.AvoidBranchingStatementAsLastInLoop",
|
||||
"PMD.UseObjectForClearerAPI", "PMD.AvoidCatchingThrowable",
|
||||
"PMD.CognitiveComplexity" })
|
||||
"PMD.CognitiveComplexity", "PMD.AvoidCatchingGenericException" })
|
||||
public K8sObserver(Class<O> objectClass, Class<L> objectListClass,
|
||||
K8sClient client, APIResource context, String namespace,
|
||||
ListOptions options) {
|
||||
|
|
@ -85,38 +86,41 @@ public class K8sObserver<O extends KubernetesObject,
|
|||
api = new GenericKubernetesApi<>(objectClass, objectListClass,
|
||||
context.getGroup(), context.getPreferredVersion(),
|
||||
context.getResourcePlural(), client);
|
||||
thread = Thread.ofVirtual().unstarted(() -> {
|
||||
try {
|
||||
logger.config(() -> "Watching " + context.getResourcePlural()
|
||||
+ " (" + context.getPreferredVersion() + ")"
|
||||
+ " in " + namespace);
|
||||
thread = (Components.useVirtualThreads() ? Thread.ofVirtual()
|
||||
: Thread.ofPlatform()).unstarted(() -> {
|
||||
try {
|
||||
logger
|
||||
.config(() -> "Watching " + context.getResourcePlural()
|
||||
+ " (" + context.getPreferredVersion() + ")"
|
||||
+ " in " + namespace);
|
||||
|
||||
// Watch sometimes terminates without apparent reason.
|
||||
while (!Thread.currentThread().isInterrupted()) {
|
||||
Instant startedAt = Instant.now();
|
||||
try {
|
||||
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
|
||||
var changed = api.watch(namespace, options).iterator();
|
||||
while (changed.hasNext()) {
|
||||
handler.accept(client, changed.next());
|
||||
// Watch sometimes terminates without apparent reason.
|
||||
while (!Thread.currentThread().isInterrupted()) {
|
||||
Instant startedAt = Instant.now();
|
||||
try {
|
||||
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
|
||||
var changed
|
||||
= api.watch(namespace, options).iterator();
|
||||
while (changed.hasNext()) {
|
||||
handler.accept(client, changed.next());
|
||||
}
|
||||
} catch (ApiException | RuntimeException e) {
|
||||
logger.log(Level.FINE, e, () -> "Problem watching"
|
||||
+ " (will retry): " + e.getMessage());
|
||||
delayRestart(startedAt);
|
||||
}
|
||||
} catch (ApiException | RuntimeException e) {
|
||||
logger.log(Level.FINE, e, () -> "Problem watching"
|
||||
+ " (will retry): " + e.getMessage());
|
||||
delayRestart(startedAt);
|
||||
}
|
||||
if (onTerminated != null) {
|
||||
onTerminated.accept(this, null);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
logger.log(Level.SEVERE, e, () -> "Probem watching: "
|
||||
+ e.getMessage());
|
||||
if (onTerminated != null) {
|
||||
onTerminated.accept(this, e);
|
||||
}
|
||||
}
|
||||
if (onTerminated != null) {
|
||||
onTerminated.accept(this, null);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
logger.log(Level.SEVERE, e, () -> "Probem watching: "
|
||||
+ e.getMessage());
|
||||
if (onTerminated != null) {
|
||||
onTerminated.accept(this, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@SuppressWarnings("PMD.AvoidLiteralsInIfCondition")
|
||||
|
|
|
|||
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* VM-Operator
|
||||
* Copyright (C) 2024 Michael N. Lipp
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.jdrupes.vmoperator.common;
|
||||
|
||||
import io.kubernetes.client.Discovery.APIResource;
|
||||
import io.kubernetes.client.openapi.ApiException;
|
||||
import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim;
|
||||
import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimList;
|
||||
import io.kubernetes.client.util.generic.options.ListOptions;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A stub for pods (v1).
|
||||
*/
|
||||
@SuppressWarnings("PMD.DataflowAnomalyAnalysis")
|
||||
public class K8sV1PvcStub extends
|
||||
K8sGenericStub<V1PersistentVolumeClaim, V1PersistentVolumeClaimList> {
|
||||
|
||||
/** The pods' context. */
|
||||
public static final APIResource CONTEXT
|
||||
= new APIResource("", List.of("v1"), "v1", "PersistentVolumeClaim",
|
||||
true, "persistentvolumeclaims", "persistentvolumeclaim");
|
||||
|
||||
/**
|
||||
* Instantiates a new stub.
|
||||
*
|
||||
* @param client the client
|
||||
* @param namespace the namespace
|
||||
* @param name the name
|
||||
*/
|
||||
protected K8sV1PvcStub(K8sClient client, String namespace, String name) {
|
||||
super(V1PersistentVolumeClaim.class, V1PersistentVolumeClaimList.class,
|
||||
client, CONTEXT, namespace, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the stub for the given namespace and name.
|
||||
*
|
||||
* @param client the client
|
||||
* @param namespace the namespace
|
||||
* @param name the name
|
||||
* @return the kpod stub
|
||||
*/
|
||||
public static K8sV1PvcStub get(K8sClient client, String namespace,
|
||||
String name) {
|
||||
return new K8sV1PvcStub(client, namespace, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the stubs for the objects in the given namespace that match
|
||||
* the criteria from the given options.
|
||||
*
|
||||
* @param client the client
|
||||
* @param namespace the namespace
|
||||
* @param options the options
|
||||
* @return the collection
|
||||
* @throws ApiException the api exception
|
||||
*/
|
||||
public static Collection<K8sV1PvcStub> list(K8sClient client,
|
||||
String namespace, ListOptions options) throws ApiException {
|
||||
return K8sGenericStub.list(V1PersistentVolumeClaim.class,
|
||||
V1PersistentVolumeClaimList.class, client, CONTEXT, namespace,
|
||||
options, (clnt, nscp, name) -> new K8sV1PvcStub(clnt, nscp, name));
|
||||
}
|
||||
}
|
||||
|
|
@ -37,6 +37,13 @@ import org.jdrupes.vmoperator.util.GsonPtr;
|
|||
@SuppressWarnings("PMD.DataClass")
|
||||
public class VmDefinitionModel extends K8sDynamicModel {
|
||||
|
||||
/**
|
||||
* The VM state from the VM definition.
|
||||
*/
|
||||
public enum RequestedVmState {
|
||||
STOPPED, RUNNING
|
||||
}
|
||||
|
||||
/**
|
||||
* Permissions for accessing and manipulating the VM.
|
||||
*/
|
||||
|
|
@ -111,6 +118,18 @@ public class VmDefinitionModel extends K8sDynamicModel {
|
|||
.flatMap(Function.identity()).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the requested VM state
|
||||
*
|
||||
* @return the string
|
||||
*/
|
||||
public RequestedVmState vmState() {
|
||||
return GsonPtr.to(data()).getAsString("spec", "vm", "state")
|
||||
.map(s -> "Running".equals(s) ? RequestedVmState.RUNNING
|
||||
: RequestedVmState.STOPPED)
|
||||
.orElse(RequestedVmState.STOPPED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the display password serial.
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue