added svcapi ui and camunda code
[it/otf.git] / otf-service-api / src / test / java / org / oran / otf / api / tests / shared / MemoryDatabase.java
diff --git a/otf-service-api/src/test/java/org/oran/otf/api/tests/shared/MemoryDatabase.java b/otf-service-api/src/test/java/org/oran/otf/api/tests/shared/MemoryDatabase.java
new file mode 100644 (file)
index 0000000..2c17abb
--- /dev/null
@@ -0,0 +1,386 @@
+/*  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