cbf22e1fe1fc180fece9eea91e5e13407a7e15ef
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / tenantmanager / TenantManage.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.nemo.user.tenantmanager;\r
9 \r
10 import java.util.HashMap;\r
11 import java.util.List;\r
12 import java.util.Map;\r
13 import java.util.concurrent.ExecutionException;\r
14 import java.util.concurrent.TimeUnit;\r
15 import java.util.concurrent.TimeoutException;\r
16 \r
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
18 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
20 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserRoleName;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.RegisterUserInput;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserBuilder;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.UserRoles;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.user.roles.UserRole;\r
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
31 import org.slf4j.Logger;\r
32 import org.slf4j.LoggerFactory;\r
33 \r
34 import com.google.common.base.Optional;\r
35 import com.google.common.util.concurrent.CheckedFuture;\r
36 import com.google.common.util.concurrent.FutureCallback;\r
37 import com.google.common.util.concurrent.Futures;\r
38 import com.google.common.util.concurrent.ListenableFuture;\r
39 import com.google.common.util.concurrent.SettableFuture;\r
40 \r
41 /**\r
42  * Created by z00293636 on 2015/8/29.\r
43  */\r
44 \r
45 /* maintain tenant information, including how many tenants are active, their information */\r
46 public class TenantManage {\r
47     private static final Logger LOG = LoggerFactory.getLogger(TenantManage.class);\r
48     private DataBroker dataBroker;\r
49     private final SettableFuture<List<UserRole>> userRoleListFuture = SettableFuture.create();\r
50     private final SettableFuture<List<User>> usersListFuture = SettableFuture.create();\r
51     private User user;\r
52 \r
53     public TenantManage(DataBroker dataBroker)\r
54     {\r
55         this.dataBroker = dataBroker;\r
56     }\r
57 \r
58     private void setUserRoleList(List<UserRole> userRoleList)\r
59     {\r
60         this.userRoleListFuture.set(userRoleList);\r
61     }\r
62 \r
63     private void setUserList(List<User> userList)\r
64     {\r
65         this.usersListFuture.set(userList);\r
66     }\r
67 \r
68     private void setUser(User user)\r
69     {\r
70         this.user = user;\r
71     }\r
72 \r
73     public List<UserRole> getUserRoleList() {\r
74         try {\r
75             return userRoleListFuture.get(1, TimeUnit.SECONDS);\r
76         } catch (InterruptedException | ExecutionException | TimeoutException e) {\r
77             LOG.error("Cannot read role information.", e);\r
78             return null;\r
79         }\r
80     }\r
81 \r
82     /**\r
83      *\r
84      * @return Map from UserRoleName to UserRole.  If no roles exist, an empty (not-null) map is returned.\r
85      */\r
86     public Map<UserRoleName, UserRole> getUserRoles() {\r
87         final Map<UserRoleName, UserRole> map = new HashMap<>();\r
88         final List<UserRole> userRoleList = getUserRoleList();\r
89         if (userRoleList != null) {\r
90             for (UserRole role : userRoleList) {\r
91                 map.put(role.getRoleName(), role);\r
92             }\r
93         }\r
94         return map;\r
95     }\r
96 \r
97     public List<User> getUsersList() {\r
98         try {\r
99             return usersListFuture.get(1, TimeUnit.SECONDS);\r
100         } catch (InterruptedException | ExecutionException | TimeoutException e) {\r
101             LOG.error("Cannot read user information.", e);\r
102             return null;\r
103         }\r
104     }\r
105 \r
106     /**\r
107      *\r
108      * @return Map from UserId to User.  If no users exist, an empty (not-null) map is returned.\r
109      */\r
110     public Map<UserId, User> getUsers()\r
111     {\r
112         final Map<UserId, User> map = new HashMap<>();\r
113         final List<User> userList = getUsersList();\r
114         if (userList != null) {\r
115             for (User user : userList) {\r
116                 map.put(user.getUserId(), user);\r
117             }\r
118         }\r
119         return map;\r
120     }\r
121 \r
122     public User getUser()\r
123     {\r
124         return user;\r
125     }\r
126 \r
127     public void fetchUserRoles(){\r
128 \r
129         InstanceIdentifier<UserRoles> userRolesInsId = InstanceIdentifier.builder(UserRoles.class).build();\r
130         ListenableFuture<Optional<UserRoles>> userRolesFuture = this.dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, userRolesInsId);\r
131         Futures.addCallback(userRolesFuture, new FutureCallback<Optional<UserRoles>>() {\r
132             @Override\r
133             public void onSuccess(Optional<UserRoles> result)\r
134             {\r
135                 setUserRoleList(result.get().getUserRole());\r
136             }\r
137 \r
138             @Override\r
139             public void onFailure(Throwable t)\r
140             {\r
141                 LOG.error("Can not read role information.", t);\r
142             }\r
143         });\r
144     }\r
145 \r
146     public void fetchUsers(){\r
147         InstanceIdentifier<Users> usersInsId = InstanceIdentifier.builder(Users.class).build();\r
148         ListenableFuture<Optional<Users>> usersFuture = dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, usersInsId);\r
149         Futures.addCallback(usersFuture, new FutureCallback<Optional<Users>>() {\r
150             @Override\r
151             public void onSuccess(Optional<Users> result)\r
152             {\r
153                 setUserList(result.get().getUser());\r
154             }\r
155 \r
156             @Override\r
157             public void onFailure(Throwable t)\r
158             {\r
159                 LOG.error("Can not read users information.", t);\r
160             }\r
161         });\r
162     }\r
163 \r
164     public void fetchVNSpace(UserId userId)\r
165     {\r
166         fetchUsers();\r
167         final Map<UserId, User> users = getUsers();\r
168 \r
169         User user = users.get(userId);\r
170         if (users.containsKey(userId) && user != null) {\r
171             setUser(user);\r
172         }\r
173     }\r
174 \r
175     public void addUser(RegisterUserInput registerUserInput){\r
176         WriteTransaction t = dataBroker.newWriteOnlyTransaction();\r
177         if (registerUserInput.getUserId() != null)\r
178         {\r
179             User user = new UserBuilder(registerUserInput).build();\r
180 //            UserBuilder userBuilder = new UserBuilder();\r
181 //            userBuilder.setUserId(registerUserInput.getUserId());\r
182 //            userBuilder.setUserName(registerUserInput.getUserName());\r
183 //            userBuilder.setUserPassword(registerUserInput.getUserPassword());\r
184 //            userBuilder.setUserRole(registerUserInput.getUserRole());\r
185 //\r
186 //            User user = userBuilder.build();\r
187             UserKey userKey = new UserKey(registerUserInput.getUserId());\r
188 \r
189             InstanceIdentifier<User> userid = InstanceIdentifier.builder(Users.class).child(User.class, userKey).build();\r
190 \r
191             t.put(LogicalDatastoreType.CONFIGURATION, userid, user,true);\r
192             CheckedFuture<Void, TransactionCommitFailedException> f = t.submit();\r
193             Futures.addCallback(f, new FutureCallback<Void>() {\r
194                 @Override\r
195                 public void onFailure(Throwable t) {\r
196                     LOG.error("Could not write endpoint base container", t);\r
197                 }\r
198 \r
199                 @Override\r
200                 public void onSuccess(Void result) {\r
201 \r
202                 }\r
203             });\r
204         }\r
205     }\r
206 }\r