including missing files
[dmaap/dbcapi.git] / src / main / java / org / onap / dmaap / dbcapi / service / DmaapService.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * org.onap.dmaap
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.dmaap.dbcapi.service;
22
23 import java.util.ArrayList;
24
25
26
27
28
29
30
31
32
33
34 import org.onap.dmaap.dbcapi.aaf.AafService;
35 import org.onap.dmaap.dbcapi.aaf.DmaapGrant;
36 import org.onap.dmaap.dbcapi.aaf.DmaapPerm;
37 import org.onap.dmaap.dbcapi.aaf.AafService.ServiceType;
38 import org.onap.dmaap.dbcapi.aaf.authentication.ApiPerms;
39 import org.onap.dmaap.dbcapi.aaf.database.DatabaseClass;
40 import org.onap.dmaap.dbcapi.logging.BaseLoggingClass;
41 import org.onap.dmaap.dbcapi.logging.DmaapbcLogMessageEnum;
42 import org.onap.dmaap.dbcapi.model.ApiError;
43 import org.onap.dmaap.dbcapi.model.Dmaap;
44 import org.onap.dmaap.dbcapi.model.MR_Client;
45 import org.onap.dmaap.dbcapi.model.Topic;
46 import org.onap.dmaap.dbcapi.model.DmaapObject.DmaapObject_Status;
47 import org.onap.dmaap.dbcapi.util.DmaapConfig;
48 import org.onap.dmaap.dbcapi.util.Singleton;
49
50 public class DmaapService  extends BaseLoggingClass  {
51
52         
53         private Singleton<Dmaap> dmaapholder = DatabaseClass.getDmaap();
54         
55         // TODO put these in properties file
56         String topicFactory; // = "org.openecomp.dcae.dmaap.topicFactory";
57         String topicMgrRole; // = "org.openecomp.dmaapBC.TopicMgr";
58         
59         // TODO confirm this is  equivalent to dmaap.getTopicNsRoot() so we can retire it
60         String dcaeTopicNs; // = "org.openecomp.dcae.dmaap";
61         
62         
63         public DmaapService() {
64                 DmaapConfig p = (DmaapConfig)DmaapConfig.getConfig();
65                 topicFactory = p.getProperty("MR.TopicFactoryNS", "MR.topicFactoryNS.not.set");
66                 topicMgrRole = p.getProperty("MR.TopicMgrRole", "MR.TopicMgrRole.not.set" );
67                 dcaeTopicNs = dmaapholder.get().getTopicNsRoot();
68                 
69         }
70         
71         public Dmaap getDmaap() {
72                 logger.info( "entering getDmaap()" );
73                 return(dmaapholder.get());
74         }
75         
76         public Dmaap addDmaap( Dmaap nd ) {
77                 
78                 logger.info( "entering addDmaap()" );
79                 Dmaap dmaap = dmaapholder.get();
80                 if ( dmaap.getVersion().equals( "0")) {
81
82                         nd.setLastMod();
83                         dmaapholder.update(nd);
84
85                         AafService aaf = new AafService( ServiceType.AAF_Admin);
86                         ApiPerms p = new ApiPerms();
87                         p.setEnvMap();
88                         boolean anythingWrong = setTopicMgtPerms(  nd,  aaf ) || createMmaTopic();
89                                         
90                         if ( anythingWrong ) {
91                                 dmaap.setStatus(DmaapObject_Status.INVALID); 
92                         }
93                         else {
94                                 dmaap.setStatus(DmaapObject_Status.VALID);  
95                         }
96                         dmaap.setLastMod();
97                         dmaapholder.update(dmaap);
98
99                         return dmaap;
100                 
101                 }
102                 else { 
103                         return dmaap;
104                 }
105         }
106         
107         public Dmaap updateDmaap( Dmaap nd ) {
108                 logger.info( "entering updateDmaap()" );
109                 
110                 boolean anythingWrong = false;
111
112                 Dmaap dmaap = dmaapholder.get();
113                 
114                 // some triggers for when we attempt to reprovision perms and MMA topic:
115                 // - if the DMaaP Name changes
116                 // - if the version is 0  (this is a handy test to force this processing by updating the DB)
117                 // - if the object is invalid, reprocessing might fix it.
118                 if ( ! dmaap.isStatusValid()  || ! nd.getDmaapName().equals(dmaap.getDmaapName()) || dmaap.getVersion().equals( "0") ) {
119                         nd.setLastMod();
120                         dmaapholder.update(nd);  //need to set this so the following perms will pick up any new vals.
121                         ApiPerms p = new ApiPerms();
122                         p.setEnvMap();
123                         AafService aaf = new AafService( ServiceType.AAF_Admin);
124                         anythingWrong = setTopicMgtPerms(  nd,  aaf ) || createMmaTopic();
125                 }
126                                         
127                 if ( anythingWrong ) {
128                         nd.setStatus(DmaapObject_Status.INVALID); 
129                 }
130                 else {
131                         nd.setStatus(DmaapObject_Status.VALID);  
132                 }
133                 nd.setLastMod();
134                 dmaapholder.update(nd);  // may need to update status...
135                 return(dmaapholder.get());
136                 
137         }
138         
139         public String getTopicPerm(){
140                 Dmaap dmaap = dmaapholder.get();
141                 return getTopicPerm( dmaap.getDmaapName() );
142         }
143         public String getTopicPerm( String val ) {
144                 Dmaap dmaap = dmaapholder.get();
145                 return dmaap.getTopicNsRoot() + "." + val + ".mr.topic";
146         }
147         
148         public String getBridgeAdminFqtn(){
149                 Dmaap dmaap = dmaapholder.get();
150                 String topic = dmaap.getBridgeAdminTopic();
151                 
152                 // check if this is already an fqtn (contains a dot)
153                 // otherwise build it
154                 if ( topic.indexOf('.') < 0 ) {
155                         topic = dmaap.getTopicNsRoot() + "." + dmaap.getDmaapName() + "." + dmaap.getBridgeAdminTopic();
156                 }
157                 return( topic );
158         }
159
160         private boolean setTopicMgtPerms( Dmaap nd, AafService aaf ){
161                 String[] actions = { "create", "destroy" };
162                 String instance = ":" + dcaeTopicNs + "." + nd.getDmaapName() + ".mr.topic:" + dcaeTopicNs + "." + nd.getDmaapName();
163                 
164                 for( String action : actions ) {
165
166                         DmaapPerm perm = new DmaapPerm( topicFactory, instance, action );
167                 
168                         int rc = aaf.addPerm( perm );
169                         if ( rc != 201 &&  rc != 409 ) {
170                                 logger.error( "unable to add perm for "+ topicFactory + "|" + instance + "|" + action );
171                                 return true;
172                         }
173
174                         DmaapGrant grant = new DmaapGrant( perm, topicMgrRole );
175                         rc = aaf.addGrant( grant );
176                         if ( rc != 201 && rc != 409 ) {
177                                 logger.error( "unable to grant to " + topicMgrRole + " perm for "+ topicFactory + "|" + instance + "|" + action );
178                                 return true;
179                         }
180                 }
181                 
182                 String t = dcaeTopicNs +"." + nd.getDmaapName() + ".mr.topic";
183                 String[] s = { "view", "pub", "sub" };
184                 actions = s;
185                 instance = "*";
186                 
187                 for( String action : actions ) {
188
189                         DmaapPerm perm = new DmaapPerm( t, instance, action );
190                 
191                         int rc = aaf.addPerm( perm );
192                         if ( rc != 201 &&  rc != 409 ) {
193                                 errorLogger.error( DmaapbcLogMessageEnum.AAF_UNEXPECTED_RESPONSE, Integer.toString(rc), "add perm", t + "|" + instance + "|" + action );
194                                 return true;
195                         }
196
197                         DmaapGrant grant = new DmaapGrant( perm, topicMgrRole );
198                         rc = aaf.addGrant( grant );
199                         if ( rc != 201 && rc != 409 ) {
200                                 errorLogger.error( DmaapbcLogMessageEnum.AAF_UNEXPECTED_RESPONSE, Integer.toString(rc), "grant to " + topicMgrRole + " perm ", topicFactory + "|" + instance + "|" + action );
201                                 return true;
202                         }
203                                 
204                 }
205                 return false;
206         }
207
208         public boolean testCreateMmaTopic() {
209
210                 DmaapConfig p = (DmaapConfig)DmaapConfig.getConfig();
211                 String unit_test = p.getProperty( "UnitTest", "No" );
212                 if ( unit_test.equals( "Yes" ) ) {
213                         return createMmaTopic();
214                 }
215                 return false;
216         }
217         
218         // create the special topic for MMA provisioning.
219         // return true indicating a problem in topic creation, 
220         // else false means it was ok  (created or previously existed)
221         private boolean createMmaTopic() {
222                 boolean rc = true;
223                 DmaapConfig p = (DmaapConfig)DmaapConfig.getConfig();
224                 Dmaap dmaap = dmaapholder.get();
225                 
226                 ArrayList<MR_Client> clients = new ArrayList<MR_Client>();
227                 String[] actions = { "pub", "sub", "view" };
228                 String centralMR = new DcaeLocationService().getCentralLocation();
229                 if ( centralMR == null ) {
230                         return rc;
231                 }
232                 logger.info( "Location for " + dmaap.getBridgeAdminTopic() + " is " + centralMR );
233         
234                 // first client is the Role used by Bus Controller to send messages to MMA
235                 String provRole = p.getProperty("MM.ProvRole");
236                 MR_Client nClient = new MR_Client();
237                 nClient.setAction(actions);
238                 nClient.setClientRole(provRole);
239                 nClient.setDcaeLocationName(centralMR);
240                 clients.add( nClient );
241         
242                 // second client is the Role used by MMA to listen to messages from Bus Controller
243                 String agentRole = p.getProperty("MM.AgentRole");
244                 nClient = new MR_Client();
245                 nClient.setAction(actions);
246                 nClient.setClientRole(agentRole);
247                 nClient.setDcaeLocationName(centralMR);
248                 clients.add( nClient );
249         
250                 // initialize Topic
251                 Topic mmaTopic = new Topic();
252                 mmaTopic.setTopicName(dmaap.getBridgeAdminTopic());
253                 mmaTopic.setClients(clients);
254                 mmaTopic.setOwner("BusController");
255                 mmaTopic.setTopicDescription("topic reserved for MirrorMaker Administration");
256                 mmaTopic.setTnxEnabled("false");
257                 
258                 ApiError err = new ApiError();
259                 TopicService svc = new TopicService();
260                 try {
261                         @SuppressWarnings("unused")
262                         Topic nTopic = svc.addTopic(mmaTopic, err);
263                         if ( err.is2xx() || err.getCode() == 409 ) {
264                                 return false;
265                         }
266                 } catch ( Exception e) {
267                         errorLogger.error( DmaapbcLogMessageEnum.UNEXPECTED_CONDITION, " while adding Topic: " + e.getMessage());
268                 }
269                 errorLogger.error( DmaapbcLogMessageEnum.TOPIC_CREATE_ERROR,  dmaap.getBridgeAdminTopic(), err.getFields(), err.getFields(), err.getMessage());
270                 
271                 return rc;
272                 
273         }
274 }