update link to upper-constraints.txt
[multicloud/framework.git] / artifactbroker / plugins / forwarding-plugins / src / main / java / org / onap / policy / distribution / forwarding / k8s / K8sArtifactForwarder.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.distribution.forwarding.k8s;
22
23 import com.google.gson.Gson;
24 import com.google.gson.GsonBuilder;
25 import com.google.gson.reflect.TypeToken;
26
27 import java.io.File;
28 import java.io.IOException;
29 import java.util.ArrayList;
30 import java.util.Collection;
31 import java.util.Collections;
32 import java.util.LinkedHashMap;
33 import java.util.List;
34 import java.util.Map;
35
36
37 import org.apache.http.HttpEntity;
38 import org.apache.http.NameValuePair;
39 import org.apache.http.client.ClientProtocolException;
40 import org.apache.http.client.entity.UrlEncodedFormEntity;
41 import org.apache.http.client.methods.CloseableHttpResponse;
42 import org.apache.http.client.methods.HttpGet;
43 import org.apache.http.client.methods.HttpPost;
44 import org.apache.http.entity.FileEntity;
45 import org.apache.http.entity.StringEntity;
46 import org.apache.http.impl.client.CloseableHttpClient;
47 import org.apache.http.impl.client.HttpClients;
48 import org.apache.http.message.BasicNameValuePair;
49 import org.apache.http.util.EntityUtils;
50
51 import org.onap.policy.common.logging.flexlogger.FlexLogger;
52 import org.onap.policy.common.logging.flexlogger.Logger;
53 import org.onap.policy.common.parameters.ParameterService;
54 import org.onap.policy.distribution.forwarding.ArtifactForwarder;
55 import org.onap.policy.distribution.model.CloudArtifact;
56 import org.onap.policy.distribution.model.PolicyInput;
57 import org.onap.policy.distribution.model.VfModuleModel;
58 import org.onap.sdc.api.notification.IArtifactInfo;
59
60
61 /**
62  * Forwards policies to the XACML PDP.
63  */
64 public class K8sArtifactForwarder implements ArtifactForwarder {
65
66     private static final Logger LOGGER = FlexLogger.getLogger(K8sArtifactForwarder.class);
67     private static final String BASE_PATH = "http://localhost:9015/v1/rb/definition";
68     private static final String CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT = "CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT";
69     private static final String HELM_ARTIFACT = "HELM";
70     private Map<String, IArtifactInfo> artifactMap;
71
72     private K8sArtifactForwarderParameterGroup configurationParameters = null;
73
74
75
76     @Override
77     public void forward(PolicyInput  policyInput) {
78         if (policyInput instanceof CloudArtifact) {
79             System.out.println("get a CloudArtifact !");
80             CloudArtifact cloudArtifact = (CloudArtifact) policyInput;
81             artifactMap = cloudArtifact.getArtifactTypeMap();
82             System.out.println("the artifactMap = " + artifactMap);
83             ArrayList<VfModuleModel> vfModuleModels = cloudArtifact.getVfModulePayload();
84             System.out.println("the size of vfModule = " + vfModuleModels.size());
85
86             for (VfModuleModel vfModule : vfModuleModels) {
87                 forwardAndUpload(vfModule);
88             }
89         } else {
90             System.out.println("NOT a CloudArtifact type !");
91             return;
92         }
93     }
94
95     private void forwardAndUpload(VfModuleModel vfModule) {
96
97         System.out.println("before create type !");
98         boolean definitionCreated = createDefinition(vfModule);
99         System.out.println(" after create type !");
100         if (definitionCreated) {
101             uploadArtifact(vfModule);
102         }
103     }
104
105     private boolean createDefinition(VfModuleModel vfModule) {
106         try {
107             HttpPost httpPost = new HttpPost(BASE_PATH);
108             httpPost.addHeader("Accept", "application/json");
109             httpPost.addHeader("Content-Type", "application/json");
110
111             Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
112                 .create();
113
114             Map<String, Object> map = new LinkedHashMap<String, Object>();
115             map.put("rb-name", vfModule.getVfModuleModelInvariantUUID());
116             map.put("rb-version", vfModule.getVfModuleModelCustomizationUUID());
117             map.put("descritpion",vfModule.getVfModuleModelDescription());
118             Map<String, String> labelMap = new LinkedHashMap<String, String>();
119             labelMap.put("vf_module_model_uuid",vfModule.getVfModuleModelUUID());
120             labelMap.put("vf_module_model_name",vfModule.getVfModuleModelName());
121             map.put("labels", labelMap);
122             String json = gson.toJson(map);
123
124             StringEntity entity = new StringEntity(json);
125             httpPost.setEntity(entity);
126             return invokeHttpPost("definition", httpPost);
127         } catch (Exception e) {
128             System.out.println("create definition error");
129             return false;
130         }
131
132     }
133
134     private boolean uploadArtifact(VfModuleModel vfModule) {
135         String url = BASE_PATH + "/" + vfModule.getVfModuleModelInvariantUUID() + "/"
136             + vfModule.getVfModuleModelCustomizationUUID() + "/content";
137         HttpPost httpPost = new HttpPost(url);
138         httpPost.addHeader("content-type", "application/x-www-form-urlencoded;charset=utf-8");
139
140         List<String> artifacts = vfModule.getArtifacts();
141         System.out.println("artifacts = " + artifacts);
142
143         String vfNamePrefix = vfModule.getVfModuleModelName().toLowerCase();
144         if ( vfNamePrefix.indexOf("..") > 0 ) {
145             vfNamePrefix = vfNamePrefix.substring(vfNamePrefix.indexOf("..") + 2);
146             if ( vfNamePrefix.indexOf("..") > 0 )
147                 vfNamePrefix = vfNamePrefix.substring(0, vfNamePrefix.indexOf("..")) + "_";
148             else
149                 vfNamePrefix = "";
150         } else
151             vfNamePrefix = "";
152
153         IArtifactInfo cloudArtifact = null;
154         IArtifactInfo firstCloudArtifact = null;
155         int cloudArtifactCount = 0;
156         boolean found = false;
157
158         for (String artifact: artifacts) {
159             if (artifactMap.get(artifact) != null
160                     && artifactMap.get(artifact).getArtifactType().equals(HELM_ARTIFACT)) {
161                 firstCloudArtifact = artifactMap.get(artifact);
162                 cloudArtifact = firstCloudArtifact;
163                 cloudArtifactCount = 1;
164                 found = true;
165                 break;
166             }
167         }
168
169         if ( found == false  )
170             for (String artifact: artifacts) {
171                 if ( artifactMap.get(artifact) != null
172                     && artifactMap.get(artifact).getArtifactType().equals(CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT)) {
173                     if ( cloudArtifactCount == 0 )
174                         firstCloudArtifact = artifactMap.get(artifact);
175                     cloudArtifactCount++;
176                     IArtifactInfo tmpArtifact = artifactMap.get(artifact);
177                     if ( tmpArtifact.getArtifactName().toLowerCase().startsWith(vfNamePrefix) ) {
178                         cloudArtifact = tmpArtifact;
179                         found = true;
180                         break;
181                     }
182                 }
183             }
184
185         if ( found == false  ) {
186             if ( firstCloudArtifact == null ) {
187                 System.out.println(" meets error , no CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT or HELM type found ");
188                 return false;
189             } else {
190                 if ( cloudArtifactCount == 1 || vfNamePrefix == "" ) {
191                     cloudArtifact = firstCloudArtifact;
192                 } else {
193                     System.out.println(" meets error , CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT artifacts mismatch ");
194                     return false;
195                 }
196             }
197         }
198
199         String cloudArtifactPath = "/data/" + vfModule.getVfModuleModelCustomizationUUID()
200             + "/" + cloudArtifact.getArtifactName();
201         File file = new File(cloudArtifactPath);
202         FileEntity entity = new FileEntity(file);
203         httpPost.setEntity(entity);
204
205         return invokeHttpPost("uploading", httpPost);
206     }
207
208
209     @Override
210     public void configure(String parameterGroupName) {
211         configurationParameters = ParameterService.get(parameterGroupName);
212     }
213
214     protected static boolean invokeHttpPost(String action, HttpPost httpPost)  {
215         System.out.println("httpPost URI: " + httpPost);
216         boolean ret = false;
217
218         String errorMsg;
219         label1: {
220             try ( CloseableHttpClient httpClient = HttpClients.createDefault() ) {
221                 System.out.println("Execute Post Body: " + EntityUtils.toString(httpPost.getEntity()));
222                 CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost);
223                 System.out.println("result2");
224                 String result = EntityUtils.toString(closeableHttpResponse.getEntity());
225                 System.out.println("result = {}" + result);
226                 System.out.println("status  = {}" + closeableHttpResponse.getStatusLine().getStatusCode());
227                 int status = closeableHttpResponse.getStatusLine().getStatusCode();
228                 // [200, 300] means pass
229                 if ( (status >=200) && (status <= 300) ) {
230                     ret = true;
231                 } else {
232                     System.out.println("exception: ret= " + status);
233                 }
234
235                 closeableHttpResponse.close();
236                 break label1;
237             } catch (IOException exp) {
238                 errorMsg = action + " :invokeHttpPost failed with: " + exp.getMessage();
239                 System.out.println("exception: POST FAILED : {}" + errorMsg);
240             }
241         }
242
243         System.out.println("httpPost end!");
244         return ret;
245     }
246
247 }