d1d0d96042ce7b4e88bc3d459a1c094c4805907f
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.adapters.tasks.audit;
22
23 import static com.shazam.shazamcrest.MatcherAssert.assertThat;
24 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
25 import static org.junit.Assert.assertEquals;
26 import static org.mockito.Mockito.doReturn;
27 import java.io.File;
28 import java.io.IOException;
29 import java.nio.file.Files;
30 import java.nio.file.Paths;
31 import java.util.ArrayList;
32 import java.util.HashSet;
33 import java.util.List;
34 import java.util.Optional;
35 import java.util.Set;
36 import java.util.stream.Collectors;
37 import org.junit.Before;
38 import org.junit.Test;
39 import org.junit.runner.RunWith;
40 import org.mockito.InjectMocks;
41 import org.mockito.Mock;
42 import org.mockito.junit.MockitoJUnitRunner;
43 import org.onap.aai.domain.yang.LInterface;
44 import org.onap.aai.domain.yang.LInterfaces;
45 import org.onap.aai.domain.yang.Vserver;
46 import org.onap.so.adapters.tasks.audit.AuditVServer;
47 import org.onap.so.adapters.tasks.audit.HeatStackAudit;
48 import org.onap.so.objects.audit.AAIObjectAuditList;
49 import org.onap.so.openstack.utils.MsoHeatUtils;
50 import org.onap.so.openstack.utils.MsoNeutronUtils;
51 import org.skyscreamer.jsonassert.JSONAssert;
52 import com.fasterxml.jackson.annotation.JsonInclude.Include;
53 import com.fasterxml.jackson.databind.DeserializationFeature;
54 import com.fasterxml.jackson.databind.ObjectMapper;
55 import com.woorea.openstack.heat.model.Resource;
56 import com.woorea.openstack.heat.model.Resources;
57 import com.woorea.openstack.heat.model.Stack;
58 import com.woorea.openstack.quantum.model.Port;
59
60
61 @RunWith(MockitoJUnitRunner.Silent.class)
62 public class HeatStackAuditTest extends HeatStackAudit {
63
64     @InjectMocks
65     private HeatStackAudit heatStackAudit = new HeatStackAudit();
66
67     @Mock
68     private MsoHeatUtils msoHeatUtilsMock;
69
70     @Mock
71     private MsoNeutronUtils neutronUtilsMock;
72
73     @Mock
74     private AuditVServer auditVserver;
75
76     private static final String cloudRegion = "cloudRegion";
77     private static final String tenantId = "tenantId";
78
79     private Resources resources = new Resources();
80
81     private ObjectMapper objectMapper =
82             new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
83                     .setSerializationInclusion(Include.NON_NULL);
84
85     private ObjectMapper stackObjectMapper = new ObjectMapper()
86             .configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true).setSerializationInclusion(Include.NON_NULL);
87
88     private List<Optional<Port>> portList = new ArrayList<>();
89
90     @Before
91     public void setup() throws Exception {
92         resources = objectMapper.readValue(new File("src/test/resources/GetResources.json"), Resources.class);
93         Port neutronPort1 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort1.json"), Port.class);
94         doReturn(Optional.of(neutronPort1)).when(neutronUtilsMock)
95                 .getNeutronPort("7ee06d9d-3d18-411c-9d3e-aec930f70413", cloudRegion, tenantId);
96         Port neutronPort2 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort2.json"), Port.class);
97         doReturn(Optional.of(neutronPort2)).when(neutronUtilsMock)
98                 .getNeutronPort("27391d94-33af-474a-927d-d409249e8fd3", cloudRegion, tenantId);
99         Port neutronPort3 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort3.json"), Port.class);
100         doReturn(Optional.of(neutronPort3)).when(neutronUtilsMock)
101                 .getNeutronPort("fdeedf37-c01e-4ab0-bdd6-8d5fc4913943", cloudRegion, tenantId);
102         Port neutronPort4 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort4.json"), Port.class);
103         doReturn(Optional.of(neutronPort4)).when(neutronUtilsMock)
104                 .getNeutronPort("8d93f63e-e972-48c7-ad98-b2122da47315", cloudRegion, tenantId);
105         Port neutronPort5 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort5.json"), Port.class);
106         doReturn(Optional.of(neutronPort5)).when(neutronUtilsMock)
107                 .getNeutronPort("0594a2f2-7ea4-42eb-abc2-48ea49677fca", cloudRegion, tenantId);
108         Port neutronPort6 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort6.json"), Port.class);
109         doReturn(Optional.of(neutronPort6)).when(neutronUtilsMock)
110                 .getNeutronPort("00bb8407-650e-48b5-b919-33b88d6f8fe3", cloudRegion, tenantId);
111
112
113         portList.add(Optional.empty());
114         portList.add(Optional.of(neutronPort1));
115         portList.add(Optional.of(neutronPort2));
116         portList.add(Optional.of(neutronPort3));
117         portList.add(Optional.of(neutronPort4));
118         portList.add(Optional.of(neutronPort5));
119         portList.add(Optional.of(neutronPort6));
120     }
121
122     @Test
123     public void extract_proper_path_Test() {
124         Optional<String> actualResult = extractStackPathFromHref(
125                 "https://orchestration.com:8004/v1/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
126         assertEquals("/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81", actualResult.get());
127     }
128
129     @Test
130     public void extract_proper_resources_path_Test() {
131         Optional<String> actualResult = extractResourcePathFromHref(
132                 "https://orchestration.com:8004/v1/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
133         assertEquals("/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81/resources", actualResult.get());
134     }
135
136     @Test
137     public void extract_invalid_uri_Test() {
138         Optional<String> actualResult = extractStackPathFromHref(
139                 "orchestrn.com:8004/v18b44d60a6f94bdcb2738f9e//stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
140         assertEquals(false, actualResult.isPresent());
141     }
142
143     @Test
144     public void createVserverSet_Test() throws Exception {
145         List<Resource> novaResources = resources.getList().stream().filter(p -> "OS::Nova::Server".equals(p.getType()))
146                 .collect(Collectors.toList());
147
148         List<Resource> resourceGroups = resources.getList().stream()
149                 .filter(p -> "OS::Heat::ResourceGroup".equals(p.getType())).collect(Collectors.toList());
150
151         Resources service1QueryResponse = objectMapper
152                 .readValue(new File("src/test/resources/Service1ResourceGroupResponse.json"), Resources.class);
153         doReturn(service1QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest(
154                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz/31d0647a-6043-49a4-81b6-ccab29380672/resources",
155                 cloudRegion, tenantId, Resources.class);
156
157         Resources service2QueryResponse = objectMapper
158                 .readValue(new File("src/test/resources/Service2ResourceGroupResponse.json"), Resources.class);
159         doReturn(service2QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest(
160                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst/447a9b41-714e-434b-b1d0-6cce8d9f0f0c/resources",
161                 cloudRegion, tenantId, Resources.class);
162
163
164         Stack service2StackQuerySubInt =
165                 stackObjectMapper.readValue(new File("src/test/resources/Service2SubInterface0.json"), Stack.class);
166         doReturn(service2StackQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest(
167                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81",
168                 cloudRegion, tenantId, Stack.class);
169         Resources service2ResourceQuerySubInt = objectMapper
170                 .readValue(new File("src/test/resources/Service2SubInterface1Resources.json"), Resources.class);
171         doReturn(service2ResourceQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest(
172                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81/resources",
173                 cloudRegion, tenantId, Resources.class);
174
175         Stack service1StackQuerySubInt1 =
176                 stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface0.json"), Stack.class);
177         doReturn(service1StackQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest(
178                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb",
179                 cloudRegion, tenantId, Stack.class);
180         Resources service1ResourceQuerySubInt1 = objectMapper
181                 .readValue(new File("src/test/resources/Service1SubInterface0Resources.json"), Resources.class);
182         doReturn(service1ResourceQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest(
183                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb/resources",
184                 cloudRegion, tenantId, Resources.class);
185
186
187         Stack service1StackQuerySubInt2 =
188                 stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface1.json"), Stack.class);
189         doReturn(service1StackQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest(
190                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a",
191                 cloudRegion, tenantId, Stack.class);
192         Resources service1ResourceQuerySubInt2 = objectMapper
193                 .readValue(new File("src/test/resources/Service1SubInterface1Resources.json"), Resources.class);
194         doReturn(service1ResourceQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest(
195                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a/resources",
196                 cloudRegion, tenantId, Resources.class);
197
198         Stack service1StackQuerySubInt3 =
199                 stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface2.json"), Stack.class);
200         doReturn(service1StackQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest(
201                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c",
202                 cloudRegion, tenantId, Stack.class);
203         Resources service1ResourceQuerySubInt3 = objectMapper
204                 .readValue(new File("src/test/resources/Service1SubInterface2Resources.json"), Resources.class);
205         doReturn(service1ResourceQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest(
206                 "/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c/resources",
207                 cloudRegion, tenantId, Resources.class);
208
209         Set<Vserver> vServersToAudit = heatStackAudit.createVserverSet(resources, novaResources, portList);
210         Set<Vserver> vserversWithSubInterfaces =
211                 heatStackAudit.processSubInterfaces(cloudRegion, tenantId, resourceGroups, vServersToAudit);
212
213         String actualValue = objectMapper.writeValueAsString(vserversWithSubInterfaces);
214         String expectedValue = getJson("ExpectedVserversToAudit.json");
215         JSONAssert.assertEquals(expectedValue, actualValue, false);
216     }
217
218     @Test
219     public void auditHeatStackNoServers_Test() throws Exception {
220         Resources getResource = objectMapper
221                 .readValue(new File("src/test/resources/Service1ResourceGroupResponse.json"), Resources.class);
222         doReturn(getResource).when(msoHeatUtilsMock).queryStackResources(cloudRegion, tenantId, "heatStackName", 3);
223
224         Optional<AAIObjectAuditList> actual =
225                 heatStackAudit.auditHeatStack(cloudRegion, "cloudOwner", tenantId, "heatStackName");
226         assertEquals(true, actual.get().getAuditList().isEmpty());
227     }
228
229     @Test
230     public void auditHeatStackNestedServers_Test() throws Exception {
231         Resources getResource =
232                 objectMapper.readValue(new File("src/test/resources/GetNestedResources.json"), Resources.class);
233         List<Resource> novaResources = getResource.getList().stream()
234                 .filter(p -> "OS::Nova::Server".equals(p.getType())).collect(Collectors.toList());
235         List<Resource> resourceGroups = getResource.getList().stream()
236                 .filter(p -> "OS::Heat::ResourceGroup".equals(p.getType())).collect(Collectors.toList());
237
238         doReturn(getResource).when(msoHeatUtilsMock).queryStackResources(cloudRegion, tenantId, "heatStackName", 3);
239         Set<Vserver> vServersToAudit = heatStackAudit.createVserverSet(resources, novaResources, portList);
240         Set<Vserver> vserversWithSubInterfaces =
241                 heatStackAudit.processSubInterfaces(cloudRegion, tenantId, resourceGroups, vServersToAudit);
242         String actualValue = objectMapper.writeValueAsString(vserversWithSubInterfaces);
243         String expectedValue = getJson("NestedExpectedValue.json");
244         JSONAssert.assertEquals(expectedValue, actualValue, false);
245     }
246
247
248     @Test
249     public void findInterfaceInformation_Test() {
250         List<Resource> novaResources = resources.getList().stream().filter(p -> "OS::Nova::Server".equals(p.getType()))
251                 .collect(Collectors.toList());
252         Set<Vserver> expectedVservers = new HashSet<>();
253         Vserver vServer1 = new Vserver();
254         vServer1.setVserverId("92272b67-d23f-42ca-87fa-7b06a9ec81f3");
255         LInterfaces vServer1Linterfaces = new LInterfaces();
256         vServer1.setLInterfaces(vServer1Linterfaces);
257
258         LInterface ssc_1_trusted_port_0 = new LInterface();
259         ssc_1_trusted_port_0.setInterfaceId("7ee06d9d-3d18-411c-9d3e-aec930f70413");
260         ssc_1_trusted_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
261         vServer1.getLInterfaces().getLInterface().add(ssc_1_trusted_port_0);
262
263         LInterface ssc_1_svc2_port_0 = new LInterface();
264         ssc_1_svc2_port_0.setInterfaceId("27391d94-33af-474a-927d-d409249e8fd3");
265         ssc_1_svc2_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
266         vServer1.getLInterfaces().getLInterface().add(ssc_1_svc2_port_0);
267
268         LInterface ssc_1_mgmt_port_1 = new LInterface();
269         ssc_1_mgmt_port_1.setInterfaceId("fdeedf37-c01e-4ab0-bdd6-8d5fc4913943");
270         ssc_1_mgmt_port_1.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
271         vServer1.getLInterfaces().getLInterface().add(ssc_1_mgmt_port_1);
272
273         LInterface ssc_1_mgmt_port_0 = new LInterface();
274         ssc_1_mgmt_port_0.setInterfaceId("8d93f63e-e972-48c7-ad98-b2122da47315");
275         ssc_1_mgmt_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
276         vServer1.getLInterfaces().getLInterface().add(ssc_1_mgmt_port_0);
277
278         LInterface ssc_1_svc1_port_0 = new LInterface();
279         ssc_1_svc1_port_0.setInterfaceId("0594a2f2-7ea4-42eb-abc2-48ea49677fca");
280         ssc_1_svc1_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
281         vServer1.getLInterfaces().getLInterface().add(ssc_1_svc1_port_0);
282
283         LInterface ssc_1_int_ha_port_0 = new LInterface();
284         ssc_1_int_ha_port_0.setInterfaceId("00bb8407-650e-48b5-b919-33b88d6f8fe3");
285         ssc_1_int_ha_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
286         vServer1.getLInterfaces().getLInterface().add(ssc_1_int_ha_port_0);
287
288         expectedVservers.add(vServer1);
289
290         Set<Vserver> actualVservers = heatStackAudit.createVserverSet(resources, novaResources, portList);
291
292         assertThat(actualVservers, sameBeanAs(expectedVservers));
293     }
294
295     private String getJson(String filename) throws IOException {
296         return new String(Files.readAllBytes(Paths.get("src/test/resources/" + filename)));
297     }
298 }