--- /dev/null
+/* Copyright (c) 2019 AT&T Intellectual Property. #\r
+# #\r
+# Licensed under the Apache License, Version 2.0 (the "License"); #\r
+# you may not use this file except in compliance with the License. #\r
+# You may obtain a copy of the License at #\r
+# #\r
+# http://www.apache.org/licenses/LICENSE-2.0 #\r
+# #\r
+# Unless required by applicable law or agreed to in writing, software #\r
+# distributed under the License is distributed on an "AS IS" BASIS, #\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #\r
+# See the License for the specific language governing permissions and #\r
+# limitations under the License. #\r
+##############################################################################*/\r
+\r
+\r
+package org.oran.otf.api.tests.shared;\r
+\r
+import org.oran.otf.common.model.*;\r
+import org.oran.otf.common.model.local.BpmnInstance;\r
+import org.oran.otf.common.model.local.UserGroup;\r
+import com.mongodb.BasicDBObjectBuilder;\r
+import com.mongodb.DBObject;\r
+import com.mongodb.MongoClient;\r
+import de.flapdoodle.embed.mongo.Command;\r
+import de.flapdoodle.embed.mongo.MongodExecutable;\r
+import de.flapdoodle.embed.mongo.MongodProcess;\r
+import de.flapdoodle.embed.mongo.MongodStarter;\r
+import de.flapdoodle.embed.mongo.config.DownloadConfigBuilder;\r
+import de.flapdoodle.embed.mongo.config.ExtractedArtifactStoreBuilder;\r
+import de.flapdoodle.embed.mongo.config.IMongodConfig;\r
+import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;\r
+import de.flapdoodle.embed.mongo.config.Net;\r
+import de.flapdoodle.embed.mongo.config.RuntimeConfigBuilder;\r
+import de.flapdoodle.embed.mongo.distribution.Version;\r
+import de.flapdoodle.embed.mongo.distribution.Version.Main;\r
+import de.flapdoodle.embed.process.config.IRuntimeConfig;\r
+import de.flapdoodle.embed.process.config.store.HttpProxyFactory;\r
+import de.flapdoodle.embed.process.runtime.Network;\r
+\r
+import java.sql.Timestamp;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Date;\r
+import java.util.List;\r
+import java.util.Random;\r
+import javassist.util.proxy.ProxyFactory;\r
+import org.apache.commons.lang3.time.DateUtils;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.client.methods.HttpGet;\r
+import org.oran.otf.common.model.*;\r
+import org.springframework.context.annotation.Configuration;\r
+import org.bson.types.ObjectId;\r
+import org.springframework.data.mongodb.core.MongoTemplate;\r
+import org.springframework.data.mongodb.core.query.Criteria;\r
+import org.springframework.data.mongodb.core.query.Query;\r
+import org.springframework.test.context.ActiveProfiles;\r
+\r
+\r
+@ActiveProfiles("test")\r
+public abstract class MemoryDatabase {\r
+ protected static MongodExecutable mongodExecutable;\r
+ protected static MongoTemplate mongoTemplate;\r
+\r
+ //TODO use mongod process to be response from mongodExecutable.start(), on pulbic calls check if null if so call setup else dont\r
+ protected static MongodProcess mongod = null;\r
+\r
+ protected static Query userQuery = new Query(Criteria.where("firstName").is("Mech"));\r
+ //protected static Query mechUserQuery = new Query(Criteria.where("firstName").is("Mech"));\r
+ protected static Query testInstanceQuery = new Query(Criteria.where("testInstanceName").is("MechTestInstance"));\r
+ protected static Query groupQuery = new Query(Criteria.where("groupName").is("MechGroup"));\r
+ protected static Query testDefQuery = new Query(Criteria.where("testName").is("MechTestDefinition"));\r
+\r
+ //values should match with DataConfig2\r
+ protected static int port=5555;\r
+ protected static String host="localhost";\r
+\r
+\r
+ public static void setup()throws Exception{\r
+ Command command = Command.MongoD;\r
+ IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()\r
+ .defaults(command)\r
+ .artifactStore(new ExtractedArtifactStoreBuilder()\r
+ .defaults(command)\r
+ .download(new DownloadConfigBuilder()\r
+ .defaultsForCommand(command)\r
+ .proxyFactory(new HttpProxyFactory("localhost",8080))))\r
+ .build();\r
+\r
+ //String host = "localhost";\r
+ //int port = 5555;\r
+\r
+ IMongodConfig mongodConfig = new MongodConfigBuilder().version(Main.PRODUCTION)\r
+ .net(new Net(host, port, Network.localhostIsIPv6()))\r
+ .build();\r
+ //MongodStarter starter = MongodStarter.getDefaultInstance();\r
+ MongodStarter starter = MongodStarter.getInstance(runtimeConfig);\r
+ mongodExecutable = starter.prepare(mongodConfig);\r
+ mongodExecutable.start();\r
+ mongoTemplate = new MongoTemplate(new MongoClient(host, port), "test");\r
+\r
+ DBObject objectToSave = BasicDBObjectBuilder.start()\r
+ .add("name", "john")\r
+ .get();\r
+ mongoTemplate.save(objectToSave, "collection");\r
+\r
+\r
+ }\r
+ /*\r
+ public static User createMechUser(){\r
+\r
+ User user = mongoTemplate.findOne(mechUserQuery, User.class);\r
+ if(user == null) {\r
+ user = new User();\r
+ user.setFirstName("Mech");\r
+ user.setLastName("Id");\r
+ user.setEmail("email@localhost");\r
+ mongoTemplate.save(user, "users");\r
+ user = mongoTemplate.findOne(mechUserQuery, User.class);\r
+ }\r
+ return user;\r
+ }\r
+\r
+ */\r
+ //TODO: make admin user be the mechid, this is because of AAF test will fail if random user is used\r
+ private static User createMechUserIfNotExists(){\r
+ User user = mongoTemplate.findOne(userQuery, User.class);\r
+ if(user == null) {\r
+ user = new User();\r
+ user.setFirstName("Mech");\r
+ user.setLastName("Id");\r
+ user.setEmail("email@localhost");\r
+ mongoTemplate.save(user, "users");\r
+ user = mongoTemplate.findOne(userQuery, User.class);\r
+ }\r
+ return user;\r
+\r
+ }\r
+ private static Group createMechGroupIfNotExists(){\r
+ User user = MemoryDatabase.createMechUserIfNotExists();\r
+ Group group = mongoTemplate.findOne(groupQuery, Group.class);\r
+ if(group == null) {\r
+ String groupName = "MechGroup";\r
+ group = new Group();\r
+ group.setOwnerId(user.get_id());\r
+ group.setGroupName(groupName);\r
+ group.setGroupDescription(groupName + " description");\r
+ mongoTemplate.save(group, "groups");\r
+ group = mongoTemplate.findOne(groupQuery, Group.class);\r
+ }\r
+ return group;\r
+ }\r
+ private static TestDefinition createMechTestDefinitionIfNotExists(){\r
+ TestDefinition testDefinition = mongoTemplate.findOne(testDefQuery, TestDefinition.class);\r
+ if(testDefinition == null){\r
+\r
+ BpmnInstance bpmnInstance = new BpmnInstance();\r
+ bpmnInstance.setDeployed(true);\r
+ bpmnInstance.setVersion(1);\r
+ List list = new ArrayList(Arrays.asList(bpmnInstance));\r
+\r
+ testDefinition = new TestDefinition();\r
+ testDefinition.setDisabled(false);\r
+ testDefinition.setBpmnInstances(list);\r
+ testDefinition.setTestName("MechTestDefinition");\r
+ testDefinition.setTestDescription("MechTestDefinition description");\r
+ testDefinition.setProcessDefinitionKey("MechTestDefinitionKey");\r
+ testDefinition.setCreatedBy(createMechUserIfNotExists().get_id());\r
+ testDefinition.setGroupId(createMechGroupIfNotExists().get_id());\r
+ testDefinition.setCreatedAt(new Timestamp(new Date().getTime()));\r
+ testDefinition.setUpdatedAt(new Timestamp(new Date().getTime()));\r
+ mongoTemplate.save(testDefinition, "testDefinitions");\r
+ testDefinition = mongoTemplate.findOne(testDefQuery, TestDefinition.class);\r
+ }\r
+ return testDefinition;\r
+\r
+ }\r
+\r
+\r
+ private static TestInstance createMechTestInstanceIfNotExists(){\r
+ TestInstance testInstance = mongoTemplate.findOne(testInstanceQuery, TestInstance.class);\r
+ User user = createMechUserIfNotExists();\r
+ UserGroup userGroup = new UserGroup();\r
+ if(testInstance == null){\r
+ testInstance = new TestInstance();\r
+ testInstance.setTestInstanceName("MechTestInstance");\r
+ testInstance.setTestInstanceDescription("MechTestInstance description");\r
+ testInstance.setCreatedBy(user.get_id());\r
+ testInstance.setGroupId(createMechGroupIfNotExists().get_id());\r
+ testInstance.setTestDefinitionId(createMechTestDefinitionIfNotExists().get_id());\r
+ testInstance.setMaxExecutionTimeInMillis(new Random().nextInt(5000));\r
+ testInstance.setUseLatestTestDefinition(true);\r
+ mongoTemplate.save(testInstance, "testInstances");\r
+ testInstance = mongoTemplate.findOne(testInstanceQuery, TestInstance.class);\r
+ }\r
+ userGroup.setGroupId(testInstance.getGroupId());\r
+ userGroup.setPermissions(Arrays.asList("Admin"));\r
+ user.setGroups(Arrays.asList(userGroup));\r
+ mongoTemplate.save(user, "users");\r
+ return testInstance;\r
+ }\r
+\r
+ public static void createGroups(){\r
+\r
+ MemoryDatabase.createMechUserIfNotExists();\r
+ List<String> groupNames = new ArrayList<>(Arrays.asList("Group1", "Group2", "Group3", "Group4", "Group5"));\r
+ groupNames.forEach(name->{\r
+ Group group = new Group();\r
+ User usr = mongoTemplate.findOne(userQuery, User.class);\r
+ group.setOwnerId(usr.get_id());\r
+ group.setGroupName(name);\r
+ group.setGroupDescription(name + " description");\r
+ mongoTemplate.save(group, "groups");\r
+ });\r
+\r
+ }\r
+\r
+ public static void createGroupsForPermission()\r
+ {\r
+ Group parentGroup = new Group();\r
+ Group firstChildGroup = new Group();\r
+ Group childOfChildGroup = new Group();\r
+ parentGroup.setGroupName("parent group");\r
+ firstChildGroup.setGroupName("first child group");\r
+ childOfChildGroup.setGroupName("child of child group");\r
+ Role adminRole = new Role();\r
+ Role devRole = new Role();\r
+ Role executorRole = new Role();\r
+ GroupMember parentMember = new GroupMember();\r
+ GroupMember firstChildMember = new GroupMember();\r
+ GroupMember childOfChildMember = new GroupMember();\r
+ //set up members\r
+ createUsers();\r
+ List<User> users = mongoTemplate.findAll(User.class,"users"); // this should be atleast 3 users\r
+ /*\r
+ set up\r
+ parent group -> members only with admin roles. Permission = "READ","WRITE","MANAGEMENT"\r
+ child group -> members only with admin and dev roles. Permission = "READ","WRITE", "MANAGEMENT\r
+ child of child group -> members with only executor roles. Permission = "EXECUTE\r
+ */\r
+ parentMember.setUserId(users.get(0).get_id());\r
+ parentMember.setRoles(Arrays.asList("admin"));\r
+ firstChildMember.setUserId(users.get(1).get_id());\r
+ firstChildMember.setRoles(Arrays.asList("dev","admin"));\r
+ childOfChildMember.setUserId(users.get(2).get_id());\r
+ childOfChildMember.setRoles(Arrays.asList("executor"));\r
+ //set up roles\r
+ adminRole.setRoleName("admin");\r
+ adminRole.setPermissions(Arrays.asList("READ","WRITE","MANAGEMENT"));\r
+ devRole.setRoleName("dev");\r
+ devRole.setPermissions(Arrays.asList("READ","WRITE"));\r
+ executorRole.setRoleName("executor");\r
+ executorRole.setPermissions(Arrays.asList("EXECUTE"));\r
+ List<Role> defaultRoles = new ArrayList<>();\r
+ defaultRoles.add(devRole);\r
+ defaultRoles.add(adminRole);\r
+ defaultRoles.add(executorRole);\r
+ //set up groups\r
+ parentGroup.setRoles(defaultRoles);\r
+ parentGroup.setMembers(Arrays.asList(parentMember));\r
+ firstChildGroup.setRoles(defaultRoles);\r
+ firstChildGroup.setMembers(Arrays.asList(firstChildMember));\r
+ childOfChildGroup.setRoles(defaultRoles);\r
+ childOfChildGroup.setMembers(Arrays.asList(childOfChildMember));\r
+ /*\r
+ set up parent tree\r
+ structure:\r
+ parentGroup\r
+ |\r
+ Child group\r
+ |\r
+ Child of child group\r
+ */\r
+ mongoTemplate.save(parentGroup,"groups");\r
+ mongoTemplate.save(firstChildGroup,"groups");\r
+ mongoTemplate.save(childOfChildGroup,"groups");\r
+ // query object so we can get the object id and set up parent ids\r
+ Query parentQ = new Query(Criteria.where("groupName").is("parent group"));\r
+ Query firstChildQ = new Query(Criteria.where("groupName").is("first child group"));\r
+ Query childOfChildQ = new Query(Criteria.where("groupName").is("child of child group"));\r
+ Group parentGroupDbObj = mongoTemplate.findOne(parentQ,Group.class);\r
+ Group firstChildDbObj = mongoTemplate.findOne(firstChildQ,Group.class);\r
+ Group childOfChildDbObj = mongoTemplate.findOne(childOfChildQ,Group.class);\r
+\r
+ firstChildDbObj.setParentGroupId(parentGroupDbObj.get_id());\r
+ childOfChildDbObj.setParentGroupId(firstChildDbObj.get_id());\r
+ mongoTemplate.save(firstChildDbObj);\r
+ mongoTemplate.save(childOfChildDbObj);\r
+ }\r
+\r
+ public static void createUsers(){\r
+ List<String> usersFirstNames = new ArrayList<>(Arrays.asList("Joe", "Jim", "Rick", "David", "Tony"));\r
+ List<String> usersLastNames = new ArrayList<>(Arrays.asList("Terry", "Roll", "Luis", "Perry"));\r
+ usersFirstNames.forEach(name->{\r
+ User user = new User();\r
+ int index = new Random().nextInt(usersFirstNames.size()-1);\r
+ user.setEmail(name+usersLastNames.get(index)+"@email.com");\r
+ user.setLastName(name);\r
+ user.setFirstName(usersLastNames.get(index));\r
+ mongoTemplate.save(user, "users");\r
+ });\r
+\r
+ }\r
+ public static void createTeatHeads(){\r
+ List<String> testheadNames = new ArrayList<>(Arrays.asList("SSH", "FTP", "PING", "PROCESS", "daRudeSandstorm"));\r
+ testheadNames.forEach(name->{\r
+ String random = Integer.toString(new Random().nextInt(4000)+4000);\r
+ TestHead testHead = new TestHead();\r
+ testHead.setTestHeadName(name);\r
+ testHead.setTestHeadDescription(name+" virtual test head ");\r
+ testHead.setPort(random);\r
+ testHead.setResourcePath("resources.vths.com/"+name);\r
+ testHead.setHostname("resources.vths.com");\r
+ testHead.setGroupId(createMechUserIfNotExists().get_id());\r
+ testHead.setGroupId(createMechGroupIfNotExists().get_id());\r
+ testHead.setCreatedAt(new Timestamp(new Date().getTime()));\r
+ testHead.setUpdatedAt(new Timestamp(new Date().getTime()));\r
+ mongoTemplate.save(testHead, "testHeads");\r
+\r
+ });\r
+ }\r
+ public static void createTestDefinitions(){\r
+ List<String> testDefinitionNames = new ArrayList<>(Arrays.asList("testDef1", "testDef2", "testDef3", "testDef4"));\r
+ testDefinitionNames.forEach(name->{\r
+ TestDefinition testDefinition = new TestDefinition();\r
+ testDefinition.setDisabled(false);\r
+ testDefinition.setTestName(name);\r
+ testDefinition.setTestDescription(name+" description");\r
+ testDefinition.setProcessDefinitionKey(name+"key");\r
+ testDefinition.setCreatedBy(createMechUserIfNotExists().get_id());\r
+ testDefinition.setGroupId(createMechGroupIfNotExists().get_id());\r
+ testDefinition.setCreatedAt(new Timestamp(new Date().getTime()));\r
+ testDefinition.setUpdatedAt(new Timestamp(new Date().getTime()));\r
+ mongoTemplate.save(testDefinition, "testDefinitions");\r
+ });\r
+ }\r
+ public static void createTestInstances(){\r
+ List<String> testInstanceName = new ArrayList<>(Arrays.asList("TestInstance1", "TestInstance2", "TestInstance3", "TestInstance4"));\r
+ testInstanceName.forEach(name->{\r
+ TestInstance testInstance = new TestInstance();\r
+ testInstance.setTestInstanceName(name);\r
+ testInstance.setTestInstanceDescription(name+" description");\r
+ testInstance.setCreatedBy(createMechUserIfNotExists().get_id());\r
+ testInstance.setGroupId(createMechGroupIfNotExists().get_id());\r
+ testInstance.setTestDefinitionId(createMechTestDefinitionIfNotExists().get_id());\r
+ testInstance.setMaxExecutionTimeInMillis(new Random().nextInt(5000));\r
+ testInstance.setUseLatestTestDefinition(true);\r
+ mongoTemplate.save(testInstance, "testInstances");\r
+ });\r
+ }\r
+\r
+ public static void createTestExecutions(){\r
+ List<String> results = new ArrayList<>(Arrays.asList("COMPLETED", "FAILED", "PASSED", "INCOMPLETE"));\r
+ results.forEach(result->{\r
+ TestExecution testExecution = new TestExecution();\r
+ testExecution.setAsync(false);\r
+ testExecution.setExecutorId(createMechUserIfNotExists().get_id());\r
+ testExecution.setGroupId(createMechGroupIfNotExists().get_id());\r
+ testExecution.setStartTime(new Timestamp(new Date().getTime()));\r
+ testExecution.setEndTime(new Timestamp(DateUtils.addHours(new Date(),3).getTime()));\r
+ testExecution.setTestResult(result);\r
+ testExecution.setTestResultMessage("Process result is: "+ result);\r
+ mongoTemplate.save(testExecution, "testExecutions");\r
+ });\r
+ }\r
+\r
+ public static void createAllAdmin(){\r
+ createMechTestDefinitionIfNotExists();\r
+ createMechTestInstanceIfNotExists();\r
+ }\r
+\r
+ public static void createAllTables()throws Exception{\r
+ setup();\r
+ createUsers();\r
+ createGroups();\r
+ createTeatHeads();\r
+ createTestDefinitions();\r
+ createTestInstances();\r
+ createTestExecutions();\r
+ }\r
+\r
+ public static void cleanup(){\r
+ mongodExecutable.stop();\r
+ }\r
+\r
+}\r