All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cloudfoundry.multiapps.controller.process.jobs.OrphanedDataCleaner Maven / Gradle / Ivy

There is a newer version: 1.183.0
Show newest version
package org.cloudfoundry.multiapps.controller.process.jobs;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import org.cloudfoundry.multiapps.controller.core.auditlogging.MtaConfigurationPurgerAuditLog;
import org.cloudfoundry.multiapps.controller.core.cf.OAuthClientFactory;
import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
import org.cloudfoundry.multiapps.controller.core.util.SecurityUtil;
import org.cloudfoundry.multiapps.mta.model.AuditableConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;

import com.sap.cloudfoundry.client.facade.CloudCredentials;
import com.sap.cloudfoundry.client.facade.CloudOperationException;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableCloudFoundryClientFactory;
import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient;

public abstract class OrphanedDataCleaner implements Cleaner {

    private static final Logger LOGGER = LoggerFactory.getLogger(OrphanedDataCleaner.class);

    private final ApplicationConfiguration configuration;
    private final OAuthClientFactory oAuthClientFactory;
    private final MtaConfigurationPurgerAuditLog mtaConfigurationPurgerAuditLog;
    protected CloudSpaceClient spaceClient;
    private boolean executed;

    protected OrphanedDataCleaner(ApplicationConfiguration applicationConfiguration, OAuthClientFactory oAuthClientFactory,
                                  MtaConfigurationPurgerAuditLog mtaConfigurationPurgerAuditLog) {
        this.configuration = applicationConfiguration;
        this.oAuthClientFactory = oAuthClientFactory;
        this.mtaConfigurationPurgerAuditLog = mtaConfigurationPurgerAuditLog;
        this.executed = false;
    }

    @Override
    public void execute(LocalDateTime expirationTime) {
        if (!executed) {
            LOGGER.info(CleanUpJob.LOG_MARKER, getStartCleanupLogMessage());
            int deletedOrphanedDataCount = deleteOrphanedData();
            LOGGER.info(CleanUpJob.LOG_MARKER, getEndCleanupLogMessage(deletedOrphanedDataCount));
            executed = true;
        }
    }

    protected abstract String getStartCleanupLogMessage();

    protected abstract String getEndCleanupLogMessage(int deletedDataCount);

    private int deleteOrphanedData() {
        List configurationData = getConfigurationData();
        return configurationData.stream()
                                .filter(this::hasNoAssociatedSpace)
                                .map(this::getSpaceId)
                                .distinct()
                                .mapToInt(this::deleteConfigurationDataBySpaceId)
                                .sum();
    }

    protected abstract List getConfigurationData();

    private boolean hasNoAssociatedSpace(T configurationData) {
        String spaceId = getSpaceId(configurationData);
        return !spaceExists(spaceId);
    }

    protected abstract String getSpaceId(T configurationData);

    private boolean spaceExists(String spaceId) {
        if (spaceClient == null) {
            initSpaceClient();
        }
        try {
            spaceClient.getSpace(UUID.fromString(spaceId));
            return true;
        } catch (CloudOperationException e) {
            if (HttpStatus.NOT_FOUND == e.getStatusCode()) {
                return false;
            }
            LOGGER.error(CleanUpJob.LOG_MARKER, "Could not get space with uuid " + spaceId, e);
            // will skip deletion of data
            return true;
        }
    }

    protected MtaConfigurationPurgerAuditLog getMtaConfigurationPurgerAuditLog() {
        return mtaConfigurationPurgerAuditLog;
    }

    protected abstract int deleteConfigurationDataBySpaceId(String spaceId);

    protected void initSpaceClient() {
        CloudCredentials cloudCredentials = new CloudCredentials(configuration.getGlobalAuditorUser(),
                                                                 configuration.getGlobalAuditorPassword(),
                                                                 SecurityUtil.CLIENT_ID,
                                                                 SecurityUtil.CLIENT_SECRET,
                                                                 configuration.getGlobalAuditorOrigin());
        var clientFactory = ImmutableCloudFoundryClientFactory.builder()
                                                              .connectTimeout(Duration.ofMinutes(5))
                                                              .responseTimeout(Duration.ofMinutes(5))
                                                              .connectionPoolSize(1)
                                                              .threadPoolSize(1)
                                                              .build();
        var oauthClient = oAuthClientFactory.createOAuthClient();
        oauthClient.init(cloudCredentials);
        spaceClient = clientFactory.createSpaceClient(configuration.getControllerUrl(), oauthClient, Collections.emptyMap());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy