1 /* Copyright (c) 2019 AT&T Intellectual Property. #
\r
3 # Licensed under the Apache License, Version 2.0 (the "License"); #
\r
4 # you may not use this file except in compliance with the License. #
\r
5 # You may obtain a copy of the License at #
\r
7 # http://www.apache.org/licenses/LICENSE-2.0 #
\r
9 # Unless required by applicable law or agreed to in writing, software #
\r
10 # distributed under the License is distributed on an "AS IS" BASIS, #
\r
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
\r
12 # See the License for the specific language governing permissions and #
\r
13 # limitations under the License. #
\r
14 ##############################################################################*/
\r
17 package org.oran.otf.api.tests.shared;
\r
19 import org.oran.otf.common.model.*;
\r
20 import org.oran.otf.common.model.local.BpmnInstance;
\r
21 import org.oran.otf.common.model.local.UserGroup;
\r
22 import com.mongodb.BasicDBObjectBuilder;
\r
23 import com.mongodb.DBObject;
\r
24 import com.mongodb.MongoClient;
\r
25 import de.flapdoodle.embed.mongo.Command;
\r
26 import de.flapdoodle.embed.mongo.MongodExecutable;
\r
27 import de.flapdoodle.embed.mongo.MongodProcess;
\r
28 import de.flapdoodle.embed.mongo.MongodStarter;
\r
29 import de.flapdoodle.embed.mongo.config.DownloadConfigBuilder;
\r
30 import de.flapdoodle.embed.mongo.config.ExtractedArtifactStoreBuilder;
\r
31 import de.flapdoodle.embed.mongo.config.IMongodConfig;
\r
32 import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
\r
33 import de.flapdoodle.embed.mongo.config.Net;
\r
34 import de.flapdoodle.embed.mongo.config.RuntimeConfigBuilder;
\r
35 import de.flapdoodle.embed.mongo.distribution.Version;
\r
36 import de.flapdoodle.embed.mongo.distribution.Version.Main;
\r
37 import de.flapdoodle.embed.process.config.IRuntimeConfig;
\r
38 import de.flapdoodle.embed.process.config.store.HttpProxyFactory;
\r
39 import de.flapdoodle.embed.process.runtime.Network;
\r
41 import java.sql.Timestamp;
\r
42 import java.util.ArrayList;
\r
43 import java.util.Arrays;
\r
44 import java.util.Date;
\r
45 import java.util.List;
\r
46 import java.util.Random;
\r
47 import javassist.util.proxy.ProxyFactory;
\r
48 import org.apache.commons.lang3.time.DateUtils;
\r
49 import org.apache.http.HttpResponse;
\r
50 import org.apache.http.client.methods.HttpGet;
\r
51 import org.oran.otf.common.model.*;
\r
52 import org.springframework.context.annotation.Configuration;
\r
53 import org.bson.types.ObjectId;
\r
54 import org.springframework.data.mongodb.core.MongoTemplate;
\r
55 import org.springframework.data.mongodb.core.query.Criteria;
\r
56 import org.springframework.data.mongodb.core.query.Query;
\r
57 import org.springframework.test.context.ActiveProfiles;
\r
60 @ActiveProfiles("test")
\r
61 public abstract class MemoryDatabase {
\r
62 protected static MongodExecutable mongodExecutable;
\r
63 protected static MongoTemplate mongoTemplate;
\r
65 //TODO use mongod process to be response from mongodExecutable.start(), on pulbic calls check if null if so call setup else dont
\r
66 protected static MongodProcess mongod = null;
\r
68 protected static Query userQuery = new Query(Criteria.where("firstName").is("Mech"));
\r
69 //protected static Query mechUserQuery = new Query(Criteria.where("firstName").is("Mech"));
\r
70 protected static Query testInstanceQuery = new Query(Criteria.where("testInstanceName").is("MechTestInstance"));
\r
71 protected static Query groupQuery = new Query(Criteria.where("groupName").is("MechGroup"));
\r
72 protected static Query testDefQuery = new Query(Criteria.where("testName").is("MechTestDefinition"));
\r
74 //values should match with DataConfig2
\r
75 protected static int port=5555;
\r
76 protected static String host="localhost";
\r
79 public static void setup()throws Exception{
\r
80 Command command = Command.MongoD;
\r
81 IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
\r
83 .artifactStore(new ExtractedArtifactStoreBuilder()
\r
85 .download(new DownloadConfigBuilder()
\r
86 .defaultsForCommand(command)
\r
87 .proxyFactory(new HttpProxyFactory("localhost",8080))))
\r
90 //String host = "localhost";
\r
93 IMongodConfig mongodConfig = new MongodConfigBuilder().version(Main.PRODUCTION)
\r
94 .net(new Net(host, port, Network.localhostIsIPv6()))
\r
96 //MongodStarter starter = MongodStarter.getDefaultInstance();
\r
97 MongodStarter starter = MongodStarter.getInstance(runtimeConfig);
\r
98 mongodExecutable = starter.prepare(mongodConfig);
\r
99 mongodExecutable.start();
\r
100 mongoTemplate = new MongoTemplate(new MongoClient(host, port), "test");
\r
102 DBObject objectToSave = BasicDBObjectBuilder.start()
\r
103 .add("name", "john")
\r
105 mongoTemplate.save(objectToSave, "collection");
\r
110 public static User createMechUser(){
\r
112 User user = mongoTemplate.findOne(mechUserQuery, User.class);
\r
115 user.setFirstName("Mech");
\r
116 user.setLastName("Id");
\r
117 user.setEmail("email@localhost");
\r
118 mongoTemplate.save(user, "users");
\r
119 user = mongoTemplate.findOne(mechUserQuery, User.class);
\r
125 //TODO: make admin user be the mechid, this is because of AAF test will fail if random user is used
\r
126 private static User createMechUserIfNotExists(){
\r
127 User user = mongoTemplate.findOne(userQuery, User.class);
\r
130 user.setFirstName("Mech");
\r
131 user.setLastName("Id");
\r
132 user.setEmail("email@localhost");
\r
133 mongoTemplate.save(user, "users");
\r
134 user = mongoTemplate.findOne(userQuery, User.class);
\r
139 private static Group createMechGroupIfNotExists(){
\r
140 User user = MemoryDatabase.createMechUserIfNotExists();
\r
141 Group group = mongoTemplate.findOne(groupQuery, Group.class);
\r
142 if(group == null) {
\r
143 String groupName = "MechGroup";
\r
144 group = new Group();
\r
145 group.setOwnerId(user.get_id());
\r
146 group.setGroupName(groupName);
\r
147 group.setGroupDescription(groupName + " description");
\r
148 mongoTemplate.save(group, "groups");
\r
149 group = mongoTemplate.findOne(groupQuery, Group.class);
\r
153 private static TestDefinition createMechTestDefinitionIfNotExists(){
\r
154 TestDefinition testDefinition = mongoTemplate.findOne(testDefQuery, TestDefinition.class);
\r
155 if(testDefinition == null){
\r
157 BpmnInstance bpmnInstance = new BpmnInstance();
\r
158 bpmnInstance.setDeployed(true);
\r
159 bpmnInstance.setVersion(1);
\r
160 List list = new ArrayList(Arrays.asList(bpmnInstance));
\r
162 testDefinition = new TestDefinition();
\r
163 testDefinition.setDisabled(false);
\r
164 testDefinition.setBpmnInstances(list);
\r
165 testDefinition.setTestName("MechTestDefinition");
\r
166 testDefinition.setTestDescription("MechTestDefinition description");
\r
167 testDefinition.setProcessDefinitionKey("MechTestDefinitionKey");
\r
168 testDefinition.setCreatedBy(createMechUserIfNotExists().get_id());
\r
169 testDefinition.setGroupId(createMechGroupIfNotExists().get_id());
\r
170 testDefinition.setCreatedAt(new Timestamp(new Date().getTime()));
\r
171 testDefinition.setUpdatedAt(new Timestamp(new Date().getTime()));
\r
172 mongoTemplate.save(testDefinition, "testDefinitions");
\r
173 testDefinition = mongoTemplate.findOne(testDefQuery, TestDefinition.class);
\r
175 return testDefinition;
\r
180 private static TestInstance createMechTestInstanceIfNotExists(){
\r
181 TestInstance testInstance = mongoTemplate.findOne(testInstanceQuery, TestInstance.class);
\r
182 User user = createMechUserIfNotExists();
\r
183 UserGroup userGroup = new UserGroup();
\r
184 if(testInstance == null){
\r
185 testInstance = new TestInstance();
\r
186 testInstance.setTestInstanceName("MechTestInstance");
\r
187 testInstance.setTestInstanceDescription("MechTestInstance description");
\r
188 testInstance.setCreatedBy(user.get_id());
\r
189 testInstance.setGroupId(createMechGroupIfNotExists().get_id());
\r
190 testInstance.setTestDefinitionId(createMechTestDefinitionIfNotExists().get_id());
\r
191 testInstance.setMaxExecutionTimeInMillis(new Random().nextInt(5000));
\r
192 testInstance.setUseLatestTestDefinition(true);
\r
193 mongoTemplate.save(testInstance, "testInstances");
\r
194 testInstance = mongoTemplate.findOne(testInstanceQuery, TestInstance.class);
\r
196 userGroup.setGroupId(testInstance.getGroupId());
\r
197 userGroup.setPermissions(Arrays.asList("Admin"));
\r
198 user.setGroups(Arrays.asList(userGroup));
\r
199 mongoTemplate.save(user, "users");
\r
200 return testInstance;
\r
203 public static void createGroups(){
\r
205 MemoryDatabase.createMechUserIfNotExists();
\r
206 List<String> groupNames = new ArrayList<>(Arrays.asList("Group1", "Group2", "Group3", "Group4", "Group5"));
\r
207 groupNames.forEach(name->{
\r
208 Group group = new Group();
\r
209 User usr = mongoTemplate.findOne(userQuery, User.class);
\r
210 group.setOwnerId(usr.get_id());
\r
211 group.setGroupName(name);
\r
212 group.setGroupDescription(name + " description");
\r
213 mongoTemplate.save(group, "groups");
\r
218 public static void createGroupsForPermission()
\r
220 Group parentGroup = new Group();
\r
221 Group firstChildGroup = new Group();
\r
222 Group childOfChildGroup = new Group();
\r
223 parentGroup.setGroupName("parent group");
\r
224 firstChildGroup.setGroupName("first child group");
\r
225 childOfChildGroup.setGroupName("child of child group");
\r
226 Role adminRole = new Role();
\r
227 Role devRole = new Role();
\r
228 Role executorRole = new Role();
\r
229 GroupMember parentMember = new GroupMember();
\r
230 GroupMember firstChildMember = new GroupMember();
\r
231 GroupMember childOfChildMember = new GroupMember();
\r
234 List<User> users = mongoTemplate.findAll(User.class,"users"); // this should be atleast 3 users
\r
237 parent group -> members only with admin roles. Permission = "READ","WRITE","MANAGEMENT"
\r
238 child group -> members only with admin and dev roles. Permission = "READ","WRITE", "MANAGEMENT
\r
239 child of child group -> members with only executor roles. Permission = "EXECUTE
\r
241 parentMember.setUserId(users.get(0).get_id());
\r
242 parentMember.setRoles(Arrays.asList("admin"));
\r
243 firstChildMember.setUserId(users.get(1).get_id());
\r
244 firstChildMember.setRoles(Arrays.asList("dev","admin"));
\r
245 childOfChildMember.setUserId(users.get(2).get_id());
\r
246 childOfChildMember.setRoles(Arrays.asList("executor"));
\r
248 adminRole.setRoleName("admin");
\r
249 adminRole.setPermissions(Arrays.asList("READ","WRITE","MANAGEMENT"));
\r
250 devRole.setRoleName("dev");
\r
251 devRole.setPermissions(Arrays.asList("READ","WRITE"));
\r
252 executorRole.setRoleName("executor");
\r
253 executorRole.setPermissions(Arrays.asList("EXECUTE"));
\r
254 List<Role> defaultRoles = new ArrayList<>();
\r
255 defaultRoles.add(devRole);
\r
256 defaultRoles.add(adminRole);
\r
257 defaultRoles.add(executorRole);
\r
259 parentGroup.setRoles(defaultRoles);
\r
260 parentGroup.setMembers(Arrays.asList(parentMember));
\r
261 firstChildGroup.setRoles(defaultRoles);
\r
262 firstChildGroup.setMembers(Arrays.asList(firstChildMember));
\r
263 childOfChildGroup.setRoles(defaultRoles);
\r
264 childOfChildGroup.setMembers(Arrays.asList(childOfChildMember));
\r
272 Child of child group
\r
274 mongoTemplate.save(parentGroup,"groups");
\r
275 mongoTemplate.save(firstChildGroup,"groups");
\r
276 mongoTemplate.save(childOfChildGroup,"groups");
\r
277 // query object so we can get the object id and set up parent ids
\r
278 Query parentQ = new Query(Criteria.where("groupName").is("parent group"));
\r
279 Query firstChildQ = new Query(Criteria.where("groupName").is("first child group"));
\r
280 Query childOfChildQ = new Query(Criteria.where("groupName").is("child of child group"));
\r
281 Group parentGroupDbObj = mongoTemplate.findOne(parentQ,Group.class);
\r
282 Group firstChildDbObj = mongoTemplate.findOne(firstChildQ,Group.class);
\r
283 Group childOfChildDbObj = mongoTemplate.findOne(childOfChildQ,Group.class);
\r
285 firstChildDbObj.setParentGroupId(parentGroupDbObj.get_id());
\r
286 childOfChildDbObj.setParentGroupId(firstChildDbObj.get_id());
\r
287 mongoTemplate.save(firstChildDbObj);
\r
288 mongoTemplate.save(childOfChildDbObj);
\r
291 public static void createUsers(){
\r
292 List<String> usersFirstNames = new ArrayList<>(Arrays.asList("Joe", "Jim", "Rick", "David", "Tony"));
\r
293 List<String> usersLastNames = new ArrayList<>(Arrays.asList("Terry", "Roll", "Luis", "Perry"));
\r
294 usersFirstNames.forEach(name->{
\r
295 User user = new User();
\r
296 int index = new Random().nextInt(usersFirstNames.size()-1);
\r
297 user.setEmail(name+usersLastNames.get(index)+"@email.com");
\r
298 user.setLastName(name);
\r
299 user.setFirstName(usersLastNames.get(index));
\r
300 mongoTemplate.save(user, "users");
\r
304 public static void createTeatHeads(){
\r
305 List<String> testheadNames = new ArrayList<>(Arrays.asList("SSH", "FTP", "PING", "PROCESS", "daRudeSandstorm"));
\r
306 testheadNames.forEach(name->{
\r
307 String random = Integer.toString(new Random().nextInt(4000)+4000);
\r
308 TestHead testHead = new TestHead();
\r
309 testHead.setTestHeadName(name);
\r
310 testHead.setTestHeadDescription(name+" virtual test head ");
\r
311 testHead.setPort(random);
\r
312 testHead.setResourcePath("resources.vths.com/"+name);
\r
313 testHead.setHostname("resources.vths.com");
\r
314 testHead.setGroupId(createMechUserIfNotExists().get_id());
\r
315 testHead.setGroupId(createMechGroupIfNotExists().get_id());
\r
316 testHead.setCreatedAt(new Timestamp(new Date().getTime()));
\r
317 testHead.setUpdatedAt(new Timestamp(new Date().getTime()));
\r
318 mongoTemplate.save(testHead, "testHeads");
\r
322 public static void createTestDefinitions(){
\r
323 List<String> testDefinitionNames = new ArrayList<>(Arrays.asList("testDef1", "testDef2", "testDef3", "testDef4"));
\r
324 testDefinitionNames.forEach(name->{
\r
325 TestDefinition testDefinition = new TestDefinition();
\r
326 testDefinition.setDisabled(false);
\r
327 testDefinition.setTestName(name);
\r
328 testDefinition.setTestDescription(name+" description");
\r
329 testDefinition.setProcessDefinitionKey(name+"key");
\r
330 testDefinition.setCreatedBy(createMechUserIfNotExists().get_id());
\r
331 testDefinition.setGroupId(createMechGroupIfNotExists().get_id());
\r
332 testDefinition.setCreatedAt(new Timestamp(new Date().getTime()));
\r
333 testDefinition.setUpdatedAt(new Timestamp(new Date().getTime()));
\r
334 mongoTemplate.save(testDefinition, "testDefinitions");
\r
337 public static void createTestInstances(){
\r
338 List<String> testInstanceName = new ArrayList<>(Arrays.asList("TestInstance1", "TestInstance2", "TestInstance3", "TestInstance4"));
\r
339 testInstanceName.forEach(name->{
\r
340 TestInstance testInstance = new TestInstance();
\r
341 testInstance.setTestInstanceName(name);
\r
342 testInstance.setTestInstanceDescription(name+" description");
\r
343 testInstance.setCreatedBy(createMechUserIfNotExists().get_id());
\r
344 testInstance.setGroupId(createMechGroupIfNotExists().get_id());
\r
345 testInstance.setTestDefinitionId(createMechTestDefinitionIfNotExists().get_id());
\r
346 testInstance.setMaxExecutionTimeInMillis(new Random().nextInt(5000));
\r
347 testInstance.setUseLatestTestDefinition(true);
\r
348 mongoTemplate.save(testInstance, "testInstances");
\r
352 public static void createTestExecutions(){
\r
353 List<String> results = new ArrayList<>(Arrays.asList("COMPLETED", "FAILED", "PASSED", "INCOMPLETE"));
\r
354 results.forEach(result->{
\r
355 TestExecution testExecution = new TestExecution();
\r
356 testExecution.setAsync(false);
\r
357 testExecution.setExecutorId(createMechUserIfNotExists().get_id());
\r
358 testExecution.setGroupId(createMechGroupIfNotExists().get_id());
\r
359 testExecution.setStartTime(new Timestamp(new Date().getTime()));
\r
360 testExecution.setEndTime(new Timestamp(DateUtils.addHours(new Date(),3).getTime()));
\r
361 testExecution.setTestResult(result);
\r
362 testExecution.setTestResultMessage("Process result is: "+ result);
\r
363 mongoTemplate.save(testExecution, "testExecutions");
\r
367 public static void createAllAdmin(){
\r
368 createMechTestDefinitionIfNotExists();
\r
369 createMechTestInstanceIfNotExists();
\r
372 public static void createAllTables()throws Exception{
\r
377 createTestDefinitions();
\r
378 createTestInstances();
\r
379 createTestExecutions();
\r
382 public static void cleanup(){
\r
383 mongodExecutable.stop();
\r