X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=lighty%2Fccsdk-lighty-module%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fccsdk%2Fdistribution%2Flighty%2FCcsdkLightyApplication.java;fp=lighty%2Fccsdk-lighty-module%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fccsdk%2Fdistribution%2Flighty%2FCcsdkLightyApplication.java;h=efecb3f1b42f01bce07acf9beebb4b102f449b75;hb=e385a7a1d1934c6a3d22df3c3244678ca415134a;hp=0000000000000000000000000000000000000000;hpb=400d508da587d8c4fd5c19c15437b2fc2213c9b7;p=ccsdk%2Fdistribution.git diff --git a/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyApplication.java b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyApplication.java new file mode 100644 index 00000000..efecb3f1 --- /dev/null +++ b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyApplication.java @@ -0,0 +1,170 @@ +/* + * ============LICENSE_START========================================== + * Copyright (c) 2019 PANTHEON.tech s.r.o. + * =================================================================== + * 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. + * ============LICENSE_END============================================ + * + */ +package org.onap.ccsdk.distribution.lighty; + +import io.lighty.core.controller.api.AbstractLightyModule; +import io.lighty.core.controller.api.LightyController; +import io.lighty.core.controller.impl.LightyControllerBuilder; +import io.lighty.core.controller.impl.config.ConfigurationException; +import io.lighty.core.controller.impl.config.ControllerConfiguration; +import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConf; +import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConfBuilder; +import io.lighty.modules.northbound.restconf.community.impl.config.RestConfConfiguration; +import io.lighty.modules.northbound.restconf.community.impl.util.RestConfConfigUtils; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; +import java.util.Base64; +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; +import org.onap.ccsdk.sli.core.lighty.common.CcsdkLightyUtils; +import org.opendaylight.aaa.encrypt.AAAEncryptionService; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.config.aaa.authn.encrypt.service.config.rev160915.AaaEncryptServiceConfig; +import org.opendaylight.yang.gen.v1.config.aaa.authn.encrypt.service.config.rev160915.AaaEncryptServiceConfigBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The implementation of the {@link io.lighty.core.controller.api.LightyModule} that groups all necessary components + * needed to start the CCSDK lighty.io application. + */ +public class CcsdkLightyApplication extends AbstractLightyModule { + + private static final Logger LOG = LoggerFactory.getLogger(CcsdkLightyApplication.class); + + private ControllerConfiguration controllerConfiguration; + private RestConfConfiguration restConfConfiguration; + + private LightyController lightyController; + private CommunityRestConf communityRestConf; + private CcsdkLightyModule ccsdkLightyModule; + + public CcsdkLightyApplication(ControllerConfiguration controllerConfiguration, + RestConfConfiguration restConfConfiguration) { + this.controllerConfiguration = controllerConfiguration; + this.restConfConfiguration = restConfConfiguration; + } + + @Override + protected boolean initProcedure() { + // Start Lighty Controller with base OLD services + LightyControllerBuilder lightyControllerBuilder = new LightyControllerBuilder(); + try { + lightyController = lightyControllerBuilder.from(controllerConfiguration).build(); + } catch (ConfigurationException e) { + LOG.error("Exception thrown while starting Lighty controller!", e); + return false; + } + if (!CcsdkLightyUtils.startLightyModule(lightyController)) { + LOG.error("Unable to start Lighty controller!"); + return false; + } + + // Start RestConf + CommunityRestConfBuilder communityRestConfBuilder = new CommunityRestConfBuilder(); + communityRestConf = communityRestConfBuilder + .from(RestConfConfigUtils.getRestConfConfiguration(restConfConfiguration, + lightyController.getServices())) + .build(); + if (!CcsdkLightyUtils.startLightyModule(communityRestConf)) { + LOG.error("Unable to start RestConf!"); + return false; + } + + // Start Lighty CCSDK + AAAEncryptionService aaaEncryptionService = null; + try { + aaaEncryptionService = createAAAEncryptionService(getDefaultAaaEncryptServiceConfig()); + } catch (ConfigurationException e) { + LOG.error("Exception thrown while initializing {}!", AAAEncryptionService.class, e); + } + DataBroker dataBroker = lightyController.getServices().getControllerBindingDataBroker(); + NotificationPublishService notificationPublishService = lightyController.getServices() + .getControllerBindingNotificationPublishService(); + RpcProviderRegistry rpcProviderRegistry = lightyController.getServices().getControllerRpcProviderRegistry(); + ccsdkLightyModule = new CcsdkLightyModule(dataBroker, notificationPublishService, + rpcProviderRegistry, aaaEncryptionService); + if (!CcsdkLightyUtils.startLightyModule(ccsdkLightyModule)) { + LOG.error("Unable to start CCSDK Lighty module!"); + return false; + } + + return true; + } + + @Override + protected boolean stopProcedure() { + boolean stopSuccessful = true; + + if (!CcsdkLightyUtils.stopLightyModule(ccsdkLightyModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(communityRestConf)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(lightyController)) { + stopSuccessful = false; + } + + return stopSuccessful; + } + + private AAAEncryptionService createAAAEncryptionService(AaaEncryptServiceConfig encrySrvConfig) + throws ConfigurationException { + final byte[] encryptionKeySalt = Base64.getDecoder().decode(encrySrvConfig.getEncryptSalt()); + try { + final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(encrySrvConfig.getEncryptMethod()); + final KeySpec keySpec = new PBEKeySpec(encrySrvConfig.getEncryptKey().toCharArray(), encryptionKeySalt, + encrySrvConfig.getEncryptIterationCount(), encrySrvConfig.getEncryptKeyLength()); + SecretKey key = new SecretKeySpec(keyFactory.generateSecret(keySpec).getEncoded(), + encrySrvConfig.getEncryptType()); + IvParameterSpec ivParameterSpec = new IvParameterSpec(encryptionKeySalt); + + Cipher encryptCipher = Cipher.getInstance(encrySrvConfig.getCipherTransforms()); + encryptCipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); + + Cipher decryptCipher = Cipher.getInstance(encrySrvConfig.getCipherTransforms()); + decryptCipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec); + + return new AAAEncryptionServiceLightyImpl(encryptCipher, decryptCipher); + + } catch (NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException + | InvalidAlgorithmParameterException | InvalidKeyException e) { + throw new ConfigurationException(e); + } + } + + private AaaEncryptServiceConfig getDefaultAaaEncryptServiceConfig() { + return new AaaEncryptServiceConfigBuilder().setEncryptKey("V1S1ED4OMeEh") + .setPasswordLength(12).setEncryptSalt("TdtWeHbch/7xP52/rp3Usw==") + .setEncryptMethod("PBKDF2WithHmacSHA1").setEncryptType("AES") + .setEncryptIterationCount(32768).setEncryptKeyLength(128) + .setCipherTransforms("AES/CBC/PKCS5Padding").build(); + } +}