Adding nemo engine.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / UserManager.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;\r
9 \r
10 import com.google.common.util.concurrent.Futures;\r
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
12 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration;\r
13 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;\r
14 import org.opendaylight.nemo.intent.IntentResolutionException;\r
15 import org.opendaylight.nemo.intent.IntentResolver;\r
16 import org.opendaylight.nemo.intent.computation.VNMappingException;\r
17 import org.opendaylight.nemo.user.advancedquery.AdvancedQuery;\r
18 import org.opendaylight.nemo.user.tenantmanager.AAA;\r
19 import org.opendaylight.nemo.user.tenantmanager.RegisterUser;\r
20 import org.opendaylight.nemo.user.tenantmanager.TenantManage;\r
21 import org.opendaylight.nemo.user.transactionmanager.TransactionBegin;\r
22 import org.opendaylight.nemo.user.transactionmanager.TransactionEnd;\r
23 import org.opendaylight.nemo.user.vnspacemanager.languagestyle.LanguageIntent;\r
24 import org.opendaylight.nemo.user.vnspacemanager.structurestyle.deleteintent.DeleteIntent;\r
25 import org.opendaylight.nemo.user.vnspacemanager.structurestyle.updateintent.UpdateIntent;\r
26 import org.opendaylight.nemo.user.vnspacemanager.VNSpaceManagement;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.*;\r
28 import org.opendaylight.yangtools.yang.common.RpcResult;\r
29 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;\r
30 \r
31 import java.util.concurrent.Future;\r
32 \r
33 /**\r
34  * Created by z00293636 on 2015/9/7.\r
35  */\r
36 public class UserManager implements NemoIntentService, AutoCloseable {\r
37 \r
38     private DataBroker dataBroker;\r
39     private RpcProviderRegistry rpcProviderRegistry;\r
40 \r
41     private VNSpaceManagement vnSpaceManagement;\r
42     private RegisterUser registerUser;\r
43     private UpdateIntent updateIntent;\r
44     private DeleteIntent deleteIntent;\r
45     private LanguageIntent languageIntent;\r
46     private TenantManage tenantManage;\r
47     private AAA aaa;\r
48     private TransactionBegin transactionBegin;\r
49     private TransactionEnd transactionEnd;\r
50     private AdvancedQuery advancedQuery;\r
51     private IntentResolver intentResolver;\r
52 \r
53     Boolean transaction;\r
54     Boolean informresolver;\r
55 \r
56     private RpcRegistration<NemoIntentService> rpcRegistration;\r
57 \r
58     public UserManager(DataBroker dataBroker, RpcProviderRegistry rpcProviderRegistry,\r
59                        IntentResolver intentResolver)\r
60     {\r
61         this.dataBroker = dataBroker;\r
62         this.rpcProviderRegistry = rpcProviderRegistry;\r
63 \r
64         this.intentResolver = intentResolver;\r
65         vnSpaceManagement = new VNSpaceManagement(dataBroker);\r
66         tenantManage = new TenantManage(dataBroker);\r
67         aaa = new AAA(tenantManage);\r
68         registerUser = new RegisterUser(tenantManage);\r
69         updateIntent = new UpdateIntent(dataBroker,tenantManage);\r
70         deleteIntent = new DeleteIntent(dataBroker, tenantManage);\r
71         languageIntent = new LanguageIntent(dataBroker);\r
72         advancedQuery = new AdvancedQuery(dataBroker, tenantManage);\r
73 \r
74         transactionBegin = new TransactionBegin();\r
75         transactionEnd = new TransactionEnd();\r
76 \r
77         transaction = false;\r
78         informresolver = false;\r
79 \r
80         rpcRegistration = rpcProviderRegistry.addRpcImplementation(NemoIntentService.class, this);\r
81     }\r
82     @Override\r
83     public Future<RpcResult<AdvancedNemoQueryOutput>> advancedNemoQuery(AdvancedNemoQueryInput input) {\r
84         RpcResult<AdvancedNemoQueryOutput> advancedNemoQueryOutputRpcResult = null;\r
85         AdvancedNemoQueryOutputBuilder advancedNemoQueryOutputBuilder = new AdvancedNemoQueryOutputBuilder();\r
86 \r
87         String errorInfo = advancedQuery.advancedQuery(aaa, input);\r
88         if (errorInfo != null)\r
89         {\r
90             advancedNemoQueryOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(errorInfo);\r
91         }\r
92         else\r
93         {\r
94             advancedNemoQueryOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage(advancedQuery.getAdvancedQueryReuslt(input));\r
95         }\r
96         advancedNemoQueryOutputRpcResult = RpcResultBuilder.<AdvancedNemoQueryOutput>success(advancedNemoQueryOutputBuilder.build()).build();\r
97 \r
98         return Futures.immediateFuture(advancedNemoQueryOutputRpcResult);\r
99     }\r
100 \r
101     @Override\r
102     public Future<RpcResult<BeginTransactionOutput>> beginTransaction(BeginTransactionInput input) {\r
103         RpcResult<BeginTransactionOutput> beginTransactionOutputResult = null;\r
104         BeginTransactionOutputBuilder beginTransactionOutputBuilder = new BeginTransactionOutputBuilder();\r
105 \r
106         if (transaction)\r
107         {\r
108             beginTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage("The previous transaction has not been finished.");\r
109         }\r
110         else\r
111         {\r
112             String errorInfo = transactionBegin.transactionbegin(aaa,input);\r
113             if (errorInfo != null)\r
114             {\r
115                 beginTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(errorInfo);\r
116             }\r
117             else\r
118             {\r
119                 transaction = true;\r
120                 beginTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage("Transaction Begin.");\r
121             }\r
122         }\r
123         beginTransactionOutputResult = RpcResultBuilder.<BeginTransactionOutput>success(beginTransactionOutputBuilder.build()).build();\r
124         return Futures.immediateFuture(beginTransactionOutputResult);\r
125     }\r
126 \r
127     @Override\r
128     public Future<RpcResult<EndTransactionOutput>> endTransaction(EndTransactionInput input) {\r
129         RpcResult<EndTransactionOutput> endTransactionOutputResult = null;\r
130         EndTransactionOutputBuilder endTransactionOutputBuilder = new EndTransactionOutputBuilder();\r
131 \r
132         if (!transaction)\r
133         {\r
134             endTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage("The transaction has not started.");\r
135         }\r
136         else\r
137         {\r
138             String errorInfo = transactionEnd.transactionend(aaa,input);\r
139             if (errorInfo != null)\r
140             {\r
141                 endTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(errorInfo);\r
142             }\r
143             else\r
144             {\r
145                 transaction = false;\r
146                 if (informresolver)\r
147                 {\r
148                     informresolver = false;\r
149                     try\r
150                     {\r
151                         intentResolver.resolveIntent(input.getUserId());\r
152                                                 endTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage("The transaction ends.");\r
153                     }\r
154                     catch (IntentResolutionException | VNMappingException e)\r
155                     {\r
156                         e.printStackTrace();\r
157                         endTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(e.getMessage());\r
158                     }\r
159                     catch (Exception e)\r
160                     {\r
161                         e.printStackTrace();\r
162                     }\r
163                 }\r
164                 else\r
165                 {\r
166                     endTransactionOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage("The transaction ends.");\r
167                 }\r
168 \r
169             }\r
170         }\r
171         endTransactionOutputResult = RpcResultBuilder.<EndTransactionOutput>success(endTransactionOutputBuilder.build()).build();\r
172         return Futures.immediateFuture(endTransactionOutputResult);\r
173     }\r
174 \r
175     @Override\r
176     public Future<RpcResult<LanguageStyleNemoRequestOutput>> languageStyleNemoRequest(LanguageStyleNemoRequestInput input) {\r
177         RpcResult<LanguageStyleNemoRequestOutput> styleNemoRequestOutputRpcResult = null;\r
178         LanguageStyleNemoRequestOutputBuilder languageStyleNemoRequestOutputBuilder = new LanguageStyleNemoRequestOutputBuilder();\r
179 \r
180         String errorInfo = languageIntent.LanIntentHandler(aaa,input);\r
181 \r
182         if (errorInfo != null)\r
183         {\r
184             languageStyleNemoRequestOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(errorInfo);\r
185         }\r
186         else\r
187         {\r
188             languageStyleNemoRequestOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage("The intent has been stored in this transaction.");\r
189             informresolver = true;\r
190         }\r
191         styleNemoRequestOutputRpcResult = RpcResultBuilder.<LanguageStyleNemoRequestOutput>success(languageStyleNemoRequestOutputBuilder.build()).build();\r
192 \r
193         return Futures.immediateFuture(styleNemoRequestOutputRpcResult);\r
194     }\r
195 \r
196     @Override\r
197     public Future<RpcResult<RegisterUserOutput>> registerUser(RegisterUserInput input) {\r
198         RpcResult<RegisterUserOutput> registerUserOutputRpcResult = null;\r
199         RegisterUserOutputBuilder registerUserOutputBuilder = new RegisterUserOutputBuilder();\r
200         String errorInfo = registerUser.registerUser(input);\r
201 \r
202         if (errorInfo != null)\r
203         {\r
204             registerUserOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(errorInfo);\r
205         }\r
206         else\r
207         {\r
208             registerUserOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage("Register user successfully.");\r
209         }\r
210 \r
211         registerUserOutputRpcResult = RpcResultBuilder.<RegisterUserOutput>success(registerUserOutputBuilder.build()).build();\r
212 \r
213         return Futures.immediateFuture(registerUserOutputRpcResult);\r
214     }\r
215 \r
216     @Override\r
217     public Future<RpcResult<StructureStyleNemoDeleteOutput>> structureStyleNemoDelete(StructureStyleNemoDeleteInput input) {\r
218         RpcResult<StructureStyleNemoDeleteOutput> styleNemoDeleteOutputRpcResult = null;\r
219         StructureStyleNemoDeleteOutputBuilder styleNemoDeleteOutputBuilder = new StructureStyleNemoDeleteOutputBuilder();\r
220 \r
221         String errorInfo = deleteIntent.styleNemoDeleteOutput(aaa,input);\r
222 \r
223         if (errorInfo != null)\r
224         {\r
225             styleNemoDeleteOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(errorInfo);\r
226         }\r
227         else\r
228         {\r
229             styleNemoDeleteOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage("The intent has been handled by user manager successfully.");\r
230             informresolver = true;\r
231         }\r
232 \r
233 \r
234         styleNemoDeleteOutputRpcResult = RpcResultBuilder.<StructureStyleNemoDeleteOutput>success(styleNemoDeleteOutputBuilder.build()).build();\r
235 \r
236         return Futures.immediateFuture(styleNemoDeleteOutputRpcResult);\r
237     }\r
238 \r
239     @Override\r
240     public Future<RpcResult<StructureStyleNemoUpdateOutput>> structureStyleNemoUpdate(StructureStyleNemoUpdateInput input) {\r
241         RpcResult<StructureStyleNemoUpdateOutput> styleNemoUpdateOutputRpcResult = null;\r
242         StructureStyleNemoUpdateOutputBuilder styleNemoUpdateOutputBuilder = new StructureStyleNemoUpdateOutputBuilder();\r
243 \r
244         String erroInfo = updateIntent.updateIntent(aaa,input);\r
245 \r
246         if (erroInfo != null)\r
247         {\r
248             styleNemoUpdateOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Error).setMessage(erroInfo);\r
249         }\r
250         else\r
251         {\r
252             styleNemoUpdateOutputBuilder.setResultCode(CommonRpcResult.ResultCode.Ok).setMessage("The intent has been handled by user manager successfully.");\r
253             informresolver = true;\r
254         }\r
255 \r
256         styleNemoUpdateOutputRpcResult = RpcResultBuilder.<StructureStyleNemoUpdateOutput>success(styleNemoUpdateOutputBuilder.build()).build();\r
257 \r
258         return Futures.immediateFuture(styleNemoUpdateOutputRpcResult);\r
259     }\r
260 \r
261     @Override\r
262     public void close() throws Exception {\r
263         if ( null != rpcRegistration ) {\r
264             rpcRegistration.close();\r
265         }\r
266     }\r
267 }\r