1 package org.onap.sdc.dcae.client;
3 import org.apache.commons.codec.digest.DigestUtils;
4 import org.apache.http.impl.client.CloseableHttpClient;
5 import org.apache.http.impl.client.HttpClientBuilder;
6 import org.apache.http.message.BasicHeader;
7 import org.onap.sdc.dcae.composition.restmodels.CreateVFCMTRequest;
8 import org.onap.sdc.dcae.composition.restmodels.ReferenceUUID;
9 import org.onap.sdc.dcae.composition.restmodels.sdc.*;
10 import org.onap.sdc.dcae.composition.util.DcaeBeConstants;
11 import org.onap.sdc.dcae.composition.util.SystemProperties;
12 import org.onap.sdc.dcae.enums.AssetType;
13 import org.onap.sdc.dcae.enums.SdcConsumerInfo;
14 import org.onap.sdc.dcae.utils.Normalizers;
15 import org.onap.sdc.dcae.utils.SDCResponseErrorHandler;
16 import org.onap.sdc.dcae.utils.SdcRestClientUtils;
17 import org.onap.sdc.common.onaplog.OnapLoggerDebug;
18 import org.onap.sdc.common.onaplog.Enums.LogLevel;
19 import org.springframework.beans.factory.annotation.Autowired;
20 import org.springframework.http.*;
21 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
22 import org.springframework.stereotype.Component;
23 import org.springframework.util.Base64Utils;
24 import org.springframework.web.client.*;
26 import javax.annotation.PostConstruct;
29 import java.util.stream.Collectors;
30 import java.util.stream.Stream;
32 @Component("sdcrestclient")
33 public class SdcRestClient implements ISdcClient {
36 private SystemProperties systemProperties;
38 private static final String SLASH = "/";
39 private static final String ECOMP_INSTANCE_ID_HEADER = "X-ECOMP-InstanceID";
40 private static final String ECOMP_REQUEST_ID_HEADER = "X-ECOMP-RequestID";
41 private static final String USER_ID_HEADER = "USER_ID";
42 private static final String RESOURCES_PATH = "resources";
43 private static final String SERVICES_PATH = "services";
44 private static final String ARTIFACTS_PATH = "artifacts";
45 private static final String CONTENT_MD5_HEADER = "Content-MD5";
46 private static final String RESOURCE_INSTANCES_PATH = "resourceInstances";
47 private static final String LIFECYCLE_STATE_PATH = "lifecycleState/{lifecycleOperation}";
48 private static final String METADATA_PATH = "metadata";
49 private static final String VERSION_PATH = "version";
50 private static final String MONITORING_REFERENCES_PATH = "externalReferences/monitoring";
52 private static OnapLoggerDebug debugLogger = OnapLoggerDebug.getInstance();
56 private RestTemplate client;
60 URI configUri = URI.create(systemProperties.getProperties().getProperty(DcaeBeConstants.Config.URI));
61 EnumMap<SdcConsumerInfo, String> userInfo = SdcRestClientUtils.extractConsumerInfoFromUri(configUri);
62 CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultHeaders(defaultHeaders(userInfo)).build();
63 HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
64 requestFactory.setHttpClient(httpClient);
65 client = new RestTemplate(requestFactory);
66 client.setErrorHandler(new SDCResponseErrorHandler());
67 uri = userInfo.get(SdcConsumerInfo.CATALOG_URL);
70 private List<BasicHeader> defaultHeaders(EnumMap<SdcConsumerInfo, String> userInfo) {
71 List<BasicHeader> headers = new ArrayList<>();
72 headers.add(new BasicHeader(HttpHeaders.AUTHORIZATION, userInfo.get(SdcConsumerInfo.AUTH)));
73 headers.add(new BasicHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE));
74 headers.add(new BasicHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_OCTET_STREAM_VALUE));
75 headers.add(new BasicHeader(ECOMP_INSTANCE_ID_HEADER, userInfo.get(SdcConsumerInfo.INSTANCE_ID)));
79 public ResourceDetailed getResource(String uuid, String requestId) {
80 String url = buildRequestPath(RESOURCES_PATH, uuid, METADATA_PATH);
81 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Get resource from SDC. URL={}", url);
82 return getObject(url, requestId, ResourceDetailed.class);
85 public ServiceDetailed getService(String uuid, String requestId) {
86 String url = buildRequestPath(SERVICES_PATH, uuid, METADATA_PATH);
87 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Get service from SDC. URL={}", url);
88 return getObject(url, requestId, ServiceDetailed.class);
91 public List<Resource> getResources(String resourceType, String category, String subcategory, String requestId) {
92 String url = buildRequestPath(RESOURCES_PATH, SdcRestClientUtils.buildResourceFilterQuery(resourceType, category, subcategory));
93 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Get resources from SDC. URL={}", url);
94 return Arrays.asList(getObject(url, requestId, Resource[].class));
97 public List<Service> getServices(String requestId) {
98 String url = buildRequestPath(SERVICES_PATH);
99 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Get services from SDC. URL={}", url);
100 return Arrays.asList(getObject(url, requestId, Service[].class));
103 public String addExternalMonitoringReference(String userId, CreateVFCMTRequest resource, ReferenceUUID vfcmtUuid, String requestId) {
104 String url = buildRequestPath(resource.getContextType(), resource.getServiceUuid(), RESOURCE_INSTANCES_PATH,
105 Normalizers.normalizeComponentInstanceName(resource.getVfiName()), MONITORING_REFERENCES_PATH);
107 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Connecting service id {} name {} to vfcmt {} URL={}",
108 resource.getServiceUuid(), resource.getVfiName(), vfcmtUuid.getReferenceUUID(), url);
110 return client.postForObject(url, new HttpEntity<>(vfcmtUuid, postResourceHeaders(userId, requestId)),
114 public void deleteExternalMonitoringReference(String userId, String context, String uuid, String normalizeVfiName, String vfcmtUuid, String requestId) {
115 String url = buildRequestPath(context, uuid, RESOURCE_INSTANCES_PATH,
116 normalizeVfiName, MONITORING_REFERENCES_PATH, vfcmtUuid);
117 client.exchange(url, HttpMethod.DELETE, new HttpEntity(postResourceHeaders(userId, requestId)), String.class);
120 public ResourceDetailed createResource(String userId, CreateVFCMTRequest resource, String requestId) {
121 String url = buildRequestPath(RESOURCES_PATH);
122 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Create SDC resource with name {} URL={}", resource.getName(), url);
123 return client.postForObject(url, new HttpEntity<>(resource, postResourceHeaders(userId, requestId)), ResourceDetailed.class);
126 public ResourceDetailed changeResourceLifecycleState(String userId, String uuid, String lifecycleOperation, String userRemarks, String requestId) {
127 String url = buildRequestPath(RESOURCES_PATH, uuid, LIFECYCLE_STATE_PATH);
128 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Change SDC resource lifecycle state ({}). URL={}", lifecycleOperation, url);
129 return client.postForObject(url, new HttpEntity<>(SdcRestClientUtils.buildUserRemarksObject(userRemarks), postResourceHeaders(userId, requestId)), ResourceDetailed.class, lifecycleOperation);
132 public ServiceDetailed changeServiceLifecycleState(String userId, String uuid, String lifecycleOperation, String userRemarks, String requestId) {
133 String url = buildRequestPath(SERVICES_PATH, uuid, LIFECYCLE_STATE_PATH);
134 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Change SDC service lifecycle state ({}). URL={}", lifecycleOperation, url);
135 return client.postForObject(url, new HttpEntity<>(SdcRestClientUtils.buildUserRemarksObject(userRemarks), postResourceHeaders(userId, requestId)), ServiceDetailed.class, lifecycleOperation);
138 public Asset changeAssetLifecycleState(String userId, String uuid, String lifecycleOperation, String userRemarks, AssetType assetType, String requestId) {
139 return AssetType.RESOURCE == assetType ? changeResourceLifecycleState(userId, uuid, lifecycleOperation, userRemarks, requestId) : changeServiceLifecycleState(userId, uuid, lifecycleOperation, userRemarks, requestId);
142 public String getResourceArtifact(String resourceUuid, String artifactUuid, String requestId) {
143 String url = buildRequestPath(RESOURCES_PATH, resourceUuid, ARTIFACTS_PATH, artifactUuid);
144 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Get resource artifact from SDC. URL={}", url);
145 return getObject(url, requestId, String.class);
148 public Artifact createResourceArtifact(String userId, String resourceUuid, Artifact artifact, String requestId) throws Exception {
149 String url = buildRequestPath(RESOURCES_PATH, resourceUuid, ARTIFACTS_PATH);
150 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Create SDC resource artifact. URL={}", url);
151 String artifactData = SdcRestClientUtils.artifactToString(artifact);
152 return client.postForObject(url, new HttpEntity<>(artifactData, postArtifactHeaders(userId, artifactData, requestId)), Artifact.class);
155 public Artifact updateResourceArtifact(String userId, String resourceUuid, Artifact artifact, String requestId) throws Exception {
156 String url = buildRequestPath(RESOURCES_PATH, resourceUuid, ARTIFACTS_PATH, artifact.getArtifactUUID());
157 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Update SDC resource artifact. URL={}", url);
158 String artifactData = SdcRestClientUtils.artifactToString(artifact);
159 return client.postForObject(url, new HttpEntity<>(artifactData, postArtifactHeaders(userId, artifactData, requestId)), Artifact.class);
162 public void deleteResourceArtifact(String userId, String resourceUuid, String artifactId, String requestId) {
163 String url = buildRequestPath(RESOURCES_PATH, resourceUuid, ARTIFACTS_PATH, artifactId);
164 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Delete SDC resource artifact. URL={}", url);
165 client.exchange(url, HttpMethod.DELETE, new HttpEntity(postResourceHeaders(userId, requestId)), Artifact.class);
168 public Artifact createVfInstanceArtifact(String userId, String serviceUuid, String normalizedInstanceName, Artifact artifact, String requestId) throws Exception {
169 String url = buildRequestPath(SERVICES_PATH, serviceUuid, RESOURCE_INSTANCES_PATH, normalizedInstanceName, ARTIFACTS_PATH);
170 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Create SDC resource instance artifact. URL={}", url);
171 String artifactData = SdcRestClientUtils.artifactToString(artifact);
172 return client.postForObject(url, new HttpEntity<>(artifactData, postArtifactHeaders(userId, artifactData, requestId)), Artifact.class);
175 public Artifact updateVfInstanceArtifact(String userId, String serviceUuid, String normalizedInstanceName, Artifact artifact, String requestId) throws Exception {
176 String url = buildRequestPath(SERVICES_PATH, serviceUuid, RESOURCE_INSTANCES_PATH, normalizedInstanceName, ARTIFACTS_PATH, artifact.getArtifactUUID());
177 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Update SDC resource instance artifact. URL={}", url);
178 String artifactData = SdcRestClientUtils.artifactToString(artifact);
179 return client.postForObject(url, new HttpEntity<>(artifactData, postArtifactHeaders(userId, artifactData, requestId)), Artifact.class);
182 public ExternalReferencesMap getMonitoringReferences(String context, String uuid, String version, String requestId) {
183 String url = buildRequestPath(context, uuid, VERSION_PATH, version, MONITORING_REFERENCES_PATH);
184 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Get SDC service monitoring references. URL={}", url);
185 return getObject(url, requestId, ExternalReferencesMap.class);
188 public void deleteInstanceResourceArtifact(String userId, String context, String serviceUuid, String normalizedVfiName, String artifactUuid, String requestId) {
189 String url = buildRequestPath(context, serviceUuid, RESOURCE_INSTANCES_PATH, normalizedVfiName, ARTIFACTS_PATH, artifactUuid);
190 debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Delete SDC instance resource artifact. URL={}", url);
191 client.exchange(url, HttpMethod.DELETE, new HttpEntity(postResourceHeaders(userId, requestId)), Artifact.class);
194 private HttpHeaders postResourceHeaders(String userId, String requestId) {
195 HttpHeaders headers = requestHeader(requestId);
196 headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
197 headers.add(USER_ID_HEADER, userId);
201 private HttpHeaders postArtifactHeaders(String userId, String artifact, String requestId) {
202 HttpHeaders headers = postResourceHeaders(userId, requestId);
203 String md5 = Base64Utils.encodeToString(DigestUtils.md5Hex(artifact).getBytes());
204 headers.add(CONTENT_MD5_HEADER, md5);
208 private HttpHeaders requestHeader(String requestId){
209 HttpHeaders headers = new HttpHeaders();
210 headers.add(ECOMP_REQUEST_ID_HEADER, requestId);
214 private <T> T getObject(String url, String requestId, Class<T> clazz) {
215 return client.exchange(url, HttpMethod.GET, new HttpEntity<>(requestHeader(requestId)), clazz).getBody();
218 private String buildRequestPath(String... args){
219 return uri + Stream.of(args).collect(Collectors.joining(SLASH));