/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package plugin; import controllers.util.CatalogAclListener; import org.apache.commons.lang.StringUtils; import org.springframework.context.support.GenericXmlApplicationContext; import play.Logger; import play.Play; import play.PlayPlugin; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.coordinator.common.impl.ZkConnection; import com.emc.storageos.db.client.model.EncryptionProvider; import com.emc.storageos.security.authentication.AuthSvcEndPointLocator; import com.emc.storageos.security.keystore.KeyStoreExporter; import com.emc.storageos.security.validator.Validator; import com.emc.vipr.client.ViPRCoreClient; /** * Manages the connection into the Storage OS Framework */ public class StorageOsPlugin extends PlayPlugin { private static final String DEFAULT_CONTEXT_FILE = "dbclient-prod.xml"; private static StorageOsPlugin instance = null; private String version; private GenericXmlApplicationContext context; private ZkConnection zkConnection; private CoordinatorClient coordinatorClient; private EncryptionProvider encryptionProvider; private AuthSvcEndPointLocator authSvcEndPointLocator; public static StorageOsPlugin getInstance() { return instance; } public StorageOsPlugin() { // Load the version from the client version String clientVersion = ViPRCoreClient.class.getPackage().getImplementationVersion(); String version = StringUtils.defaultIfBlank(clientVersion, "dev"); version = StringUtils.substringBefore(version, " "); this.version = version.replaceAll("[^A-Za-z0-9_\\-\\.]", ""); } public String getVersion() { return version; } public static boolean isEnabled() { return "spring".equals(Play.configuration.getProperty("dbClient", "spring")); } public static String getContextFileName() { return Play.configuration.getProperty("dbClient.spring.context", DEFAULT_CONTEXT_FILE); } private String[] getContextFiles() { return new String[] { DEFAULT_CONTEXT_FILE, "portal-oss-conf.xml", "portal-emc-conf.xml" }; } /** * Called at application start (and at each reloading) Time to start stateful things. */ @Override public void onApplicationStart() { instance = this;// NOSONAR // ("Suppressing Sonar violation of Lazy initialization of static fields should be synchronized for field instance") if (!isEnabled()) { return; } try { Logger.info("Connecting to Coordinator Service"); // To using Spring profile feature context = new GenericXmlApplicationContext(); context.getEnvironment().setActiveProfiles(System.getProperty("buildType")); context.load(getContextFiles()); context.refresh(); Logger.info("Connected to Coordinator Service"); zkConnection = getBean("zkconn", ZkConnection.class); coordinatorClient = getBean("coordinator", CoordinatorClient.class); encryptionProvider = getBean("encryptionProvider", EncryptionProvider.class); authSvcEndPointLocator = getBean("authSvcEndpointLocator", AuthSvcEndPointLocator.class); Validator.setAuthSvcEndPointLocator(authSvcEndPointLocator); Validator.setCoordinator(coordinatorClient); // need reference to local-security-conf.xml to load this Validator.setStorageOSUserRepository(null); coordinatorClient.start(); encryptionProvider.start(); Logger.info("Started ViPR connection, version: %s", version); KeyStoreExporter keystoreExporter = getBean("keystoreExporter", KeyStoreExporter.class); keystoreExporter.export(); // register node listener for catalog acl change coordinatorClient.addNodeListener(new CatalogAclListener()); Logger.info("added CatalogAclListener"); } catch (Exception e) { Logger.error(e, "Error initializing ViPR Connection"); shutdown(); } } private <T> T getBean(String name, Class<T> type) { return (T) context.getBean(name, type); } private void shutdown() { Logger.error("Shutting down"); Runtime.getRuntime().halt(-1); } @Override public void onApplicationStop() { if (!isEnabled()) { return; } zkConnection.disconnect(); Logger.info("Stopped StorageOS Connection"); context.destroy(); } public CoordinatorClient getCoordinatorClient() { return coordinatorClient; } public EncryptionProvider getEncryptionProvider() { return encryptionProvider; } public AuthSvcEndPointLocator getAuthSvcEndPointLocator() { return authSvcEndPointLocator; } }