From f96a07c31cbca70916cf0429d8356e8739cbd7eb Mon Sep 17 00:00:00 2001 From: Gary Wu Date: Mon, 30 Nov 2015 15:54:53 -0800 Subject: [PATCH] Refactor TenantManage Refactor TenantManage to make the following changes: 1. Block on the retrieval of users and roles since the MD-SAL API is async. Without this the calls will always return null since the async calls will not have completed yet. 2. Added new APIs to return users and roles as Maps to avoid linear searches. Change-Id: Ib3ce98a3ac6adbbc66627e497d85531d12258c99 Signed-off-by: Gary Wu --- .../nemo/user/tenantmanager/AAA.java | 48 +++------ .../nemo/user/tenantmanager/RegisterUser.java | 45 ++------ .../nemo/user/tenantmanager/TenantManage.java | 102 ++++++++++++------ .../nemo/user/tenantmanager/AAATest.java | 3 +- .../user/tenantmanager/RegisterUserTest.java | 5 +- 5 files changed, 94 insertions(+), 109 deletions(-) diff --git a/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/AAA.java b/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/AAA.java index e9b959b..51e693e 100644 --- a/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/AAA.java +++ b/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/AAA.java @@ -7,6 +7,8 @@ */ package org.opendaylight.nemo.user.tenantmanager; +import java.util.Map; + import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserName; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserPassword; @@ -14,8 +16,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.com import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.UserInstance; -import java.util.List; - /** * Created by z00293636 on 2015/8/29. */ @@ -37,39 +37,19 @@ public class AAA { private String checkUser(UserId userId, UserName userName, UserPassword userPassword, UserRoleName userRoleName) { tenantManage.fetchUsers(); - List userList = tenantManage.getUsersList(); + final Map users = tenantManage.getUsers(); String errorInfo = null; - Boolean userexist = false; - - if (userList != null) - { - for (User user : userList) - { - if (user.getUserId().equals(userId)) - { - userexist = true; - if (!user.getUserName().equals(userName)) - { - errorInfo = "The user name is not right."; - break; - } - else if (!user.getUserPassword().equals(userPassword)) - { - errorInfo = "The password is not right."; - break; - } - else if (!user.getUserRole().equals(userRoleName)) - { - errorInfo = "The role is not right."; - break; - } - } - } - - } - - if (!userexist) - { + final User user = users.get(userId); + + if (users.containsKey(userId) && user != null) { + if (!user.getUserName().equals(userName)) { + errorInfo = "The user name is not right."; + } else if (!user.getUserPassword().equals(userPassword)) { + errorInfo = "The password is not right."; + } else if (!user.getUserRole().equals(userRoleName)) { + errorInfo = "The role is not right."; + } + } else { errorInfo = "The user is not exist."; } return errorInfo; diff --git a/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/RegisterUser.java b/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/RegisterUser.java index d598b02..5dbf6a0 100644 --- a/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/RegisterUser.java +++ b/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/RegisterUser.java @@ -7,21 +7,19 @@ */ package org.opendaylight.nemo.user.tenantmanager; +import java.util.Map; + import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserRoleName; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.RegisterUserInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.user.roles.UserRole; -import java.util.List; - /** * Created by z00293636 on 2015/9/20. */ public class RegisterUser { - private TenantManage tenantManage; - private List userRoleList; - private List usersList; + private final TenantManage tenantManage; public RegisterUser(TenantManage tenantManage) { @@ -33,19 +31,19 @@ public class RegisterUser { String errorInfo = null; tenantManage.fetchUserRoles(); - userRoleList = tenantManage.getUserRoleList(); + Map userRoles = tenantManage.getUserRoles(); tenantManage.fetchUsers(); - usersList = tenantManage.getUsersList(); + Map users = tenantManage.getUsers(); - if (userRoleList == null) + if (userRoles.isEmpty()) { errorInfo = "There are no roles be defined."; } else { - if (IfRoleExist(input.getUserRole())) + if (userRoles.containsKey(input.getUserRole())) { - if (usersList != null && IfUserHasRegistered(input.getUserId())) + if (users.containsKey(input.getUserId())) { errorInfo = "The user has been registered."; } @@ -61,32 +59,5 @@ public class RegisterUser { } return errorInfo; } - private boolean IfRoleExist(UserRoleName userRoleName){ - Boolean roleExist = false; - - for (UserRole userRole : userRoleList) - { - if (userRole.getRoleName().equals(userRoleName)) - { - roleExist = true; - } - } - - return roleExist; - } - - private boolean IfUserHasRegistered(UserId userId){ - Boolean userHasRegistered = false; - - for (User user : usersList) - { - if (user.getUserId().equals(userId)) - { - userHasRegistered = true; - } - } - - return userHasRegistered; - } } diff --git a/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/TenantManage.java b/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/TenantManage.java index c20756b..cbf22e1 100644 --- a/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/TenantManage.java +++ b/nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/TenantManage.java @@ -7,16 +7,19 @@ */ package org.opendaylight.nemo.user.tenantmanager; -import com.google.common.base.Optional; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.ListenableFuture; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserRoleName; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.RegisterUserInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User; @@ -28,8 +31,12 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.SettableFuture; /** * Created by z00293636 on 2015/8/29. @@ -39,8 +46,8 @@ import java.util.List; public class TenantManage { private static final Logger LOG = LoggerFactory.getLogger(TenantManage.class); private DataBroker dataBroker; - private List userRoleList; - private List usersList ; + private final SettableFuture> userRoleListFuture = SettableFuture.create(); + private final SettableFuture> usersListFuture = SettableFuture.create(); private User user; public TenantManage(DataBroker dataBroker) @@ -50,12 +57,12 @@ public class TenantManage { private void setUserRoleList(List userRoleList) { - this.userRoleList = userRoleList; + this.userRoleListFuture.set(userRoleList); } private void setUserList(List userList) { - this.usersList = userList; + this.usersListFuture.set(userList); } private void setUser(User user) @@ -63,14 +70,53 @@ public class TenantManage { this.user = user; } - public List getUserRoleList() - { - return userRoleList; + public List getUserRoleList() { + try { + return userRoleListFuture.get(1, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + LOG.error("Cannot read role information.", e); + return null; + } } - public List getUsersList() + /** + * + * @return Map from UserRoleName to UserRole. If no roles exist, an empty (not-null) map is returned. + */ + public Map getUserRoles() { + final Map map = new HashMap<>(); + final List userRoleList = getUserRoleList(); + if (userRoleList != null) { + for (UserRole role : userRoleList) { + map.put(role.getRoleName(), role); + } + } + return map; + } + + public List getUsersList() { + try { + return usersListFuture.get(1, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + LOG.error("Cannot read user information.", e); + return null; + } + } + + /** + * + * @return Map from UserId to User. If no users exist, an empty (not-null) map is returned. + */ + public Map getUsers() { - return usersList; + final Map map = new HashMap<>(); + final List userList = getUsersList(); + if (userList != null) { + for (User user : userList) { + map.put(user.getUserId(), user); + } + } + return map; } public User getUser() @@ -87,18 +133,14 @@ public class TenantManage { public void onSuccess(Optional result) { setUserRoleList(result.get().getUserRole()); - return; } @Override public void onFailure(Throwable t) { LOG.error("Can not read role information.", t); - - return; } }); - return; } public void fetchUsers(){ @@ -109,35 +151,25 @@ public class TenantManage { public void onSuccess(Optional result) { setUserList(result.get().getUser()); - return; } @Override public void onFailure(Throwable t) { LOG.error("Can not read users information.", t); - - return; } }); - return; } public void fetchVNSpace(UserId userId) { fetchUsers(); - if (getUsersList() != null) - { - for (User user : getUsersList()) - { - if (user.getUserId().equals(userId)) - { - setUser(user); - break; - } - } + final Map users = getUsers(); + + User user = users.get(userId); + if (users.containsKey(userId) && user != null) { + setUser(user); } - return; } public void addUser(RegisterUserInput registerUserInput){ diff --git a/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/AAATest.java b/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/AAATest.java index 98f669a..24f50ac 100644 --- a/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/AAATest.java +++ b/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/AAATest.java @@ -32,6 +32,7 @@ public class AAATest extends TestCase { private TenantManage tenantManage; private UserInstance userInstance; + @Override @Before public void setUp() throws Exception { tenantManage = mock(TenantManage.class); @@ -47,7 +48,7 @@ public class AAATest extends TestCase { String acutal = aaa.checkUser(userInstance); String expected = "The user is not exist."; verify(tenantManage).fetchUsers(); - verify(tenantManage).getUsersList(); + verify(tenantManage).getUsers(); Assert.assertNotNull(aaa); Assert.assertEquals(expected,acutal); } diff --git a/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/RegisterUserTest.java b/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/RegisterUserTest.java index e0a6689..26ce176 100644 --- a/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/RegisterUserTest.java +++ b/nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/RegisterUserTest.java @@ -38,6 +38,7 @@ public class RegisterUserTest extends TestCase { private RegisterUser registerUser; private TenantManage tenantManage; private RegisterUserInput input; + @Override @Before public void setUp() throws Exception { tenantManage = mock(TenantManage.class); @@ -62,8 +63,8 @@ public class RegisterUserTest extends TestCase { when(input.getUserRole()).thenReturn(mock(UserRoleName.class)); registerUser.registerUser(input); - verify(tenantManage,times(2)).getUserRoleList(); - verify(tenantManage,times(2)).getUsersList(); + verify(tenantManage,times(2)).getUserRoles(); + verify(tenantManage,times(2)).getUsers(); Assert.assertNotNull(tenantManage); Assert.assertNotNull(registerUser); } -- 2.36.6