Search in sources :

Example 21 with StackGresDbOps

use of io.stackgres.common.crd.sgdbops.StackGresDbOps in project stackgres by ongres.

the class DbOpLauncherImpl method launchDbOp.

@Override
public void launchDbOp(String dbOpName, String namespace) {
    StackGresDbOps dbOps = dbOpsFinder.findByNameAndNamespace(dbOpName, namespace).orElseThrow(() -> new IllegalArgumentException(StackGresDbOps.KIND + " " + dbOpName + " does not exists in namespace " + namespace));
    Instance<DatabaseOperationJob> jobImpl = instance.select(new DatabaseOperationLiteral(dbOps.getSpec().getOp()));
    if (jobImpl.isResolvable()) {
        LOGGER.info("Initializing conditions for SgDbOps {}", dbOps.getMetadata().getName());
        var status = Optional.ofNullable(dbOps.getStatus()).or(() -> Optional.of(new StackGresDbOpsStatus())).map(dbOpsStatus -> {
            dbOpsStatus.setOpStarted(Instant.now().toString());
            dbOpsStatus.setOpRetries(Optional.ofNullable(dbOpsStatus.getOpRetries()).map(opRetries -> opRetries + 1).orElse(0));
            dbOpsStatus.setConditions(getStartingConditions());
            return dbOpsStatus;
        }).orElseThrow();
        dbOps.setStatus(status);
        final StackGresDbOps initializedDbOps = dbOpsScheduler.update(dbOps);
        try {
            final int lockPollInterval = Integer.parseInt(DBOPS_LOCK_POLL_INTERVAL.getString());
            final int timeout = Integer.parseInt(DBOPS_LOCK_TIMEOUT.getString());
            LockRequest lockRequest = ImmutableLockRequest.builder().namespace(initializedDbOps.getMetadata().getNamespace()).serviceAccount(JobsProperty.SERVICE_ACCOUNT.getString()).podName(JobsProperty.POD_NAME.getString()).pollInterval(lockPollInterval).timeout(timeout).lockResourceName(initializedDbOps.getSpec().getSgCluster()).build();
            Infrastructure.setDroppedExceptionHandler(err -> LOGGER.error("Dropped exception ", err));
            lockAcquirer.lockRun(lockRequest, (targetCluster) -> {
                databaseOperationEventEmitter.operationStarted(dbOpName, namespace);
                final DatabaseOperationJob databaseOperationJob = jobImpl.get();
                Uni<ClusterRestartState> jobUni = databaseOperationJob.runJob(initializedDbOps, targetCluster);
                if (initializedDbOps.getSpec().getTimeout() != null) {
                    jobUni.await().atMost(Duration.parse(initializedDbOps.getSpec().getTimeout()));
                } else {
                    jobUni.await().indefinitely();
                }
                databaseOperationEventEmitter.operationCompleted(dbOpName, namespace);
            });
            LOGGER.info("Operation completed for SgDbOp {}", dbOpName);
            updateToCompletedConditions(dbOpName, namespace);
        } catch (TimeoutException timeoutEx) {
            updateToTimeoutConditions(dbOpName, namespace);
            databaseOperationEventEmitter.operationTimedOut(dbOpName, namespace);
            throw timeoutEx;
        } catch (Exception e) {
            updateToFailedConditions(dbOpName, namespace);
            databaseOperationEventEmitter.operationFailed(dbOpName, namespace);
            throw e;
        }
    } else if (jobImpl.isAmbiguous()) {
        throw new IllegalStateException("Multiple implementations of the operation " + dbOps.getSpec().getOp() + " found");
    } else {
        throw new IllegalStateException("Implementation of operation " + dbOps.getSpec().getOp() + " not found");
    }
}
Also used : LockRequest(io.stackgres.jobs.dbops.lock.LockRequest) StackGresCluster(io.stackgres.common.crd.sgcluster.StackGresCluster) LoggerFactory(org.slf4j.LoggerFactory) StackGresDbOpsCondition(io.stackgres.common.crd.sgdbops.StackGresDbOpsCondition) JobsProperty(io.stackgres.jobs.app.JobsProperty) LockAcquirer(io.stackgres.jobs.dbops.lock.LockAcquirer) StackGresDbOps(io.stackgres.common.crd.sgdbops.StackGresDbOps) Uni(io.smallrye.mutiny.Uni) Inject(javax.inject.Inject) Duration(java.time.Duration) StackGresDbOpsStatus(io.stackgres.common.crd.sgdbops.StackGresDbOpsStatus) CustomResourceFinder(io.stackgres.common.resource.CustomResourceFinder) Any(javax.enterprise.inject.Any) Instance(javax.enterprise.inject.Instance) Infrastructure(io.smallrye.mutiny.infrastructure.Infrastructure) Logger(org.slf4j.Logger) ImmutableLockRequest(io.stackgres.jobs.dbops.lock.ImmutableLockRequest) TimeoutException(io.smallrye.mutiny.TimeoutException) Instant(java.time.Instant) ClusterRestartState(io.stackgres.jobs.dbops.clusterrestart.ClusterRestartState) DBOPS_LOCK_TIMEOUT(io.stackgres.jobs.app.JobsProperty.DBOPS_LOCK_TIMEOUT) DbOpsStatusCondition(io.stackgres.common.crd.sgdbops.DbOpsStatusCondition) List(java.util.List) DBOPS_LOCK_POLL_INTERVAL(io.stackgres.jobs.app.JobsProperty.DBOPS_LOCK_POLL_INTERVAL) CustomResourceScheduler(io.stackgres.common.resource.CustomResourceScheduler) DateTimeFormatter(java.time.format.DateTimeFormatter) Optional(java.util.Optional) ApplicationScoped(javax.enterprise.context.ApplicationScoped) StackGresDbOps(io.stackgres.common.crd.sgdbops.StackGresDbOps) TimeoutException(io.smallrye.mutiny.TimeoutException) StackGresDbOpsStatus(io.stackgres.common.crd.sgdbops.StackGresDbOpsStatus) ClusterRestartState(io.stackgres.jobs.dbops.clusterrestart.ClusterRestartState) LockRequest(io.stackgres.jobs.dbops.lock.LockRequest) ImmutableLockRequest(io.stackgres.jobs.dbops.lock.ImmutableLockRequest) TimeoutException(io.smallrye.mutiny.TimeoutException)

Example 22 with StackGresDbOps

use of io.stackgres.common.crd.sgdbops.StackGresDbOps in project stackgres by ongres.

the class DbOpsImmutableSpecValidator method validate.

@Override
public void validate(StackGresDbOpsReview review) throws ValidationFailed {
    switch(review.getRequest().getOperation()) {
        case UPDATE:
            StackGresDbOps dbOps = review.getRequest().getObject();
            StackGresDbOps oldDbOps = review.getRequest().getOldObject();
            if (!dbOps.getSpec().equals(oldDbOps.getSpec())) {
                fail("spec can not be updated");
            }
            break;
        default:
    }
}
Also used : StackGresDbOps(io.stackgres.common.crd.sgdbops.StackGresDbOps)

Example 23 with StackGresDbOps

use of io.stackgres.common.crd.sgdbops.StackGresDbOps in project stackgres by ongres.

the class FakeDbOpsScheduler method updateStatus.

@Override
public StackGresDbOps updateStatus(StackGresDbOps resource) {
    String name = resource.getMetadata().getName();
    String namespace = resource.getMetadata().getNamespace();
    StackGresDbOps savedOp = kubeDb.getDbOps(name, namespace);
    savedOp.setStatus(resource.getStatus());
    return kubeDb.addOrReplaceDbOps(savedOp);
}
Also used : StackGresDbOps(io.stackgres.common.crd.sgdbops.StackGresDbOps)

Aggregations

StackGresDbOps (io.stackgres.common.crd.sgdbops.StackGresDbOps)23 EnvVarBuilder (io.fabric8.kubernetes.api.model.EnvVarBuilder)8 List (java.util.List)8 Inject (javax.inject.Inject)8 StackGresCluster (io.stackgres.common.crd.sgcluster.StackGresCluster)7 Optional (java.util.Optional)6 ImmutableList (com.google.common.collect.ImmutableList)5 LabelFactoryForCluster (io.stackgres.common.LabelFactoryForCluster)5 LabelFactoryForDbOps (io.stackgres.common.LabelFactoryForDbOps)5 Collectors (java.util.stream.Collectors)5 JsonMapper (com.fasterxml.jackson.databind.json.JsonMapper)4 ContainerBuilder (io.fabric8.kubernetes.api.model.ContainerBuilder)4 EnvVar (io.fabric8.kubernetes.api.model.EnvVar)4 HasMetadata (io.fabric8.kubernetes.api.model.HasMetadata)4 ObjectMeta (io.fabric8.kubernetes.api.model.ObjectMeta)4 PodSecurityContext (io.fabric8.kubernetes.api.model.PodSecurityContext)4 JobBuilder (io.fabric8.kubernetes.api.model.batch.v1.JobBuilder)4 ClusterStatefulSetPath (io.stackgres.common.ClusterStatefulSetPath)4 DbOpsEnvironmentVariables (io.stackgres.operator.cluster.factory.DbOpsEnvironmentVariables)4 StackGresDbOpsContext (io.stackgres.operator.conciliation.dbops.StackGresDbOpsContext)4