blob: d81e0173f127b56ce2b74267ddb1486bfd96df47 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.epam.dlab.backendapi.service.impl;
import com.epam.dlab.auth.SystemUserInfoService;
import com.epam.dlab.backendapi.dao.ComputationalDAO;
import com.epam.dlab.backendapi.dao.EnvDAO;
import com.epam.dlab.backendapi.dao.ExploratoryDAO;
import com.epam.dlab.backendapi.domain.RequestId;
import com.epam.dlab.backendapi.service.ComputationalService;
import com.epam.dlab.backendapi.service.ExploratoryService;
import com.epam.dlab.backendapi.service.InactivityService;
import com.epam.dlab.constants.ServiceConsts;
import com.epam.dlab.dto.SchedulerJobDTO;
import com.epam.dlab.dto.UserInstanceDTO;
import com.epam.dlab.dto.base.DataEngineType;
import com.epam.dlab.dto.computational.UserComputationalResource;
import com.epam.dlab.dto.status.EnvResource;
import com.epam.dlab.rest.client.RESTService;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
import static com.epam.dlab.dto.base.DataEngineType.CLOUD_SERVICE;
import static com.epam.dlab.dto.base.DataEngineType.SPARK_STANDALONE;
@Slf4j
public class InactivityServiceImpl implements InactivityService {
@Inject
private ExploratoryDAO exploratoryDAO;
@Inject
private ComputationalDAO computationalDAO;
@Inject
private EnvDAO envDAO;
@Inject
@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
private RESTService provisioningService;
@Inject
private RequestId requestId;
@Inject
private ComputationalService computationalService;
@Inject
private ExploratoryService exploratoryService;
@Inject
private SystemUserInfoService systemUserInfoService;
@Override
public void stopClustersByInactivity(List<String> computationalIds) {
exploratoryDAO.getInstancesByComputationalIdsAndStatus(computationalIds, RUNNING)
.forEach(this::stopClusters);
}
@Override
public void updateLastActivityForClusters(List<EnvResource> clusters) {
log.debug("Updating last activity date for clusters...");
clusters.forEach(r -> computationalDAO.updateLastActivityDateForInstanceId(r.getId(), r.getLastActivity()));
}
@Override
public void stopByInactivity(List<EnvResource> exploratories) {
final List<String> expIds = exploratories.stream().map(EnvResource::getId).collect(Collectors.toList());
exploratoryDAO.getInstancesByIdsAndStatus(expIds, RUNNING)
.stream()
.filter(this::shouldExploratoryBeInactivated)
.forEach(this::stopNotebook);
}
@Override
public void updateLastActivity(List<EnvResource> exploratories) {
exploratories.forEach(r -> exploratoryDAO.updateLastActivityDateForInstanceId(r.getId(), r.getLastActivity()));
}
private void stopNotebook(UserInstanceDTO ui) {
exploratoryService.stop(systemUserInfoService.create(ui.getUser()), ui.getExploratoryName());
}
private boolean shouldExploratoryBeInactivated(UserInstanceDTO ui) {
final SchedulerJobDTO schedulerData = ui.getSchedulerData();
return Objects.nonNull(schedulerData) && schedulerData.isCheckInactivityRequired() && Objects.nonNull(ui.getLastActivity()) &&
ui.getLastActivity().plusMinutes(schedulerData.getMaxInactivity()).isBefore(LocalDateTime.now());
}
private void stopClusters(UserInstanceDTO ui) {
ui.getResources().stream()
.filter(this::shouldClusterBeInactivated)
.forEach(c -> stopCluster(c, ui.getUser(), ui.getExploratoryName()));
}
private boolean shouldClusterBeInactivated(UserComputationalResource c) {
final SchedulerJobDTO schedulerData = c.getSchedulerData();
return Objects.nonNull(schedulerData) && schedulerData.isCheckInactivityRequired() &&
c.getLastActivity().plusMinutes(schedulerData.getMaxInactivity()).isBefore(LocalDateTime.now());
}
private void stopCluster(UserComputationalResource c, String user, String exploratoryName) {
final DataEngineType dataEngineType = c.getDataEngineType();
final String compName = c.getComputationalName();
if (dataEngineType == SPARK_STANDALONE) {
computationalService.stopSparkCluster(systemUserInfoService.create(user), exploratoryName, compName);
} else if (dataEngineType == CLOUD_SERVICE) {
computationalService.terminateComputational(systemUserInfoService.create(user), exploratoryName, compName);
}
}
}