diff options
58 files changed, 5663 insertions, 151 deletions
diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java index b1911654c4..6c1c81c6ef 100644 --- a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java +++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java @@ -65,6 +65,9 @@ public class QueryServiceInfo extends CatalogQuery { @Override public String JSON2(boolean isArray, boolean isEmbed) { + if (serviceInfo == null) { + return "\"serviceInfo\": null"; + } StringBuilder sb = new StringBuilder(); sb.append("\"serviceInfo\": "); sb.append("\n"); @@ -73,8 +76,8 @@ public class QueryServiceInfo extends CatalogQuery { put(valueMap, "ID", null == serviceInfo ? null : serviceInfo.getId()); put(valueMap, "SERVICE_INPUT", null == serviceInfo ? null : serviceInfo.getServiceInput()); put(valueMap, "SERVICE_PROPERTIES", null == serviceInfo ? null : serviceInfo.getServiceProperties()); - // String subitem = new QueryServiceArtifact(service.getServiceArtifactList()).JSON2(true, true); - // valueMap.put("_SERVICEARTIFACT_", subitem.replaceAll("(?m)^", "\t\t"));m + String subitem = new QueryServiceArtifact(service.getServiceArtifactList()).JSON2(true, true); + valueMap.put("_SERVICEARTIFACT_", subitem.replaceAll("(?m)^", "\t\t")); sb.append(this.setTemplate(TEMPLATE, valueMap)); sb.append("}"); return sb.toString(); diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java index 0eb7d0418e..d5aa472c8d 100644 --- a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java +++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java @@ -40,7 +40,7 @@ public class QueryServiceMacroHolder extends CatalogQuery { + "\t\"serviceType\" : <SERVICE_TYPE>,\n" + "\t\"serviceRole\" : <SERVICE_ROLE>,\n" + "\t\"environmentContext\" : <ENVIRONMENT_CONTEXT>,\n" + "\t\"resourceOrder\" : <RESOURCE_ORDER>,\n" + "\t\"workloadContext\" : <WORKLOAD_CONTEXT>,\n" + "<_SERVICEVNFS_>,\n" + "<_SERVICENETWORKS_>,\n" - + "<_SERVICEALLOTTEDRESOURCES_>\n" + "\t}}"; + + "<_SERVICEINFO_>,\n" + "<_SERVICEPROXY_>,\n" + "<_SERVICEALLOTTEDRESOURCES_>\n" + "\t}}"; public QueryServiceMacroHolder() { super(); @@ -94,6 +94,12 @@ public class QueryServiceMacroHolder extends CatalogQuery { subitem = new QueryAllottedResourceCustomization(service.getAllottedCustomizations()).JSON2(true, true); valueMap.put("_SERVICEALLOTTEDRESOURCES_", subitem.replaceAll(LINE_BEGINNING, "\t")); + subitem = new QueryServiceInfo(serviceMacroHolder.getServiceInfo()).JSON2(true, true); + valueMap.put("_SERVICEINFO_", subitem.replaceAll(LINE_BEGINNING, "\t")); + + subitem = new QueryServiceProxyCustomization(service.getServiceProxyCustomizations()).JSON2(true, true); + valueMap.put("_SERVICEPROXY_", subitem.replaceAll(LINE_BEGINNING, "\t")); + buf.append(this.setTemplate(TEMPLATE, valueMap)); return buf.toString(); } diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceProxyCustomization.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceProxyCustomization.java new file mode 100644 index 0000000000..94cf304120 --- /dev/null +++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceProxyCustomization.java @@ -0,0 +1,124 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (c) 2019, CMCC Technologies Co., Ltd. + * ================================================================================ + * 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.so.adapters.catalogdb.catalogrest; + +import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@XmlRootElement(name = "serviceProxyCustomizations") +public class QueryServiceProxyCustomization extends CatalogQuery { + + protected static Logger logger = LoggerFactory.getLogger(QueryServiceProxyCustomization.class); + + private List<ServiceProxyResourceCustomization> serviceProxyResourceCustomizationList; + + private static final String TEMPLATE = + "\t{\n" + "\t\t\"modelInfo\" : {\n" + "\t\t\t\"modelName\" : <MODEL_NAME>,\n" + + "\t\t\t\"modelUuid\" : <MODEL_UUID>,\n" + + "\t\t\t\"modelInvariantUuid\" : <MODEL_INVARIANT_UUID>,\n" + + "\t\t\t\"modelVersion\" : <MODEL_VERSION>,\n" + + "\t\t\t\"modelCustomizationUuid\" : <MODEL_CUSTOMIZATION_UUID>,\n" + + "\t\t\t\"modelInstanceName\" : <MODEL_INSTANCE_NAME>\n" + "\t},\n" + + "\t\t\"toscaNodeType\" : <TOSCA_NODE_TYPE>,\n" + + "\t\t\"description\" : <DESCRIPTION>,\n" + + "\t\t\"sourceModelUuid\" : <SOURCE_SERVICE_MODEL_UUID>\n" + "\t}"; + + public QueryServiceProxyCustomization() { + super(); + this.serviceProxyResourceCustomizationList = new ArrayList<>(); + } + + public QueryServiceProxyCustomization( + List<ServiceProxyResourceCustomization> serviceProxyResourceCustomizationList) { + this.serviceProxyResourceCustomizationList = serviceProxyResourceCustomizationList; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + boolean first = true; + int i = 1; + for (ServiceProxyResourceCustomization o : serviceProxyResourceCustomizationList) { + sb.append(i).append("\t"); + if (!first) + sb.append("\n"); + + first = false; + sb.append(o); + } + return sb.toString(); + } + + @Override + public String JSON2(boolean isArray, boolean isEmbed) { + StringBuilder sb = new StringBuilder(); + if (!isEmbed && isArray) + sb.append("{ "); + if (isArray) + sb.append("\"serviceProxy\": ["); + Map<String, String> valueMap = new HashMap<>(); + String sep = ""; + boolean first = true; + + if (this.serviceProxyResourceCustomizationList != null) { + for (ServiceProxyResourceCustomization o : serviceProxyResourceCustomizationList) { + if (first) + sb.append("\n"); + + first = false; + + boolean arNull = o == null; + + put(valueMap, "MODEL_CUSTOMIZATION_UUID", arNull ? null : o.getModelCustomizationUUID()); + put(valueMap, "MODEL_INSTANCE_NAME", arNull ? null : o.getModelInstanceName()); + put(valueMap, "MODEL_UUID", arNull ? null : o.getModelUUID()); + put(valueMap, "MODEL_INVARIANT_UUID", arNull ? null : o.getModelInvariantUUID()); + put(valueMap, "MODEL_VERSION", arNull ? null : o.getModelVersion()); + put(valueMap, "MODEL_NAME", arNull ? null : o.getModelName()); + put(valueMap, "TOSCA_NODE_TYPE", arNull ? null : o.getToscaNodeType()); + put(valueMap, "DESCRIPTION", arNull ? null : o.getDescription()); + put(valueMap, "SOURCE_SERVICE_MODEL_UUID", (String) (arNull ? null + : o.getSourceService() == null ? null : o.getSourceService().getModelUUID())); + + sb.append(sep).append(this.setTemplate(TEMPLATE, valueMap)); + sep = ",\n"; + } + } + if (!first) + sb.append("\n"); + + if (isArray) + sb.append("]"); + + if (!isEmbed && isArray) + sb.append("}"); + + return sb.toString(); + } + +} diff --git a/adapters/mso-nssmf-adapter/src/main/resources/META-INF/services/org.onap.so.client.RestProperties b/adapters/mso-nssmf-adapter/src/main/resources/META-INF/services/org.onap.so.client.RestProperties new file mode 100644 index 0000000000..f93ec63f37 --- /dev/null +++ b/adapters/mso-nssmf-adapter/src/main/resources/META-INF/services/org.onap.so.client.RestProperties @@ -0,0 +1 @@ +org.onap.so.adapters.nssmf.extclients.aai.AaiClientPropertiesImpl
\ No newline at end of file diff --git a/adapters/mso-nssmf-adapter/src/main/resources/application.yaml b/adapters/mso-nssmf-adapter/src/main/resources/application.yaml new file mode 100644 index 0000000000..cb2f04d7ec --- /dev/null +++ b/adapters/mso-nssmf-adapter/src/main/resources/application.yaml @@ -0,0 +1,61 @@ +# +# ============LICENSE_START======================================================= +# ONAP - SO +# ================================================================================ +# Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. +# ================================================================================ +# 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========================================================= +#/ +aai: + auth: 2A11B07DB6214A839394AA1EC5844695F5114FC407FF5422625FB00175A3DCB8A1FF745F22867EFA72D5369D599BBD88DA8BED4233CF5586 + endpoint: https://aai.onap:30233 +logging: + path: logs + +spring: + datasource: + driver-class-name: org.mariadb.jdbc.Driver + jdbcUrl: jdbc:mariadb://192.168.235.44:30444/requestdb + username: root + password: secretpassword + + jpa: + show-sql: false + hibernate: + dialect: org.hibernate.dialect.MySQL5Dialect + ddl-auto: validate + naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy + enable-lazy-load-no-trans: true +server: + port: 8080 + tomcat: + max-threads: 50 + +mso: + key: 07a7159d3bf51a0e53be7a8f89699be7 + site-name: localSite + logPath: ./logs/nssmf + msb-ip: msb-iag.{{ include "common.namespace" . }} + msb-port: 80 + adapters: + requestDb: + endpoint: https://so-request-db-adapter.{{ include "common.namespace" . }}:8083 + auth: Basic YnBlbDpwYXNzd29yZDEk + +#Actuator +management: + security: + enabled: false + basic: + enabled: false
\ No newline at end of file diff --git a/adapters/mso-nssmf-adapter/src/main/resources/nssmf.jks b/adapters/mso-nssmf-adapter/src/main/resources/nssmf.jks Binary files differnew file mode 100644 index 0000000000..2ecce5bd3d --- /dev/null +++ b/adapters/mso-nssmf-adapter/src/main/resources/nssmf.jks diff --git a/adapters/mso-nssmf-adapter/src/main/resources/nssmf.p12 b/adapters/mso-nssmf-adapter/src/main/resources/nssmf.p12 Binary files differnew file mode 100644 index 0000000000..25e7fbfca9 --- /dev/null +++ b/adapters/mso-nssmf-adapter/src/main/resources/nssmf.p12 diff --git a/adapters/mso-nssmf-adapter/src/main/resources/org.onap.so.jks b/adapters/mso-nssmf-adapter/src/main/resources/org.onap.so.jks Binary files differnew file mode 100644 index 0000000000..f7cd9e8f86 --- /dev/null +++ b/adapters/mso-nssmf-adapter/src/main/resources/org.onap.so.jks diff --git a/adapters/mso-nssmf-adapter/src/main/resources/org.onap.so.p12 b/adapters/mso-nssmf-adapter/src/main/resources/org.onap.so.p12 Binary files differnew file mode 100644 index 0000000000..1927b1f13f --- /dev/null +++ b/adapters/mso-nssmf-adapter/src/main/resources/org.onap.so.p12 diff --git a/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/NssmfAdapterRestTest.java b/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/NssmfAdapterRestTest.java new file mode 100644 index 0000000000..5bfd39096c --- /dev/null +++ b/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/NssmfAdapterRestTest.java @@ -0,0 +1,392 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.adapters.nssmf; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.LinkedList; +import java.util.List; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpRequestBase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.onap.so.adapters.nssmf.model.TokenResponse; +import org.onap.so.adapters.nssmf.rest.HttpMethod; +import org.onap.so.adapters.nssmf.rest.NssmfAdapterRest; +import org.onap.so.adapters.nssmf.rest.NssmfInfo; +import org.onap.so.adapters.nssmf.rest.NssmfManager; +import org.onap.so.adapters.nssmf.rest.RestUtil; +import org.onap.so.beans.nsmf.ActDeActNssi; +import org.onap.so.beans.nsmf.AllocateCnNssi; +import org.onap.so.beans.nsmf.CnSliceProfile; +import org.onap.so.beans.nsmf.DeAllocateNssi; +import org.onap.so.beans.nsmf.EsrInfo; +import org.onap.so.beans.nsmf.JobStatusRequest; +import org.onap.so.beans.nsmf.NsiInfo; +import org.onap.so.beans.nsmf.NssiActDeActRequest; +import org.onap.so.beans.nsmf.NssiAllocateRequest; +import org.onap.so.beans.nsmf.NssiDeAllocateRequest; +import org.onap.so.beans.nsmf.NssiResponse; +import org.onap.so.beans.nsmf.PerfReq; +import org.onap.so.beans.nsmf.PerfReqEmbbList; +import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; +import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal; +import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.unMarshal; +import static org.onap.so.beans.nsmf.NetworkType.CORE; +import static org.onap.so.beans.nsmf.ResourceSharingLevel.NON_SHARED; + +@RunWith(SpringRunner.class) +public class NssmfAdapterRestTest { + + private final static String ALLOCATE = "{\n" + " \"esrInfo\" : {\n" + " \"vendor\" : \"huawei\",\n" + + " \"networkType\" : \"cn\"\n" + " },\n" + " \"allocateCnNssi\" : {\n" + + " \"nssiId\" : \"NSST-C-001-HDBNJ-NSSMF-01-A-ZX\",\n" + " \"nssiName\" : \"eMBB-001\",\n" + + " \"sliceProfile\" : {\n" + " \"snssaiList\" : [ \"001-100001\" ],\n" + + " \"sliceProfileId\" : \"ab9af40f13f721b5f13539d87484098\",\n" + + " \"plmnIdList\" : [ \"460-00\", \"460-01\" ],\n" + " \"perfReq\" : {\n" + + " \"perfReqEmbbList\" : [ {\n" + " \"activityFactor\" : 50\n" + " } ]\n" + + " },\n" + " \"maxNumberofUEs\" : 200,\n" + + " \"coverageAreaTAList\" : [ \"1\", \"2\", \"3\" ],\n" + " \"latency\" : 6,\n" + + " \"resourceSharingLevel\" : \"non-shared\"\n" + " },\n" + " \"scriptName\" : \"CN1\",\n" + + " \"nsiInfo\" : {\n" + " \"nsiName\" : \"eMBB-001\",\n" + + " \"nsiId\" : \"NSI-M-001-HDBNJ-NSMF-01-A-ZX\"\n" + " }\n" + " }\n" + "}"; + + private NssmfManager nssmfMgr; + + @Mock + private ResourceOperationStatusRepository rscOperStatusRepo; + + @Mock + private RestUtil restUtil; + + @Mock + private NssmfAdapterRest nssmfRest; + + @Mock + private HttpResponse tokenResponse; + + @Mock + private HttpEntity tokenEntity; + + @Mock + private HttpResponse commonResponse; + + @Mock + private HttpEntity commonEntity; + + @Mock + private StatusLine statusLine; + + @Mock + private HttpClient httpClient; + + private InputStream postStream; + + private InputStream tokenStream; + + @Before + public void setUp() { + initMocks(this); + nssmfMgr = new NssmfManager(); + nssmfMgr.setRestUtil(restUtil); + nssmfMgr.setRscOperStatusRepo(rscOperStatusRepo); + } + + private void createCommonMock(int statusCode, NssmfInfo nssmf) throws Exception { + when(nssmfRest.getNssmfMgr()).thenReturn(nssmfMgr); + when(nssmfRest.allocateNssi(any(NssiAllocateRequest.class))).thenCallRealMethod(); + when(nssmfRest.deAllocateNssi(any(NssiDeAllocateRequest.class), any(String.class))).thenCallRealMethod(); + when(nssmfRest.activateNssi(any(NssiActDeActRequest.class), any(String.class))).thenCallRealMethod(); + when(nssmfRest.deactivateNssi(any(NssiActDeActRequest.class), any(String.class))).thenCallRealMethod(); + + when(nssmfRest.queryJobStatus(any(JobStatusRequest.class), any(String.class))).thenCallRealMethod(); + when(restUtil.sendRequest(any(String.class), any(HttpMethod.class), any(String.class), any(EsrInfo.class))) + .thenCallRealMethod(); + when(restUtil.getHttpsClient()).thenReturn(httpClient); + + when(statusLine.getStatusCode()).thenReturn(200); + when(restUtil.getNssmfHost(any(EsrInfo.class))).thenReturn(nssmf); + + when(tokenResponse.getEntity()).thenReturn(tokenEntity); + when(tokenResponse.getStatusLine()).thenReturn(statusLine); + when(tokenEntity.getContent()).thenReturn(tokenStream); + + when(commonResponse.getEntity()).thenReturn(commonEntity); + when(commonResponse.getStatusLine()).thenReturn(statusLine); + when(commonEntity.getContent()).thenReturn(postStream); + + Answer<HttpResponse> answer = new Answer<HttpResponse>() { + + public HttpResponse answer(InvocationOnMock invocation) throws Throwable { + Object[] arguments = invocation.getArguments(); + if (arguments != null && arguments.length == 1 && arguments[0] != null) { + + HttpRequestBase base = (HttpRequestBase) arguments[0]; + if (base.getURI().toString().endsWith("/oauth/token")) { + return tokenResponse; + } else { + return commonResponse; + } + } + return commonResponse; + } + }; + doAnswer(answer).when(httpClient).execute(any(HttpRequestBase.class)); + } + + @Test + public void testNssiAllocate() throws Exception { + NssmfInfo nssmf = new NssmfInfo(); + nssmf.setUserName("nssmf-user"); + nssmf.setPassword("nssmf-pass"); + nssmf.setPort("8080"); + nssmf.setIpAddress("127.0.0.1"); + + NssiResponse nssiRes = new NssiResponse(); + nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067"); + nssiRes.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX"); + + TokenResponse token = new TokenResponse(); + token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39"); + token.setExpires(1800); + + postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8)); + tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8)); + + createCommonMock(200, nssmf); + // assertEquals(prettyPrint(allocateNssi()), ALLOCATE); + ResponseEntity res = nssmfRest.allocateNssi(allocateNssi()); + assertNotNull(res); + assertNotNull(res.getBody()); + NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class); + assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067"); + assertEquals(allRes.getNssiId(), "NSSI-C-001-HDBNJ-NSSMF-01-A-ZX"); + } + + @Test + public void testNssiDeAllocate() throws Exception { + NssmfInfo nssmf = new NssmfInfo(); + nssmf.setUserName("nssmf-user"); + nssmf.setPassword("nssmf-pass"); + nssmf.setPort("8080"); + nssmf.setIpAddress("127.0.0.1"); + + NssiResponse nssiRes = new NssiResponse(); + nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067"); + + TokenResponse token = new TokenResponse(); + token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39"); + token.setExpires(1800); + + postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8)); + tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8)); + + createCommonMock(200, nssmf); + ResponseEntity res = nssmfRest.deAllocateNssi(deAllocateNssi(), "ab9af40f13f721b5f13539d87484098"); + assertNotNull(res); + assertNotNull(res.getBody()); + NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class); + assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067"); + } + + @Test + public void testNssiActivate() throws Exception { + NssmfInfo nssmf = new NssmfInfo(); + nssmf.setUserName("nssmf-user"); + nssmf.setPassword("nssmf-pass"); + nssmf.setPort("8080"); + nssmf.setIpAddress("127.0.0.1"); + + NssiResponse nssiRes = new NssiResponse(); + nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067"); + + TokenResponse token = new TokenResponse(); + token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39"); + token.setExpires(1800); + + postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8)); + tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8)); + + createCommonMock(200, nssmf); + ResponseEntity res = nssmfRest.activateNssi(activateNssi(), "001-100001"); + assertNotNull(res); + assertNotNull(res.getBody()); + NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class); + assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067"); + } + + @Test + public void testNssiDeActivate() throws Exception { + NssmfInfo nssmf = new NssmfInfo(); + nssmf.setUserName("nssmf-user"); + nssmf.setPassword("nssmf-pass"); + nssmf.setPort("8080"); + nssmf.setIpAddress("127.0.0.1"); + + NssiResponse nssiRes = new NssiResponse(); + nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067"); + + TokenResponse token = new TokenResponse(); + token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39"); + token.setExpires(1800); + + postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8)); + tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8)); + + createCommonMock(200, nssmf); + ResponseEntity res = nssmfRest.deactivateNssi(deActivateNssi(), "001-100001"); + assertNotNull(res); + assertNotNull(res.getBody()); + NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class); + assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067"); + } + + @Test + public void testAllocateJsonSerDeSer() throws Exception { + assertEquals(marshal(allocateNssi()), ALLOCATE); + NssiAllocateRequest all = unMarshal(ALLOCATE, NssiAllocateRequest.class); + assertNotNull(all); + assertNotNull(all.getAllocateCnNssi()); + assertNotNull(all.getAllocateCnNssi().getSliceProfile()); + assertEquals(all.getAllocateCnNssi().getSliceProfile().getResourceSharingLevel(), NON_SHARED); + assertNotNull(all.getAllocateCnNssi().getSliceProfile().getPerfReq()); + assertNotNull(all.getAllocateCnNssi().getSliceProfile().getPerfReq().getPerfReqEmbbList()); + PerfReqEmbbList embb = + all.getAllocateCnNssi().getSliceProfile().getPerfReq().getPerfReqEmbbList().iterator().next(); + assertNotNull(embb); + assertEquals(embb.getActivityFactor(), 50); + } + + public NssiAllocateRequest allocateNssi() throws Exception { + CnSliceProfile sP = new CnSliceProfile(); + List<String> sns = new LinkedList<>(); + sns.add("001-100001"); + List<String> plmn = new LinkedList<>(); + plmn.add("460-00"); + plmn.add("460-01"); + PerfReqEmbbList embb = new PerfReqEmbbList(); + embb.setActivityFactor(50); + List<PerfReqEmbbList> embbList = new LinkedList<>(); + embbList.add(embb); + PerfReq perfReq = new PerfReq(); + perfReq.setPerfReqEmbbList(embbList); + List<String> taList = new LinkedList<>(); + taList.add("1"); + taList.add("2"); + taList.add("3"); + sP.setSnssaiList(sns); + sP.setSliceProfileId("ab9af40f13f721b5f13539d87484098"); + sP.setPlmnIdList(plmn); + sP.setPerfReq(perfReq); + sP.setMaxNumberofUEs(200); + sP.setCoverageAreaTAList(taList); + sP.setLatency(6); + sP.setResourceSharingLevel(NON_SHARED); + NsiInfo nsiInfo = new NsiInfo(); + nsiInfo.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX"); + nsiInfo.setNsiName("eMBB-001"); + AllocateCnNssi cnNssi = new AllocateCnNssi(); + cnNssi.setNssiId("NSST-C-001-HDBNJ-NSSMF-01-A-ZX"); + cnNssi.setNssiName("eMBB-001"); + cnNssi.setScriptName("CN1"); + cnNssi.setSliceProfile(sP); + cnNssi.setNsiInfo(nsiInfo); + EsrInfo esrInfo = new EsrInfo(); + esrInfo.setVendor("huawei"); + esrInfo.setNetworkType(CORE); + NssiAllocateRequest allocate = new NssiAllocateRequest(); + allocate.setAllocateCnNssi(cnNssi); + allocate.setEsrInfo(esrInfo); + return allocate; + } + + public NssiDeAllocateRequest deAllocateNssi() throws Exception { + DeAllocateNssi deAllocateNssi = new DeAllocateNssi(); + deAllocateNssi.setTerminateNssiOption(0); + List<String> snssai = new LinkedList<>(); + snssai.add("001-100001"); + deAllocateNssi.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX"); + deAllocateNssi.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX"); + deAllocateNssi.setScriptName("CN1"); + deAllocateNssi.setSnssaiList(snssai); + EsrInfo esrInfo = new EsrInfo(); + esrInfo.setVendor("huawei"); + esrInfo.setNetworkType(CORE); + NssiDeAllocateRequest deAllocate = new NssiDeAllocateRequest(); + deAllocate.setDeAllocateNssi(deAllocateNssi); + deAllocate.setEsrInfo(esrInfo); + return deAllocate; + } + + public NssiActDeActRequest activateNssi() throws Exception { + EsrInfo esrInfo = new EsrInfo(); + esrInfo.setVendor("huawei"); + esrInfo.setNetworkType(CORE); + ActDeActNssi act = new ActDeActNssi(); + act.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX"); + act.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX"); + NssiActDeActRequest actReq = new NssiActDeActRequest(); + actReq.setActDeActNssi(act); + actReq.setEsrInfo(esrInfo); + return actReq; + } + + public NssiActDeActRequest deActivateNssi() throws Exception { + EsrInfo esrInfo = new EsrInfo(); + esrInfo.setVendor("huawei"); + esrInfo.setNetworkType(CORE); + ActDeActNssi deAct = new ActDeActNssi(); + deAct.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX"); + deAct.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX"); + NssiActDeActRequest deActReq = new NssiActDeActRequest(); + deActReq.setActDeActNssi(deAct); + deActReq.setEsrInfo(esrInfo); + return deActReq; + } + + public String queryJobStatusNssi() throws Exception { + EsrInfo esrInfo = new EsrInfo(); + esrInfo.setVendor("huawei"); + esrInfo.setNetworkType(CORE); + + JobStatusRequest jobStatus = new JobStatusRequest(); + jobStatus.setEsrInfo(esrInfo); + jobStatus.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX"); + jobStatus.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX"); + return marshal(jobStatus); + } +} diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java index c9d4f4d92f..e084cfec18 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java @@ -39,6 +39,9 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.List; import java.util.Optional; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.toscaparser.api.elements.Metadata; +import org.onap.so.asdc.util.ZipParser; import org.onap.so.logger.LoggingAnchor; import org.onap.logging.ref.slf4j.ONAPLogConstants; import org.onap.sdc.api.IDistributionClient; @@ -737,6 +740,7 @@ public class ASDCController { protected void processResourceNotification(INotificationData iNotif) { // For each artifact, create a structure describing the VFModule in a ordered flat level + ResourceStructure resourceStructure = null; String msoConfigPath = getMsoConfigPath(); ToscaResourceStructure toscaResourceStructure = new ToscaResourceStructure(msoConfigPath); DistributionStatusEnum deployStatus = DistributionStatusEnum.DEPLOY_OK; @@ -748,8 +752,8 @@ public class ASDCController { if (isCsarAlreadyDeployed(iNotif, toscaResourceStructure)) { return; } - - ResourceStructure resourceStructure = null; + // process NsstResource + this.processNsstNotification(iNotif, toscaResourceStructure); for (IResourceInstance resource : iNotif.getResources()) { String resourceType = resource.getResourceType(); @@ -914,6 +918,23 @@ public class ASDCController { "processCsarServiceArtifacts", ErrorCode.BusinessProcessError.getValue(), "Exception in processCsarServiceArtifacts", e); } + } else if (artifact.getArtifactType().equals(ASDCConfiguration.OTHER)) { + try { + IDistributionClientDownloadResult resultArtifact = + this.downloadTheArtifact(artifact, iNotif.getDistributionID()); + + writeArtifactToFile(artifact, resultArtifact); + + toscaResourceStructure.setToscaArtifact(artifact); + + toscaResourceStructure.setServiceVersion(iNotif.getServiceVersion()); + + } catch (ASDCDownloadException e) { + logger.error(LoggingAnchor.SIX, MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(), + "Exception caught during processCsarServiceArtifacts", "ASDC", + "processCsarServiceArtifacts", ErrorCode.BusinessProcessError.getValue(), + "Exception in processCsarServiceArtifacts", e); + } } @@ -940,4 +961,38 @@ public class ASDCController { } return UNKNOWN; } + + private void processNsstNotification(INotificationData iNotif, ToscaResourceStructure toscaResourceStructure) { + Metadata serviceMetadata = toscaResourceStructure.getServiceMetadata(); + try { + if (serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY).equalsIgnoreCase("NSST")) { + + String artifactContent = null; + List<IArtifactInfo> serviceArtifacts = iNotif.getServiceArtifacts(); + Optional<IArtifactInfo> artifactOpt = serviceArtifacts.stream() + .filter(e -> e.getArtifactType().equalsIgnoreCase("OTHER")).findFirst(); + if (artifactOpt.isPresent()) { + IArtifactInfo artifactInfo = artifactOpt.get(); + logger.debug("Ready to parse this serviceArtifactUUID: " + artifactInfo.getArtifactUUID()); + String filePath = Paths.get(getMsoConfigPath(), "ASDC", artifactInfo.getArtifactVersion(), + artifactInfo.getArtifactName()).normalize().toString(); + ZipParser zipParserInstance = ZipParser.getInstance(); + artifactContent = zipParserInstance.parseJsonForZip(filePath); + logger.debug( + "serviceArtifact parsing success! serviceArtifactUUID: " + artifactInfo.getArtifactUUID()); + } else { + logger.debug("serviceArtifact is null"); + } + ResourceStructure resourceStructure = new VfResourceStructure(iNotif, new ResourceInstance()); + resourceStructure.setResourceType(ResourceType.OTHER); + toscaInstaller.installTheNsstService(toscaResourceStructure, (VfResourceStructure) resourceStructure, + artifactContent); + } + } catch (IOException e) { + logger.error("serviceArtifact parse failure for service uuid: " + + serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY)); + } catch (Exception e) { + logger.error("error NSST process resource failure ", e); + } + } } diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java index 263118d1b3..3175839725 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java @@ -54,6 +54,7 @@ import org.onap.sdc.tosca.parser.enums.EntityTemplateType; import org.onap.sdc.tosca.parser.enums.SdcTypes; import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; import org.onap.sdc.toscaparser.api.CapabilityAssignment; +import org.onap.sdc.toscaparser.api.NodeTemplate; import org.onap.sdc.toscaparser.api.Property; import org.onap.sdc.toscaparser.api.RequirementAssignment; import org.onap.sdc.toscaparser.api.elements.Metadata; @@ -74,64 +75,8 @@ import org.onap.so.asdc.installer.VfModuleStructure; import org.onap.so.asdc.installer.VfResourceStructure; import org.onap.so.asdc.installer.bpmn.WorkflowResource; import org.onap.so.asdc.util.YamlEditor; -import org.onap.so.db.catalog.beans.AllottedResource; -import org.onap.so.db.catalog.beans.AllottedResourceCustomization; -import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization; -import org.onap.so.db.catalog.beans.CollectionResource; -import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization; -import org.onap.so.db.catalog.beans.ConfigurationResource; -import org.onap.so.db.catalog.beans.ConfigurationResourceCustomization; -import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization; -import org.onap.so.db.catalog.beans.CvnfcCustomization; -import org.onap.so.db.catalog.beans.HeatEnvironment; -import org.onap.so.db.catalog.beans.HeatFiles; -import org.onap.so.db.catalog.beans.HeatTemplate; -import org.onap.so.db.catalog.beans.HeatTemplateParam; -import org.onap.so.db.catalog.beans.InstanceGroup; -import org.onap.so.db.catalog.beans.InstanceGroupType; -import org.onap.so.db.catalog.beans.NetworkCollectionResourceCustomization; -import org.onap.so.db.catalog.beans.NetworkInstanceGroup; -import org.onap.so.db.catalog.beans.NetworkResource; -import org.onap.so.db.catalog.beans.NetworkResourceCustomization; -import org.onap.so.db.catalog.beans.PnfResource; -import org.onap.so.db.catalog.beans.PnfResourceCustomization; -import org.onap.so.db.catalog.beans.Service; -import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization; -import org.onap.so.db.catalog.beans.SubType; -import org.onap.so.db.catalog.beans.TempNetworkHeatTemplateLookup; -import org.onap.so.db.catalog.beans.ToscaCsar; -import org.onap.so.db.catalog.beans.VFCInstanceGroup; -import org.onap.so.db.catalog.beans.VfModule; -import org.onap.so.db.catalog.beans.VfModuleCustomization; -import org.onap.so.db.catalog.beans.VnfResource; -import org.onap.so.db.catalog.beans.VnfResourceCustomization; -import org.onap.so.db.catalog.beans.VnfcCustomization; -import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization; -import org.onap.so.db.catalog.data.repository.AllottedResourceCustomizationRepository; -import org.onap.so.db.catalog.data.repository.AllottedResourceRepository; -import org.onap.so.db.catalog.data.repository.CollectionResourceCustomizationRepository; -import org.onap.so.db.catalog.data.repository.CollectionResourceRepository; -import org.onap.so.db.catalog.data.repository.ConfigurationResourceCustomizationRepository; -import org.onap.so.db.catalog.data.repository.ConfigurationResourceRepository; -import org.onap.so.db.catalog.data.repository.CvnfcCustomizationRepository; -import org.onap.so.db.catalog.data.repository.ExternalServiceToInternalServiceRepository; -import org.onap.so.db.catalog.data.repository.HeatEnvironmentRepository; -import org.onap.so.db.catalog.data.repository.HeatFilesRepository; -import org.onap.so.db.catalog.data.repository.HeatTemplateRepository; -import org.onap.so.db.catalog.data.repository.InstanceGroupRepository; -import org.onap.so.db.catalog.data.repository.NetworkResourceCustomizationRepository; -import org.onap.so.db.catalog.data.repository.NetworkResourceRepository; -import org.onap.so.db.catalog.data.repository.PnfCustomizationRepository; -import org.onap.so.db.catalog.data.repository.PnfResourceRepository; -import org.onap.so.db.catalog.data.repository.ServiceProxyResourceCustomizationRepository; -import org.onap.so.db.catalog.data.repository.ServiceRepository; -import org.onap.so.db.catalog.data.repository.TempNetworkHeatTemplateRepository; -import org.onap.so.db.catalog.data.repository.ToscaCsarRepository; -import org.onap.so.db.catalog.data.repository.VFModuleCustomizationRepository; -import org.onap.so.db.catalog.data.repository.VFModuleRepository; -import org.onap.so.db.catalog.data.repository.VnfResourceRepository; -import org.onap.so.db.catalog.data.repository.VnfcCustomizationRepository; -import org.onap.so.db.catalog.data.repository.VnfcInstanceGroupCustomizationRepository; +import org.onap.so.db.catalog.beans.*; +import org.onap.so.db.catalog.data.repository.*; import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus; import org.onap.so.db.request.beans.WatchdogDistributionStatus; import org.onap.so.db.request.beans.WatchdogServiceModVerIdLookup; @@ -271,6 +216,9 @@ public class ToscaResourceInstaller { protected PnfCustomizationRepository pnfCustomizationRepository; @Autowired + protected ServiceInfoRepository serviceInfoRepository; + + @Autowired protected WorkflowResource workflowResource; @Autowired @@ -445,6 +393,7 @@ public class ToscaResourceInstaller { createToscaCsar(toscaResourceStruct); createService(toscaResourceStruct, vfResourceStruct); Service service = toscaResourceStruct.getCatalogService(); + ServiceInfo serviceInfo = createServiceInfo(toscaResourceStruct, service); List<IEntityDetails> vfEntityList = getEntityDetails(toscaResourceStruct, EntityQuery.newBuilder(SdcTypes.VF), TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE), false); @@ -474,8 +423,9 @@ public class ToscaResourceInstaller { processServiceProxyAndConfiguration(toscaResourceStruct, service); logger.info("Saving Service: {} ", service.getModelName()); - service = serviceRepo.save(service); - correlateConfigCustomResources(service); + ServiceInfo serviceResult = serviceInfoRepository.save(serviceInfo); + Service resultService = serviceResult.getService(); + correlateConfigCustomResources(resultService); workflowResource.processWorkflows(vfResourceStructure); @@ -2912,5 +2862,122 @@ public class ToscaResourceInstaller { return new Timestamp(new Date().getTime()); } + private String getServiceInput(ToscaResourceStructure toscaResourceStructure) { + String serviceInput = null; + + List<Object> serviceInputList; + ISdcCsarHelper sdcCsarHelper = toscaResourceStructure.getSdcCsarHelper(); + List<Input> serviceInputs = sdcCsarHelper.getServiceInputs(); + if (!serviceInputs.isEmpty()) { + serviceInputList = new ArrayList<>(); + serviceInputs.forEach(input -> { + Map<String, Object> serviceInputMap = new HashMap<>(); + serviceInputMap.put("name", input.getName()); + serviceInputMap.put("type", input.getType()); + serviceInputMap.put("default", input.getDefault() == null ? "" : input.getDefault()); + serviceInputMap.put("required", input.isRequired()); + serviceInputList.add(serviceInputMap); + + }); + ObjectMapper objectMapper = new ObjectMapper(); + try { + serviceInput = objectMapper.writeValueAsString(serviceInputList); + serviceInput = serviceInput.replace("\"", "\\\""); + } catch (JsonProcessingException e) { + logger.error("service input could not be deserialized for service uuid: " + + sdcCsarHelper.getServiceMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)); + } + } else { + logger.debug("serviceInput is null"); + } + return serviceInput; + } + + @Transactional(rollbackFor = {ArtifactInstallerException.class}) + public void installTheNsstService(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStruct, + String artifactContent) { + createToscaCsar(toscaResourceStruct); + createService(toscaResourceStruct, vfResourceStruct); + Service service = toscaResourceStruct.getCatalogService(); + ServiceInfo serviceInfo = createServiceInfo(toscaResourceStruct, service); + createServiceArtifact(service, vfResourceStruct, artifactContent); + serviceInfoRepository.save(serviceInfo); + } + + private void createServiceArtifact(Service service, VfResourceStructure vfResourceStruct, String artifactContent) { + List<ServiceArtifact> serviceArtifactList = new ArrayList<>(); + ServiceArtifact serviceArtifact; + List<IArtifactInfo> artifactInfoList = vfResourceStruct.getNotification().getServiceArtifacts().stream() + .filter(artifact -> artifact.getArtifactType().equalsIgnoreCase("OTHER")).collect(Collectors.toList()); + for (IArtifactInfo artifactInfo : artifactInfoList) { + serviceArtifact = new ServiceArtifact(); + serviceArtifact.setArtifactUUID(artifactInfo.getArtifactUUID()); + serviceArtifact.setName(artifactInfo.getArtifactName()); + serviceArtifact.setType(artifactInfo.getArtifactType()); + serviceArtifact.setVersion(artifactInfo.getArtifactVersion()); + serviceArtifact.setDescription(artifactInfo.getArtifactDescription()); + serviceArtifact.setChecksum(artifactInfo.getArtifactChecksum()); + serviceArtifact.setContent(artifactContent); + serviceArtifact.setService(service); + serviceArtifactList.add(serviceArtifact); + } + service.setServiceArtifactList(serviceArtifactList); + } + + private ServiceInfo createServiceInfo(ToscaResourceStructure toscaResourceStruct, Service service) { + ServiceInfo serviceInfo = new ServiceInfo(); + String serviceInput = getServiceInput(toscaResourceStruct); + serviceInfo.setServiceInput(serviceInput); + + String serviceProperties = getServiceProperties(toscaResourceStruct); + serviceInfo.setServiceProperties(serviceProperties); + + serviceInfo.setService(service); + return serviceInfo; + } + + private String getServiceProperties(ToscaResourceStructure toscaResourceStruct) { + String propertiesJson = null; + ObjectMapper objectMapper = new ObjectMapper(); + ISdcCsarHelper helper = toscaResourceStruct.getSdcCsarHelper(); + String typeName = helper.getServiceSubstitutionMappingsTypeName(); + Optional<NodeTemplate> nodeTemplate = helper.getServiceNodeTemplates().stream().findAny(); + List<Object> serviceProperties = new ArrayList<>(); + Map<String, Object> servicePropertiesMap; + if (nodeTemplate.isPresent()) { + LinkedHashMap<String, Object> customDef = nodeTemplate.get().getCustomDef(); + Optional<String> machKey = + customDef.keySet().stream().filter(key -> key.equalsIgnoreCase(typeName)).findFirst(); + if (machKey.isPresent()) { + Object obj = customDef.get(machKey.get()); + try { + if (obj instanceof Map) { + Object properties = ((HashMap) obj).get("properties"); + if (null != properties) { + for (Object propertyName : ((Map) properties).keySet()) { + servicePropertiesMap = new HashMap<>(); + servicePropertiesMap.put("name", propertyName); + Object object = ((Map) properties).get(propertyName); + for (Object entry : ((Map) object).entrySet()) { + servicePropertiesMap.put((String) ((Map.Entry) entry).getKey(), + ((Map.Entry) entry).getValue()); + } + servicePropertiesMap.remove("description"); + serviceProperties.add(servicePropertiesMap); + } + propertiesJson = objectMapper.writeValueAsString(serviceProperties); + propertiesJson = propertiesJson.replace("\"", "\\\""); + } + } + } catch (JsonProcessingException e) { + logger.error("serviceProperties could not be deserialized for service uuid: " + + nodeTemplate.get().getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)); + } + } + } else { + logger.debug("ServiceNodeTemplates is null"); + } + return propertiesJson; + } } diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/util/ZipParser.java b/asdc-controller/src/main/java/org/onap/so/asdc/util/ZipParser.java new file mode 100644 index 0000000000..c2f04dca7b --- /dev/null +++ b/asdc-controller/src/main/java/org/onap/so/asdc/util/ZipParser.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (c) 2019, CMCC Technologies Co., Ltd. + * ================================================================================ + * 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.so.asdc.util; + +import java.io.*; +import java.nio.charset.Charset; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; + +public class ZipParser { + + private static volatile ZipParser instance; + + public static ZipParser getInstance() { + if (instance == null) { + synchronized (ZipParser.class) { + if (instance == null) { + instance = new ZipParser(); + } + } + } + return instance; + } + + public String parseJsonForZip(String path) throws IOException { + ZipFile zf = new ZipFile(path); + InputStream in = new BufferedInputStream(new FileInputStream(path)); + Charset cs = Charset.forName("utf-8"); + ZipInputStream zin = new ZipInputStream(in, cs); + ZipEntry ze; + String artifactContent = null; + while ((ze = zin.getNextEntry()) != null) { + if (ze.toString().endsWith("json")) { + StringBuilder jsonStr = new StringBuilder(); + BufferedReader br = new BufferedReader(new InputStreamReader(zf.getInputStream(ze))); + String line; + while ((line = br.readLine()) != null) { + jsonStr.append(line); + } + br.close(); + artifactContent = jsonStr.toString().replace("\"", "\\\"").replaceAll("\\s", ""); + } + } + zin.closeEntry(); + return artifactContent; + } + +} diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java index c25c4c2828..b8a2d01b49 100644 --- a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java +++ b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java @@ -75,19 +75,8 @@ import org.onap.so.asdc.installer.ToscaResourceStructure; import org.onap.so.asdc.installer.VfModuleStructure; import org.onap.so.asdc.installer.VfResourceStructure; import org.onap.so.asdc.installer.bpmn.WorkflowResource; -import org.onap.so.db.catalog.beans.ConfigurationResource; -import org.onap.so.db.catalog.beans.ConfigurationResourceCustomization; -import org.onap.so.db.catalog.beans.Service; -import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization; -import org.onap.so.db.catalog.beans.ToscaCsar; -import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization; -import org.onap.so.db.catalog.data.repository.ConfigurationResourceCustomizationRepository; -import org.onap.so.db.catalog.data.repository.InstanceGroupRepository; -import org.onap.so.db.catalog.data.repository.ServiceRepository; -import org.onap.so.db.catalog.data.repository.ToscaCsarRepository; -import org.onap.so.db.catalog.data.repository.VFModuleRepository; -import org.onap.so.db.catalog.data.repository.VnfResourceRepository; -import org.onap.so.db.catalog.data.repository.VnfcInstanceGroupCustomizationRepository; +import org.onap.so.db.catalog.beans.*; +import org.onap.so.db.catalog.data.repository.*; import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus; import org.onap.so.db.request.data.repository.WatchdogComponentDistributionStatusRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -325,8 +314,6 @@ public class ToscaResourceInstallerTest extends BaseTest { notificationData.setServiceUUID("serviceUUID1"); notificationData.setWorkloadContext("workloadContext1"); - - String serviceType = "test-type1"; String serviceRole = "test-role1"; String category = "Network L3+"; @@ -356,6 +343,7 @@ public class ToscaResourceInstallerTest extends BaseTest { doReturn(resourceCustomizationUUID).when(metadata).getValue("vfModuleModelCustomizationUUID"); ServiceRepository serviceRepo = spy(ServiceRepository.class); + ServiceInfoRepository serviceInfoRepo = spy(ServiceInfoRepository.class); VnfResourceRepository vnfRepo = spy(VnfResourceRepository.class); doReturn(null).when(vnfRepo).findResourceByModelUUID(uuid); @@ -366,6 +354,7 @@ public class ToscaResourceInstallerTest extends BaseTest { WorkflowResource workflowResource = spy(WorkflowResource.class); ReflectionTestUtils.setField(toscaInstaller, "serviceRepo", serviceRepo); + ReflectionTestUtils.setField(toscaInstaller, "serviceInfoRepository", serviceInfoRepo); ReflectionTestUtils.setField(toscaInstaller, "vnfRepo", vnfRepo); ReflectionTestUtils.setField(toscaInstaller, "vfModuleRepo", vfModuleRepo); ReflectionTestUtils.setField(toscaInstaller, "instanceGroupRepo", instanceGroupRepo); @@ -436,7 +425,10 @@ public class ToscaResourceInstallerTest extends BaseTest { assertNotNull(service); service.setModelVersion("1.0"); + ServiceInfo serviceInfo = new ServiceInfo(); + serviceInfo.setService(service); doReturn(service).when(serviceRepo).save(service); + doReturn(serviceInfo).when(serviceInfoRepo).save(any(ServiceInfo.class)); WatchdogComponentDistributionStatusRepository watchdogCDStatusRepository = spy(WatchdogComponentDistributionStatusRepository.class); diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.java b/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.java index 53d163a5bc..02c0f2dbf7 100644 --- a/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.java +++ b/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.java @@ -7,9 +7,9 @@ * 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. diff --git a/asdc-controller/src/test/resources/schema.sql b/asdc-controller/src/test/resources/schema.sql index 0821ebc97c..d051d1a56c 100644 --- a/asdc-controller/src/test/resources/schema.sql +++ b/asdc-controller/src/test/resources/schema.sql @@ -1378,6 +1378,34 @@ CREATE TABLE IF NOT EXISTS `activity_spec_to_user_parameters` ( ENGINE = InnoDB DEFAULT CHARACTER SET = latin1; +CREATE TABLE IF NOT EXISTS `service_info` ( + `ID` int (11) AUTO_INCREMENT, + `SERVICE_INPUT` varchar (5000), + `SERVICE_PROPERTIES` varchar (5000), + PRIMARY KEY (`ID`) +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE IF NOT EXISTS `service_artifact`( + `ARTIFACT_UUID` varchar (200) NOT NULL, + `TYPE` varchar (200) NOT NULL, + `NAME` varchar (200) NOT NULL, + `VERSION` varchar (200) NOT NULL, + `DESCRIPTION` varchar (200) DEFAULT NULL, + `CONTENT` LONGTEXT DEFAULT NULL, + `CHECKSUM` varchar (200) DEFAULT NULL, + `CREATION_TIMESTAMP` DATETIME DEFAULT CURRENT_TIMESTAMP, + `SERVICE_MODEL_UUID` varchar (200) NOT NULL, + PRIMARY KEY (`ARTIFACT_UUID`), + CONSTRAINT `fk_service_artifact_service_info1` FOREIGN KEY (`SERVICE_MODEL_UUID`) REFERENCES `service` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE IF NOT EXISTS `service_to_service_info` ( + `SERVICE_MODEL_UUID` varchar (200) NOT NULL, + `SERVICE_INFO_ID` INT (11) NOT NULL, + PRIMARY KEY (`SERVICE_MODEL_UUID`,`SERVICE_INFO_ID`), + CONSTRAINT `fk_service_to_service_info__service1` FOREIGN KEY (`SERVICE_MODEL_UUID`) REFERENCES `service` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_service_to_service_info__service_info1` FOREIGN KEY (`SERVICE_INFO_ID`) REFERENCES `service_info` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=latin1; --------START Request DB SCHEMA -------- CREATE DATABASE requestdb; diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/SDNCLcmPropertiesImpl.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/SDNCLcmPropertiesImpl.java new file mode 100644 index 0000000000..eb2567d47c --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/SDNCLcmPropertiesImpl.java @@ -0,0 +1,117 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.restproperties; + +import java.net.MalformedURLException; +import java.net.URL; +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.onap.so.client.sdnc.common.SDNCConstants; +import org.onap.so.client.sdnc.lcm.SDNCLcmProperties; + +public class SDNCLcmPropertiesImpl implements SDNCLcmProperties { + + public static final String SDNC_HOST = "sdnc.host"; + public static final String SDNC_AUTH = "sdnc.auth"; + public static final String LCM_PATH = "sdnc.lcm.path"; + + public static final String DMAAP_HOST = "sdnc.dmaap.host"; + public static final String DMAAP_AUTH = "sdnc.dmaap.auth"; + public static final String DMAAP_PARTITION = "sdnc.dmaap.partition"; + public static final String DMAAP_TIMEOUT = "sdnc.dmaap.timeout"; + public static final String DMAAP_ENVIRONMENT = "sdnc.dmaap.environment"; + public static final String LCM_DMAAP_READ_TOPIC = "sdnc.lcm.dmapp.readTopic"; + public static final String LCM_DMAAP_WRITE_TOPIC = "sdnc.lcm.dmaap.writeTopic"; + + public static final String MSO_KEY = "mso.msoKey"; + + public SDNCLcmPropertiesImpl() {} + + @Override + public String getHost() { + return UrnPropertiesReader.getVariable(SDNC_HOST); + } + + @Override + public String getPath() { + String path = UrnPropertiesReader.getVariable(LCM_PATH); + return (path != null) ? path : SDNCConstants.LCM_API_BASE_PATH; + } + + @Override + public String getBasicAuth() { + return UrnPropertiesReader.getVariable(SDNC_AUTH); + } + + @Override + public String getDmaapHost() { + return UrnPropertiesReader.getVariable(DMAAP_HOST); + } + + @Override + public String getDmaapAuth() { + return UrnPropertiesReader.getVariable(DMAAP_AUTH); + } + + @Override + public String getDmaapPartition() { + String partition = UrnPropertiesReader.getVariable(DMAAP_PARTITION); + return (partition != null) ? partition : SDNCConstants.LCM_DMAAP_PARTITION; + } + + @Override + public String getDmaapTimeout() { + String timeout = UrnPropertiesReader.getVariable(DMAAP_TIMEOUT); + return (timeout != null) ? timeout : SDNCConstants.LCM_DMAAP_TIMEOUT; + } + + @Override + public String getDmaapEnvironment() { + String environment = UrnPropertiesReader.getVariable(DMAAP_ENVIRONMENT); + return (environment != null) ? environment : SDNCConstants.LCM_DMAAP_ENVIRONMENT; + } + + @Override + public String getDmaaPLcmReadTopic() { + String readTopic = UrnPropertiesReader.getVariable(LCM_DMAAP_READ_TOPIC); + return (readTopic != null) ? readTopic : SDNCConstants.LCM_DMAAP_READ_TOPIC; + } + + @Override + public String getDmaaPLcmWriteTopic() { + String writeTopic = UrnPropertiesReader.getVariable(LCM_DMAAP_WRITE_TOPIC); + return (writeTopic != null) ? writeTopic : SDNCConstants.LCM_DMAAP_WRITE_TOPIC; + } + + @Override + public String getKey() { + return UrnPropertiesReader.getVariable(MSO_KEY); + } + + @Override + public URL getEndpoint() throws MalformedURLException { + return new URL(getHost()); + } + + @Override + public String getSystemName() { + return SDNCConstants.SYSTEM_NAME; + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/common/SDNCConstants.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/common/SDNCConstants.java new file mode 100644 index 0000000000..fd9412e70e --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/common/SDNCConstants.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.common; + +public interface SDNCConstants { + String SYSTEM_NAME = "MSO"; + + String LCM_API_VER = "2.00"; + + String LCM_FLAGS_MODE_NORMAL = "NORMAL"; + String LCM_FLAGS_MODE_EXCLUSIVE = "EXCLUSIVE"; + + String LCM_FLAGS_FORCE_TRUE = "TRUE"; + String LCM_FLAGS_FORCE_FALSE = "FALSE"; + + int LCM_FLAGS_TTL = 65000; + + String LCM_API_BASE_PATH = "/restconf/operations/LCM:"; + + String LCM_DMAAP_MSG_VER = "1.0"; + String LCM_DMAAP_MSG_TYPE_REQUEST = "request"; + String LCM_DMAAP_MSG_TYPE_RESPONSE = "response"; + + String LCM_DMAAP_PARTITION = "MSOLCM"; + String LCM_DMAAP_TIMEOUT = "20000"; + String LCM_DMAAP_ENVIRONMENT = "TEST"; + String LCM_DMAAP_READ_TOPIC = "SDNC-LCM-WRITE"; + String LCM_DMAAP_WRITE_TOPIC = "SDNC-LCM-READ"; + + int LCM_TIMEOUT = 300; +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilder.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilder.java new file mode 100644 index 0000000000..5616db3577 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilder.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import java.net.URI; +import org.onap.so.client.RestPropertiesLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SDNCLcmClientBuilder { + + private static Logger logger = LoggerFactory.getLogger(SDNCLcmClientBuilder.class); + + private final SDNCLcmProperties sdncLcmProperties; + + public SDNCLcmClientBuilder() { + sdncLcmProperties = RestPropertiesLoader.getInstance().getNewImpl(SDNCLcmProperties.class); + } + + public SDNCLcmClientBuilder(SDNCLcmProperties pros) { + sdncLcmProperties = pros; + } + + public SDNCLcmRestClient newSDNCLcmRestClient(String operation) throws SDNCLcmClientBuilderException { + URI pathUri; + try { + String path = sdncLcmProperties.getPath() + operation; + pathUri = new URI(path); + logger.debug("SDNC host: " + sdncLcmProperties.getHost()); + logger.debug("SDNC API path: " + pathUri.getPath()); + } catch (Exception e) { + String msg = "Error API path syntax: "; + logger.error(msg, e); + throw new SDNCLcmClientBuilderException(msg + e.toString()); + } + + try { + SDNCLcmRestClient sdncLcmRestClient = new SDNCLcmRestClient(sdncLcmProperties, pathUri); + logger.debug("Create SDNCLcmRestClient success"); + return sdncLcmRestClient; + } catch (Exception e) { + String msg = "Create SDNCLcmRestClient failure: "; + logger.error(msg, e); + throw new SDNCLcmClientBuilderException(msg + e.toString()); + } + } + + public SDNCLcmDmaapClient newSDNCLcmDmaapClient() throws SDNCLcmClientBuilderException { + try { + SDNCLcmDmaapClient sdncLcmDmaapClient = new SDNCLcmDmaapClient(sdncLcmProperties); + logger.debug("Create SDNCLcmDmaapClient success"); + return sdncLcmDmaapClient; + } catch (Exception e) { + String msg = "Create SDNCLcmDmaapClient failure: "; + logger.error(msg, e); + throw new SDNCLcmClientBuilderException(msg + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilderException.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilderException.java new file mode 100644 index 0000000000..9160d4e352 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilderException.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +public class SDNCLcmClientBuilderException extends Exception { + + private static final long serialVersionUID = -1525705272349747712L; + + public SDNCLcmClientBuilderException(String message) { + super(message); + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClient.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClient.java new file mode 100644 index 0000000000..f6e4ffce59 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClient.java @@ -0,0 +1,90 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.onap.so.client.sdnc.lcm.beans.LcmDmaapRequest; +import org.onap.so.client.sdnc.lcm.beans.LcmDmaapResponse; +import org.onap.so.client.dmaap.rest.RestPublisher; +import org.onap.so.client.dmaap.rest.RestConsumer; + +public class SDNCLcmDmaapClient { + + private static Logger logger = LoggerFactory.getLogger(SDNCLcmDmaapClient.class); + + private RestPublisher dmaapPublisher; + private RestConsumer dmaapConsumer; + + public SDNCLcmDmaapClient(SDNCLcmProperties sdncLcmProperties) { + Properties properties = new Properties(); + + properties.put("host", sdncLcmProperties.getDmaapHost()); + if (sdncLcmProperties.getDmaapAuth() != null && sdncLcmProperties.getKey() != null) { + properties.put("auth", sdncLcmProperties.getDmaapAuth()); + properties.put("key", sdncLcmProperties.getKey()); + } + properties.put("partition", sdncLcmProperties.getDmaapPartition()); + properties.put("timeout", sdncLcmProperties.getDmaapTimeout()); + properties.put("environment", sdncLcmProperties.getDmaapEnvironment()); + + properties.put("topic", sdncLcmProperties.getDmaaPLcmWriteTopic()); + dmaapPublisher = new RestPublisher(properties); + + properties.put("topic", sdncLcmProperties.getDmaaPLcmReadTopic()); + dmaapConsumer = new RestConsumer(properties); + } + + public void sendRequest(LcmDmaapRequest lcmDmaapRequest) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + String lcmRestRequestString = mapper.writeValueAsString(lcmDmaapRequest); + + dmaapPublisher.send(lcmRestRequestString); + } + + public Iterable<String> fetch() { + return dmaapConsumer.fetch(); + } + + public List<LcmDmaapResponse> getResponse() { + List<LcmDmaapResponse> responseList = new ArrayList<>(); + + ObjectMapper mapper = new ObjectMapper(); + Iterable<String> itrString = dmaapConsumer.fetch(); + for (String message : itrString) { + LcmDmaapResponse lcmDmaapResponse; + try { + lcmDmaapResponse = mapper.readValue(message, LcmDmaapResponse.class); + } catch (Exception e) { + logger.warn("Invalid SDNC LCM DMaaP response: " + message); + continue; + } + + responseList.add(lcmDmaapResponse); + } + + return responseList; + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilder.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilder.java new file mode 100644 index 0000000000..bf1229a310 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilder.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import java.time.Instant; +import org.onap.so.client.sdnc.common.SDNCConstants; +import org.onap.so.client.sdnc.lcm.beans.*; + +public class SDNCLcmMessageBuilder { + + public static LcmFlags getSDNCFlags() { + LcmFlags lcmFlags = new LcmFlags(); + + lcmFlags.setMode(SDNCConstants.LCM_FLAGS_MODE_NORMAL); + lcmFlags.setForce(SDNCConstants.LCM_FLAGS_FORCE_FALSE); + lcmFlags.setTtl(SDNCConstants.LCM_FLAGS_TTL); + + return lcmFlags; + } + + public static LcmCommonHeader buildLcmCommonHeader(String requestId, String subRequestId) { + LcmCommonHeader lcmCommonHeader = new LcmCommonHeader(); + + lcmCommonHeader.setApiVer(SDNCConstants.LCM_API_VER); + lcmCommonHeader.setOriginatorId(SDNCConstants.SYSTEM_NAME); + lcmCommonHeader.setRequestId(requestId); + lcmCommonHeader.setSubRequestId(subRequestId); + lcmCommonHeader.setFlags(getSDNCFlags()); + lcmCommonHeader.setTimestamp(Instant.now().toString()); + + return lcmCommonHeader; + } + + public static LcmInput buildLcmInputForPnf(String requestId, String subRequestId, String pnfName, String action, + String payload) { + LcmInput lcmInput = new LcmInput(); + + LcmCommonHeader lcmCommonHeader = buildLcmCommonHeader(requestId, subRequestId); + + LcmActionIdentifiers sdncActionIdentifiers = new LcmActionIdentifiers(); + sdncActionIdentifiers.setPnfName(pnfName); + + lcmInput.setCommonHeader(lcmCommonHeader); + lcmInput.setAction(action); + lcmInput.setActionIdentifiers(sdncActionIdentifiers); + lcmInput.setPayload(payload); + + return lcmInput; + } + + public static LcmDmaapRequest buildLcmDmaapRequest(String operation, LcmInput lcmInput) { + LcmDmaapRequest lcmDmaapRequest = new LcmDmaapRequest(); + + LcmRestRequest lcmRestRequest = new LcmRestRequest(); + lcmRestRequest.setInput(lcmInput); + + String correlationId = + lcmInput.getCommonHeader().getRequestId() + "-" + lcmInput.getCommonHeader().getSubRequestId(); + + lcmDmaapRequest.setVersion(SDNCConstants.LCM_DMAAP_MSG_VER); + lcmDmaapRequest.setType(SDNCConstants.LCM_DMAAP_MSG_TYPE_REQUEST); + lcmDmaapRequest.setCambriaPartition(SDNCConstants.SYSTEM_NAME); + lcmDmaapRequest.setCorrelationId(correlationId); + lcmDmaapRequest.setRpcName(operation); + lcmDmaapRequest.setBody(lcmRestRequest); + + return lcmDmaapRequest; + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmProperties.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmProperties.java new file mode 100644 index 0000000000..df5fb3be0b --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmProperties.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import org.onap.so.client.RestProperties; + +public interface SDNCLcmProperties extends RestProperties { + String getHost(); + + String getPath(); + + String getBasicAuth(); + + String getDmaapHost(); + + String getDmaapAuth(); + + String getDmaapPartition(); + + String getDmaapTimeout(); + + String getDmaapEnvironment(); + + String getDmaaPLcmReadTopic(); + + String getDmaaPLcmWriteTopic(); + + String getKey(); +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClient.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClient.java new file mode 100644 index 0000000000..3faf58ec28 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClient.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import java.net.URI; +import java.util.Map; +import java.util.Optional; +import org.onap.so.client.RestClient; +import org.onap.logging.filter.base.ONAPComponents; +import org.onap.so.client.sdnc.lcm.beans.LcmInput; +import org.onap.so.client.sdnc.lcm.beans.LcmOutput; +import org.onap.so.client.sdnc.lcm.beans.LcmRestRequest; +import org.onap.so.client.sdnc.lcm.beans.LcmRestResponse; + +public class SDNCLcmRestClient extends RestClient { + + private final SDNCLcmProperties sdncLcmProperties; + + public SDNCLcmRestClient(SDNCLcmProperties props, URI path) { + this(props, path, "application/json", "application/json"); + } + + public SDNCLcmRestClient(SDNCLcmProperties props, URI path, String accept, String contentType) { + super(props, Optional.of(path), accept, contentType); + this.sdncLcmProperties = props; + } + + @Override + protected void initializeHeaderMap(Map<String, String> headerMap) { + headerMap.put("Authorization", sdncLcmProperties.getBasicAuth()); + } + + @Override + public ONAPComponents getTargetEntity() { + return ONAPComponents.SDNC; + } + + public LcmRestResponse sendRequest(LcmRestRequest lcmRestRequest) { + return post(lcmRestRequest, LcmRestResponse.class); + } + + public LcmOutput sendRequest(LcmInput lcmInput) { + LcmRestRequest lcmRestRequest = new LcmRestRequest(); + lcmRestRequest.setInput(lcmInput); + + LcmRestResponse lcmRestResponse = sendRequest(lcmRestRequest); + return lcmRestResponse.getOutput(); + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmActionIdentifiers.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmActionIdentifiers.java new file mode 100644 index 0000000000..883fd02c78 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmActionIdentifiers.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"serviceInstanceId", "vnfId", "vfModuleId", "vnfcName", "vserverId", "pnfName"}) +public class LcmActionIdentifiers { + + @JsonProperty("service-instance-id") + private String serviceInstanceId; + + @JsonProperty("vnf-id") + private String vnfId; + + @JsonProperty("vf-module-id") + private String vfModuleId; + + @JsonProperty("vnfc-name") + private String vnfcName; + + @JsonProperty("vserver-id") + private String vserverId; + + @JsonProperty("pnf-name") + private String pnfName; + + public String getServiceInstanceId() { + return serviceInstanceId; + } + + public void setServiceInstanceId(String value) { + this.serviceInstanceId = value; + } + + public String getVnfId() { + return vnfId; + } + + public void setVnfId(String value) { + this.vnfId = value; + } + + public String getVfModuleId() { + return vfModuleId; + } + + public void setVfModuleId(String value) { + this.vfModuleId = value; + } + + public String getVnfcName() { + return vnfcName; + } + + public void setVnfcName(String value) { + this.vnfcName = value; + } + + public String getVserverId() { + return vserverId; + } + + public void setVserverId(String value) { + this.vserverId = value; + } + + public String getPnfName() { + return pnfName; + } + + public void setPnfName(String value) { + this.pnfName = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmCommonHeader.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmCommonHeader.java new file mode 100644 index 0000000000..f3fd2ca11d --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmCommonHeader.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"apiVer", "flags", "originatorId", "requestId", "subRequestId", "timestamp"}) +public class LcmCommonHeader { + + @JsonProperty(value = "api-ver", required = true) + private String apiVer; + + @JsonProperty(value = "flags") + private LcmFlags flags; + + @JsonProperty(value = "originator-id", required = true) + private String originatorId; + + @JsonProperty(value = "request-id", required = true) + private String requestId; + + @JsonProperty(value = "sub-request-id") + private String subRequestId; + + @JsonProperty(value = "timestamp", required = true) + private String timestamp; + + public String getApiVer() { + return apiVer; + } + + public void setApiVer(String value) { + this.apiVer = value; + } + + public String getOriginatorId() { + return originatorId; + } + + public void setOriginatorId(String value) { + this.originatorId = value; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String value) { + this.requestId = value; + } + + public String getSubRequestId() { + return subRequestId; + } + + public void setSubRequestId(String value) { + this.subRequestId = value; + } + + public LcmFlags getFlags() { + return flags; + } + + public void setFlags(LcmFlags value) { + this.flags = value; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String value) { + this.timestamp = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequest.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequest.java new file mode 100644 index 0000000000..db62e8b20b --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequest.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"version", "type", "cambriaPartition", "correlationId", "rpcName", "body"}) +public class LcmDmaapRequest { + + @JsonProperty(value = "version", required = true) + private String version; + + @JsonProperty(value = "type", required = true) + private String type; + + @JsonProperty(value = "cambria.partition", required = true) + private String cambriaPartition; + + @JsonProperty(value = "correlation-id", required = true) + private String correlationId; + + @JsonProperty(value = "rpc-name", required = true) + private String rpcName; + + @JsonProperty(value = "body") + private LcmRestRequest body; + + public String getVersion() { + return version; + } + + public void setVersion(String value) { + this.version = value; + } + + public String getType() { + return type; + } + + public void setType(String value) { + this.type = value; + } + + public String getCambriaPartition() { + return cambriaPartition; + } + + public void setCambriaPartition(String value) { + this.cambriaPartition = value; + } + + public String getCorrelationId() { + return correlationId; + } + + public void setCorrelationId(String value) { + this.correlationId = value; + } + + public String getRpcName() { + return rpcName; + } + + public void setRpcName(String value) { + this.rpcName = value; + } + + public LcmRestRequest getBody() { + return body; + } + + public void setBody(LcmRestRequest value) { + this.body = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponse.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponse.java new file mode 100644 index 0000000000..35f4a26b17 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponse.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"version", "type", "cambriaPartition", "correlationId", "rpcName", "body"}) +public class LcmDmaapResponse { + + @JsonProperty(value = "version", required = true) + private String version; + + @JsonProperty(value = "type", required = true) + private String type; + + @JsonProperty(value = "cambria.partition", required = true) + private String cambriaPartition; + + @JsonProperty(value = "correlation-id", required = true) + private String correlationId; + + @JsonProperty(value = "rpc-name", required = true) + private String rpcName; + + @JsonProperty(value = "body") + private LcmRestResponse body; + + public String getVersion() { + return version; + } + + public void setVersion(String value) { + this.version = value; + } + + public String getType() { + return type; + } + + public void setType(String value) { + this.type = value; + } + + public String getCambriaPartition() { + return cambriaPartition; + } + + public void setCambriaPartition(String value) { + this.cambriaPartition = value; + } + + public String getCorrelationId() { + return correlationId; + } + + public void setCorrelationId(String value) { + this.correlationId = value; + } + + public String getRpcName() { + return rpcName; + } + + public void setRpcName(String value) { + this.rpcName = value; + } + + public LcmRestResponse getBody() { + return body; + } + + public void setBody(LcmRestResponse value) { + this.body = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmFlags.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmFlags.java new file mode 100644 index 0000000000..36527ec887 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmFlags.java @@ -0,0 +1,64 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"mode", "force", "ttl"}) +public class LcmFlags { + + @JsonProperty("mode") + private String mode; + + @JsonProperty("force") + private String force; + + @JsonProperty("ttl") + private int ttl; + + public String getMode() { + return mode; + } + + public void setMode(String value) { + this.mode = value; + } + + public String getForce() { + return force; + } + + public void setForce(String value) { + this.force = value; + } + + public Integer getTtl() { + return ttl; + } + + public void setTtl(Integer value) { + this.ttl = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmInput.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmInput.java new file mode 100644 index 0000000000..6634430bed --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmInput.java @@ -0,0 +1,75 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"commonHeader", "action", "actionIdentifiers", "payload"}) +public class LcmInput { + + @JsonProperty(value = "common-header", required = true) + private LcmCommonHeader commonHeader; + + @JsonProperty(value = "action", required = true) + private String action; + + @JsonProperty(value = "action-identifiers", required = true) + private LcmActionIdentifiers actionIdentifiers; + + @JsonProperty(value = "payload") + private String payload; + + public LcmCommonHeader getCommonHeader() { + return commonHeader; + } + + public void setCommonHeader(LcmCommonHeader value) { + this.commonHeader = value; + } + + public String getAction() { + return action; + } + + public void setAction(String value) { + this.action = value; + } + + public LcmActionIdentifiers getActionIdentifiers() { + return actionIdentifiers; + } + + public void setActionIdentifiers(LcmActionIdentifiers value) { + this.actionIdentifiers = value; + } + + public String getPayload() { + return payload; + } + + public void setPayload(String value) { + this.payload = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmOutput.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmOutput.java new file mode 100644 index 0000000000..3741786671 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmOutput.java @@ -0,0 +1,64 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"commonHeader", "status", "payload"}) +public class LcmOutput { + + @JsonProperty(value = "common-header", required = true) + private LcmCommonHeader commonHeader; + + @JsonProperty(value = "status", required = true) + private LcmStatus status; + + @JsonProperty(value = "payload") + private String payload; + + public LcmCommonHeader getCommonHeader() { + return commonHeader; + } + + public void setCommonHeader(LcmCommonHeader value) { + this.commonHeader = value; + } + + public LcmStatus getStatus() { + return status; + } + + public void setStatus(LcmStatus value) { + this.status = value; + } + + public String getPayload() { + return payload; + } + + public void setPayload(String value) { + this.payload = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequest.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequest.java new file mode 100644 index 0000000000..146eb8a4f6 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequest.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"input"}) +public class LcmRestRequest { + + @JsonProperty(value = "input", required = true) + private LcmInput input; + + public LcmInput getInput() { + return input; + } + + public void setInput(LcmInput value) { + this.input = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponse.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponse.java new file mode 100644 index 0000000000..6920f95ce2 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponse.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"output"}) +public class LcmRestResponse { + + @JsonProperty(value = "output", required = true) + private LcmOutput output; + + public LcmOutput getOutput() { + return output; + } + + public void setOutput(LcmOutput value) { + this.output = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmStatus.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmStatus.java new file mode 100644 index 0000000000..8a2a142792 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmStatus.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({"code", "message"}) +public class LcmStatus { + + @JsonProperty(value = "code", required = true) + private int code; + + @JsonProperty(value = "message", required = true) + private String message; + + public int getCode() { + return code; + } + + public void setCode(int value) { + this.code = value; + } + + public String getMessage() { + return message; + } + + public void setMessage(String value) { + this.message = value; + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties b/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties index 27da189456..147bc2ee95 100644 --- a/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties +++ b/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties @@ -1,3 +1,4 @@ org.onap.so.client.restproperties.AAIPropertiesImpl org.onap.so.client.restproperties.CDSPropertiesImpl -org.onap.so.client.restproperties.PolicyRestPropertiesImpl
\ No newline at end of file +org.onap.so.client.restproperties.PolicyRestPropertiesImpl +org.onap.so.client.restproperties.SDNCLcmPropertiesImpl diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClientTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClientTest.java new file mode 100644 index 0000000000..5483792a84 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClientTest.java @@ -0,0 +1,139 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import java.util.List; +import org.apache.http.HttpStatus; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import org.onap.so.BaseTest; +import org.onap.so.client.restproperties.SDNCLcmPropertiesImpl; +import org.onap.so.client.sdnc.lcm.beans.*; + +public class SDNCLcmDmaapClientTest extends BaseTest { + + protected SDNCLcmMessageBuilderTest sdncLcmMessageBuilderTest = new SDNCLcmMessageBuilderTest(); + + protected static final String DMAAP_HOST_PROP = SDNCLcmPropertiesImpl.DMAAP_HOST; + protected static final String DMAAP_WRITE_TOPIC_PROP = SDNCLcmPropertiesImpl.LCM_DMAAP_WRITE_TOPIC; + protected static final String DMAAP_READ_TOPIC_PROP = SDNCLcmPropertiesImpl.LCM_DMAAP_READ_TOPIC; + protected static final String DMAAP_PARTITION_PROP = SDNCLcmPropertiesImpl.DMAAP_PARTITION; + + protected String testWriteTopic = "TEST-WRITE-TOPIC"; + protected String testReadTopic = "TEST-READ-TOPIC"; + protected String testPartition = "TESTMSO"; + protected final String defaultConsumerName = "consumer1"; + + private void clearSystemProperty() { + System.clearProperty(DMAAP_HOST_PROP); + System.clearProperty(DMAAP_WRITE_TOPIC_PROP); + System.clearProperty(DMAAP_READ_TOPIC_PROP); + System.clearProperty(DMAAP_PARTITION_PROP); + } + + public SDNCLcmDmaapClient buildSDNCLcmDmaapClient() { + String testHost = "http://localhost:" + wireMockPort; + + System.setProperty(DMAAP_HOST_PROP, testHost); + System.setProperty(DMAAP_WRITE_TOPIC_PROP, testWriteTopic); + System.setProperty(DMAAP_READ_TOPIC_PROP, testReadTopic); + System.setProperty(DMAAP_PARTITION_PROP, testPartition); + + SDNCLcmProperties sdncLcmProperties = new SDNCLcmPropertiesImpl(); + SDNCLcmClientBuilder sdncLcmClientBuilder = new SDNCLcmClientBuilder(sdncLcmProperties); + + try { + return sdncLcmClientBuilder.newSDNCLcmDmaapClient(); + } catch (Exception e) { + clearSystemProperty(); + fail("Create SDNCLcmDmaapClient error: " + e.toString()); + return null; + } + } + + @Test + public final void testSDNCLcmDmaapClientSendRequest() { + SDNCLcmDmaapClient sdncLcmDmaapClient = buildSDNCLcmDmaapClient(); + + assertNotEquals(null, sdncLcmDmaapClient); + + String testDmaapWritePath = "/events/" + testWriteTopic; + String expectedWriteResponse = "{\"serverTimeMs\":2,\"count\":1}"; + wireMockServer.stubFor(post(urlPathEqualTo(testDmaapWritePath)) + .willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(expectedWriteResponse) + .withStatus(HttpStatus.SC_OK))); + + LcmInput lcmInput = sdncLcmMessageBuilderTest.buildLcmInputForPnf(); + LcmDmaapRequest lcmDmaapRequest = + SDNCLcmMessageBuilder.buildLcmDmaapRequest(sdncLcmMessageBuilderTest.getOperation(), lcmInput); + + try { + sdncLcmDmaapClient.sendRequest(lcmDmaapRequest); + } catch (Exception e) { + clearSystemProperty(); + fail("SDNCLcmDmaapClient sends request error: " + e.toString()); + return; + } + + String testDmaapReadPath = "/events/" + testReadTopic + "/" + testPartition + "/" + defaultConsumerName; + + String expectedLcmDmaapResponse = LcmDmaapResponseTest.getExpectedLcmDmaapResponse(); + String expectedResponseListItem; + try { + expectedResponseListItem = sdncLcmMessageBuilderTest.convertToSting(expectedLcmDmaapResponse); + } catch (JsonProcessingException e) { + clearSystemProperty(); + fail("Convert LcmDmaapResponse String to List item error: " + e.toString()); + return; + } + String expectedReadResponse = "[" + expectedResponseListItem + "]"; + wireMockServer.stubFor(get(urlPathEqualTo(testDmaapReadPath)) + .willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(expectedReadResponse) + .withStatus(HttpStatus.SC_OK))); + + List<LcmDmaapResponse> LcmDmaapResponseList = sdncLcmDmaapClient.getResponse(); + + clearSystemProperty(); + + if (LcmDmaapResponseList.size() < 1) { + clearSystemProperty(); + fail("Can not get LcmDmaapResponse list"); + return; + } + + LcmOutput lcmOutput = LcmDmaapResponseList.get(0).getBody().getOutput(); + + String expectedLcmOutput = LcmOutputTest.getExpectedLcmOutput(); + try { + String lcmOutputString = sdncLcmMessageBuilderTest.convertToSting(lcmOutput); + assertEquals(expectedLcmOutput, lcmOutputString); + } catch (Exception e) { + fail("Convert LcmOutput to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilderTest.java new file mode 100644 index 0000000000..d930c6728c --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilderTest.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import org.onap.so.client.sdnc.lcm.beans.LcmBeanTest; +import org.onap.so.client.sdnc.lcm.beans.LcmInput; +import org.onap.so.client.sdnc.lcm.beans.LcmInputTest; + +public class SDNCLcmMessageBuilderTest extends LcmBeanTest { + + public LcmInput buildLcmInputForPnf() { + LcmInput lcmInput = + SDNCLcmMessageBuilder.buildLcmInputForPnf(requestId, subRequestId, pnfName, action, inputPayload); + + lcmInput.getCommonHeader().setTimestamp(timestamp); + + return lcmInput; + } + + @Test + public final void testBuildLcmRestRequestForPnf() { + LcmInput lcmInput = buildLcmInputForPnf(); + + String expectedLcmInput = LcmInputTest.getExpectedLcmInput(); + try { + String lcmInputString = convertToSting(lcmInput); + assertEquals(expectedLcmInput, lcmInputString); + } catch (Exception e) { + fail("Convert LcmInput to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClientTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClientTest.java new file mode 100644 index 0000000000..04cfc6e3c8 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClientTest.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm; + +import org.apache.http.HttpStatus; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import org.onap.logging.filter.base.ONAPComponents; +import org.onap.so.BaseTest; +import org.onap.so.client.restproperties.SDNCLcmPropertiesImpl; +import org.onap.so.client.sdnc.common.SDNCConstants; +import org.onap.so.client.sdnc.lcm.beans.*; + +public class SDNCLcmRestClientTest extends BaseTest { + + protected SDNCLcmMessageBuilderTest sdncLcmMessageBuilderTest = new SDNCLcmMessageBuilderTest(); + + protected static final String SDNC_HOST_PROP = SDNCLcmPropertiesImpl.SDNC_HOST; + protected static final String SDNC_PATH_PROP = SDNCLcmPropertiesImpl.LCM_PATH; + + private void clearSystemProperty() { + System.clearProperty(SDNC_HOST_PROP); + System.clearProperty(SDNC_PATH_PROP); + } + + public SDNCLcmRestClient buildSDNCLcmRestClient() { + String testHost = "http://localhost:" + wireMockPort; + + System.setProperty(SDNC_HOST_PROP, testHost); + System.setProperty(SDNC_PATH_PROP, SDNCConstants.LCM_API_BASE_PATH); + + SDNCLcmProperties sdncLcmProperties = new SDNCLcmPropertiesImpl(); + SDNCLcmClientBuilder sdncLcmClientBuilder = new SDNCLcmClientBuilder(sdncLcmProperties); + + try { + return sdncLcmClientBuilder.newSDNCLcmRestClient(sdncLcmMessageBuilderTest.getOperation()); + } catch (Exception e) { + clearSystemProperty(); + fail("Create SDNCLcmRestClient error: " + e.toString()); + return null; + } + } + + @Test + public final void testSDNCLcmRestClientSendRequest() { + SDNCLcmRestClient sdncLcmRestClient = buildSDNCLcmRestClient(); + + assertNotEquals(null, sdncLcmRestClient); + assertEquals(ONAPComponents.SDNC, sdncLcmRestClient.getTargetEntity()); + + String testLcmApiPath = SDNCConstants.LCM_API_BASE_PATH + sdncLcmMessageBuilderTest.getOperation(); + String expectedLcmRestResponse = LcmRestResponseTest.getExpectedLcmRestResponse(); + wireMockServer.stubFor(post(urlPathEqualTo(testLcmApiPath)) + .willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(expectedLcmRestResponse) + .withStatus(HttpStatus.SC_OK))); + + LcmInput lcmInput = sdncLcmMessageBuilderTest.buildLcmInputForPnf(); + LcmOutput lcmOutput = sdncLcmRestClient.sendRequest(lcmInput); + + clearSystemProperty(); + + String expectedLcmOutput = LcmOutputTest.getExpectedLcmOutput(); + try { + String lcmOutputString = sdncLcmMessageBuilderTest.convertToSting(lcmOutput); + assertEquals(expectedLcmOutput, lcmOutputString); + } catch (Exception e) { + fail("Convert LcmOutput to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmBeanTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmBeanTest.java new file mode 100644 index 0000000000..5562444a46 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmBeanTest.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.onap.so.client.sdnc.common.SDNCConstants; + +public class LcmBeanTest { + private static Logger logger = LoggerFactory.getLogger(LcmBeanTest.class); + + protected String requestId = "9f77f437-1515-44bd-a420-0aaf8a3c31a0"; + protected String subRequestId = "c197a4b5-18d9-48a2-ad2d-a3b56858501c"; + protected String timestamp = "2020-02-25T10:20:28.116Z"; + + protected String pnfName = "testpnf"; + protected String action = "TestAction"; + protected String operation = "test-operation"; + + protected String inputPayload = "{\"testPayload\": \"input test\"}"; + protected String outputPayload = "{\"testPayload\": \"output test\"}"; + + public String getOperation() { + return operation; + } + + public LcmFlags buildSDNCFlags() { + LcmFlags lcmFlags = new LcmFlags(); + + lcmFlags.setMode(SDNCConstants.LCM_FLAGS_MODE_NORMAL); + lcmFlags.setForce(SDNCConstants.LCM_FLAGS_FORCE_FALSE); + lcmFlags.setTtl(SDNCConstants.LCM_FLAGS_TTL); + + return lcmFlags; + } + + public LcmCommonHeader buildLcmCommonHeader() { + LcmCommonHeader lcmCommonHeader = new LcmCommonHeader(); + + lcmCommonHeader.setApiVer(SDNCConstants.LCM_API_VER); + lcmCommonHeader.setFlags(buildSDNCFlags()); + lcmCommonHeader.setOriginatorId(SDNCConstants.SYSTEM_NAME); + lcmCommonHeader.setRequestId(requestId); + lcmCommonHeader.setSubRequestId(subRequestId); + lcmCommonHeader.setTimestamp(timestamp); + + return lcmCommonHeader; + } + + public String convertToSting(Object msgObject) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + + String msgString = mapper.writeValueAsString(msgObject); + logger.debug(msgObject.getClass().getSimpleName() + "\n" + msgString); + + return msgString; + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequestTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequestTest.java new file mode 100644 index 0000000000..709a557937 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequestTest.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import org.junit.Test; +import org.onap.so.client.sdnc.common.SDNCConstants; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class LcmDmaapRequestTest extends LcmBeanTest { + private static String expectedLcmDmaapRequest = "{" + "\"version\":\"1.0\"," + "\"type\":\"request\"," + + "\"cambria.partition\":\"MSO\"," + + "\"correlation-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0-c197a4b5-18d9-48a2-ad2d-a3b56858501c\"," + + "\"rpc-name\":\"test-operation\"," + "\"body\":" + LcmRestRequestTest.getExpectedLcmRestRequest() + "}"; + + public LcmDmaapRequest buildLcmDmaapRequest() { + LcmDmaapRequest lcmDmaapRequest = new LcmDmaapRequest(); + + LcmRestRequestTest lcmRestRequestTest = new LcmRestRequestTest(); + LcmRestRequest lcmRestRequest = lcmRestRequestTest.buildLcmRestRequest(); + LcmCommonHeader lcmCommonHeader = lcmRestRequest.getInput().getCommonHeader(); + String correlationId = lcmCommonHeader.getRequestId() + "-" + lcmCommonHeader.getSubRequestId(); + + lcmDmaapRequest.setVersion(SDNCConstants.LCM_DMAAP_MSG_VER); + lcmDmaapRequest.setType(SDNCConstants.LCM_DMAAP_MSG_TYPE_REQUEST); + lcmDmaapRequest.setCambriaPartition(SDNCConstants.SYSTEM_NAME); + lcmDmaapRequest.setCorrelationId(correlationId); + lcmDmaapRequest.setRpcName(operation); + lcmDmaapRequest.setBody(lcmRestRequest); + + return lcmDmaapRequest; + } + + public static String getExpectedLcmDmaapRequest() { + return expectedLcmDmaapRequest; + } + + @Test + public final void testLcmDmaapRequest() { + LcmDmaapRequest lcmDmaapRequest = buildLcmDmaapRequest(); + + try { + String lcmDmaapRequestString = convertToSting(lcmDmaapRequest); + assertEquals(expectedLcmDmaapRequest, lcmDmaapRequestString); + } catch (Exception e) { + fail("Convert LcmDmaapRequest to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponseTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponseTest.java new file mode 100644 index 0000000000..0cdbeebb27 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponseTest.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import org.junit.Test; +import org.onap.so.client.sdnc.common.SDNCConstants; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class LcmDmaapResponseTest extends LcmBeanTest { + private static String expectedLcmDmaapResponse = "{" + "\"version\":\"1.0\"," + "\"type\":\"response\"," + + "\"cambria.partition\":\"MSO\"," + + "\"correlation-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0-c197a4b5-18d9-48a2-ad2d-a3b56858501c\"," + + "\"rpc-name\":\"test-operation\"," + "\"body\":" + LcmRestResponseTest.getExpectedLcmRestResponse() + "}"; + + public LcmDmaapResponse buildLcmDmaapResponse() { + LcmDmaapResponse lcmDmaapResponse = new LcmDmaapResponse(); + + LcmRestResponseTest lcmRestResponseTest = new LcmRestResponseTest(); + LcmRestResponse lcmRestResponse = lcmRestResponseTest.buildLcmRestResponse(); + LcmCommonHeader lcmCommonHeader = lcmRestResponse.getOutput().getCommonHeader(); + String correlationId = lcmCommonHeader.getRequestId() + "-" + lcmCommonHeader.getSubRequestId(); + + lcmDmaapResponse.setVersion(SDNCConstants.LCM_DMAAP_MSG_VER); + lcmDmaapResponse.setType(SDNCConstants.LCM_DMAAP_MSG_TYPE_RESPONSE); + lcmDmaapResponse.setCambriaPartition(SDNCConstants.SYSTEM_NAME); + lcmDmaapResponse.setCorrelationId(correlationId); + lcmDmaapResponse.setRpcName(operation); + lcmDmaapResponse.setBody(lcmRestResponse); + + return lcmDmaapResponse; + } + + public static String getExpectedLcmDmaapResponse() { + return expectedLcmDmaapResponse; + } + + @Test + public final void testLcmDmaapResponse() { + LcmDmaapResponse lcmDmaapResponse = buildLcmDmaapResponse(); + + try { + String lcmDmaapResponseString = convertToSting(lcmDmaapResponse); + assertEquals(expectedLcmDmaapResponse, lcmDmaapResponseString); + } catch (Exception e) { + fail("Convert LcmDmaapResponse to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmInputTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmInputTest.java new file mode 100644 index 0000000000..b8c34fcbc7 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmInputTest.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class LcmInputTest extends LcmBeanTest { + private static String expectedLcmInput = "{" + "\"common-header\":{" + "\"api-ver\":\"2.00\"," + + "\"flags\":{\"mode\":\"NORMAL\",\"force\":\"FALSE\",\"ttl\":65000}," + "\"originator-id\":\"MSO\"," + + "\"request-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0\"," + + "\"sub-request-id\":\"c197a4b5-18d9-48a2-ad2d-a3b56858501c\"," + + "\"timestamp\":\"2020-02-25T10:20:28.116Z\"" + "}," + "\"action\":\"TestAction\"," + + "\"action-identifiers\":{\"pnf-name\":\"testpnf\"}," + + "\"payload\":\"{\\\"testPayload\\\": \\\"input test\\\"}\"}"; + + public LcmInput buildLcmInput() { + LcmInput lcmInput = new LcmInput(); + + LcmCommonHeader lcmCommonHeader = buildLcmCommonHeader(); + + LcmActionIdentifiers lcmActionIdentifiers = new LcmActionIdentifiers(); + lcmActionIdentifiers.setPnfName(pnfName); + + lcmInput.setCommonHeader(lcmCommonHeader); + lcmInput.setAction(action); + lcmInput.setActionIdentifiers(lcmActionIdentifiers); + lcmInput.setPayload(inputPayload); + + return lcmInput; + } + + public static String getExpectedLcmInput() { + return expectedLcmInput; + } + + @Test + public final void testLcmInput() { + LcmInput lcmInput = buildLcmInput(); + + try { + String lcmInputString = convertToSting(lcmInput); + assertEquals(expectedLcmInput, lcmInputString); + } catch (Exception e) { + fail("Convert LcmInput to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmOutputTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmOutputTest.java new file mode 100644 index 0000000000..1530be38a7 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmOutputTest.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import org.onap.so.client.sdnc.common.SDNCConstants; + +public class LcmOutputTest extends LcmBeanTest { + private static String expectedLcmOutput = "{" + "\"common-header\":{" + "\"api-ver\":\"2.00\"," + + "\"originator-id\":\"MSO\"," + "\"request-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0\"," + + "\"sub-request-id\":\"c197a4b5-18d9-48a2-ad2d-a3b56858501c\"" + "}," + + "\"status\":{\"code\":400,\"message\":\"Test output message\"}," + + "\"payload\":\"{\\\"testPayload\\\": \\\"output test\\\"}\"}"; + + @Override + public LcmCommonHeader buildLcmCommonHeader() { + LcmCommonHeader lcmCommonHeader = new LcmCommonHeader(); + + lcmCommonHeader.setApiVer(SDNCConstants.LCM_API_VER); + lcmCommonHeader.setOriginatorId(SDNCConstants.SYSTEM_NAME); + lcmCommonHeader.setRequestId(requestId); + lcmCommonHeader.setSubRequestId(subRequestId); + + return lcmCommonHeader; + } + + public LcmStatus buildLcmStatus() { + LcmStatus lcmStatus = new LcmStatus(); + + lcmStatus.setCode(400); + lcmStatus.setMessage("Test output message"); + + return lcmStatus; + } + + public LcmOutput buildLcmOutput() { + LcmOutput lcmOutput = new LcmOutput(); + + LcmCommonHeader lcmCommonHeader = buildLcmCommonHeader(); + LcmStatus lcmStatus = buildLcmStatus(); + + lcmOutput.setCommonHeader(lcmCommonHeader); + lcmOutput.setStatus(lcmStatus); + lcmOutput.setPayload(outputPayload); + + return lcmOutput; + } + + public static String getExpectedLcmOutput() { + return expectedLcmOutput; + } + + @Test + public final void testLcmOutput() { + LcmOutput lcmOutput = buildLcmOutput(); + + try { + String lcmOutputString = convertToSting(lcmOutput); + assertEquals(expectedLcmOutput, lcmOutputString); + } catch (Exception e) { + fail("Convert LcmOutput to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequestTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequestTest.java new file mode 100644 index 0000000000..c078326c82 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequestTest.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class LcmRestRequestTest extends LcmBeanTest { + private static String expectedLcmRestRequest = "{" + "\"input\":" + LcmInputTest.getExpectedLcmInput() + "}"; + + public LcmRestRequest buildLcmRestRequest() { + LcmRestRequest lcmRestRequest = new LcmRestRequest(); + + LcmInputTest lcmInputTest = new LcmInputTest(); + lcmRestRequest.setInput(lcmInputTest.buildLcmInput()); + + return lcmRestRequest; + } + + public static String getExpectedLcmRestRequest() { + return expectedLcmRestRequest; + } + + @Test + public final void testLcmRestRequest() { + LcmRestRequest lcmRestRequest = buildLcmRestRequest(); + + try { + String lcmRestRequestString = convertToSting(lcmRestRequest); + assertEquals(expectedLcmRestRequest, lcmRestRequestString); + } catch (Exception e) { + fail("Convert LcmRestRequest to String error: " + e.toString()); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponseTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponseTest.java new file mode 100644 index 0000000000..5867acb421 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponseTest.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.client.sdnc.lcm.beans; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class LcmRestResponseTest extends LcmBeanTest { + private static String expectedLcmRestResponse = "{" + "\"output\":" + LcmOutputTest.getExpectedLcmOutput() + "}"; + + public LcmRestResponse buildLcmRestResponse() { + LcmRestResponse lcmRestResponse = new LcmRestResponse(); + + LcmOutputTest lcmOutputTest = new LcmOutputTest(); + lcmRestResponse.setOutput(lcmOutputTest.buildLcmOutput()); + + return lcmRestResponse; + } + + public static String getExpectedLcmRestResponse() { + return expectedLcmRestResponse; + } + + @Test + public final void testLcmRestResponse() { + LcmRestResponse lcmRestResponse = buildLcmRestResponse(); + + try { + String lcmRestResponseString = convertToSting(lcmRestResponse); + assertEquals(expectedLcmRestResponse, lcmRestResponseString); + } catch (Exception e) { + fail("Convert LcmRestResponse to String error: " + e.toString()); + } + } +} diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DeleteCommunicationService.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DeleteCommunicationService.groovy new file mode 100644 index 0000000000..00b0b37b18 --- /dev/null +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DeleteCommunicationService.groovy @@ -0,0 +1,429 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + # Copyright (c) 2019, CMCC Technologies Co., Ltd. + # + # 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.so.bpmn.infrastructure.scripts + + +import org.camunda.bpm.engine.delegate.BpmnError +import org.camunda.bpm.engine.delegate.DelegateExecution +import org.onap.aai.domain.yang.Relationship +import org.onap.aai.domain.yang.ServiceInstance +import org.onap.aai.domain.yang.CommunicationServiceProfile +import org.onap.aai.domain.yang.CommunicationServiceProfiles +import org.onap.logging.filter.base.ONAPComponents +import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor +import org.onap.so.bpmn.common.scripts.ExceptionUtil +import org.onap.so.bpmn.common.scripts.MsoUtils +import org.onap.so.bpmn.common.scripts.RequestDBUtil +import org.onap.so.bpmn.core.UrnPropertiesReader +import org.onap.so.bpmn.core.WorkflowException +import org.onap.so.bpmn.core.json.JsonUtils +import org.onap.so.client.HttpClient +import org.onap.so.client.HttpClientFactory +import org.onap.so.client.aai.AAIObjectType +import org.onap.so.client.aai.AAIResourcesClient +import org.onap.so.client.aai.entities.AAIResultWrapper +import org.onap.so.client.aai.entities.uri.AAIResourceUri +import org.onap.so.client.aai.entities.uri.AAIUriFactory +import org.onap.so.db.request.beans.OperationStatus +import org.slf4j.Logger +import org.slf4j.LoggerFactory + +import javax.ws.rs.NotFoundException +import javax.ws.rs.core.Response + +import static org.apache.commons.lang3.StringUtils.isBlank + +class DeleteCommunicationService extends AbstractServiceTaskProcessor { + private final String PREFIX ="DeleteCommunicationService" + private final Long TIMEOUT = 60 * 60 * 1000 + + ExceptionUtil exceptionUtil = new ExceptionUtil() + JsonUtils jsonUtil = new JsonUtils() + private RequestDBUtil requestDBUtil = new RequestDBUtil() + private static final Logger LOGGER = LoggerFactory.getLogger(DeleteCommunicationService.class) + + @Override + void preProcessRequest(DelegateExecution execution) { + execution.setVariable("prefix",PREFIX) + String msg = "" + + LOGGER.trace("Starting preProcessRequest") + + try { + // check for incoming json message/input + String siRequest = execution.getVariable("bpmnRequest") + String requestId = execution.getVariable("mso-request-id") + execution.setVariable("msoRequestId", requestId) + execution.setVariable("operationType", "DELETE") + + //communication service id + String serviceInstanceId = execution.getVariable("serviceInstanceId") + if (isBlank(serviceInstanceId)) { + msg = "communication-service id is null" + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + + LOGGER.info("Input Request: ${siRequest}, reqId: ${requestId}, serviceInstanceId: ${serviceInstanceId}") + + //requestParameters + checkAndSetRequestParam(siRequest,"globalSubscriberId",false,execution) + checkAndSetRequestParam(siRequest,"serviceType",false,execution) + checkAndSetRequestParam(siRequest,"operationId",false,execution) + + } catch (BpmnError e) { + throw e + } catch (any) { + msg = "Exception in preProcessRequest " + any.getCause() + LOGGER.debug(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } + LOGGER.trace("Exit preProcessRequest") + } + + + /** + * prepare update operation status + * @param execution + */ + void preInitUpdateOperationStatus(DelegateExecution execution){ + LOGGER.trace(" ======== STARTED initUpdateOperationStatus Process ======== ") + try{ + execution.setVariable("result","processing") + execution.setVariable("progress","0") + execution.setVariable("operationContent","delete communication service operation start") + setOperationStatus(execution) + + }catch(Exception e){ + LOGGER.error("Exception Occured Processing initUpdateOperationStatus. Exception is:\n" + e) + execution.setVariable("CVFMI_ErrorResponse", "Error Occurred during initUpdateOperationStatus Method:\n" + e.getMessage()) + } + LOGGER.trace("======== COMPLETED initUpdateOperationStatus Process ======== ") + } + + /** + * send sync response + * @param execution + */ + void sendSyncResponse(DelegateExecution execution) { + LOGGER.debug("Begin sendSyncResponse") + + try { + String operationId = execution.getVariable("operationId") + String syncResponse = """{"operationId":"${operationId}"}""".trim() + sendWorkflowResponse(execution, 202, syncResponse) + + } catch (Exception ex) { + String msg = "Exception in sendSyncResponse: " + ex.getMessage() + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } + LOGGER.debug("Exit sendSyncResponse") + } + + /** + * query CommunicationSerive from AAI + * save e2eslice-service instance id and service name + * @param execution + */ + private void queryCommunicationSeriveFromAAI(DelegateExecution execution) + { + LOGGER.trace(" ***** begin queryCommunicationSeriveFromAAI *****") + String serviceInstanceId = execution.getVariable("serviceInstanceId") + + String errorMsg = "query communication service from aai failed" + AAIResultWrapper wrapper = queryAAI(execution, AAIObjectType.SERVICE_INSTANCE, serviceInstanceId, errorMsg) + Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class) + if(si.isPresent()) + { + String serviceInstName = si.get()?.getServiceInstanceName() + String e2eSliceServiceInstId + if(si.isPresent()) + { + List<Relationship> relationshipList = si.get().getRelationshipList()?.getRelationship() + for (Relationship relationship : relationshipList) + { + String relatedTo = relationship.getRelatedTo() + if (relatedTo == "service-instance") + { + String relatedLink = relationship.getRelatedLink()?:"" + e2eSliceServiceInstId = relatedLink ? relatedLink.substring(relatedLink.lastIndexOf("/") + 1,relatedLink.length()) : "" + break + } + } + } + execution.setVariable("e2eSliceServiceInstanceId", e2eSliceServiceInstId) + execution.setVariable("serviceInstanceName", serviceInstName ?: "") + LOGGER.info("communication-service Id: ${serviceInstanceId}, e2eslice-service Id: ${e2eSliceServiceInstId}, serviceName: ${serviceInstName}") + } + LOGGER.debug(" ***** Exit queryCommunicationSeriveFromAAI *****") + } + + /** + * query AAI + * @param execution + * @param aaiObjectType + * @param instanceId + * @return AAIResultWrapper + */ + private AAIResultWrapper queryAAI(DelegateExecution execution, AAIObjectType aaiObjectType, String instanceId, String errorMsg) + { + String globalSubscriberId = execution.getVariable("globalSubscriberId") + String serviceType = execution.getVariable("serviceType") + + AAIResourcesClient resourceClient = new AAIResourcesClient() + AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(aaiObjectType, globalSubscriberId, serviceType, instanceId) + if (!resourceClient.exists(resourceUri)) { + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMsg) + } + AAIResultWrapper wrapper = resourceClient.get(resourceUri, NotFoundException.class) + return wrapper + } + + + /** + * 再次调用deleteE2EServiceInstance接口,然后获取到operationid, + */ + void sendRequest2NSMFWF(DelegateExecution execution) { + LOGGER.trace("begin preRequestSend2NSMF") + try { + //url:/onap/so/infra/e2eServiceInstances/v3/{serviceInstanceId}" + def NSMF_endpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution) + String url = "${NSMF_endpoint}/e2eServiceInstances/v3/${execution.getVariable("e2eSliceServiceInstanceId")}" + + String requestBody = """ + { + "globalSubscriberId": "${execution.getVariable("globalSubscriberId")}", + "serviceType": "${execution.getVariable("serviceType")}" + } + """ + requestBody.replaceAll("\\s+", "") + + String basicAuthValue = UrnPropertiesReader.getVariable("mso.infra.endpoint.auth", execution) + HttpClient httpClient = new HttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO) + httpClient.addAdditionalHeader("Authorization", basicAuthValue) + httpClient.addAdditionalHeader("Accept", "application/json") + Response httpResponse = httpClient.delete(requestBody) + handleNSSMFWFResponse(httpResponse, execution) + + } catch (BpmnError e) { + throw e + } catch (any) { + String msg = "Exception in DeleteCommunicationService.preRequestSend2NSMF. " + any.getCause() + LOGGER.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } + + LOGGER.trace("exit preRequestSend2NSMF") + } + + /** + * prepare to call sub process + * @param execution + */ + void prepareCallCheckProcessStatus(DelegateExecution execution) + { + LOGGER.debug(PREFIX + "prepareCallCheckProcessStatus Start") + + def successConditions = new ArrayList<>() + successConditions.add("finished") + execution.setVariable("successConditions", successConditions) + + def errorConditions = new ArrayList<>() + errorConditions.add("error") + execution.setVariable("errorConditions", errorConditions) + + execution.setVariable("processServiceType", "communication service") + execution.setVariable("subOperationType", "DELETE") + execution.setVariable("initProgress", 20) + execution.setVariable("endProgress",90) + + execution.setVariable("timeOut", TIMEOUT) + + LOGGER.debug(PREFIX + "prepareCallCheckProcessStatus Exit") + } + + /** + * delete communication profile from AAI + * @param execution + */ + void delCSProfileFromAAI(DelegateExecution execution) + { + LOGGER.debug("start delete communication service profile from AAI") + String globalSubscriberId = execution.getVariable("globalSubscriberId") + String serviceType = execution.getVariable("serviceType") + String serviceInstanceId = execution.getVariable("serviceInstanceId") + + String profileId + try + { + AAIResourcesClient resourceClient = new AAIResourcesClient() + AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.COMMUNICATION_PROFILE_ALL, globalSubscriberId, serviceType, serviceInstanceId) + AAIResultWrapper wrapper = resourceClient.get(resourceUri, NotFoundException.class) + Optional<CommunicationServiceProfiles> csProfilesOpt = wrapper.asBean(CommunicationServiceProfiles.class) + if(csProfilesOpt.isPresent()){ + CommunicationServiceProfiles csProf + iles = csProfilesOpt.get() + CommunicationServiceProfile csProfile = csProfiles.getCommunicationServiceProfile().get(0) + profileId = csProfile ? csProfile.getProfileId() : "" + } + resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.COMMUNICATION_SERVICE_PROFILE, globalSubscriberId, serviceType, serviceInstanceId, profileId) + if (!resourceClient.exists(resourceUri)) { + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "communication service profile was not found in aai") + } + + resourceClient.delete(resourceUri) + LOGGER.debug("end delete communication service profile from AAI") + } + catch (any) + { + String msg = "delete communication service profile from aai failed! cause-"+any.getCause() + LOGGER.error(any.printStackTrace()) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); + } + + } + + /** + * delete communication service from AAI + * @param execution + */ + void delCSFromAAI(DelegateExecution execution) + { + try + { + LOGGER.debug("start delete communication service from AAI") + AAIResourcesClient resourceClient = new AAIResourcesClient() + AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), execution.getVariable("serviceInstanceId")) + resourceClient.delete(serviceInstanceUri) + + execution.setVariable("progress", "100") + execution.setVariable("result", "finished") + execution.setVariable("operationContent", "CSMF completes service terminated.") + setOperationStatus(execution) + LOGGER.debug("end delete communication service from AAI") + } + catch (any) + { + LOGGER.error("Error occured within delCSFromAAI method, cause: ${any.getCause()} ") + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Error occured during delete communication service from aai") + } + } + + void sendSyncError(DelegateExecution execution) + { + LOGGER.debug("Starting sendSyncError") + + try { + String errorMessage + if (execution.getVariable("WorkflowException") instanceof WorkflowException) { + WorkflowException wfe = execution.getVariable("WorkflowException") + errorMessage = wfe.getErrorMessage() + } else { + errorMessage = "Sending Sync Error." + } + + String buildworkflowException = + """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1"> + <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage> + <aetgt:ErrorCode>7000</aetgt:ErrorCode> + </aetgt:WorkflowException>""" + + LOGGER.debug(buildworkflowException) + sendWorkflowResponse(execution, 500, buildworkflowException) + + } catch (Exception ex) { + LOGGER.error("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage()) + } + } + + /** + * prepare update operation status + * @param execution + */ + void preFailedOperationStatus(DelegateExecution execution) + { + LOGGER.debug(" ======== STARTED preFailedOperationStatus Process ======== ") + + execution.setVariable("progress", "100") + execution.setVariable("result", "error") + execution.setVariable("operationContent", "terminate service failure") + + WorkflowException wfex = execution.getVariable("WorkflowException") as WorkflowException + String errorMessage = wfex.getErrorMessage() + errorMessage = errorMessage.length() > 200 ? errorMessage.substring(0,200) + "......" : errorMessage + execution.setVariable("reason", errorMessage) + setOperationStatus(execution) + + LOGGER.debug("======== COMPLETED prepareEndOperationStatus Process ======== ") + } + + /** + * prepare Operation status + * @param execution + * @param operationType + */ + private void setOperationStatus(DelegateExecution execution) + { + OperationStatus operationStatus = new OperationStatus() + operationStatus.setServiceId(execution.getVariable("serviceInstanceId")) + operationStatus.setOperationId(execution.getVariable("operationId")) + operationStatus.setUserId(execution.getVariable("globalSubscriberId")) + //interface not support update + operationStatus.setServiceName(execution.getVariable("serviceInstanceName")) + operationStatus.setResult(execution.getVariable("result")) + operationStatus.setProgress(execution.getVariable("progress")) + operationStatus.setOperationContent(execution.getVariable("operationContent")) + operationStatus.setReason(execution.getVariable("reason")?:"") + operationStatus.setOperation("DELETE") + + requestDBUtil.prepareUpdateOperationStatus(execution, operationStatus) + } + + void prepareFailureStatus(DelegateExecution execution) + { + execution.setVariable("progress", "100") + execution.setVariable("operationContent", "terminate service failure.") + setOperationStatus(execution) + LOGGER.debug("${PREFIX}-prepareFailureStatus,result:${execution.getVariable("result")}, reason: ${execution.getVariable("reason")}") + } + + /** + * check request json and save parameter to execution + * @param siRequest + * @param paraName + * @param isErrorException + * @param execution + */ + private void checkAndSetRequestParam(String siRequest, String paraName, boolean isErrorException, DelegateExecution execution) + { + String msg = "" + String paramValue = jsonUtil.getJsonValue(siRequest, paraName) + if (isBlank(paramValue)) { + msg = "Input ${paraName} is null" + LOGGER.error(msg) + if(isErrorException) + { + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + + } else { + execution.setVariable(paraName, paramValue) + } + } +} diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DeleteSliceService.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DeleteSliceService.groovy new file mode 100644 index 0000000000..f0d43cf8d7 --- /dev/null +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DeleteSliceService.groovy @@ -0,0 +1,263 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (c) 2019, CMCC Technologies Co., Ltd. + * ================================================================================ + * 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.so.bpmn.infrastructure.scripts + +import org.camunda.bpm.engine.delegate.BpmnError +import org.camunda.bpm.engine.delegate.DelegateExecution +import org.onap.aai.domain.yang.ServiceProfile +import org.onap.aai.domain.yang.ServiceProfiles +import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor +import org.onap.so.bpmn.common.scripts.ExceptionUtil +import org.onap.so.bpmn.common.scripts.MsoUtils +import org.onap.so.bpmn.common.scripts.RequestDBUtil +import org.onap.so.bpmn.core.WorkflowException +import org.onap.so.bpmn.core.json.JsonUtils +import org.onap.so.client.aai.AAIObjectType +import org.onap.so.client.aai.AAIResourcesClient +import org.onap.so.client.aai.entities.AAIResultWrapper +import org.onap.so.client.aai.entities.uri.AAIResourceUri +import org.onap.so.client.aai.entities.uri.AAIUriFactory +import org.onap.so.db.request.beans.OperationStatus +import org.slf4j.Logger +import org.slf4j.LoggerFactory + +import javax.ws.rs.NotFoundException + +import static org.apache.commons.lang3.StringUtils.isBlank + +class DeleteSliceService extends AbstractServiceTaskProcessor { + + String Prefix="DELSS_" + ExceptionUtil exceptionUtil = new ExceptionUtil() + JsonUtils jsonUtil = new JsonUtils() + private RequestDBUtil requestDBUtil = new RequestDBUtil() + + private static final Logger logger = LoggerFactory.getLogger( DeleteSliceService.class) + + @Override + void preProcessRequest(DelegateExecution execution) { + execution.setVariable("prefix", Prefix) + String msg = "" + + logger.trace("Starting preProcessRequest") + + try { + // check for incoming json message/input + String siRequest = execution.getVariable("bpmnRequest") + String requestId = execution.getVariable("mso-request-id") + execution.setVariable("msoRequestId", requestId) + + //e2eslice-service instance id + String serviceInstanceId = execution.getVariable("serviceInstanceId") + if (isBlank(serviceInstanceId)) { + msg = "e2eslice-service id is null" + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + logger.info("Input Request: ${siRequest}, reqId: ${requestId}, e2eslice-service: ${serviceInstanceId}") + + //subscriberInfo + checkAndSetRequestParam(siRequest,"globalSubscriberId",false, execution) + checkAndSetRequestParam(siRequest,"serviceType",false, execution) + checkAndSetRequestParam(siRequest,"operationId",false, execution) + + //prepare init operation status + execution.setVariable("progress", "0") + execution.setVariable("result", "processing") + execution.setVariable("operationType", "DELETE") + execution.setVariable("operationContent", "Prepare init service") + updateServiceOperationStatus(execution) + + } catch (BpmnError e) { + throw e + } catch (Exception ex) { + msg = "Exception in preProcessRequest " + ex.getMessage() + logger.debug(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } + logger.trace("Exit preProcessRequest") + } + + /** + * send asynchronous response + * @param execution + */ + void sendAsyncResponse(DelegateExecution execution) { + logger.trace("Staring sendSyncResponse") + + try { + String operationId = execution.getVariable("operationId") + String syncResponse = """{"operationId":"${operationId}"}""".trim() + logger.info("sendSynchResponse: xmlSyncResponse - " + "\n" + syncResponse) + sendWorkflowResponse(execution, 202, syncResponse) + + } catch (Exception ex) { + String msg = "Exception in sendSyncResponse: " + ex.getMessage() + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } + logger.trace("Exit sendSyncResponse") + } + + /** + * Deletes the slice service instance in aai + */ + void deleteSliceServiceInstance(DelegateExecution execution) { + logger.trace("Entered deleteSliceServiceInstance") + try { + + AAIResourcesClient resourceClient = new AAIResourcesClient() + AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), execution.getVariable("serviceInstanceId")) + resourceClient.delete(serviceInstanceUri) + + execution.setVariable("progress", "100") + execution.setVariable("result", "finished") + execution.setVariable("operationContent", "NSMF completes slicing service termination.") + updateServiceOperationStatus(execution) + + logger.trace("Exited deleteSliceServiceInstance") + }catch(Exception e){ + logger.debug("Error occured within deleteSliceServiceInstance method: " + e) + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Error occured during deleteSliceServiceInstance from aai") + } + } + + /** + * update operation status + * @param execution + */ + private void updateServiceOperationStatus(DelegateExecution execution){ + + OperationStatus operationStatus = new OperationStatus() + operationStatus.setServiceId(execution.getVariable("serviceInstanceId")) + operationStatus.setOperationId(execution.getVariable("operationId")) + operationStatus.setUserId(execution.getVariable("globalSubscriberId")) + operationStatus.setResult(execution.getVariable("result")) + operationStatus.setProgress(execution.getVariable("progress")) + operationStatus.setOperationContent(execution.getVariable("operationContent")) + operationStatus.setReason(execution.getVariable("reason")) + operationStatus.setOperation(execution.getVariable("operationType")) + + requestDBUtil.prepareUpdateOperationStatus(execution, operationStatus) + } + + /** + * delete service profile from aai + * @param execution + */ + private void delServiceProfileFromAAI(DelegateExecution execution) + { + String globalSubscriberId = execution.getVariable("globalSubscriberId") + String serviceType = execution.getVariable("serviceType") + String serviceInstanceId = execution.getVariable("serviceInstanceId") + String profileId = "" + + try + { + AAIResourcesClient resourceClient = new AAIResourcesClient() + AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_PROFILE_ALL, globalSubscriberId, serviceType, serviceInstanceId) + AAIResultWrapper wrapper = resourceClient.get(resourceUri, NotFoundException.class) + Optional<ServiceProfiles> serviceProfilesOpt =wrapper.asBean(ServiceProfiles.class) + if(serviceProfilesOpt.isPresent()){ + ServiceProfiles serviceProfiles = serviceProfilesOpt.get() + ServiceProfile serviceProfile = serviceProfiles.getServiceProfile().get(0) + profileId = serviceProfile ? serviceProfile.getProfileId() : "" + } + resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_PROFILE, globalSubscriberId, serviceType, serviceInstanceId, profileId) + if (!resourceClient.exists(resourceUri)) { + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai") + } + resourceClient.delete(resourceUri) + } + catch (any) + { + String msg = "delete service profile from aai failed! cause-"+any.getCause() + logger.error(any.printStackTrace()) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); + } + } + + void sendSyncError(DelegateExecution execution) { + logger.info("Starting sendSyncError") + + try { + String errorMessage + if (execution.getVariable("WorkflowException") instanceof WorkflowException) { + WorkflowException wfe = execution.getVariable("WorkflowException") + errorMessage = wfe.getErrorMessage() + } else { + errorMessage = "Sending Sync Error." + } + + String buildworkflowException = + """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1"> + <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage> + <aetgt:ErrorCode>7000</aetgt:ErrorCode> + </aetgt:WorkflowException>""" + + logger.debug(buildworkflowException) + sendWorkflowResponse(execution, 500, buildworkflowException) + + } catch (Exception ex) { + logger.error("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage()) + } + + } + + void prepareEndOperationStatus(DelegateExecution execution){ + logger.debug(" ======== STARTED prepareEndOperationStatus Process ======== ") + + execution.setVariable("progress", "100") + execution.setVariable("result", "error") + execution.setVariable("operationContent", "NSSMF Terminate service failure") + + WorkflowException wfex = execution.getVariable("WorkflowException") as WorkflowException + String errorMessage = wfex.getErrorMessage() + errorMessage = errorMessage.length() > 200 ? errorMessage.substring(0,200) + "......" : errorMessage + execution.setVariable("reason",errorMessage) + updateServiceOperationStatus(execution) + + logger.debug("======== COMPLETED prepareEndOperationStatus Process ======== ") + } + + /** + * check parameters from request body + * set to execution + * @param siRequest + * @param paraName + * @param isErrorException + * @param execution + */ + private void checkAndSetRequestParam(String siRequest, String paraName, boolean isErrorException, DelegateExecution execution) + { + String msg = "" + String paramValue = jsonUtil.getJsonValue(siRequest, paraName) + if (isBlank(paramValue)) { + msg = "Input ${paraName} is null" + logger.error(msg) + if(isErrorException) + { + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + + } else { + execution.setVariable(paraName, paramValue) + } + } +} diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn new file mode 100644 index 0000000000..3e1c1179bf --- /dev/null +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn @@ -0,0 +1,808 @@ +<?xml version="1.0" encoding="UTF-8"?> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1wio50w" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.1.2"> + <bpmn:process id="Process_0r5eb97" isExecutable="true"> + <bpmn:startEvent id="StartEvent_1nbljfd" name="Create Slice Service Creation Flow"> + <bpmn:outgoing>SequenceFlow_03s744c</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_0vilb24" name="Waiting for confirmation"> + <bpmn:outgoing>SequenceFlow_1fk37v7</bpmn:outgoing> + <bpmn:linkEventDefinition id="LinkEventDefinition_197u5pe" name="WaitingForConfirmation" /> + </bpmn:intermediateCatchEvent> + <bpmn:scriptTask id="ScriptTask_1tc44ge" name="PreProcess Incoming Request" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_03s744c</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_07e12rt</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css= new CreateSliceService() +css.preProcessRequest(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:scriptTask id="ScriptTask_1jgtb0y" name="Process User Options" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1cv0wop</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_197cm2e</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css = new CreateSliceService() +css.processUserOptions(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:exclusiveGateway id="ExclusiveGateway_0elbczl" name="Continue Slice?" default="SequenceFlow_038lb9m"> + <bpmn:incoming>SequenceFlow_197cm2e</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_12t5exy</bpmn:outgoing> + <bpmn:outgoing>SequenceFlow_038lb9m</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:scriptTask id="ScriptTask_0l3d1ai" name="Process Decomposition" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1t19ips</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0jrclmc</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css = new CreateSliceService() +css.processDecomposition(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:scriptTask id="ScriptTask_1eo3m4q" name="Get NST Selection" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_046irye</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1o23s0i</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css = new CreateSliceService() +css.getNSTSelection(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:callActivity id="CallActivity_139l55g" name="Call DoCreateSliceServiceInstance " calledElement="DoCreateSliceServiceInstance"> + <bpmn:extensionElements> + <camunda:in source="msoRequestId" target="msoRequestId" /> + <camunda:in source="serviceInstanceId" target="serviceInstanceId" /> + <camunda:in source="serviceInstanceName" target="serviceInstanceName" /> + <camunda:in source="serviceModelInfo" target="serviceModelInfo" /> + <camunda:in source="productFamilyId" target="productFamilyId" /> + <camunda:in source="serviceInputParams" target="serviceInputParams" /> + <camunda:in source="globalSubscriberId" target="globalSubscriberId" /> + <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" /> + <camunda:in source="serviceType" target="serviceType" /> + <camunda:in source="uuiRequest" target="uuiRequest" /> + <camunda:in source="requestAction" target="operationType" /> + <camunda:in source="operationId" target="operationId" /> + <camunda:in source="serviceProfile" target="serviceProfile" /> + <camunda:in source="sliceProfileTn" target="sliceProfileTn" /> + <camunda:in source="sliceProfileCn" target="sliceProfileCn" /> + <camunda:in source="sliceProfileAn" target="sliceProfileAn" /> + <camunda:in source="sliceServiceDecomposition" target="sliceServiceDecomposition" /> + <camunda:out source="WorkflowException" target="WorkflowException" /> + <camunda:out source="rollbackData" target="rollbackData" /> + <camunda:out source="rolledBack" target="rolledBack" /> + <camunda:out source="allottedResourceId" target="allottedResourceId" /> + <camunda:out source="serviceInstanceData" target="serviceInstanceData" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_1p8vxo5</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1g8m7tq</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_1v96asi" name="Goto Waiting for Confirmation"> + <bpmn:incoming>SequenceFlow_0it2g9j</bpmn:incoming> + <bpmn:linkEventDefinition id="LinkEventDefinition_0uj34dx" name="WaitingForConfirmation" /> + </bpmn:intermediateThrowEvent> + <bpmn:scriptTask id="ScriptTask_0gb975b" name="Prepare Update Orchestration Task" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1aaozcg</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_18kur12</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +execution.setVariable("taskStatus", "WaitingToConfirm") +def css = new CreateSliceService() +css.prepareUpdateOrchestrationTask(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:exclusiveGateway id="ExclusiveGateway_18eld2o" name="Is Slice Successful?" default="SequenceFlow_1c6ka9h"> + <bpmn:incoming>SequenceFlow_0mlrlbv</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1c6ka9h</bpmn:outgoing> + <bpmn:outgoing>SequenceFlow_0n4xku8</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:endEvent id="EndEvent_0x406rw"> + <bpmn:incoming>SequenceFlow_1c6ka9h</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_0mlneuw" errorRef="Error_03akl5v" /> + </bpmn:endEvent> + <bpmn:subProcess id="SubProcess_1yv9i68" name="Sub-process for FalloutHandler and Rollback" triggeredByEvent="true"> + <bpmn:startEvent id="StartEvent_1omdx56"> + <bpmn:outgoing>SequenceFlow_1w67v6s</bpmn:outgoing> + <bpmn:errorEventDefinition id="ErrorEventDefinition_06xcioh" /> + </bpmn:startEvent> + <bpmn:endEvent id="EndEvent_1jx3026"> + <bpmn:incoming>SequenceFlow_08mlzwz</bpmn:incoming> + </bpmn:endEvent> + <bpmn:scriptTask id="ScriptTask_1swzdpw" name="Handle Unexpected Error" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1w67v6s</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_08mlzwz</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.common.scripts.* +ExceptionUtil ex = new ExceptionUtil() +ex.processJavaException(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_1w67v6s" sourceRef="StartEvent_1omdx56" targetRef="ScriptTask_1swzdpw" /> + <bpmn:sequenceFlow id="SequenceFlow_08mlzwz" sourceRef="ScriptTask_1swzdpw" targetRef="EndEvent_1jx3026" /> + </bpmn:subProcess> + <bpmn:scriptTask id="ScriptTask_1ef3voz" name="Prepare Update Orchestration Task" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0kixzdj</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0klb3ey</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +execution.setVariable("taskStatus", "Completed") +def css = new CreateSliceService() +css.prepareUpdateOrchestrationTask(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:endEvent id="EndEvent_05h01gx" name="End"> + <bpmn:incoming>SequenceFlow_11rbv41</bpmn:incoming> + </bpmn:endEvent> + <bpmn:scriptTask id="ScriptTask_1xxag1o" name="Init Service Operation Status" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_07e12rt</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0t094g7</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css = new CreateSliceService() +css.prepareInitServiceOperationStatus(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_1ex8ke9" name="Goto Create Slice Service"> + <bpmn:incoming>SequenceFlow_0jrclmc</bpmn:incoming> + <bpmn:linkEventDefinition id="LinkEventDefinition_0de65en" name="CreateSliceService" /> + </bpmn:intermediateThrowEvent> + <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_1wii8im" name="Create Slice Service"> + <bpmn:outgoing>SequenceFlow_1o1tu0f</bpmn:outgoing> + <bpmn:linkEventDefinition id="LinkEventDefinition_1krpcdk" name="CreateSliceService" /> + </bpmn:intermediateCatchEvent> + <bpmn:scriptTask id="ScriptTask_1ssh2l9" name="Prepare Update Service Oper Status((finish)" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0lbdfmt</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1qv8qw1</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +execution.setVariable("operationProgress", "100") +execution.setVariable("operationResult", "finished") +execution.setVariable("operationReason", "Slice completed") +def css = new CreateSliceService() +css.prepareUpdateServiceOperationStatus(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:serviceTask id="ServiceTask_0kd6p6p" name="Update Service Operation Status"> + <bpmn:extensionElements> + <camunda:connector> + <camunda:inputOutput> + <camunda:inputParameter name="url">${CSSOS_dbAdapterEndpoint}</camunda:inputParameter> + <camunda:inputParameter name="headers"> + <camunda:script scriptFormat="groovy">execution.getVariable("CSSOS_headerMap")</camunda:script> + </camunda:inputParameter> + <camunda:inputParameter name="payload">${CSSOS_updateServiceOperStatusRequest}</camunda:inputParameter> + <camunda:inputParameter name="method">POST</camunda:inputParameter> + <camunda:outputParameter name="CSSOS_dbResponseCode">${statusCode}</camunda:outputParameter> + <camunda:outputParameter name="CSSOS_dbResponse">${response}</camunda:outputParameter> + </camunda:inputOutput> + <camunda:connectorId>http-connector</camunda:connectorId> + </camunda:connector> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0t094g7</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_046irye</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:callActivity id="CallActivity_1bnkmaz" name="Call Decompose Service" calledElement="DecomposeService"> + <bpmn:extensionElements> + <camunda:in source="msoRequestId" target="msoRequestId" /> + <camunda:in source="serviceInstanceId" target="serviceInstanceId" /> + <camunda:in source="serviceModelInfo" target="serviceModelInfo" /> + <camunda:in source="isDebugLogEnabled" target="isDebugLogEnabled" /> + <camunda:out source="serviceDecomposition" target="sliceServiceDecomposition" /> + <camunda:out source="WorkflowException" target="WorkflowException" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0q7yc2c</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1t19ips</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:scriptTask id="ScriptTask_0o2r07o" name="Prepare Decompose Service " scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1o23s0i</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0q7yc2c</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcsi= new CreateSliceService() +dcsi.prepareDecomposeService(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:scriptTask id="ScriptTask_0b7senu" name="Prepare Create OrchestrationTask" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1o1tu0f</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1sq6kp6</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css= new CreateSliceService() +css.prepareCreateOrchestrationTask(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:callActivity id="CallActivity_0h88mep" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask"> + <bpmn:extensionElements> + <camunda:out source="statusCode" target="CSSOT_dbResponseCode" /> + <camunda:out source="response" target="CSSOT_dbResponse" /> + <camunda:in source="CSSOT_taskId" target="taskId" /> + <camunda:in source="msoRequestId" target="requestId" /> + <camunda:in source="CSSOT_name" target="taskName" /> + <camunda:in source="CSSOT_status" target="taskStatus" /> + <camunda:in source="CSSOT_isManual" target="isManual" /> + <camunda:in source="CSSOT_paramJson" target="paramJson" /> + <camunda:in source="CSSOT_requestMethod" target="method" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_1sq6kp6</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1p8vxo5</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:callActivity id="CallActivity_0n47zoh" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask"> + <bpmn:extensionElements> + <camunda:out source="statusCode" target="CSSOT_dbResponseCode" /> + <camunda:out source="response" target="CSSOT_dbResponse" /> + <camunda:in source="CSSOT_taskId" target="taskId" /> + <camunda:in source="msoRequestId" target="requestId" /> + <camunda:in source="CSSOT_name" target="taskName" /> + <camunda:in source="CSSOT_status" target="taskStatus" /> + <camunda:in source="CSSOT_isManual" target="isManual" /> + <camunda:in source="CSSOT_paramJson" target="paramJson" /> + <camunda:in source="CSSOT_requestMethod" target="method" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_18kur12</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0it2g9j</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:scriptTask id="ScriptTask_12h8542" name="Prepare Update Orchestration Task" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_12t5exy</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0thd6ny</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +execution.setVariable("taskStatus", "Creating") +def css = new CreateSliceService() +css.prepareUpdateOrchestrationTask(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:callActivity id="CallActivity_0o89wmf" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask"> + <bpmn:extensionElements> + <camunda:out source="statusCode" target="CSSOT_dbResponseCode" /> + <camunda:out source="response" target="CSSOT_dbResponse" /> + <camunda:in source="CSSOT_taskId" target="taskId" /> + <camunda:in source="msoRequestId" target="requestId" /> + <camunda:in source="CSSOT_name" target="taskName" /> + <camunda:in source="CSSOT_status" target="taskStatus" /> + <camunda:in source="CSSOT_isManual" target="isManual" /> + <camunda:in source="CSSOT_paramJson" target="paramJson" /> + <camunda:in source="CSSOT_requestMethod" target="method" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0thd6ny</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0477975</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:callActivity id="CallActivity_0g98b71" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask"> + <bpmn:extensionElements> + <camunda:out source="statusCode" target="CSSOT_dbResponseCode" /> + <camunda:out source="response" target="CSSOT_dbResponse" /> + <camunda:in source="CSSOT_taskId" target="taskId" /> + <camunda:in source="msoRequestId" target="requestId" /> + <camunda:in source="CSSOT_name" target="taskName" /> + <camunda:in source="CSSOT_status" target="taskStatus" /> + <camunda:in source="CSSOT_isManual" target="isManual" /> + <camunda:in source="CSSOT_paramJson" target="paramJson" /> + <camunda:in source="CSSOT_requestMethod" target="method" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0h2oree</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1cv0wop</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:scriptTask id="ScriptTask_08wim95" name="Prepare Get User Options" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_16uz2t9</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0h2oree</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css = new CreateSliceService() +css.prepareGetUserOptions(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:callActivity id="CallActivity_0jdzpem" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask"> + <bpmn:extensionElements> + <camunda:out source="statusCode" target="CSSOT_dbResponseCode" /> + <camunda:out source="response" target="CSSOT_dbResponse" /> + <camunda:in source="CSSOT_taskId" target="taskId" /> + <camunda:in source="msoRequestId" target="requestId" /> + <camunda:in source="CSSOT_name" target="taskName" /> + <camunda:in source="CSSOT_status" target="taskStatus" /> + <camunda:in source="CSSOT_isManual" target="isManual" /> + <camunda:in source="CSSOT_paramJson" target="paramJson" /> + <camunda:in source="CSSOT_requestMethod" target="method" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_19lsayh</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_10ng1vx</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:scriptTask id="ScriptTask_1mscu5w" name="Prepare Update Orchestration Task" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_038lb9m</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_19lsayh</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +execution.setVariable("taskStatus", "Aborted") +def css = new CreateSliceService() +css.prepareUpdateOrchestrationTask(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_0pkvfun" name="Allocate Slice"> + <bpmn:outgoing>SequenceFlow_1bevt3a</bpmn:outgoing> + <bpmn:linkEventDefinition id="LinkEventDefinition_1vlfclx" name="AllocateSlice" /> + </bpmn:intermediateCatchEvent> + <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_0ktwpki" name="Goto Allocate Slice"> + <bpmn:incoming>SequenceFlow_0477975</bpmn:incoming> + <bpmn:linkEventDefinition id="LinkEventDefinition_16f2ri9" name="AllocateSlice" /> + </bpmn:intermediateThrowEvent> + <bpmn:callActivity id="CallActivity_15pl4ld" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask"> + <bpmn:extensionElements> + <camunda:out source="statusCode" target="CSSOT_dbResponseCode" /> + <camunda:out source="response" target="CSSOT_dbResponse" /> + <camunda:in source="CSSOT_taskId" target="taskId" /> + <camunda:in source="msoRequestId" target="requestId" /> + <camunda:in source="CSSOT_name" target="taskName" /> + <camunda:in source="CSSOT_status" target="taskStatus" /> + <camunda:in source="CSSOT_isManual" target="isManual" /> + <camunda:in source="CSSOT_paramJson" target="paramJson" /> + <camunda:in source="CSSOT_requestMethod" target="method" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0klb3ey</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0lbdfmt</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:endEvent id="EndEvent_1oouvuh" name="End"> + <bpmn:incoming>SequenceFlow_10ng1vx</bpmn:incoming> + </bpmn:endEvent> + <bpmn:serviceTask id="ServiceTask_0esr949" name="Update Service Operation Status"> + <bpmn:extensionElements> + <camunda:connector> + <camunda:inputOutput> + <camunda:inputParameter name="url">${CSSOS_dbAdapterEndpoint}</camunda:inputParameter> + <camunda:inputParameter name="headers"> + <camunda:script scriptFormat="groovy">execution.getVariable("CSSOS_headerMap")</camunda:script> + </camunda:inputParameter> + <camunda:inputParameter name="payload">${CSSOS_updateServiceOperStatusRequest}</camunda:inputParameter> + <camunda:inputParameter name="method">POST</camunda:inputParameter> + <camunda:outputParameter name="CSSOS_dbResponseCode">${statusCode}</camunda:outputParameter> + <camunda:outputParameter name="CSSOS_dbResponse">${response}</camunda:outputParameter> + </camunda:inputOutput> + <camunda:connectorId>http-connector</camunda:connectorId> + </camunda:connector> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_1qv8qw1</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_11rbv41</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:scriptTask id="ScriptTask_1jj846g" name="Send Sync Ack Response" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1g8m7tq</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1ey6m1e</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def css = new CreateSliceService() +css.sendSyncResponse(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:callActivity id="CallActivity_0cxst1i" name="Call DoAllocateNSIandNSSI " calledElement="DoAllocateNSIandNSSI"> + <bpmn:extensionElements> + <camunda:in source="msoRequestId" target="msoRequestId" /> + <camunda:in source="serviceInstanceId" target="sliceServiceInstanceId" /> + <camunda:in source="serviceInstanceName" target="sliceServiceInstanceName" /> + <camunda:in source="serviceModelInfo" target="serviceModelInfo" /> + <camunda:in source="productFamilyId" target="productFamilyId" /> + <camunda:in source="disableRollback" target="disableRollback" /> + <camunda:in source="serviceInputParams" target="serviceInputParams" /> + <camunda:in source="globalSubscriberId" target="globalSubscriberId" /> + <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" /> + <camunda:in source="serviceType" target="serviceType" /> + <camunda:in source="uuiRequest" target="uuiRequest" /> + <camunda:in source="requestAction" target="operationType" /> + <camunda:in source="operationId" target="operationId" /> + <camunda:in source="serviceProfile" target="serviceProfile" /> + <camunda:in source="sliceProfileTn" target="sliceProfileTn" /> + <camunda:in source="sliceProfileCn" target="sliceProfileCn" /> + <camunda:in source="sliceProfileAn" target="sliceProfileAn" /> + <camunda:in source="sliceTaskParams" target="sliceTaskParams" /> + <camunda:in source="CSSOT_taskId" target="taskId" /> + <camunda:in source="CSSOT_name" target="taskName" /> + <camunda:in source="CSSOT_status" target="taskStatus" /> + <camunda:in source="CSSOT_isManual" target="isManual" /> + <camunda:in source="resourceSharingLevel" target="resourceSharingLevel" /> + <camunda:in source="globalSubscriberId" target="globalSubscriberId" /> + <camunda:out source="WorkflowException" target="WorkflowException" /> + <camunda:out source="rollbackData" target="rollbackData" /> + <camunda:out source="rolledBack" target="rolledBack" /> + <camunda:in source="allottedResourceId" target="allottedResourceId" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_1bevt3a</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0mlrlbv</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:endEvent id="EndEvent_0bh0kwx"> + <bpmn:incoming>SequenceFlow_12qt5ci</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1xa66sx" errorRef="Error_0p2naox" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="SequenceFlow_03s744c" sourceRef="StartEvent_1nbljfd" targetRef="ScriptTask_1tc44ge" /> + <bpmn:sequenceFlow id="SequenceFlow_07e12rt" sourceRef="ScriptTask_1tc44ge" targetRef="ScriptTask_1xxag1o" /> + <bpmn:sequenceFlow id="SequenceFlow_1cv0wop" sourceRef="CallActivity_0g98b71" targetRef="ScriptTask_1jgtb0y" /> + <bpmn:sequenceFlow id="SequenceFlow_197cm2e" sourceRef="ScriptTask_1jgtb0y" targetRef="ExclusiveGateway_0elbczl" /> + <bpmn:sequenceFlow id="SequenceFlow_12t5exy" name="continue" sourceRef="ExclusiveGateway_0elbczl" targetRef="ScriptTask_12h8542"> + <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("taskAction") == "commit"}</bpmn:conditionExpression> + </bpmn:sequenceFlow> + <bpmn:sequenceFlow id="SequenceFlow_038lb9m" name="abort" sourceRef="ExclusiveGateway_0elbczl" targetRef="ScriptTask_1mscu5w" /> + <bpmn:sequenceFlow id="SequenceFlow_1t19ips" sourceRef="CallActivity_1bnkmaz" targetRef="ScriptTask_0l3d1ai" /> + <bpmn:sequenceFlow id="SequenceFlow_1p8vxo5" sourceRef="CallActivity_0h88mep" targetRef="CallActivity_139l55g" /> + <bpmn:sequenceFlow id="SequenceFlow_1g8m7tq" sourceRef="CallActivity_139l55g" targetRef="ScriptTask_1jj846g" /> + <bpmn:sequenceFlow id="SequenceFlow_0it2g9j" sourceRef="CallActivity_0n47zoh" targetRef="IntermediateThrowEvent_1v96asi" /> + <bpmn:sequenceFlow id="SequenceFlow_18kur12" sourceRef="ScriptTask_0gb975b" targetRef="CallActivity_0n47zoh" /> + <bpmn:sequenceFlow id="SequenceFlow_0mlrlbv" sourceRef="CallActivity_0cxst1i" targetRef="ExclusiveGateway_18eld2o" /> + <bpmn:sequenceFlow id="SequenceFlow_1c6ka9h" name="No" sourceRef="ExclusiveGateway_18eld2o" targetRef="EndEvent_0x406rw" /> + <bpmn:sequenceFlow id="SequenceFlow_0n4xku8" name="Yes" sourceRef="ExclusiveGateway_18eld2o" targetRef="ScriptTask_19uxoi8"> + <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("WorkflowException") == null}</bpmn:conditionExpression> + </bpmn:sequenceFlow> + <bpmn:sequenceFlow id="SequenceFlow_0klb3ey" sourceRef="ScriptTask_1ef3voz" targetRef="CallActivity_15pl4ld" /> + <bpmn:sequenceFlow id="SequenceFlow_11rbv41" sourceRef="ServiceTask_0esr949" targetRef="EndEvent_05h01gx" /> + <bpmn:sequenceFlow id="SequenceFlow_0t094g7" sourceRef="ScriptTask_1xxag1o" targetRef="ServiceTask_0kd6p6p" /> + <bpmn:sequenceFlow id="SequenceFlow_1o1tu0f" sourceRef="IntermediateCatchEvent_1wii8im" targetRef="ScriptTask_0b7senu" /> + <bpmn:sequenceFlow id="SequenceFlow_0lbdfmt" sourceRef="CallActivity_15pl4ld" targetRef="ScriptTask_1ssh2l9" /> + <bpmn:sequenceFlow id="SequenceFlow_1qv8qw1" sourceRef="ScriptTask_1ssh2l9" targetRef="ServiceTask_0esr949" /> + <bpmn:sequenceFlow id="SequenceFlow_0q7yc2c" sourceRef="ScriptTask_0o2r07o" targetRef="CallActivity_1bnkmaz" /> + <bpmn:sequenceFlow id="SequenceFlow_1sq6kp6" sourceRef="ScriptTask_0b7senu" targetRef="CallActivity_0h88mep" /> + <bpmn:sequenceFlow id="SequenceFlow_0thd6ny" sourceRef="ScriptTask_12h8542" targetRef="CallActivity_0o89wmf" /> + <bpmn:sequenceFlow id="SequenceFlow_0477975" sourceRef="CallActivity_0o89wmf" targetRef="IntermediateThrowEvent_0ktwpki" /> + <bpmn:sequenceFlow id="SequenceFlow_0h2oree" sourceRef="ScriptTask_08wim95" targetRef="CallActivity_0g98b71" /> + <bpmn:sequenceFlow id="SequenceFlow_19lsayh" sourceRef="ScriptTask_1mscu5w" targetRef="CallActivity_0jdzpem" /> + <bpmn:sequenceFlow id="SequenceFlow_10ng1vx" sourceRef="CallActivity_0jdzpem" targetRef="EndEvent_1oouvuh" /> + <bpmn:sequenceFlow id="SequenceFlow_1bevt3a" sourceRef="IntermediateCatchEvent_0pkvfun" targetRef="CallActivity_0cxst1i" /> + <bpmn:sequenceFlow id="SequenceFlow_1ey6m1e" sourceRef="ScriptTask_1jj846g" targetRef="CallActivity_0v4mw2x" /> + <bpmn:receiveTask id="Task_1b5t88h" name="Waiting for confirmation" messageRef="Message_0c4b2r5"> + <bpmn:incoming>SequenceFlow_1fk37v7</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_16uz2t9</bpmn:outgoing> + </bpmn:receiveTask> + <bpmn:sequenceFlow id="SequenceFlow_1fk37v7" sourceRef="IntermediateCatchEvent_0vilb24" targetRef="Task_1b5t88h" /> + <bpmn:sequenceFlow id="SequenceFlow_16uz2t9" sourceRef="Task_1b5t88h" targetRef="ScriptTask_08wim95" /> + <bpmn:boundaryEvent id="BoundaryEvent_0clo9pv" attachedToRef="Task_1b5t88h"> + <bpmn:outgoing>SequenceFlow_12qt5ci</bpmn:outgoing> + <bpmn:timerEventDefinition> + <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">PT2H</bpmn:timeDuration> + </bpmn:timerEventDefinition> + </bpmn:boundaryEvent> + <bpmn:sequenceFlow id="SequenceFlow_12qt5ci" sourceRef="BoundaryEvent_0clo9pv" targetRef="EndEvent_0bh0kwx" /> + <bpmn:callActivity id="CallActivity_0v4mw2x" name="Call DoCreateSliceServiceOption " calledElement="DoCreateSliceServiceOption"> + <bpmn:extensionElements> + <camunda:in source="nstModelUuid" target="nstModelUuid" /> + <camunda:in source="nstModelInvariantUuid" target="nstModelInvariantUuid" /> + <camunda:in source="serviceProfile" target="serviceProfile" /> + <camunda:in source="sliceProfileTn" target="sliceProfileTn" /> + <camunda:in source="msoRequestId" target="msoRequestId" /> + <camunda:in source="sliceProfileCn" target="sliceProfileCn" /> + <camunda:in source="sliceProfileAn" target="sliceProfileAn" /> + <camunda:in source="sliceTaskParams" target="sliceTaskParams" /> + <camunda:in source="resourceSharingLevel" target="resourceSharingLevel" /> + <camunda:out source="sliceTaskParams" target="sliceTaskParams" /> + <camunda:in source="globalSubscriberId" target="globalSubscriberId" /> + <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" /> + <camunda:in source="serviceType" target="serviceType" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_1ey6m1e</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1aaozcg</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:sequenceFlow id="SequenceFlow_1aaozcg" sourceRef="CallActivity_0v4mw2x" targetRef="ScriptTask_0gb975b" /> + <bpmn:sequenceFlow id="SequenceFlow_046irye" sourceRef="ServiceTask_0kd6p6p" targetRef="ScriptTask_1eo3m4q" /> + <bpmn:sequenceFlow id="SequenceFlow_1o23s0i" sourceRef="ScriptTask_1eo3m4q" targetRef="ScriptTask_0o2r07o" /> + <bpmn:sequenceFlow id="SequenceFlow_0jrclmc" sourceRef="ScriptTask_0l3d1ai" targetRef="IntermediateThrowEvent_1ex8ke9" /> + <bpmn:scriptTask id="ScriptTask_19uxoi8" name="Update AAI Status" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0n4xku8</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0kixzdj</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +execution.setVariable("orchestrationStatus", "deactivated") +def css = new CreateSliceService() +css.updateAAIOrchStatus(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_0kixzdj" sourceRef="ScriptTask_19uxoi8" targetRef="ScriptTask_1ef3voz" /> + </bpmn:process> + <bpmn:message id="Message_0c4b2r5" name="SliceServiceTask" /> + <bpmn:error id="Error_03akl5v" name="MSOWorkflowException" errorCode="MSOWorkflowException" /> + <bpmn:error id="Error_0p2naox" name="MSOWorkflowException" errorCode="MSOWorkflowException" /> + <bpmndi:BPMNDiagram id="BPMNDiagram_1"> + <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0r5eb97"> + <bpmndi:BPMNShape id="StartEvent_1nbljfd_di" bpmnElement="StartEvent_1nbljfd"> + <dc:Bounds x="178" y="103" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="156" y="146" width="82" height="40" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateCatchEvent_0vilb24_di" bpmnElement="IntermediateCatchEvent_0vilb24"> + <dc:Bounds x="178" y="438" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="168" y="481" width="60" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1tc44ge_di" bpmnElement="ScriptTask_1tc44ge"> + <dc:Bounds x="285" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1jgtb0y_di" bpmnElement="ScriptTask_1jgtb0y"> + <dc:Bounds x="830" y="416" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ExclusiveGateway_0elbczl_di" bpmnElement="ExclusiveGateway_0elbczl" isMarkerVisible="true"> + <dc:Bounds x="1040" y="431" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1027" y="413" width="78" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_0l3d1ai_di" bpmnElement="ScriptTask_0l3d1ai"> + <dc:Bounds x="1370" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1eo3m4q_di" bpmnElement="ScriptTask_1eo3m4q"> + <dc:Bounds x="830" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_139l55g_di" bpmnElement="CallActivity_139l55g"> + <dc:Bounds x="645" y="249" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateThrowEvent_1v96asi_di" bpmnElement="IntermediateThrowEvent_1v96asi"> + <dc:Bounds x="1584" y="271" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1567" y="312" width="81" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_0gb975b_di" bpmnElement="ScriptTask_0gb975b"> + <dc:Bounds x="1193" y="249" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ExclusiveGateway_18eld2o_di" bpmnElement="ExclusiveGateway_18eld2o" isMarkerVisible="true"> + <dc:Bounds x="488" y="776" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="483" y="746" width="60" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_0x406rw_di" bpmnElement="EndEvent_0x406rw"> + <dc:Bounds x="495" y="926" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="SubProcess_1yv9i68_di" bpmnElement="SubProcess_1yv9i68" isExpanded="true"> + <dc:Bounds x="685" y="1080" width="781" height="196" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1ef3voz_di" bpmnElement="ScriptTask_1ef3voz"> + <dc:Bounds x="823" y="761" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_05h01gx_di" bpmnElement="EndEvent_05h01gx"> + <dc:Bounds x="1585" y="783" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1593" y="826" width="20" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1xxag1o_di" bpmnElement="ScriptTask_1xxag1o"> + <dc:Bounds x="468" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateThrowEvent_1ex8ke9_di" bpmnElement="IntermediateThrowEvent_1ex8ke9"> + <dc:Bounds x="1584" y="103" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1564" y="144" width="87" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateCatchEvent_1wii8im_di" bpmnElement="IntermediateCatchEvent_1wii8im"> + <dc:Bounds x="178" y="271" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="171" y="314" width="60" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1ssh2l9_di" bpmnElement="ScriptTask_1ssh2l9"> + <dc:Bounds x="1197" y="761" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ServiceTask_0kd6p6p_di" bpmnElement="ServiceTask_0kd6p6p"> + <dc:Bounds x="645" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_1bnkmaz_di" bpmnElement="CallActivity_1bnkmaz"> + <dc:Bounds x="1193" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_0o2r07o_di" bpmnElement="ScriptTask_0o2r07o"> + <dc:Bounds x="1015" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_0b7senu_di" bpmnElement="ScriptTask_0b7senu"> + <dc:Bounds x="285" y="249" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_0h88mep_di" bpmnElement="CallActivity_0h88mep"> + <dc:Bounds x="467" y="249" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_0n47zoh_di" bpmnElement="CallActivity_0n47zoh"> + <dc:Bounds x="1371" y="249" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_12h8542_di" bpmnElement="ScriptTask_12h8542"> + <dc:Bounds x="1193" y="416" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_0o89wmf_di" bpmnElement="CallActivity_0o89wmf"> + <dc:Bounds x="1371" y="416" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_0g98b71_di" bpmnElement="CallActivity_0g98b71"> + <dc:Bounds x="645" y="416" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_08wim95_di" bpmnElement="ScriptTask_08wim95"> + <dc:Bounds x="467" y="416" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_0jdzpem_di" bpmnElement="CallActivity_0jdzpem"> + <dc:Bounds x="1371" y="605" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1mscu5w_di" bpmnElement="ScriptTask_1mscu5w"> + <dc:Bounds x="1193" y="605" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateCatchEvent_0pkvfun_di" bpmnElement="IntermediateCatchEvent_0pkvfun"> + <dc:Bounds x="178" y="783" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="168" y="826" width="66" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateThrowEvent_0ktwpki_di" bpmnElement="IntermediateThrowEvent_0ktwpki"> + <dc:Bounds x="1584" y="438" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1577" y="479" width="67" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_15pl4ld_di" bpmnElement="CallActivity_15pl4ld"> + <dc:Bounds x="1005" y="761" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_1oouvuh_di" bpmnElement="EndEvent_1oouvuh"> + <dc:Bounds x="1584" y="627" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1592" y="670" width="20" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ServiceTask_0esr949_di" bpmnElement="ServiceTask_0esr949"> + <dc:Bounds x="1375" y="761" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1jj846g_di" bpmnElement="ScriptTask_1jj846g"> + <dc:Bounds x="830" y="249" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="CallActivity_0cxst1i_di" bpmnElement="CallActivity_0cxst1i"> + <dc:Bounds x="285" y="761" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_0bh0kwx_di" bpmnElement="EndEvent_0bh0kwx"> + <dc:Bounds x="317" y="593" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_03s744c_di" bpmnElement="SequenceFlow_03s744c"> + <di:waypoint x="214" y="121" /> + <di:waypoint x="285" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_07e12rt_di" bpmnElement="SequenceFlow_07e12rt"> + <di:waypoint x="385" y="121" /> + <di:waypoint x="468" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1cv0wop_di" bpmnElement="SequenceFlow_1cv0wop"> + <di:waypoint x="745" y="456" /> + <di:waypoint x="830" y="456" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_197cm2e_di" bpmnElement="SequenceFlow_197cm2e"> + <di:waypoint x="930" y="456" /> + <di:waypoint x="1040" y="456" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_12t5exy_di" bpmnElement="SequenceFlow_12t5exy"> + <di:waypoint x="1090" y="456" /> + <di:waypoint x="1193" y="456" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1121.5" y="438" width="42" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_038lb9m_di" bpmnElement="SequenceFlow_038lb9m"> + <di:waypoint x="1065" y="481" /> + <di:waypoint x="1065" y="645" /> + <di:waypoint x="1193" y="645" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1067" y="560" width="27" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1t19ips_di" bpmnElement="SequenceFlow_1t19ips"> + <di:waypoint x="1293" y="121" /> + <di:waypoint x="1370" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1p8vxo5_di" bpmnElement="SequenceFlow_1p8vxo5"> + <di:waypoint x="567" y="289" /> + <di:waypoint x="645" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1g8m7tq_di" bpmnElement="SequenceFlow_1g8m7tq"> + <di:waypoint x="745" y="289" /> + <di:waypoint x="830" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0it2g9j_di" bpmnElement="SequenceFlow_0it2g9j"> + <di:waypoint x="1471" y="289" /> + <di:waypoint x="1584" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_18kur12_di" bpmnElement="SequenceFlow_18kur12"> + <di:waypoint x="1293" y="289" /> + <di:waypoint x="1371" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0mlrlbv_di" bpmnElement="SequenceFlow_0mlrlbv"> + <di:waypoint x="385" y="801" /> + <di:waypoint x="488" y="801" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1c6ka9h_di" bpmnElement="SequenceFlow_1c6ka9h"> + <di:waypoint x="513" y="826" /> + <di:waypoint x="513" y="926" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="521" y="832" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0n4xku8_di" bpmnElement="SequenceFlow_0n4xku8"> + <di:waypoint x="538" y="801" /> + <di:waypoint x="645" y="801" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="584" y="783" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0klb3ey_di" bpmnElement="SequenceFlow_0klb3ey"> + <di:waypoint x="923" y="801" /> + <di:waypoint x="1005" y="801" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_11rbv41_di" bpmnElement="SequenceFlow_11rbv41"> + <di:waypoint x="1475" y="801" /> + <di:waypoint x="1585" y="801" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0t094g7_di" bpmnElement="SequenceFlow_0t094g7"> + <di:waypoint x="568" y="121" /> + <di:waypoint x="645" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1o1tu0f_di" bpmnElement="SequenceFlow_1o1tu0f"> + <di:waypoint x="214" y="289" /> + <di:waypoint x="285" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0lbdfmt_di" bpmnElement="SequenceFlow_0lbdfmt"> + <di:waypoint x="1105" y="801" /> + <di:waypoint x="1197" y="801" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1qv8qw1_di" bpmnElement="SequenceFlow_1qv8qw1"> + <di:waypoint x="1297" y="801" /> + <di:waypoint x="1375" y="801" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0q7yc2c_di" bpmnElement="SequenceFlow_0q7yc2c"> + <di:waypoint x="1115" y="121" /> + <di:waypoint x="1193" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1sq6kp6_di" bpmnElement="SequenceFlow_1sq6kp6"> + <di:waypoint x="385" y="289" /> + <di:waypoint x="467" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0thd6ny_di" bpmnElement="SequenceFlow_0thd6ny"> + <di:waypoint x="1293" y="456" /> + <di:waypoint x="1371" y="456" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0477975_di" bpmnElement="SequenceFlow_0477975"> + <di:waypoint x="1471" y="456" /> + <di:waypoint x="1584" y="456" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0h2oree_di" bpmnElement="SequenceFlow_0h2oree"> + <di:waypoint x="567" y="456" /> + <di:waypoint x="645" y="456" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_19lsayh_di" bpmnElement="SequenceFlow_19lsayh"> + <di:waypoint x="1293" y="645" /> + <di:waypoint x="1371" y="645" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_10ng1vx_di" bpmnElement="SequenceFlow_10ng1vx"> + <di:waypoint x="1471" y="645" /> + <di:waypoint x="1584" y="645" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1bevt3a_di" bpmnElement="SequenceFlow_1bevt3a"> + <di:waypoint x="214" y="801" /> + <di:waypoint x="285" y="801" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1ey6m1e_di" bpmnElement="SequenceFlow_1ey6m1e"> + <di:waypoint x="930" y="289" /> + <di:waypoint x="1015" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="StartEvent_1omdx56_di" bpmnElement="StartEvent_1omdx56"> + <dc:Bounds x="715" y="1166" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_1jx3026_di" bpmnElement="EndEvent_1jx3026"> + <dc:Bounds x="1353" y="1166" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1swzdpw_di" bpmnElement="ScriptTask_1swzdpw"> + <dc:Bounds x="979" y="1144" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1w67v6s_di" bpmnElement="SequenceFlow_1w67v6s"> + <di:waypoint x="751" y="1184" /> + <di:waypoint x="979" y="1184" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_08mlzwz_di" bpmnElement="SequenceFlow_08mlzwz"> + <di:waypoint x="1079" y="1184" /> + <di:waypoint x="1353" y="1184" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ReceiveTask_0zkpdpa_di" bpmnElement="Task_1b5t88h"> + <dc:Bounds x="285" y="416" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1fk37v7_di" bpmnElement="SequenceFlow_1fk37v7"> + <di:waypoint x="214" y="456" /> + <di:waypoint x="285" y="456" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_16uz2t9_di" bpmnElement="SequenceFlow_16uz2t9"> + <di:waypoint x="385" y="456" /> + <di:waypoint x="467" y="456" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="BoundaryEvent_15igwk2_di" bpmnElement="BoundaryEvent_0clo9pv"> + <dc:Bounds x="317" y="478" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_12qt5ci_di" bpmnElement="SequenceFlow_12qt5ci"> + <di:waypoint x="335" y="514" /> + <di:waypoint x="335" y="611" /> + <di:waypoint x="335" y="593" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="CallActivity_0v4mw2x_di" bpmnElement="CallActivity_0v4mw2x"> + <dc:Bounds x="1015" y="249" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1aaozcg_di" bpmnElement="SequenceFlow_1aaozcg"> + <di:waypoint x="1115" y="289" /> + <di:waypoint x="1193" y="289" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_046irye_di" bpmnElement="SequenceFlow_046irye"> + <di:waypoint x="745" y="121" /> + <di:waypoint x="830" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1o23s0i_di" bpmnElement="SequenceFlow_1o23s0i"> + <di:waypoint x="930" y="121" /> + <di:waypoint x="1015" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0jrclmc_di" bpmnElement="SequenceFlow_0jrclmc"> + <di:waypoint x="1470" y="121" /> + <di:waypoint x="1584" y="121" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_19uxoi8_di" bpmnElement="ScriptTask_19uxoi8"> + <dc:Bounds x="645" y="761" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0kixzdj_di" bpmnElement="SequenceFlow_0kixzdj"> + <di:waypoint x="745" y="801" /> + <di:waypoint x="823" y="801" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</bpmn:definitions> + diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeleteCommunicationService.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeleteCommunicationService.bpmn new file mode 100644 index 0000000000..58a69621d3 --- /dev/null +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeleteCommunicationService.bpmn @@ -0,0 +1,523 @@ +<?xml version="1.0" encoding="UTF-8"?> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1nvjixd" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.4.1"> + <bpmn:process id="DeleteCommunicationService" name="DeleteCommunicationService" isExecutable="true"> + <bpmn:startEvent id="StartEvent_1" name="start"> + <bpmn:outgoing>SequenceFlow_1kjqnil</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="SequenceFlow_1kjqnil" sourceRef="StartEvent_1" targetRef="Task_1mqm4nb" /> + <bpmn:sequenceFlow id="SequenceFlow_0ogievs" sourceRef="Task_1mqm4nb" targetRef="Task_0q2v7qe" /> + <bpmn:sequenceFlow id="SequenceFlow_192yyii" sourceRef="Task_0q2v7qe" targetRef="Task_0zaekmn" /> + <bpmn:serviceTask id="Task_0zaekmn" name="Init Service Operation Status"> + <bpmn:extensionElements> + <camunda:connector> + <camunda:inputOutput> + <camunda:inputParameter name="url">${dbAdapterEndpoint}</camunda:inputParameter> + <camunda:inputParameter name="headers"> + <camunda:map> + <camunda:entry key="content-type">application/soap+xml</camunda:entry> + <camunda:entry key="Authorization">Basic YnBlbDpwYXNzd29yZDEk</camunda:entry> + </camunda:map> + </camunda:inputParameter> + <camunda:inputParameter name="payload">${updateOperationStatus}</camunda:inputParameter> + <camunda:inputParameter name="method">POST</camunda:inputParameter> + <camunda:outputParameter name="CSMF_dbResponseCode">${statusCode}</camunda:outputParameter> + <camunda:outputParameter name="CSMF_dbResponse">${response}</camunda:outputParameter> + </camunda:inputOutput> + <camunda:connectorId>http-connector</camunda:connectorId> + </camunda:connector> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_192yyii</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0xvoume</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:scriptTask id="Task_0q2v7qe" name="Init Service Operation Status" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0ogievs</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_192yyii</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs= new DeleteCommunicationService() +dcs.preInitUpdateOperationStatus(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:scriptTask id="Task_1mqm4nb" name="PreProcessRequest" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1kjqnil</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0ogievs</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs= new DeleteCommunicationService() +dcs.preProcessRequest(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:scriptTask id="ScriptTask_1k5stey" name="Send Sync Ack Response" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0xvoume</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_017qgen</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.sendSyncResponse(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_0xvoume" sourceRef="Task_0zaekmn" targetRef="ScriptTask_1k5stey" /> + <bpmn:sequenceFlow id="SequenceFlow_017qgen" sourceRef="ScriptTask_1k5stey" targetRef="Task_0ux5uk1" /> + <bpmn:serviceTask id="Task_1kizznk" name="Update Service Operation Status"> + <bpmn:extensionElements> + <camunda:connector> + <camunda:inputOutput> + <camunda:inputParameter name="url">${dbAdapterEndpoint}</camunda:inputParameter> + <camunda:inputParameter name="headers"> + <camunda:map> + <camunda:entry key="content-type">application/soap+xml</camunda:entry> + <camunda:entry key="Authorization">Basic YnBlbDpwYXNzd29yZDEk</camunda:entry> + </camunda:map> + </camunda:inputParameter> + <camunda:inputParameter name="payload">${updateOperationStatus}</camunda:inputParameter> + <camunda:inputParameter name="method">POST</camunda:inputParameter> + <camunda:outputParameter name="CSMF_dbResponseCode">${statusCode}</camunda:outputParameter> + <camunda:outputParameter name="CSMF_dbResponse">${response}</camunda:outputParameter> + </camunda:inputOutput> + <camunda:connectorId>http-connector</camunda:connectorId> + </camunda:connector> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0jrbkau</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1ssiyug</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:serviceTask id="Task_0xwjycr" name="update operation status completed"> + <bpmn:extensionElements> + <camunda:connector> + <camunda:inputOutput> + <camunda:inputParameter name="url">${dbAdapterEndpoint}</camunda:inputParameter> + <camunda:inputParameter name="headers"> + <camunda:map> + <camunda:entry key="content-type">application/json</camunda:entry> + <camunda:entry key="Authorization">Basic YnBlbDpwYXNzd29yZDEk</camunda:entry> + </camunda:map> + </camunda:inputParameter> + <camunda:inputParameter name="payload">${updateOperationStatus}</camunda:inputParameter> + <camunda:inputParameter name="method">POST</camunda:inputParameter> + <camunda:outputParameter name="CSMF_dbResponseCode">${statusCode}</camunda:outputParameter> + <camunda:outputParameter name="CSMF_dbResponse">${response}</camunda:outputParameter> + </camunda:inputOutput> + <camunda:connectorId>http-connector</camunda:connectorId> + </camunda:connector> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_00g94pg</bpmn:incoming> + <bpmn:incoming>SequenceFlow_16ewagx</bpmn:incoming> + <bpmn:incoming>SequenceFlow_1amyd7h</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_10g2pnj</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:endEvent id="EndEvent_0ixagvk" name="end"> + <bpmn:incoming>SequenceFlow_10g2pnj</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="SequenceFlow_10g2pnj" sourceRef="Task_0xwjycr" targetRef="EndEvent_0ixagvk" /> + <bpmn:scriptTask id="Task_0ux5uk1" name="Query CommunicationSerive From AAI" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_017qgen</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1j0e2po</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.queryCommunicationSeriveFromAAI(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_0ce724z" name="Go to Query delete progress"> + <bpmn:incoming>SequenceFlow_0bmtfxq</bpmn:incoming> + <bpmn:linkEventDefinition name="QueryDeleteProgress" /> + </bpmn:intermediateThrowEvent> + <bpmn:intermediateCatchEvent id="IntermediateThrowEvent_11i33ob" name="QueryDeleteProgress"> + <bpmn:outgoing>SequenceFlow_1tcgzv0</bpmn:outgoing> + <bpmn:linkEventDefinition name="QueryDeleteProgress" /> + </bpmn:intermediateCatchEvent> + <bpmn:scriptTask id="Task_0qg5gn6" name="send request to NSMF WF" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_12xn3kz</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0bmtfxq</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.sendRequest2NSMFWF(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_0bmtfxq" sourceRef="Task_0qg5gn6" targetRef="IntermediateThrowEvent_0ce724z" /> + <bpmn:scriptTask id="Task_0qvxmnh" name="Delete CS Profile From AAI" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0s7s7zk</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0arvpzv</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.delCSProfileFromAAI(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_0arvpzv" sourceRef="Task_0qvxmnh" targetRef="Task_0b5j6rg" /> + <bpmn:scriptTask id="Task_0b5j6rg" name="Delete CS From AAI" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0arvpzv</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_00g94pg</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.delCSFromAAI(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:subProcess id="SubProcess_0p6namq" name="Exception Handling Sub-Process" triggeredByEvent="true"> + <bpmn:startEvent id="StartEvent_1843894"> + <bpmn:outgoing>SequenceFlow_1u5ko4h</bpmn:outgoing> + <bpmn:errorEventDefinition /> + </bpmn:startEvent> + <bpmn:sequenceFlow id="SequenceFlow_1u5ko4h" sourceRef="StartEvent_1843894" targetRef="Task_1spbb2x" /> + <bpmn:scriptTask id="Task_1spbb2x" name="Send Error Response" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1u5ko4h</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_05yfw7t</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.sendSyncError(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_05yfw7t" sourceRef="Task_1spbb2x" targetRef="Task_0yqtfvh" /> + <bpmn:scriptTask id="Task_0yqtfvh" name="Pre update Failed Operation Status" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_05yfw7t</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0c0btia</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.preFailedOperationStatus(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_0c0btia" sourceRef="Task_0yqtfvh" targetRef="Task_1s3l3fc" /> + <bpmn:serviceTask id="Task_1s3l3fc" name="Update Service Operation Status"> + <bpmn:extensionElements> + <camunda:connector> + <camunda:inputOutput> + <camunda:inputParameter name="url">${dbAdapterEndpoint}</camunda:inputParameter> + <camunda:inputParameter name="headers"> + <camunda:map> + <camunda:entry key="content-type">application/soap+xml</camunda:entry> + <camunda:entry key="Authorization">Basic YnBlbDpwYXNzd29yZDEk</camunda:entry> + </camunda:map> + </camunda:inputParameter> + <camunda:inputParameter name="payload">${updateOperationStatus}</camunda:inputParameter> + <camunda:inputParameter name="method">POST</camunda:inputParameter> + <camunda:outputParameter name="CSMF_dbResponseCode">${statusCode}</camunda:outputParameter> + <camunda:outputParameter name="CSMF_dbResponse">${response}</camunda:outputParameter> + </camunda:inputOutput> + <camunda:connectorId>http-connector</camunda:connectorId> + </camunda:connector> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0c0btia</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1w55zo7</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:endEvent id="EndEvent_1fsful5"> + <bpmn:incoming>SequenceFlow_1w55zo7</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="SequenceFlow_1w55zo7" sourceRef="Task_1s3l3fc" targetRef="EndEvent_1fsful5" /> + </bpmn:subProcess> + <bpmn:sequenceFlow id="SequenceFlow_1tcgzv0" sourceRef="IntermediateThrowEvent_11i33ob" targetRef="ExclusiveGateway_16tdrty" /> + <bpmn:subProcess id="SubProcess_1l7gd5k" name="Sub-process for UnexpectedErrors" triggeredByEvent="true"> + <bpmn:startEvent id="StartEvent_0zc2hnn"> + <bpmn:outgoing>SequenceFlow_0mifi3x</bpmn:outgoing> + <bpmn:errorEventDefinition /> + </bpmn:startEvent> + <bpmn:sequenceFlow id="SequenceFlow_0mifi3x" sourceRef="StartEvent_0zc2hnn" targetRef="Task_01va9ms" /> + <bpmn:endEvent id="EndEvent_052gdjz"> + <bpmn:incoming>SequenceFlow_073yxs4</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="SequenceFlow_073yxs4" sourceRef="Task_01va9ms" targetRef="EndEvent_052gdjz" /> + <bpmn:scriptTask id="Task_01va9ms" name="Handle Unexpected Error" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0mifi3x</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_073yxs4</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.common.scripts.* +ExceptionUtil ex = new ExceptionUtil() +ex.processJavaException(execution)</bpmn:script> + </bpmn:scriptTask> + </bpmn:subProcess> + <bpmn:exclusiveGateway id="ExclusiveGateway_1lyw619" name="Is NSMF timeout?" default="SequenceFlow_0s7s7zk"> + <bpmn:incoming>SequenceFlow_0xipbpr</bpmn:incoming> + <bpmn:incoming>SequenceFlow_1sah9so</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0s7s7zk</bpmn:outgoing> + <bpmn:outgoing>SequenceFlow_0bqfbxf</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="SequenceFlow_0s7s7zk" sourceRef="ExclusiveGateway_1lyw619" targetRef="Task_0qvxmnh" /> + <bpmn:sequenceFlow id="SequenceFlow_00g94pg" sourceRef="Task_0b5j6rg" targetRef="Task_0xwjycr" /> + <bpmn:sequenceFlow id="SequenceFlow_0bqfbxf" name="yes" sourceRef="ExclusiveGateway_1lyw619" targetRef="Task_1ovewjr"> + <bpmn:documentation>#{(execution.getVariable("isTimeOut") == "YES")}</bpmn:documentation> + <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isTimeOut") == "YES")}</bpmn:conditionExpression> + </bpmn:sequenceFlow> + <bpmn:exclusiveGateway id="ExclusiveGateway_16tdrty" name="is NSMF Async Succeed?" default="SequenceFlow_0jrbkau"> + <bpmn:incoming>SequenceFlow_1tcgzv0</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0jrbkau</bpmn:outgoing> + <bpmn:outgoing>SequenceFlow_16ewagx</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="SequenceFlow_0jrbkau" sourceRef="ExclusiveGateway_16tdrty" targetRef="Task_1kizznk" /> + <bpmn:sequenceFlow id="SequenceFlow_16ewagx" name="no" sourceRef="ExclusiveGateway_16tdrty" targetRef="Task_0xwjycr"> + <bpmn:documentation>#{(execution.getVariable("isNSMFWFRspSucceed" ) == "no")}</bpmn:documentation> + <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isNSMFWFRspSucceed" ) == "no")}</bpmn:conditionExpression> + </bpmn:sequenceFlow> + <bpmn:exclusiveGateway id="ExclusiveGateway_0icj4go" name="Is E2E Slice Service Instance Id Exist?" default="SequenceFlow_12xn3kz"> + <bpmn:incoming>SequenceFlow_1j0e2po</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_12xn3kz</bpmn:outgoing> + <bpmn:outgoing>SequenceFlow_0xipbpr</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="SequenceFlow_1j0e2po" sourceRef="Task_0ux5uk1" targetRef="ExclusiveGateway_0icj4go" /> + <bpmn:sequenceFlow id="SequenceFlow_12xn3kz" sourceRef="ExclusiveGateway_0icj4go" targetRef="Task_0qg5gn6" /> + <bpmn:sequenceFlow id="SequenceFlow_0xipbpr" name="no" sourceRef="ExclusiveGateway_0icj4go" targetRef="ExclusiveGateway_1lyw619"> + <bpmn:documentation>#{(execution.getVariable("e2eSliceServiceInstanceId") == null)}</bpmn:documentation> + <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("e2eSliceServiceInstanceId") == null)}</bpmn:conditionExpression> + </bpmn:sequenceFlow> + <bpmn:callActivity id="Task_1ff6flk" name="CallCheckServiceProcessStatus" calledElement="CheckServiceProcessStatus"> + <bpmn:extensionElements> + <camunda:in source="e2eSliceServiceInstanceId" target="serviceInstanceId" /> + <camunda:in source="e2eOperationId" target="operationId" /> + <camunda:in source="successConditions" target="successConditions" /> + <camunda:in source="errorConditions" target="errorConditions" /> + <camunda:in source="processServiceType" target="processServiceType" /> + <camunda:in source="timeOut" target="timeOut" /> + <camunda:out source="operationStatus" target="result" /> + <camunda:out source="operationContent" target="reason" /> + <camunda:out source="WorkflowException" target="WorkflowException" /> + <camunda:out source="isTimeOut" target="isTimeOut" /> + <camunda:in source="subOperationType" target="operationType" /> + <camunda:in source="initProgress" target="initProgress" /> + <camunda:in source="endProgress" target="endProgress" /> + <camunda:in source="serviceInstanceId" target="parentServiceInstanceId" /> + <camunda:in source="globalSubscriberId" target="globalSubscriberId" /> + <camunda:in source="operationId" target="parentOperationId" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0thr8dc</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1sah9so</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:scriptTask id="Task_1ovewjr" name="Prepare update operation status error" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_0bqfbxf</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1amyd7h</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.prepareFailureStatus(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_1amyd7h" sourceRef="Task_1ovewjr" targetRef="Task_0xwjycr" /> + <bpmn:sequenceFlow id="SequenceFlow_1sah9so" sourceRef="Task_1ff6flk" targetRef="ExclusiveGateway_1lyw619" /> + <bpmn:sequenceFlow id="SequenceFlow_1ssiyug" sourceRef="Task_1kizznk" targetRef="Task_0y1n9ls" /> + <bpmn:sequenceFlow id="SequenceFlow_0thr8dc" sourceRef="Task_0y1n9ls" targetRef="Task_1ff6flk" /> + <bpmn:scriptTask id="Task_0y1n9ls" name="Prepare Call CheckServiceProcessStatus" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1ssiyug</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0thr8dc</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcs = new DeleteCommunicationService() +dcs.prepareCallCheckProcessStatus(execution)</bpmn:script> + </bpmn:scriptTask> + </bpmn:process> + <bpmndi:BPMNDiagram id="BPMNDiagram_1"> + <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DeleteCommunicationService"> + <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1"> + <dc:Bounds x="152" y="102" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="159" y="145" width="23" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1kjqnil_di" bpmnElement="SequenceFlow_1kjqnil"> + <di:waypoint x="188" y="120" /> + <di:waypoint x="240" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0ogievs_di" bpmnElement="SequenceFlow_0ogievs"> + <di:waypoint x="340" y="120" /> + <di:waypoint x="390" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_192yyii_di" bpmnElement="SequenceFlow_192yyii"> + <di:waypoint x="490" y="120" /> + <di:waypoint x="560" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ServiceTask_104igd7_di" bpmnElement="Task_0zaekmn"> + <dc:Bounds x="560" y="80" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_0tqibrd_di" bpmnElement="Task_0q2v7qe"> + <dc:Bounds x="390" y="80" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_18pflck_di" bpmnElement="Task_1mqm4nb"> + <dc:Bounds x="240" y="80" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1k5stey_di" bpmnElement="ScriptTask_1k5stey"> + <dc:Bounds x="740" y="80" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0xvoume_di" bpmnElement="SequenceFlow_0xvoume"> + <di:waypoint x="660" y="120" /> + <di:waypoint x="740" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_017qgen_di" bpmnElement="SequenceFlow_017qgen"> + <di:waypoint x="840" y="120" /> + <di:waypoint x="910" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ServiceTask_17pxrcl_di" bpmnElement="Task_1kizznk"> + <dc:Bounds x="330" y="310" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ServiceTask_0ucwm85_di" bpmnElement="Task_0xwjycr"> + <dc:Bounds x="1250" y="310" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_0ixagvk_di" bpmnElement="EndEvent_0ixagvk"> + <dc:Bounds x="1432" y="332" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1441" y="375" width="19" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_10g2pnj_di" bpmnElement="SequenceFlow_10g2pnj"> + <di:waypoint x="1350" y="350" /> + <di:waypoint x="1432" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_05zxl7j_di" bpmnElement="Task_0ux5uk1"> + <dc:Bounds x="910" y="80" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateThrowEvent_1go0jt1_di" bpmnElement="IntermediateThrowEvent_0ce724z"> + <dc:Bounds x="1432" y="102" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1417" y="145" width="76" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="IntermediateCatchEvent_09w3u1d_di" bpmnElement="IntermediateThrowEvent_11i33ob"> + <dc:Bounds x="152" y="332" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="127" y="375" width="86" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_0me3crz_di" bpmnElement="Task_0qg5gn6"> + <dc:Bounds x="1220" y="80" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0bmtfxq_di" bpmnElement="SequenceFlow_0bmtfxq"> + <di:waypoint x="1320" y="120" /> + <di:waypoint x="1432" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_14svlaf_di" bpmnElement="Task_0qvxmnh"> + <dc:Bounds x="900" y="310" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0arvpzv_di" bpmnElement="SequenceFlow_0arvpzv"> + <di:waypoint x="1000" y="350" /> + <di:waypoint x="1060" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_0q6s59r_di" bpmnElement="Task_0b5j6rg"> + <dc:Bounds x="1060" y="310" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="SubProcess_04znyto_di" bpmnElement="SubProcess_0p6namq" isExpanded="true"> + <dc:Bounds x="480" y="650" width="730" height="210" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="StartEvent_1qti4dg_di" bpmnElement="StartEvent_1843894"> + <dc:Bounds x="520" y="742" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1u5ko4h_di" bpmnElement="SequenceFlow_1u5ko4h"> + <di:waypoint x="556" y="760" /> + <di:waypoint x="610" y="760" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_0xdbw5d_di" bpmnElement="Task_1spbb2x"> + <dc:Bounds x="610" y="720" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_05yfw7t_di" bpmnElement="SequenceFlow_05yfw7t"> + <di:waypoint x="710" y="760" /> + <di:waypoint x="770" y="760" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_0hmczex_di" bpmnElement="Task_0yqtfvh"> + <dc:Bounds x="770" y="720" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0c0btia_di" bpmnElement="SequenceFlow_0c0btia"> + <di:waypoint x="870" y="760" /> + <di:waypoint x="930" y="760" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ServiceTask_0ra7dbt_di" bpmnElement="Task_1s3l3fc"> + <dc:Bounds x="930" y="720" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_1fsful5_di" bpmnElement="EndEvent_1fsful5"> + <dc:Bounds x="1092" y="742" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1w55zo7_di" bpmnElement="SequenceFlow_1w55zo7"> + <di:waypoint x="1030" y="760" /> + <di:waypoint x="1092" y="760" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1tcgzv0_di" bpmnElement="SequenceFlow_1tcgzv0"> + <di:waypoint x="188" y="350" /> + <di:waypoint x="235" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="SubProcess_0dwywjh_di" bpmnElement="SubProcess_1l7gd5k" isExpanded="true"> + <dc:Bounds x="660" y="950" width="350" height="200" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="StartEvent_18u3hph_di" bpmnElement="StartEvent_0zc2hnn"> + <dc:Bounds x="700" y="1032" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0mifi3x_di" bpmnElement="SequenceFlow_0mifi3x"> + <di:waypoint x="736" y="1050" /> + <di:waypoint x="790" y="1050" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="EndEvent_052gdjz_di" bpmnElement="EndEvent_052gdjz"> + <dc:Bounds x="952" y="1032" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_073yxs4_di" bpmnElement="SequenceFlow_073yxs4"> + <di:waypoint x="890" y="1050" /> + <di:waypoint x="952" y="1050" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_0lzly9f_di" bpmnElement="Task_01va9ms"> + <dc:Bounds x="790" y="1010" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ExclusiveGateway_1lyw619_di" bpmnElement="ExclusiveGateway_1lyw619" isMarkerVisible="true"> + <dc:Bounds x="785" y="325" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="786.5" y="384.5" width="47" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0s7s7zk_di" bpmnElement="SequenceFlow_0s7s7zk"> + <di:waypoint x="835" y="350" /> + <di:waypoint x="900" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_00g94pg_di" bpmnElement="SequenceFlow_00g94pg"> + <di:waypoint x="1160" y="350" /> + <di:waypoint x="1250" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0bqfbxf_di" bpmnElement="SequenceFlow_0bqfbxf"> + <di:waypoint x="810" y="325" /> + <di:waypoint x="810" y="250" /> + <di:waypoint x="900" y="250" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="846" y="232" width="17" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ExclusiveGateway_16tdrty_di" bpmnElement="ExclusiveGateway_16tdrty" isMarkerVisible="true"> + <dc:Bounds x="235" y="325" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="226" y="295" width="77" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0jrbkau_di" bpmnElement="SequenceFlow_0jrbkau"> + <di:waypoint x="285" y="350" /> + <di:waypoint x="330" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_16ewagx_di" bpmnElement="SequenceFlow_16ewagx"> + <di:waypoint x="260" y="375" /> + <di:waypoint x="260" y="500" /> + <di:waypoint x="1300" y="500" /> + <di:waypoint x="1300" y="390" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="774" y="482" width="13" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ExclusiveGateway_0icj4go_di" bpmnElement="ExclusiveGateway_0icj4go" isMarkerVisible="true"> + <dc:Bounds x="1085" y="95" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1069" y="50" width="82" height="40" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1j0e2po_di" bpmnElement="SequenceFlow_1j0e2po"> + <di:waypoint x="1010" y="120" /> + <di:waypoint x="1085" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_12xn3kz_di" bpmnElement="SequenceFlow_12xn3kz"> + <di:waypoint x="1135" y="120" /> + <di:waypoint x="1220" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0xipbpr_di" bpmnElement="SequenceFlow_0xipbpr"> + <di:waypoint x="1110" y="145" /> + <di:waypoint x="1110" y="190" /> + <di:waypoint x="810" y="190" /> + <di:waypoint x="810" y="325" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="946" y="172" width="13" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="CallActivity_1knnc2k_di" bpmnElement="Task_1ff6flk"> + <dc:Bounds x="630" y="310" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1r84j75_di" bpmnElement="Task_1ovewjr"> + <dc:Bounds x="900" y="210" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1amyd7h_di" bpmnElement="SequenceFlow_1amyd7h"> + <di:waypoint x="1000" y="250" /> + <di:waypoint x="1300" y="250" /> + <di:waypoint x="1300" y="310" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1sah9so_di" bpmnElement="SequenceFlow_1sah9so"> + <di:waypoint x="730" y="350" /> + <di:waypoint x="785" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1ssiyug_di" bpmnElement="SequenceFlow_1ssiyug"> + <di:waypoint x="430" y="350" /> + <di:waypoint x="480" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0thr8dc_di" bpmnElement="SequenceFlow_0thr8dc"> + <di:waypoint x="580" y="350" /> + <di:waypoint x="630" y="350" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_0r8ad9j_di" bpmnElement="Task_0y1n9ls"> + <dc:Bounds x="480" y="310" width="100" height="80" /> + </bpmndi:BPMNShape> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</bpmn:definitions> diff --git a/common/pom.xml b/common/pom.xml index 3b33d6ed37..02d2f35545 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -59,7 +59,7 @@ <dependency> <groupId>org.onap.aai.schema-service</groupId> <artifactId>aai-schema</artifactId> - <version>1.6.3</version> + <version>1.6.4-SNAPSHOT</version> </dependency> <dependency> <groupId>org.modelmapper</groupId> diff --git a/common/src/main/java/org/onap/so/beans/nsmf/SliceTaskParams.java b/common/src/main/java/org/onap/so/beans/nsmf/SliceTaskParams.java new file mode 100644 index 0000000000..bf881c0f19 --- /dev/null +++ b/common/src/main/java/org/onap/so/beans/nsmf/SliceTaskParams.java @@ -0,0 +1,413 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * 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.so.beans.nsmf; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +public class SliceTaskParams implements Serializable { + + private static final long serialVersionUID = -4389946152970978423L; + + private String serviceId; + + private String serviceName; + + private String nstId; + + private String nstName; + + private String tnScriptName; + + private String anScriptName; + + private String cnScriptName; + + private Map<String, Object> serviceProfile; + + private String suggestNsiId; + + private String suggestNsiName; + + private Map<String, Object> sliceProfileTn; + + private Map<String, Object> sliceProfileCn; + + private Map<String, Object> sliceProfileAn; + + private String tnSuggestNssiId; + + private String tnSuggestNssiName; + + private String tnProgress; + + private String tnStatus; + + private String tnStatusDescription; + + private String cnSuggestNssiId; + + private String cnSuggestNssiName; + + private String cnProgress; + + private String cnStatus; + + private String cnStatusDescription; + + private String anSuggestNssiId; + + private String anSuggestNssiName; + + private String anProgress; + + private String anStatus; + + private String anStatusDescription; + + public String getNstId() { + return nstId; + } + + public void setNstId(String nstId) { + this.nstId = nstId; + } + + public String getNstName() { + return nstName; + } + + public void setNstName(String nstName) { + this.nstName = nstName; + } + + public String getTnScriptName() { + return tnScriptName; + } + + public void setTnScriptName(String tnScriptName) { + this.tnScriptName = tnScriptName; + } + + public String getAnScriptName() { + return anScriptName; + } + + public void setAnScriptName(String anScriptName) { + this.anScriptName = anScriptName; + } + + public String getCnScriptName() { + return cnScriptName; + } + + public void setCnScriptName(String cnScriptName) { + this.cnScriptName = cnScriptName; + } + + public String getServiceId() { + return serviceId; + } + + public void setServiceId(String serviceId) { + this.serviceId = serviceId; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public Map<String, Object> getServiceProfile() { + return serviceProfile; + } + + public void setServiceProfile(Map<String, Object> serviceProfile) { + this.serviceProfile = serviceProfile; + } + + public String getSuggestNsiId() { + return suggestNsiId; + } + + public void setSuggestNsiId(String suggestNsiId) { + this.suggestNsiId = suggestNsiId; + } + + public String getSuggestNsiName() { + return suggestNsiName; + } + + public void setSuggestNsiName(String suggestNsiName) { + this.suggestNsiName = suggestNsiName; + } + + public Map<String, Object> getSliceProfileTn() { + return sliceProfileTn; + } + + public void setSliceProfileTn(Map<String, Object> sliceProfileTn) { + this.sliceProfileTn = sliceProfileTn; + } + + public Map<String, Object> getSliceProfileCn() { + return sliceProfileCn; + } + + public void setSliceProfileCn(Map<String, Object> sliceProfileCn) { + this.sliceProfileCn = sliceProfileCn; + } + + public Map<String, Object> getSliceProfileAn() { + return sliceProfileAn; + } + + public void setSliceProfileAn(Map<String, Object> sliceProfileAn) { + this.sliceProfileAn = sliceProfileAn; + } + + public String getTnSuggestNssiId() { + return tnSuggestNssiId; + } + + public void setTnSuggestNssiId(String tnSuggestNssiId) { + this.tnSuggestNssiId = tnSuggestNssiId; + } + + public String getTnSuggestNssiName() { + return tnSuggestNssiName; + } + + public void setTnSuggestNssiName(String tnSuggestNssiName) { + this.tnSuggestNssiName = tnSuggestNssiName; + } + + public String getTnProgress() { + return tnProgress; + } + + public void setTnProgress(String tnProgress) { + this.tnProgress = tnProgress; + } + + public String getTnStatus() { + return tnStatus; + } + + public void setTnStatus(String tnStatus) { + this.tnStatus = tnStatus; + } + + public String getTnStatusDescription() { + return tnStatusDescription; + } + + public void setTnStatusDescription(String tnStatusDescription) { + this.tnStatusDescription = tnStatusDescription; + } + + public String getCnSuggestNssiId() { + return cnSuggestNssiId; + } + + public void setCnSuggestNssiId(String cnSuggestNssiId) { + this.cnSuggestNssiId = cnSuggestNssiId; + } + + public String getCnSuggestNssiName() { + return cnSuggestNssiName; + } + + public void setCnSuggestNssiName(String cnSuggestNssiName) { + this.cnSuggestNssiName = cnSuggestNssiName; + } + + public String getCnProgress() { + return cnProgress; + } + + public void setCnProgress(String cnProgress) { + this.cnProgress = cnProgress; + } + + public String getCnStatus() { + return cnStatus; + } + + public void setCnStatus(String cnStatus) { + this.cnStatus = cnStatus; + } + + public String getCnStatusDescription() { + return cnStatusDescription; + } + + public void setCnStatusDescription(String cnStatusDescription) { + this.cnStatusDescription = cnStatusDescription; + } + + public String getAnSuggestNssiId() { + return anSuggestNssiId; + } + + public void setAnSuggestNssiId(String anSuggestNssiId) { + this.anSuggestNssiId = anSuggestNssiId; + } + + public String getAnSuggestNssiName() { + return anSuggestNssiName; + } + + public void setAnSuggestNssiName(String anSuggestNssiName) { + this.anSuggestNssiName = anSuggestNssiName; + } + + public String getAnProgress() { + return anProgress; + } + + public void setAnProgress(String anProgress) { + this.anProgress = anProgress; + } + + public String getAnStatus() { + return anStatus; + } + + public void setAnStatus(String anStatus) { + this.anStatus = anStatus; + } + + public String getAnStatusDescription() { + return anStatusDescription; + } + + public void setAnStatusDescription(String anStatusDescription) { + this.anStatusDescription = anStatusDescription; + } + + public String convertToJson() { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("ServiceId", serviceId); + jsonObject.addProperty("ServiceName", serviceName); + jsonObject.addProperty("NSTId", nstId); + jsonObject.addProperty("NSTName", nstName); + jsonObject.addProperty("TN.ScriptName", tnScriptName); + jsonObject.addProperty("AN.ScriptName", anScriptName); + jsonObject.addProperty("CN.ScriptName", cnScriptName); + for (Map.Entry<String, Object> entry : serviceProfile.entrySet()) { + jsonObject.addProperty("ServiceProfile." + entry.getKey(), entry.getValue().toString()); + } + jsonObject.addProperty("suggestNSIId", suggestNsiId); + jsonObject.addProperty("suggestNSIName", suggestNsiName); + for (Map.Entry<String, Object> entry : sliceProfileTn.entrySet()) { + jsonObject.addProperty("SliceProfile.TN." + entry.getKey(), entry.getValue().toString()); + } + for (Map.Entry<String, Object> entry : sliceProfileCn.entrySet()) { + jsonObject.addProperty("SliceProfile.CN." + entry.getKey(), entry.getValue().toString()); + } + for (Map.Entry<String, Object> entry : sliceProfileAn.entrySet()) { + jsonObject.addProperty("SliceProfile.AN." + entry.getKey(), entry.getValue().toString()); + } + jsonObject.addProperty("TN.SuggestNSSIId", tnSuggestNssiId); + jsonObject.addProperty("TN.SuggestNSSIName", tnSuggestNssiName); + jsonObject.addProperty("TN.progress", tnProgress); + jsonObject.addProperty("TN.status", tnStatus); + jsonObject.addProperty("TN.statusDescription", tnStatusDescription); + jsonObject.addProperty("CN.SuggestNSSIId", cnSuggestNssiId); + jsonObject.addProperty("CN.SuggestNSSIName", cnSuggestNssiName); + jsonObject.addProperty("CN.progress", cnProgress); + jsonObject.addProperty("CN.status", cnStatus); + jsonObject.addProperty("CN.statusDescription", cnStatusDescription); + jsonObject.addProperty("AN.SuggestNSSIId", anSuggestNssiId); + jsonObject.addProperty("AN.SuggestNSSIName", anSuggestNssiName); + jsonObject.addProperty("AN.progress", anProgress); + jsonObject.addProperty("AN.status", anStatus); + jsonObject.addProperty("AN.statusDescription", anStatusDescription); + + return jsonObject.toString(); + } + + public void convertFromJson(String jsonString) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + Map<String, String> paramMap = (Map<String, String>) mapper.readValue(jsonString, Map.class); + this.setServiceId(paramMap.get("ServiceId")); + this.setServiceName(paramMap.get("ServiceName")); + this.setNstId(paramMap.get("NSTId")); + this.setNstName(paramMap.get("NSTName")); + this.setTnScriptName(paramMap.get("TN.ScriptName")); + this.setAnScriptName(paramMap.get("AN.ScriptName")); + this.setCnScriptName(paramMap.get("CN.ScriptName")); + Map<String, Object> serviceProfileMap = new HashMap<>(); + for (Map.Entry<String, String> entry : paramMap.entrySet()) { + if (entry.getKey().startsWith("ServiceProfile.")) { + serviceProfileMap.put(entry.getKey().replaceFirst("^ServiceProfile.", ""), entry.getValue()); + } + } + this.setServiceProfile(serviceProfileMap); + this.setSuggestNsiId(paramMap.get("suggestNSIId")); + this.setSuggestNsiName(paramMap.get("suggestNSIName")); + Map<String, Object> sliceProfileTnMap = new HashMap<>(); + for (Map.Entry<String, String> entry : paramMap.entrySet()) { + if (entry.getKey().startsWith("SliceProfile.TN.")) { + sliceProfileTnMap.put(entry.getKey().replaceFirst("^SliceProfile.TN.", ""), entry.getValue()); + } + } + this.setSliceProfileTn(sliceProfileTnMap); + Map<String, Object> sliceProfileCnMap = new HashMap<>(); + for (Map.Entry<String, String> entry : paramMap.entrySet()) { + if (entry.getKey().startsWith("SliceProfile.CN.")) { + sliceProfileCnMap.put(entry.getKey().replaceFirst("^SliceProfile.CN.", ""), entry.getValue()); + } + } + this.setSliceProfileCn(sliceProfileCnMap); + Map<String, Object> sliceProfileAnMap = new HashMap<>(); + for (Map.Entry<String, String> entry : paramMap.entrySet()) { + if (entry.getKey().startsWith("SliceProfile.AN.")) { + sliceProfileAnMap.put(entry.getKey().replaceFirst("^SliceProfile.AN.", ""), entry.getValue()); + } + } + this.setSliceProfileAn(sliceProfileAnMap); + this.setTnSuggestNssiId(paramMap.get("TN.SuggestNSSIId")); + this.setTnSuggestNssiName(paramMap.get("TN.SuggestNSSIName")); + this.setTnProgress(paramMap.get("TN.progress")); + this.setTnStatus(paramMap.get("TN.status")); + this.setTnStatusDescription(paramMap.get("TN.statusDescription")); + this.setCnSuggestNssiId(paramMap.get("CN.SuggestNSSIId")); + this.setCnSuggestNssiName(paramMap.get("CN.SuggestNSSIName")); + this.setCnProgress(paramMap.get("CN.progress")); + this.setCnStatus(paramMap.get("CN.status")); + this.setCnStatusDescription(paramMap.get("CN.statusDescription")); + this.setAnSuggestNssiId(paramMap.get("AN.SuggestNSSIId")); + this.setAnSuggestNssiName(paramMap.get("AN.SuggestNSSIName")); + this.setAnProgress(paramMap.get("AN.progress")); + this.setAnStatus(paramMap.get("AN.status")); + this.setAnStatusDescription(paramMap.get("AN.statusDescription")); + } +} + diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java index f78ac737ed..b96df4ff9e 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java @@ -20,67 +20,21 @@ package org.onap.so.client.aai; -import java.io.Serializable; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; +import com.google.common.base.CaseFormat; import org.onap.aai.annotations.Metadata; -import org.onap.aai.domain.yang.AggregateRoute; -import org.onap.aai.domain.yang.AllottedResource; -import org.onap.aai.domain.yang.CloudRegion; -import org.onap.aai.domain.yang.Collection; -import org.onap.aai.domain.yang.Complex; -import org.onap.aai.domain.yang.Configuration; -import org.onap.aai.domain.yang.Connector; -import org.onap.aai.domain.yang.Customer; -import org.onap.aai.domain.yang.Device; -import org.onap.aai.domain.yang.EsrVnfm; -import org.onap.aai.domain.yang.ExtAaiNetwork; -import org.onap.aai.domain.yang.Flavor; -import org.onap.aai.domain.yang.GenericVnf; -import org.onap.aai.domain.yang.Image; -import org.onap.aai.domain.yang.InstanceGroup; -import org.onap.aai.domain.yang.L3Network; -import org.onap.aai.domain.yang.LInterface; -import org.onap.aai.domain.yang.LineOfBusiness; -import org.onap.aai.domain.yang.ModelVer; -import org.onap.aai.domain.yang.NetworkPolicy; -import org.onap.aai.domain.yang.NetworkTechnology; -import org.onap.aai.domain.yang.OperationalEnvironment; -import org.onap.aai.domain.yang.OwningEntity; -import org.onap.aai.domain.yang.PInterface; -import org.onap.aai.domain.yang.PhysicalLink; -import org.onap.aai.domain.yang.Platform; -import org.onap.aai.domain.yang.Pnf; -import org.onap.aai.domain.yang.PortGroup; -import org.onap.aai.domain.yang.Project; -import org.onap.aai.domain.yang.Pserver; -import org.onap.aai.domain.yang.RouteTableReference; -import org.onap.aai.domain.yang.Service; -import org.onap.aai.domain.yang.ServiceInstance; -import org.onap.aai.domain.yang.ServiceSubscription; -import org.onap.aai.domain.yang.SpPartner; -import org.onap.aai.domain.yang.SriovPf; -import org.onap.aai.domain.yang.Subnet; -import org.onap.aai.domain.yang.Tenant; -import org.onap.aai.domain.yang.TunnelXconnect; -import org.onap.aai.domain.yang.Vce; -import org.onap.aai.domain.yang.VfModule; -import org.onap.aai.domain.yang.VlanTag; -import org.onap.aai.domain.yang.Vnfc; -import org.onap.aai.domain.yang.VolumeGroup; -import org.onap.aai.domain.yang.VpnBinding; -import org.onap.aai.domain.yang.Vserver; -import org.onap.aai.domain.yang.Zone; +import org.onap.aai.domain.yang.*; import org.onap.so.client.graphinventory.GraphInventoryObjectType; import org.onap.so.constants.Defaults; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; -import com.google.common.base.CaseFormat; +import java.io.Serializable; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; public class AAIObjectType implements GraphInventoryObjectType, Serializable { @@ -135,6 +89,8 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable { new AAIObjectType(AAINamespaceConstants.BUSINESS, OwningEntity.class); public static final AAIObjectType ALLOTTED_RESOURCE = new AAIObjectType(AAIObjectType.SERVICE_INSTANCE.uriTemplate(), AllottedResource.class); + public static final AAIObjectType ALLOTTED_RESOURCE_ALL = + new AAIObjectType(AAIObjectType.SERVICE_INSTANCE.uriTemplate(), "/allotted-resources", "allottedResources"); public static final AAIObjectType PNF = new AAIObjectType(AAINamespaceConstants.NETWORK, Pnf.class); public static final AAIObjectType OPERATIONAL_ENVIRONMENT = new AAIObjectType(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, OperationalEnvironment.class); @@ -196,6 +152,18 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable { public static final AAIObjectType THIRDPARTY_SDNC_SYSTEM_INFO_LIST = new AAIObjectType(AAINamespaceConstants.EXTERNAL_SYSTEM + "/esr-thirdparty-sdnc-list", "/esr-thirdparty-sdnc/{sdnc-id}/esr-system-info-list", "thirdparty-sdnc-system-info-list"); + public static final AAIObjectType COMMUNICATION_SERVICE_PROFILE = + new AAIObjectType(AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), CommunicationServiceProfile.class); + public static final AAIObjectType SERVICE_PROFILE = + new AAIObjectType(AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), ServiceProfile.class); + public static final AAIObjectType SERVICE_PROFILE_ALL = + new AAIObjectType(AAIObjectType.SERVICE_INSTANCE.uriTemplate(), "/service-profiles", "serviceProfiles"); + public static final AAIObjectType SLICE_PROFILE = + new AAIObjectType(AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), SliceProfile.class); + public static final AAIObjectType SLICE_PROFILE_ALL = + new AAIObjectType(AAIObjectType.SERVICE_INSTANCE.uriTemplate(), "/slice-profiles", "sliceProfiles"); + public static final AAIObjectType COMMUNICATION_PROFILE_ALL = new AAIObjectType( + AAIObjectType.SERVICE_INSTANCE.uriTemplate(), "/communication-service-profiles", "communicationProfiles"); private final String uriTemplate; private final String parentUri; diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClientParameter.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClientParameter.java index 3cf3907424..2101252ad0 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClientParameter.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClientParameter.java @@ -45,6 +45,7 @@ public class RequestClientParameter { private String requestUri; private String instanceGroupId; private boolean generateIdsOnly; + private String operationType; private RequestClientParameter(Builder builder) { requestId = builder.requestId; @@ -69,6 +70,11 @@ public class RequestClientParameter { requestUri = builder.requestUri; instanceGroupId = builder.instanceGroupId; generateIdsOnly = builder.generateIdsOnly; + operationType = builder.operationType; + } + + public String getOperationType() { + return operationType; } public String getRequestId() { @@ -186,6 +192,12 @@ public class RequestClientParameter { private String requestUri; private String instanceGroupId; private boolean generateIdsOnly; + private String operationType; + + public Builder setOperationType(String operationType) { + this.operationType = operationType; + return this; + } public Builder setRequestId(String requestId) { this.requestId = requestId; @@ -302,4 +314,6 @@ public class RequestClientParameter { } } + + } diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/E2EServiceInstances.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/E2EServiceInstances.java index 0bcb0f1c86..94e03f1452 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/E2EServiceInstances.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/E2EServiceInstances.java @@ -23,11 +23,7 @@ package org.onap.so.apihandlerinfra; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; @@ -38,6 +34,12 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.onap.so.apihandlerinfra.e2eserviceinstancebeans.*; +import org.onap.aai.domain.yang.v16.ServiceInstance; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.AAIResourcesClient; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; import org.onap.so.logger.LoggingAnchor; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; @@ -174,6 +176,30 @@ public class E2EServiceInstances { return deleteE2EserviceInstances(request, Action.deleteInstance, instanceIdMap, version); } + /** + * Activate Requests for 5G slice Service on a specified version and serviceId + * + * @throws ApiException + */ + + @POST + @Path("/{version:[vV][3-5]}/{serviceId}/{operationType}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Operation(description = "Activate 5G slice Service on a specified version and serviceId", responses = @ApiResponse( + content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class))))) + public Response Activate5GSliceServiceInstance(String request, @PathParam("version") String version, + @PathParam("operationType") String operationType, @PathParam(SERVICE_ID) String serviceId) + throws ApiException { + if (operationType.equals("activate")) { + instanceIdMap.put("operationType", "activation"); + } else { + instanceIdMap.put("operationType", "deactivation"); + } + instanceIdMap.put(SERVICE_ID, serviceId); + return Activate5GSliceServiceInstances(request, Action.activateInstance, instanceIdMap, version); + } + @GET @Path("/{version:[vV][3-5]}/{serviceId}/operations/{operationId}") @Operation(description = "Find e2eServiceInstances Requests for a given serviceId and operationId", @@ -345,6 +371,116 @@ public class E2EServiceInstances { return builder.buildResponse(HttpStatus.SC_OK, null, e2eServiceResponse, apiVersion); } + private Response Activate5GSliceServiceInstances(String requestJSON, Action action, + HashMap<String, String> instanceIdMap, String version) throws ApiException { + // TODO should be a new one or the same service instance Id + E2ESliceServiceActivateRequest e2eActReq; + + ObjectMapper mapper = new ObjectMapper(); + try { + e2eActReq = mapper.readValue(requestJSON, E2ESliceServiceActivateRequest.class); + + } catch (Exception e) { + + logger.debug("Mapping of request to JSON object failed : ", e); + Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, + MsoException.ServiceException, "Mapping of request to JSON object failed. " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, null, version); + logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_REQUEST_VALIDATION_ERROR.toString(), + MSO_PROP_APIHANDLER_INFRA, ErrorCode.SchemaError.getValue(), requestJSON, e); + logger.debug(END_OF_THE_TRANSACTION + response.getEntity()); + return response; + } + + String requestId = UUID.randomUUID().toString(); + RecipeLookupResult recipeLookupResult; + try { + // TODO Get the service template model version uuid from AAI. + String modelVersionId = null; + AAIResourcesClient client = new AAIResourcesClient(); + AAIResourceUri url = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + e2eActReq.getGlobalSubscriberId(), e2eActReq.getServiceType(), instanceIdMap.get(SERVICE_ID)); + Optional<ServiceInstance> serviceInstanceOpt = client.get(ServiceInstance.class, url); + if (serviceInstanceOpt.isPresent()) { + modelVersionId = serviceInstanceOpt.get().getModelVersionId(); + } + recipeLookupResult = getServiceInstanceOrchestrationURI(modelVersionId, action); + } catch (Exception e) { + logger.error(MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA, + ErrorCode.AvailabilityError.getValue(), "Exception while communciate with Catalog DB", e); + + Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND, + MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(), + ErrorNumbers.SVC_NO_SERVER_RESOURCES, null, version); + + msoRequest.createErrorRequestRecord(Status.FAILED, requestId, + "Exception while communciate with " + "Catalog DB", action, ModelType.service.name(), requestJSON); + logger.debug(END_OF_THE_TRANSACTION + response.getEntity()); + return response; + } + if (recipeLookupResult == null) { + logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND.toString(), + MSO_PROP_APIHANDLER_INFRA, ErrorCode.DataError.getValue(), "No recipe found in DB"); + Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND, + MsoException.ServiceException, "Recipe does not exist in catalog DB", + ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null, version); + + msoRequest.createErrorRequestRecord(Status.FAILED, requestId, "Recipe does not exist in catalog DB", action, + ModelType.service.name(), requestJSON); + logger.debug(END_OF_THE_TRANSACTION + response.getEntity()); + return response; + } + + RequestClient requestClient; + HttpResponse response; + + try { + requestClient = requestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI()); + + JSONObject jjo = new JSONObject(requestJSON); + jjo.put("operationId", requestId); + + String bpmnRequest = jjo.toString(); + + // Capture audit event + logger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl()); + String serviceId = instanceIdMap.get(SERVICE_ID); + String operationType = instanceIdMap.get("operationType"); + String serviceInstanceType = e2eActReq.getServiceType(); + RequestClientParameter clientParam = new RequestClientParameter.Builder().setRequestId(requestId) + .setBaseVfModule(false).setRecipeTimeout(recipeLookupResult.getRecipeTimeout()) + .setRequestAction(action.name()).setServiceInstanceId(serviceId).setOperationType(operationType) + .setServiceType(serviceInstanceType).setRequestDetails(bpmnRequest).setApiVersion(version) + .setALaCarte(false).setRecipeParamXsd(recipeLookupResult.getRecipeParamXsd()).build(); + response = requestClient.post(clientParam); + + } catch (Exception e) { + Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY, + MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(), + ErrorNumbers.SVC_NO_SERVER_RESOURCES, null, version); + logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_BPEL_COMMUNICATE_ERROR.toString(), + MSO_PROP_APIHANDLER_INFRA, ErrorCode.AvailabilityError.getValue(), + "Exception while communicate with BPMN engine"); + logger.debug("End of the transaction, the final response is: " + resp.getEntity()); + return resp; + } + + if (response == null) { + Response resp = + msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY, MsoException.ServiceException, + "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null, version); + logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_BPEL_COMMUNICATE_ERROR.toString(), + MSO_PROP_APIHANDLER_INFRA, ErrorCode.BusinessProcessError.getValue(), "Null response from BPEL"); + logger.debug(END_OF_THE_TRANSACTION + resp.getEntity()); + return resp; + } + + ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType()); + int bpelStatus = respHandler.getStatus(); + + return beplStatusUpdate(requestClient, respHandler, bpelStatus, version); + } + private Response deleteE2EserviceInstances(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version) throws ApiException { // TODO should be a new one or the same service instance Id @@ -370,7 +506,15 @@ public class E2EServiceInstances { RecipeLookupResult recipeLookupResult; try { // TODO Get the service template model version uuid from AAI. - recipeLookupResult = getServiceInstanceOrchestrationURI(null, action); + String modelVersionId = null; + AAIResourcesClient client = new AAIResourcesClient(); + AAIResourceUri url = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + e2eDelReq.getGlobalSubscriberId(), e2eDelReq.getServiceType(), instanceIdMap.get(SERVICE_ID)); + Optional<ServiceInstance> serviceInstanceOpt = client.get(ServiceInstance.class, url); + if (serviceInstanceOpt.isPresent()) { + modelVersionId = serviceInstanceOpt.get().getModelVersionId(); + } + recipeLookupResult = getServiceInstanceOrchestrationURI(modelVersionId, action); } catch (Exception e) { logger.error(MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA, ErrorCode.AvailabilityError.getValue(), "Exception while communciate with Catalog DB", e); diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/e2eserviceinstancebeans/E2ESliceServiceActivateRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/e2eserviceinstancebeans/E2ESliceServiceActivateRequest.java new file mode 100644 index 0000000000..2fb219c182 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/e2eserviceinstancebeans/E2ESliceServiceActivateRequest.java @@ -0,0 +1,23 @@ +package org.onap.so.apihandlerinfra.e2eserviceinstancebeans; + +public class E2ESliceServiceActivateRequest { + private String globalSubscriberId; + + private String serviceType; + + public String getGlobalSubscriberId() { + return globalSubscriberId; + } + + public void setGlobalSubscriberId(String globalSubscriberId) { + this.globalSubscriberId = globalSubscriberId; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } +} diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java index ab40cefb4e..0d7a6dbd1f 100644 --- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java +++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java @@ -136,6 +136,9 @@ public class Service implements Serializable { @JoinColumn(name = "TOSCA_CSAR_ARTIFACT_UUID") private ToscaCsar csar; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "service") + private List<ServiceArtifact> serviceArtifactList; + @Column(name = "NAMING_POLICY") private String namingPolicy; @@ -371,6 +374,17 @@ public class Service implements Serializable { this.csar = csar; } + public List<ServiceArtifact> getServiceArtifactList() { + if (serviceArtifactList == null) { + serviceArtifactList = new ArrayList<>(); + } + return serviceArtifactList; + } + + public void setServiceArtifactList(List<ServiceArtifact> serviceArtifactList) { + this.serviceArtifactList = serviceArtifactList; + } + public String getWorkloadContext() { return this.workloadContext; } diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/ServiceInfoRepository.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/ServiceInfoRepository.java new file mode 100644 index 0000000000..e3a4ca264e --- /dev/null +++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/ServiceInfoRepository.java @@ -0,0 +1,33 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (c) 2019, CMCC Technologies Co., Ltd. + * ================================================================================ + * 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.so.db.catalog.data.repository; + +import org.onap.so.db.catalog.beans.Service; +import org.onap.so.db.catalog.beans.ServiceInfo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.rest.core.annotation.RepositoryRestResource; + +@RepositoryRestResource(collectionResourceRel = "serviceInfo", path = "serviceInfo") +public interface ServiceInfoRepository extends JpaRepository<ServiceInfo, Integer> { + + ServiceInfo findByService(Service service); + +} diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java index f9cbb0d462..ec4e922c8f 100644 --- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java +++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java @@ -20,14 +20,10 @@ package org.onap.so.db.catalog.rest.beans; +import com.openpojo.business.annotation.BusinessKey; +import org.onap.so.db.catalog.beans.*; import java.io.Serializable; import java.util.ArrayList; -import org.onap.so.db.catalog.beans.AllottedResourceCustomization; -import org.onap.so.db.catalog.beans.NetworkResourceCustomization; -import org.onap.so.db.catalog.beans.Service; -import org.onap.so.db.catalog.beans.VnfResource; -import org.onap.so.db.catalog.beans.VnfResourceCustomization; -import com.openpojo.business.annotation.BusinessKey; /* * A simple holder for Service and its associated elements: VnfResource, 1-n VfModule, Network TBD @@ -42,6 +38,8 @@ public class ServiceMacroHolder implements Serializable { private ArrayList<NetworkResourceCustomization> networkResourceCustomizations; private ArrayList<AllottedResourceCustomization> allottedResourceCustomizations; private ArrayList<VnfResourceCustomization> vnfResourceCustomizations; + private ArrayList<ServiceProxyResourceCustomization> serviceProxyResourceCustomizations; + private ServiceInfo serviceInfo; public ServiceMacroHolder() { @@ -51,6 +49,8 @@ public class ServiceMacroHolder implements Serializable { this.networkResourceCustomizations = new ArrayList<>(); this.allottedResourceCustomizations = new ArrayList<>(); this.vnfResourceCustomizations = new ArrayList<>(); + this.serviceProxyResourceCustomizations = new ArrayList<>(); + this.serviceInfo = null; } public ServiceMacroHolder(Service service) { @@ -66,6 +66,14 @@ public class ServiceMacroHolder implements Serializable { this.service = service; } + public ServiceInfo getServiceInfo() { + return serviceInfo; + } + + public void setServiceInfo(ServiceInfo serviceInfo) { + this.serviceInfo = serviceInfo; + } + public void setVnfResources(ArrayList<VnfResource> vnfResources) { this.vnfResources = vnfResources; } @@ -139,6 +147,15 @@ public class ServiceMacroHolder implements Serializable { } } + public void addServiceProxyResourceCustomization(ServiceProxyResourceCustomization sprc) { + if (this.serviceProxyResourceCustomizations != null) { + this.serviceProxyResourceCustomizations.add(sprc); + } else { + this.serviceProxyResourceCustomizations = new ArrayList<>(); + this.serviceProxyResourceCustomizations.add(sprc); + } + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -148,6 +165,11 @@ public class ServiceMacroHolder implements Serializable { } else { sb.append("service: null"); } + if (this.serviceInfo != null) { + sb.append("serviceInfo: " + this.serviceInfo.toString()); + } else { + sb.append("serviceInfo: null"); + } if (this.vnfResourceCustomizations != null && this.vnfResourceCustomizations.size() > 0) { int i = 0; sb.append("VnfResources: "); @@ -180,6 +202,13 @@ public class ServiceMacroHolder implements Serializable { sb.append("ARC[" + i++ + "]: " + arc.toString()); } } + if (this.serviceProxyResourceCustomizations != null && this.serviceProxyResourceCustomizations.size() > 0) { + int i = 0; + sb.append("ServiceProxyResourceCustomizations:"); + for (ServiceProxyResourceCustomization sprc : this.serviceProxyResourceCustomizations) { + sb.append("SPRC[" + i++ + "]: " + sprc.toString()); + } + } return sb.toString(); } @@ -202,6 +231,12 @@ public class ServiceMacroHolder implements Serializable { this.allottedResourceCustomizations = allottedResourceCustomizations; } + public ArrayList<ServiceProxyResourceCustomization> getServiceProxyResourceCustomizations() { + return serviceProxyResourceCustomizations; + } - + public void setServiceProxyResourceCustomizations( + ArrayList<ServiceProxyResourceCustomization> serviceProxyResourceCustomizations) { + this.serviceProxyResourceCustomizations = serviceProxyResourceCustomizations; + } } |