/* * Copyright (c) 2016 Cisco and/or its affiliates. * * 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 io.fd.honeycomb.infra.distro; import static com.google.inject.Guice.createInjector; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.inject.ConfigurationException; import com.google.inject.CreationException; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.ProvisionException; import com.google.inject.name.Names; import io.fd.honeycomb.data.init.DataTreeInitializer; import io.fd.honeycomb.data.init.InitializerRegistry; import io.fd.honeycomb.infra.distro.activation.ActivationModule; import io.fd.honeycomb.infra.distro.activation.ActiveModules; import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration; import io.fd.honeycomb.infra.distro.initializer.InitializerPipelineModule; import io.fd.honeycomb.infra.distro.netconf.HoneycombNotification2NetconfProvider; import io.fd.honeycomb.infra.distro.netconf.NetconfModule; import io.fd.honeycomb.infra.distro.netconf.NetconfSshServerProvider; import io.fd.honeycomb.infra.distro.netconf.NetconfTcpServerProvider; import io.fd.honeycomb.infra.distro.restconf.RestconfModule; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.netconf.sal.rest.api.RestConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class Main { private static final Logger LOG = LoggerFactory.getLogger(Main.class); private Main() { } public static void main(String[] args) { init(); } /** * Initialize the Honeycomb with provided modules */ public static Injector init() { try { LOG.info("Starting honeycomb"); final ActivationModule activationModule = new ActivationModule(); // creating child injector does not work in this case, so just create injector, and does not store ref // to it, or its active modules instance Injector injector = createInjector(ImmutableSet.builder() .add(activationModule) .addAll(createInjector(activationModule).getInstance(ActiveModules.class).createModuleInstances()) .build()); LOG.info("Honeycomb configuration: {}", injector.getInstance(HoneycombConfiguration.class)); // Log all bindings injector.getAllBindings().entrySet().stream() .forEach(e -> LOG.trace("Component available under: {} is {}", e.getKey(), e.getValue())); final HoneycombConfiguration cfgAttributes = injector.getInstance(HoneycombConfiguration.class); Preconditions.checkArgument(cfgAttributes.isRestconfEnabled() || cfgAttributes.isNetconfEnabled(), "At least one interface(Restconf|Netconf) has to be enabled for Honeycomb"); // Now get instances for all dependency roots if (cfgAttributes.isRestconfEnabled()) { LOG.info("Starting RESTCONF"); final Server server = injector.getInstance(Server.class); final RestConnector instance = injector.getInstance(RestConnector.class); if (cfgAttributes.isRestconfHttpEnabled()) { LOG.info("Starting Restconf on http"); injector.getInstance(Key.get(ServerConnector.class, Names.named(RestconfModule.RESTCONF_HTTP))); } if (cfgAttributes.isRestconfHttpsEnabled()) { LOG.info("Starting Restconf on https"); injector.getInstance(Key.get(ServerConnector.class, Names.named(RestconfModule.RESTCONF_HTTPS))); } try { server.start(); } catch (Exception e) { LOG.error("Unable to start Restconf", e); throw new InitializationException("Unable to start Restconf", e); } } if (cfgAttributes.isNetconfEnabled()) { LOG.info("Starting HONEYCOMB_NETCONF"); injector.getInstance(Key.get(NetconfOperationServiceFactory.class, Names.named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_CORE))); injector.getInstance(Key.get(NetconfOperationServiceFactory.class, Names.named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_NOTIF))); injector.getInstance(Key.get(NetconfOperationServiceFactory.class, Names.named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_OPER))); if (cfgAttributes.isNetconfTcpEnabled()) { LOG.info("Starting HONEYCOMB_NETCONF TCP"); injector.getInstance(NetconfTcpServerProvider.NetconfTcpServer.class); } if (cfgAttributes.isNetconfSshEnabled()) { LOG.info("Starting HONEYCOMB_NETCONF SSH"); injector.getInstance(NetconfSshServerProvider.NetconfSshServer.class); } injector.getInstance(HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf.class); } try { LOG.info("Initializing configuration"); injector.getInstance(Key.get(InitializerRegistry.class, Names.named(InitializerPipelineModule.HONEYCOMB_INITIALIZER))).initialize(); LOG.info("Configuration initialized successfully"); } catch (DataTreeInitializer.InitializeException e) { LOG.error("Unable to initialize configuration", e); } LOG.info("Honeycomb started successfully!"); return injector; } catch (CreationException | ProvisionException | ConfigurationException e) { LOG.error("Failed to initialize Honeycomb components", e); throw e; } catch (RuntimeException e) { LOG.error("Unexpected initialization failure", e); throw e; } finally { // Trigger gc to force collect initial garbage + dedicated classloader System.gc(); } } }