co.cask.cdap.logging.framework.distributed.LogSaverTwillRunnable.java Source code

Java tutorial

Introduction

Here is the source code for co.cask.cdap.logging.framework.distributed.LogSaverTwillRunnable.java

Source

/*
 * Copyright  2017 Cask Data, Inc.
 *
 * Licensed 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 co.cask.cdap.logging.framework.distributed;

import co.cask.cdap.common.conf.CConfiguration;
import co.cask.cdap.common.guice.ConfigModule;
import co.cask.cdap.common.guice.DiscoveryRuntimeModule;
import co.cask.cdap.common.guice.IOModule;
import co.cask.cdap.common.guice.KafkaClientModule;
import co.cask.cdap.common.guice.LocationRuntimeModule;
import co.cask.cdap.common.guice.ZKClientModule;
import co.cask.cdap.common.kerberos.DefaultOwnerAdmin;
import co.cask.cdap.common.kerberos.OwnerAdmin;
import co.cask.cdap.common.namespace.guice.NamespaceClientRuntimeModule;
import co.cask.cdap.common.twill.AbstractMasterTwillRunnable;
import co.cask.cdap.data.runtime.DataFabricModules;
import co.cask.cdap.data.runtime.DataSetsModules;
import co.cask.cdap.data2.audit.AuditModule;
import co.cask.cdap.logging.guice.DistributedLogFrameworkModule;
import co.cask.cdap.logging.guice.LoggingModules;
import co.cask.cdap.logging.service.LogSaverStatusService;
import co.cask.cdap.messaging.guice.MessagingClientModule;
import co.cask.cdap.metrics.guice.MetricsClientRuntimeModule;
import co.cask.cdap.security.auth.context.AuthenticationContextModules;
import co.cask.cdap.security.authorization.AuthorizationEnforcementModule;
import co.cask.cdap.security.impersonation.RemoteUGIProvider;
import co.cask.cdap.security.impersonation.UGIProvider;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.util.concurrent.Service;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Scopes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.util.ShutdownHookManager;
import org.apache.twill.api.TwillContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * Twill wrapper for running LogSaver through Twill.
 */
public final class LogSaverTwillRunnable extends AbstractMasterTwillRunnable {
    private static final Logger LOG = LoggerFactory.getLogger(LogSaverTwillRunnable.class);

    private Injector injector;

    public LogSaverTwillRunnable(String name, String cConfName, String hConfName) {
        super(name, cConfName, hConfName);
    }

    @Override
    protected Injector doInit(TwillContext context) {
        name = context.getSpecification().getName();
        injector = createGuiceInjector(getCConfiguration(), getConfiguration(), context);

        // Register shutdown hook to stop Log Saver before Hadoop Filesystem shuts down
        ShutdownHookManager.get().addShutdownHook(new Runnable() {
            @Override
            public void run() {
                LOG.info("Shutdown hook triggered.");
                stop();
            }
        }, FileSystem.SHUTDOWN_HOOK_PRIORITY + 1);

        return injector;
    }

    @Override
    protected void addServices(List<? super Service> services) {
        services.add(injector.getInstance(LogSaverStatusService.class));
        services.add(injector.getInstance(DistributedLogFramework.class));
    }

    @VisibleForTesting
    static Injector createGuiceInjector(CConfiguration cConf, Configuration hConf, TwillContext twillContext) {
        return Guice.createInjector(new ConfigModule(cConf, hConf), new IOModule(), new ZKClientModule(),
                new KafkaClientModule(), new MetricsClientRuntimeModule().getDistributedModules(),
                new DiscoveryRuntimeModule().getDistributedModules(),
                new LocationRuntimeModule().getDistributedModules(),
                new NamespaceClientRuntimeModule().getDistributedModules(),
                new DataFabricModules().getDistributedModules(), new DataSetsModules().getDistributedModules(),
                new DistributedLogFrameworkModule(twillContext), new LoggingModules().getDistributedModules(),
                new AuditModule().getDistributedModules(),
                new AuthorizationEnforcementModule().getDistributedModules(),
                new AuthenticationContextModules().getMasterModule(), new MessagingClientModule(),
                new AbstractModule() {
                    @Override
                    protected void configure() {
                        bind(OwnerAdmin.class).to(DefaultOwnerAdmin.class);
                        bind(UGIProvider.class).to(RemoteUGIProvider.class).in(Scopes.SINGLETON);
                    }
                });
    }
}