blob: b147fd1754c938156cf31a8db3a7af262c0f2e2c [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.datalab.backendapi;
import com.epam.datalab.auth.UserInfo;
import com.epam.datalab.backendapi.core.DirectoriesCreator;
import com.epam.datalab.backendapi.core.DockerWarmuper;
import com.epam.datalab.backendapi.core.response.handlers.ComputationalConfigure;
import com.epam.datalab.backendapi.modules.CloudModuleConfigurator;
import com.epam.datalab.backendapi.modules.ModuleFactory;
import com.epam.datalab.backendapi.resources.*;
import com.epam.datalab.backendapi.resources.base.KeyResource;
import com.epam.datalab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
import com.epam.datalab.cloud.CloudModule;
import com.epam.datalab.process.model.DatalabProcess;
import com.epam.datalab.rest.client.RESTService;
import com.epam.datalab.rest.mappers.JsonProcessingExceptionMapper;
import com.epam.datalab.rest.mappers.RuntimeExceptionMapper;
import com.epam.datalab.util.ServiceUtils;
import com.fasterxml.jackson.databind.InjectableValues;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.Guice;
import com.google.inject.Injector;
import de.ahus1.keycloak.dropwizard.AbstractKeycloakAuthenticator;
import de.ahus1.keycloak.dropwizard.KeycloakBundle;
import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
import de.thomaskrille.dropwizard_template_config.TemplateConfigBundle;
import de.thomaskrille.dropwizard_template_config.TemplateConfigBundleConfiguration;
import io.dropwizard.Application;
import io.dropwizard.auth.Authenticator;
import io.dropwizard.auth.Authorizer;
import io.dropwizard.forms.MultiPartBundle;
import io.dropwizard.jersey.setup.JerseyEnvironment;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import org.keycloak.KeycloakSecurityContext;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
public class ProvisioningServiceApplication extends Application<ProvisioningServiceApplicationConfiguration> {
public static void main(String[] args) throws Exception {
if (ServiceUtils.printAppVersion(ProvisioningServiceApplication.class, args)) {
return;
}
new ProvisioningServiceApplication().run(args);
}
@Override
public void initialize(Bootstrap<ProvisioningServiceApplicationConfiguration> bootstrap) {
bootstrap.addBundle(new MultiPartBundle());
bootstrap.addBundle(new TemplateConfigBundle(
new TemplateConfigBundleConfiguration().fileIncludePath(ServiceUtils.getConfPath())
));
bootstrap.addBundle(new KeycloakBundle<ProvisioningServiceApplicationConfiguration>() {
@Override
protected KeycloakConfiguration getKeycloakConfiguration(ProvisioningServiceApplicationConfiguration configuration) {
return configuration.getKeycloakConfiguration();
}
@Override
protected Class<? extends Principal> getUserClass() {
return UserInfo.class;
}
@Override
protected Authorizer createAuthorizer() {
return (Authorizer<UserInfo>) (principal, role) -> principal.getRoles().contains(role);
}
@Override
protected Authenticator createAuthenticator(KeycloakConfiguration configuration) {
class KeycloakAuthenticator extends AbstractKeycloakAuthenticator<UserInfo> {
private KeycloakAuthenticator(KeycloakConfiguration keycloakConfiguration) {
super(keycloakConfiguration);
}
@Override
protected UserInfo prepareAuthentication(KeycloakSecurityContext keycloakSecurityContext,
HttpServletRequest httpServletRequest,
KeycloakConfiguration keycloakConfiguration) {
return new UserInfo(keycloakSecurityContext.getToken().getPreferredUsername(),
keycloakSecurityContext.getIdTokenString());
}
}
return new KeycloakAuthenticator(configuration);
}
});
}
@Override
public void run(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
DatalabProcess.getInstance().setProcessTimeout(configuration.getProcessTimeout());
DatalabProcess.getInstance().setMaxProcessesPerBox(configuration.getProcessMaxThreadsPerJvm());
DatalabProcess.getInstance().setMaxProcessesPerUser(configuration.getProcessMaxThreadsPerUser());
CloudModule cloudModule = CloudModuleConfigurator.getCloudModule(configuration);
Injector injector = Guice.createInjector(ModuleFactory.getModule(configuration, environment), cloudModule);
cloudModule.init(environment, injector);
final ObjectMapper mapper = injector.getInstance(ObjectMapper.class);
final InjectableValues.Std injectableValues = new InjectableValues.Std();
injectableValues.addValue(RESTService.class, injector.getInstance(RESTService.class));
injectableValues.addValue(ComputationalConfigure.class, injector.getInstance(ComputationalConfigure.class));
mapper.setInjectableValues(injectableValues);
environment.lifecycle().manage(injector.getInstance(DirectoriesCreator.class));
if (configuration.isHandlersPersistenceEnabled()) {
environment.lifecycle().manage(injector.getInstance(RestoreCallbackHandlerServiceImpl.class));
}
environment.lifecycle().manage(injector.getInstance(DockerWarmuper.class));
JerseyEnvironment jersey = environment.jersey();
jersey.register(configuration.getCloudProvider());
jersey.register(new RuntimeExceptionMapper());
jersey.register(new JsonProcessingExceptionMapper());
jersey.register(injector.getInstance(ChangePropertiesResource.class));
jersey.register(injector.getInstance(DockerResource.class));
jersey.register(injector.getInstance(GitExploratoryResource.class));
jersey.register(injector.getInstance(LibraryResource.class));
jersey.register(injector.getInstance(InfrastructureResource.class));
jersey.register(injector.getInstance(ImageResource.class));
jersey.register(injector.getInstance(BackupResource.class));
jersey.register(injector.getInstance(KeyResource.class));
jersey.register(injector.getInstance(CallbackHandlerResource.class));
jersey.register(injector.getInstance(ProjectResource.class));
jersey.register(injector.getInstance(OdahuResource.class));
jersey.register(injector.getInstance(ProvisioningHealthCheckResource.class));
environment.jersey().register(injector.getInstance(BucketResource.class));
}
}