DCAE-D be initial commit
[sdc/dcae-d/dt-be-main.git] / dcaedt_catalog / asdc / src / main / java / org / onap / sdc / dcae / client / SdcRestClient.java
1 package org.onap.sdc.dcae.client;
2
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.*;
25
26 import javax.annotation.PostConstruct;
27 import java.net.URI;
28 import java.util.*;
29 import java.util.stream.Collectors;
30 import java.util.stream.Stream;
31
32 @Component("sdcrestclient")
33 public class SdcRestClient implements ISdcClient {
34
35     @Autowired
36     private SystemProperties systemProperties;
37
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";
51
52     private static OnapLoggerDebug debugLogger = OnapLoggerDebug.getInstance();
53
54     private String uri;
55
56     private RestTemplate client;
57
58     @PostConstruct
59     private void init() {
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);
68     }
69
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)));
76         return headers;
77     }
78
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);
83     }
84
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);
89     }
90
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));
95     }
96
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));
101     }
102
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);
106
107         debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Connecting service id {} name {} to vfcmt {} URL={}",
108                 resource.getServiceUuid(), resource.getVfiName(), vfcmtUuid.getReferenceUUID(), url);
109
110         return client.postForObject(url, new HttpEntity<>(vfcmtUuid, postResourceHeaders(userId, requestId)),
111                 String.class);
112     }
113
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);
118     }
119
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);
124     }
125
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);
130     }
131
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);
136     }
137
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);
140     }
141
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);
146     }
147
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);
153     }
154
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);
160     }
161
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);
166     }
167
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);
173     }
174
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);
180     }
181
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);
186     }
187
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);
192     }
193
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);
198         return headers;
199     }
200
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);
205         return headers;
206     }
207
208     private HttpHeaders requestHeader(String requestId){
209         HttpHeaders headers = new HttpHeaders();
210         headers.add(ECOMP_REQUEST_ID_HEADER, requestId);
211         return headers;
212     }
213
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();
216     }
217
218     private String buildRequestPath(String... args){
219         return uri + Stream.of(args).collect(Collectors.joining(SLASH));
220     }
221 }