2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2020 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
23 import static org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.SubscriptionAuthentication.AuthTypeEnum.BASIC;
24 import static org.slf4j.LoggerFactory.getLogger;
26 import java.security.GeneralSecurityException;
27 import java.util.ArrayList;
28 import java.util.List;
30 import java.util.Objects;
31 import java.util.Optional;
32 import org.onap.so.adapters.vnfmadapter.Constants;
33 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogServiceProvider;
34 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogUrlProvider;
35 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.BasicAuth;
36 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
37 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
38 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
39 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsLinks;
40 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
41 import org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache.PackageManagementCacheServiceProvider;
42 import org.onap.so.adapters.vnfmadapter.rest.exceptions.InternalServerErrorException;
43 import org.onap.so.adapters.vnfmadapter.rest.exceptions.SubscriptionRequestConversionException;
44 import org.onap.so.rest.service.HttpRestServiceProvider;
45 import org.onap.so.utils.CryptoUtils;
46 import org.slf4j.Logger;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.beans.factory.annotation.Value;
49 import org.springframework.core.convert.ConversionException;
50 import org.springframework.core.convert.ConversionService;
51 import org.springframework.stereotype.Service;
54 * Manages package management subscriptions from the VNFMs
56 * @author Ronan Kenny (ronan.kenny@est.tech)
57 * @author Gareth Roper (gareth.roper@est.tech)
61 public class SubscriptionManager {
63 private static final Logger logger = getLogger(SubscriptionManager.class);
64 private final PackageManagementCacheServiceProvider packageManagementCacheServiceProvider;
65 private final EtsiCatalogUrlProvider etsiCatalogUrlProvider;
66 private final HttpRestServiceProvider httpServiceProvider;
67 private final ConversionService conversionService;
68 private final EtsiCatalogServiceProvider etsiCatalogServiceProvider;
69 private final String vnfmAdapterEndpoint;
70 private final String msoKeyString;
71 private final String vnfmAdapterAuth;
75 public SubscriptionManager(final PackageManagementCacheServiceProvider packageManagementCacheServiceProvider,
76 final ConversionService conversionService, final HttpRestServiceProvider httpServiceProvider,
77 final EtsiCatalogUrlProvider etsiCatalogUrlProvider,
78 final EtsiCatalogServiceProvider etsiCatalogServiceProvider,
79 @Value("${vnfmadapter.endpoint}") final String vnfmAdapterEndpoint,
80 @Value("${mso.key}") final String msoKeyString,
81 @Value("${vnfmadapter.auth:D6CFE56451508B75536C5E8A1E7AE06D0346006A693BF29293A6E1C762EFD59C671911DB6E9294E4FE15E4C1C5524B}") final String vnfmAdapterAuth) {
82 this.packageManagementCacheServiceProvider = packageManagementCacheServiceProvider;
83 this.etsiCatalogUrlProvider = etsiCatalogUrlProvider;
84 this.conversionService = conversionService;
85 this.httpServiceProvider = httpServiceProvider;
86 this.etsiCatalogServiceProvider = etsiCatalogServiceProvider;
87 this.vnfmAdapterEndpoint = vnfmAdapterEndpoint;
88 this.vnfmAdapterAuth = vnfmAdapterAuth;
89 this.msoKeyString = msoKeyString;
92 public Optional<InlineResponse2002> createSubscription(final PkgmSubscriptionRequest pkgmSubscriptionRequest)
93 throws GeneralSecurityException {
95 final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest =
96 buildEtsiCatalogManagerPkgmSubscriptionRequest(pkgmSubscriptionRequest);
98 final Optional<PkgmSubscription> optionalEtsiCatalogManagerSubscription =
99 etsiCatalogServiceProvider.postSubscription(etsiCatalogManagerSubscriptionRequest);
101 if (optionalEtsiCatalogManagerSubscription.isPresent()) {
102 PkgmSubscription etsiCatalogManagerSubscription = optionalEtsiCatalogManagerSubscription.get();
103 logger.debug("postPkgmSubscriptionRequest Response SubscriptionId: {}",
104 Objects.requireNonNull(etsiCatalogManagerSubscription.getId().toString()));
105 final String subscriptionId = etsiCatalogManagerSubscription.getId().toString();
107 packageManagementCacheServiceProvider.addSubscription(subscriptionId, pkgmSubscriptionRequest);
109 final InlineResponse2002 response2002 = new InlineResponse2002();
110 response2002.setId(subscriptionId);
111 response2002.setFilter(pkgmSubscriptionRequest.getFilter());
112 response2002.setCallbackUri(getSubscriptionUri(subscriptionId).toString());
113 response2002.setLinks(new SubscriptionsLinks()
114 .self(new VnfPackagesLinksSelf().href(getSubscriptionUri(subscriptionId).toString())));
116 return Optional.of(response2002);
118 throw new InternalServerErrorException(
119 "Received empty response from POST to ETSI Catalog Manager Subscription Endpoint.");
124 public Optional<String> getSubscriptionId(final PkgmSubscriptionRequest pkgmSubscriptionRequest) {
125 return packageManagementCacheServiceProvider.getSubscriptionId(pkgmSubscriptionRequest);
128 public Optional<InlineResponse2002> getSubscription(final String subscriptionId) {
129 final Optional<PkgmSubscriptionRequest> optional =
130 packageManagementCacheServiceProvider.getSubscription(subscriptionId);
131 if (optional.isPresent()) {
132 final PkgmSubscriptionRequest subscription = optional.get();
133 return Optional.of(getInlineResponse2002(subscriptionId, subscription));
135 return Optional.empty();
138 public List<InlineResponse2002> getSubscriptions() {
139 final Map<String, PkgmSubscriptionRequest> subscriptions =
140 packageManagementCacheServiceProvider.getSubscriptions();
141 final List<InlineResponse2002> response = new ArrayList<>();
142 subscriptions.forEach((key, value) -> response.add(getInlineResponse2002(key, value)));
146 public URI getSubscriptionUri(final String subscriptionId) {
148 vnfmAdapterEndpoint + Constants.PACKAGE_MANAGEMENT_BASE_URL + "/subscriptions/" + subscriptionId);
151 private InlineResponse2002 getInlineResponse2002(final String id, final PkgmSubscriptionRequest subscription) {
152 return new InlineResponse2002().id(id).filter(subscription.getFilter())
153 .callbackUri(subscription.getCallbackUri());
156 private org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest buildEtsiCatalogManagerPkgmSubscriptionRequest(
157 PkgmSubscriptionRequest pkgmSubscriptionRequest) throws GeneralSecurityException {
159 final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest;
161 etsiCatalogManagerSubscriptionRequest = conversionService.convert(pkgmSubscriptionRequest,
162 org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest.class);
163 } catch (ConversionException conversionException) {
164 logger.error(conversionException.getMessage());
165 throw new SubscriptionRequestConversionException(
166 "Could not convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
167 } catch (Exception exception) {
168 logger.error(exception.getMessage());
169 throw new InternalServerErrorException(
170 "Could not convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
173 if (etsiCatalogManagerSubscriptionRequest != null) {
174 etsiCatalogManagerSubscriptionRequest
175 .setCallbackUri(vnfmAdapterEndpoint + Constants.ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL);
177 final String[] auth = decryptAuth();
178 final String username = auth[0];
179 final String password = auth[1];
181 etsiCatalogManagerSubscriptionRequest.setAuthentication(
182 new org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.SubscriptionAuthentication()
183 .addAuthTypeItem(BASIC).paramsBasic(new BasicAuth().userName(username).password(password)));
184 return etsiCatalogManagerSubscriptionRequest;
186 throw new SubscriptionRequestConversionException(
187 "Failed to convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
190 private String[] decryptAuth() throws GeneralSecurityException {
191 final String decryptedAuth = CryptoUtils.decrypt(vnfmAdapterAuth, msoKeyString);
192 final String[] auth = decryptedAuth.split(":");