e728cfd0d46fd5da37f421071012ccc1ef194d72
[so.git] / adapters / mso-openstack-adapters / src / test / java / org / onap / so / adapters / audit / HeatStackAuditTest.java
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.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
28 import java.io.File;
29 import java.io.IOException;
30 import java.nio.file.Files;
31 import java.nio.file.Paths;
32 import java.util.ArrayList;
33 import java.util.HashSet;
34 import java.util.List;
35 import java.util.Optional;
36 import java.util.Set;
37 import java.util.stream.Collectors;
38
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.junit.runner.RunWith;
42 import org.mockito.InjectMocks;
43 import org.mockito.Mock;
44 import org.mockito.junit.MockitoJUnitRunner;
45 import org.onap.aai.domain.yang.LInterface;
46 import org.onap.aai.domain.yang.LInterfaces;
47 import org.onap.aai.domain.yang.Vserver;
48 import org.onap.so.openstack.utils.MsoHeatUtils;
49 import org.onap.so.openstack.utils.MsoNeutronUtils;
50 import org.skyscreamer.jsonassert.JSONAssert;
51
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 = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).setSerializationInclusion(Include.NON_NULL);
82         
83         private ObjectMapper stackObjectMapper = new ObjectMapper().configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true).setSerializationInclusion(Include.NON_NULL);
84
85         private List<Optional<Port>> portList = new ArrayList<>();
86         
87         @Before
88         public void setup() throws Exception{           
89                 resources= objectMapper.readValue(new File("src/test/resources/GetResources.json"), Resources.class);
90                 Port neutronPort1 =stackObjectMapper.readValue(new File("src/test/resources/NeutronPort1.json"), Port.class);
91                 doReturn(Optional.of(neutronPort1)).when(neutronUtilsMock).getNeutronPort("7ee06d9d-3d18-411c-9d3e-aec930f70413", cloudRegion,tenantId);
92                 Port neutronPort2 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort2.json"), Port.class);
93                 doReturn(Optional.of(neutronPort2)).when(neutronUtilsMock).getNeutronPort("27391d94-33af-474a-927d-d409249e8fd3", cloudRegion,tenantId);
94                 Port neutronPort3 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort3.json"), Port.class);
95                 doReturn(Optional.of(neutronPort3)).when(neutronUtilsMock).getNeutronPort("fdeedf37-c01e-4ab0-bdd6-8d5fc4913943", cloudRegion,tenantId);        
96                 Port neutronPort4 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort4.json"), Port.class);
97                 doReturn(Optional.of(neutronPort4)).when(neutronUtilsMock).getNeutronPort("8d93f63e-e972-48c7-ad98-b2122da47315", cloudRegion,tenantId);
98                 Port neutronPort5 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort5.json"), Port.class);
99                 doReturn(Optional.of(neutronPort5)).when(neutronUtilsMock).getNeutronPort("0594a2f2-7ea4-42eb-abc2-48ea49677fca", cloudRegion,tenantId);
100                 Port neutronPort6 = stackObjectMapper.readValue(new File("src/test/resources/NeutronPort6.json"), Port.class);
101                 doReturn(Optional.of(neutronPort6)).when(neutronUtilsMock).getNeutronPort("00bb8407-650e-48b5-b919-33b88d6f8fe3", cloudRegion,tenantId);
102                 
103
104                 portList.add(Optional.empty());
105                 portList.add(Optional.of(neutronPort1));
106                 portList.add(Optional.of(neutronPort2));
107                 portList.add(Optional.of(neutronPort3));
108                 portList.add(Optional.of(neutronPort4));
109                 portList.add(Optional.of(neutronPort5));
110                 portList.add(Optional.of(neutronPort6));
111         } 
112         
113         @Test
114         public void extract_proper_path_Test(){
115                 Optional<String> actualResult = extractStackPathFromHref("https://orchestration.com:8004/v1/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
116                 assertEquals("/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81", actualResult.get());
117         }
118         
119         @Test
120         public void extract_proper_resources_path_Test(){
121                 Optional<String> actualResult = extractResourcePathFromHref("https://orchestration.com:8004/v1/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
122                 assertEquals("/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81/resources", actualResult.get());
123         }
124         
125         @Test
126         public void extract_invalid_uri_Test(){
127                 Optional<String> actualResult = extractStackPathFromHref("orchestrn.com:8004/v18b44d60a6f94bdcb2738f9e//stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
128                 assertEquals(false, actualResult.isPresent());
129         }
130
131         @Test
132         public void createVserverSet_Test() throws Exception{
133                 List<Resource> novaResources = resources.getList().stream()
134                                 .filter(p -> "OS::Nova::Server".equals(p.getType())).collect(Collectors.toList());
135                 
136                 List<Resource> resourceGroups = resources.getList().stream()
137                                 .filter(p -> "OS::Heat::ResourceGroup".equals(p.getType())).collect(Collectors.toList());
138
139                 Resources service1QueryResponse = objectMapper.readValue(new File("src/test/resources/Service1ResourceGroupResponse.json"), Resources.class);
140                 doReturn(service1QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz/31d0647a-6043-49a4-81b6-ccab29380672/resources", cloudRegion,      tenantId, Resources.class);
141                 
142                 Resources service2QueryResponse =objectMapper.readValue(new File("src/test/resources/Service2ResourceGroupResponse.json"), Resources.class);
143                 doReturn(service2QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst/447a9b41-714e-434b-b1d0-6cce8d9f0f0c/resources", cloudRegion,      tenantId, Resources.class);
144                 
145                 
146                 Stack service2StackQuerySubInt = stackObjectMapper.readValue(new File("src/test/resources/Service2SubInterface0.json"), Stack.class);
147                 doReturn(service2StackQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81", cloudRegion,tenantId, Stack.class);
148                 Resources service2ResourceQuerySubInt = objectMapper.readValue(new File("src/test/resources/Service2SubInterface1Resources.json"), Resources.class);
149                 doReturn(service2ResourceQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81/resources", cloudRegion,tenantId, Resources.class);
150                 
151                 Stack service1StackQuerySubInt1 =stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface0.json"), Stack.class);
152                 doReturn(service1StackQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb", cloudRegion,tenantId, Stack.class);
153                 Resources service1ResourceQuerySubInt1 = objectMapper.readValue(new File("src/test/resources/Service1SubInterface0Resources.json"), Resources.class);
154                 doReturn(service1ResourceQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb/resources", cloudRegion,tenantId, Resources.class);
155
156         
157                 Stack service1StackQuerySubInt2 =stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface1.json"), Stack.class);
158                 doReturn(service1StackQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a", cloudRegion,tenantId, Stack.class);
159                 Resources service1ResourceQuerySubInt2 = objectMapper.readValue(new File("src/test/resources/Service1SubInterface1Resources.json"), Resources.class);
160                 doReturn(service1ResourceQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a/resources", cloudRegion,tenantId, Resources.class);
161
162                 Stack service1StackQuerySubInt3 =stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface2.json"), Stack.class);
163                 doReturn(service1StackQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c", cloudRegion,tenantId, Stack.class);
164                 Resources service1ResourceQuerySubInt3 = objectMapper.readValue(new File("src/test/resources/Service1SubInterface2Resources.json"), Resources.class);
165                 doReturn(service1ResourceQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c/resources", cloudRegion,tenantId, Resources.class);
166         
167                 Set<Vserver> vServersToAudit = heatStackAudit.createVserverSet(resources, novaResources,portList);
168                 Set<Vserver> vserversWithSubInterfaces = heatStackAudit.processSubInterfaces(cloudRegion,tenantId,resourceGroups, vServersToAudit);
169                 
170                 String actualValue = objectMapper.writeValueAsString(vserversWithSubInterfaces);
171                 String expectedValue = getJson("ExpectedVserversToAudit.json");
172                 JSONAssert.assertEquals(expectedValue, actualValue, false);
173         }
174         
175         @Test
176         public void auditHeatStackNoServers_Test() throws Exception{
177                 Resources getResource = objectMapper.readValue(new File("src/test/resources/Service1ResourceGroupResponse.json"), Resources.class);
178                 doReturn(getResource).when(msoHeatUtilsMock).queryStackResources(cloudRegion,   tenantId, "heatStackName", 3);
179                 
180                 Optional<AAIObjectAuditList> actual = heatStackAudit.auditHeatStack(cloudRegion, "cloudOwner", tenantId, "heatStackName");
181                 assertEquals(true, actual.get().getAuditList().isEmpty());
182         }
183         
184         @Test
185         public void auditHeatStackNestedServers_Test() throws Exception{
186                 Resources getResource = objectMapper.readValue(new File("src/test/resources/GetNestedResources.json"), Resources.class);                
187                 List<Resource> novaResources = getResource.getList().stream()
188                                 .filter(p -> "OS::Nova::Server".equals(p.getType())).collect(Collectors.toList());              
189                 List<Resource> resourceGroups = getResource.getList().stream()
190                                 .filter(p -> "OS::Heat::ResourceGroup".equals(p.getType())).collect(Collectors.toList());
191                 
192                 doReturn(getResource).when(msoHeatUtilsMock).queryStackResources(cloudRegion,   tenantId, "heatStackName", 3);          
193                 Set<Vserver> vServersToAudit = heatStackAudit.createVserverSet(resources, novaResources,portList);              
194                 Set<Vserver> vserversWithSubInterfaces = heatStackAudit.processSubInterfaces(cloudRegion,tenantId,resourceGroups, vServersToAudit);
195                 String actualValue = objectMapper.writeValueAsString(vserversWithSubInterfaces);
196                 String expectedValue = getJson("NestedExpectedValue.json");
197                 JSONAssert.assertEquals(expectedValue, actualValue, false);
198         }
199         
200
201         @Test
202         public void findInterfaceInformation_Test(){
203                 List<Resource> novaResources = resources.getList().stream()
204                                 .filter(p -> "OS::Nova::Server".equals(p.getType())).collect(Collectors.toList());
205                 Set<Vserver> expectedVservers = new HashSet<>();
206                 Vserver vServer1= new Vserver();
207                 vServer1.setVserverId("92272b67-d23f-42ca-87fa-7b06a9ec81f3");
208                 LInterfaces vServer1Linterfaces = new LInterfaces();
209                 vServer1.setLInterfaces(vServer1Linterfaces);
210                 
211                 LInterface ssc_1_trusted_port_0 = new LInterface();
212                 ssc_1_trusted_port_0.setInterfaceId("7ee06d9d-3d18-411c-9d3e-aec930f70413");
213                 ssc_1_trusted_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
214                 vServer1.getLInterfaces().getLInterface().add(ssc_1_trusted_port_0);
215                 
216                 LInterface ssc_1_svc2_port_0 = new LInterface();
217                 ssc_1_svc2_port_0.setInterfaceId("27391d94-33af-474a-927d-d409249e8fd3");
218                 ssc_1_svc2_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
219                 vServer1.getLInterfaces().getLInterface().add(ssc_1_svc2_port_0);
220                 
221                 LInterface ssc_1_mgmt_port_1 = new LInterface();
222                 ssc_1_mgmt_port_1.setInterfaceId("fdeedf37-c01e-4ab0-bdd6-8d5fc4913943");
223                 ssc_1_mgmt_port_1.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
224                 vServer1.getLInterfaces().getLInterface().add(ssc_1_mgmt_port_1);
225                 
226                 LInterface ssc_1_mgmt_port_0 = new LInterface();
227                 ssc_1_mgmt_port_0.setInterfaceId("8d93f63e-e972-48c7-ad98-b2122da47315");
228                 ssc_1_mgmt_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
229                 vServer1.getLInterfaces().getLInterface().add(ssc_1_mgmt_port_0);
230                 
231                 LInterface ssc_1_svc1_port_0 = new LInterface();
232                 ssc_1_svc1_port_0.setInterfaceId("0594a2f2-7ea4-42eb-abc2-48ea49677fca");
233                 ssc_1_svc1_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
234                 vServer1.getLInterfaces().getLInterface().add(ssc_1_svc1_port_0);
235                 
236                 LInterface ssc_1_int_ha_port_0 = new LInterface();
237                 ssc_1_int_ha_port_0.setInterfaceId("00bb8407-650e-48b5-b919-33b88d6f8fe3");
238                 ssc_1_int_ha_port_0.setInterfaceName("ibcx0026v_ibcx0026vm003_untrusted_port");
239                 vServer1.getLInterfaces().getLInterface().add(ssc_1_int_ha_port_0);             
240                 
241                 expectedVservers.add(vServer1);
242         
243                 Set<Vserver> actualVservers = heatStackAudit.createVserverSet(resources, novaResources,portList);
244                 
245                 assertThat(actualVservers, sameBeanAs(expectedVservers));
246         }
247
248         private String getJson(String filename) throws IOException {
249                  return new String(Files.readAllBytes(Paths.get("src/test/resources/" + filename)));
250         }
251 }