X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fdmaap%2Fdbcapi%2Fservice%2FMR_ClientService.java;h=d0407c2fa97a0d7d14f507d11824e661fac0fc17;hb=5eeb7b8e6f7c4bbe5da8d08a8145109e2f05329f;hp=68b340fd84cd09785c2e6967dbb839dafa554d5a;hpb=a05efb7b7b3cfc77f5e3fda11e8434834829f56a;p=dmaap%2Fdbcapi.git diff --git a/src/main/java/org/onap/dmaap/dbcapi/service/MR_ClientService.java b/src/main/java/org/onap/dmaap/dbcapi/service/MR_ClientService.java index 68b340f..d0407c2 100644 --- a/src/main/java/org/onap/dmaap/dbcapi/service/MR_ClientService.java +++ b/src/main/java/org/onap/dmaap/dbcapi/service/MR_ClientService.java @@ -3,6 +3,8 @@ * org.onap.dmaap * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * + * Modifications Copyright (C) 2019 IBM. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,8 +40,9 @@ import org.onap.dmaap.dbcapi.aaf.AafService; import org.onap.dmaap.dbcapi.aaf.DmaapGrant; import org.onap.dmaap.dbcapi.aaf.DmaapPerm; import org.onap.dmaap.dbcapi.aaf.AafService.ServiceType; -import org.onap.dmaap.dbcapi.aaf.client.MrProvConnection; -import org.onap.dmaap.dbcapi.aaf.database.DatabaseClass; +import org.onap.dmaap.dbcapi.aaf.AafUserRole; +import org.onap.dmaap.dbcapi.client.MrProvConnection; +import org.onap.dmaap.dbcapi.database.DatabaseClass; import org.onap.dmaap.dbcapi.logging.BaseLoggingClass; import org.onap.dmaap.dbcapi.model.ApiError; import org.onap.dmaap.dbcapi.model.DcaeLocation; @@ -51,29 +54,27 @@ import org.onap.dmaap.dbcapi.util.DmaapConfig; public class MR_ClientService extends BaseLoggingClass{ + private static final String MR_CLIENT_ID = "mrClientId"; private int deleteLevel; private Map mr_clients = DatabaseClass.getMr_clients(); private Map clusters = DatabaseClass.getMr_clusters(); - private Map topics = DatabaseClass.getTopics(); private Map locations = DatabaseClass.getDcaeLocations(); private DmaapService dmaap = new DmaapService(); + private String centralCname; public MR_ClientService() { DmaapConfig p = (DmaapConfig)DmaapConfig.getConfig(); - - deleteLevel = Integer.valueOf(p.getProperty("MR.ClientDeleteLevel", "0" )); - } - public Map getMR_Clients() { - return mr_clients; + centralCname = p.getProperty("MR.CentralCname", "MRcname.not.set"); + deleteLevel = Integer.valueOf(p.getProperty("MR.ClientDeleteLevel", "0" )); } public List getAllMr_Clients() { - return new ArrayList(mr_clients.values()); + return new ArrayList<>(mr_clients.values()); } - public ArrayList getAllMrClients(String fqtn) { - ArrayList results = new ArrayList(); + List getAllMrClients(String fqtn) { + ArrayList results = new ArrayList<>(); for (Map.Entry entry : mr_clients.entrySet()) { MR_Client client = entry.getValue(); @@ -84,8 +85,8 @@ public class MR_ClientService extends BaseLoggingClass{ return results; } - public ArrayList getClientsByLocation(String location) { - ArrayList results = new ArrayList(); + List getClientsByLocation(String location) { + List results = new ArrayList<>(); for (Map.Entry entry : mr_clients.entrySet()) { MR_Client client = entry.getValue(); @@ -95,26 +96,14 @@ public class MR_ClientService extends BaseLoggingClass{ } return results; } - - public void refreshClients( String location ) { - ApiError err = new ApiError(); - ArrayList clients = getClientsByLocation( location ); - for( MR_Client client : clients ) { - Topic topic = topics.get(client.getFqtn()); - if ( topic != null ) { - addMr_Client( client, topic, err); - } - - - } - } + public MR_Client getMr_Client( String key, ApiError apiError ) { MR_Client c = mr_clients.get( key ); if ( c == null ) { apiError.setCode(Status.NOT_FOUND.getStatusCode()); - apiError.setFields( "mrClientId"); - apiError.setMessage("mrClientId " + key + " not found" ); + apiError.setFields(MR_CLIENT_ID); + apiError.setMessage(MR_CLIENT_ID+ " " + key + " not found" ); } else { apiError.setCode(200); } @@ -126,18 +115,33 @@ public class MR_ClientService extends BaseLoggingClass{ logger.info( "Client dcaeLocation that doesn't exist or not specified" ); return null; } - grantClientPerms( client, err); + // original style: clients specified Role. This has precedence for backwards + // compatibility. + // ONAP style: clients specify Identity to be assigned to generated Role + String role = client.getClientRole(); + if ( role != null ) { + grantClientRolePerms( client, err); + } else if ( client.hasClientIdentity() ){ + if ( client.isSubscriber() ) { + role = topic.getSubscriberRole(); + assignIdentityToRole( client, role, err ); + } + if (client.isPublisher() ) { + role = topic.getPublisherRole(); + assignIdentityToRole( client, role, err ); + } + } if ( ! client.isStatusValid()) { return null; } String centralFqdn = null; DcaeLocation candidate = locations.get(client.getDcaeLocationName()); - if ( candidate != null && candidate.isCentral() ) { - DmaapConfig p = ( DmaapConfig)DmaapConfig.getConfig(); - centralFqdn = p.getProperty("MR.CentralCname"); - } + MR_Cluster cluster = clusters.get( client.getDcaeLocationName()); - if ( cluster != null ) { + if ( cluster != null && candidate != null ) { + if ( candidate.isCentral() && ! topic.getReplicationCase().involvesFQDN() ) { + centralFqdn = centralCname; + } client.setTopicURL(cluster.genTopicURL(centralFqdn, client.getFqtn())); if ( centralFqdn == null ) { client.setStatus( addTopicToCluster( cluster, topic, err)); @@ -148,8 +152,8 @@ public class MR_ClientService extends BaseLoggingClass{ } else { MR_ClusterService clusters = new MR_ClusterService(); - // in 1610, MM should only exist for edge-to-central - // we use a cname for the central target + // MM should only exist for edge-to-central + // we use a cname for the central target (default resiliency with no replicationGroup set) // but still need to provision topics on all central MRs for( MR_Cluster central: clusters.getCentralClusters() ) { client.setStatus( addTopicToCluster( central, topic, err)); @@ -161,9 +165,8 @@ public class MR_ClientService extends BaseLoggingClass{ } } else { - logger.info( "Client references a dcaeLocation that doesn't exist:" + client.getDcaeLocationName()); + logger.warn( "Client references a dcaeLocation that doesn't exist:" + client.getDcaeLocationName()); client.setStatus( DmaapObject_Status.STAGED); - //return null; } mr_clients.put( client.getMrClientId(), client ); @@ -178,7 +181,7 @@ public class MR_ClientService extends BaseLoggingClass{ MrProvConnection prov = new MrProvConnection(); logger.info( "POST topic " + topic.getFqtn() + " to cluster " + cluster.getFqdn() + " in loc " + cluster.getDcaeLocationName()); if ( prov.makeTopicConnection(cluster)) { - String resp = prov.doPostTopic(topic, err); + prov.doPostTopic(topic, err); logger.info( "response code: " + err.getCode() ); if ( err.is2xx() || err.getCode() == 409 ) { return DmaapObject_Status.VALID; @@ -187,26 +190,46 @@ public class MR_ClientService extends BaseLoggingClass{ return DmaapObject_Status.INVALID; } - private void grantClientPerms( MR_Client client, ApiError err) { + private void grantClientRolePerms( MR_Client client, ApiError err) { AafService aaf = new AafService(ServiceType.AAF_TopicMgr); String instance = ":topic." + client.getFqtn(); client.setStatus( DmaapObject_Status.VALID); + String role = client.getClientRole(); for( String want : client.getAction() ) { int rc; DmaapPerm perm = new DmaapPerm( dmaap.getTopicPerm(), instance, want ); - DmaapGrant g = new DmaapGrant( perm, client.getClientRole() ); - rc = aaf.addGrant( g ); - if ( rc != 201 && rc != 409 ) { - client.setStatus( DmaapObject_Status.INVALID); - err.setCode(rc); - err.setMessage( "Grant of " + dmaap.getTopicPerm() + "|" + instance + "|" + want + " failed for " + client.getClientRole() ); - logger.warn( err.getMessage()); - return; - } + if ( role != null ) { + DmaapGrant g = new DmaapGrant( perm, role ); + rc = aaf.addGrant( g ); + if ( rc != 201 && rc != 409 ) { + client.setStatus( DmaapObject_Status.INVALID); + err.setCode(rc); + err.setMessage( "Grant of " + dmaap.getTopicPerm() + "|" + instance + "|" + want + " failed for " + role ); + logger.warn( err.getMessage()); + return; + } + } else { + logger.warn( "No Grant of " + dmaap.getTopicPerm() + "|" + instance + "|" + want + " because role is null " ); + } } } + private void assignIdentityToRole( MR_Client client, String role, ApiError err ) { + AafService aaf = new AafService(ServiceType.AAF_TopicMgr); + + AafUserRole ur = new AafUserRole( client.getClientIdentity(), role ); + int rc = aaf.addUserRole( ur ); + if ( rc != 201 && rc != 409 ) { + client.setStatus( DmaapObject_Status.INVALID); + err.setCode(rc); + err.setMessage( "Failed to add user " + client.getClientIdentity()+ " to " + role ); + logger.warn( err.getMessage()); + return; + } + client.setStatus( DmaapObject_Status.VALID); + + } private void revokeClientPerms( MR_Client client, ApiError err) { AafService aaf = new AafService(ServiceType.AAF_TopicMgr); @@ -231,7 +254,7 @@ public class MR_ClientService extends BaseLoggingClass{ MR_Client c = mr_clients.get( client.getMrClientId()); if ( c == null ) { apiError.setCode(Status.NOT_FOUND.getStatusCode()); - apiError.setFields( "mrClientId"); + apiError.setFields(MR_CLIENT_ID); apiError.setMessage("mrClientId " + client.getMrClientId() + " not found" ); } else { apiError.setCode(200); @@ -244,20 +267,20 @@ public class MR_ClientService extends BaseLoggingClass{ MR_Client client = mr_clients.get( key ); if ( client == null ) { apiError.setCode(Status.NOT_FOUND.getStatusCode()); - apiError.setFields( "mrClientId"); + apiError.setFields(MR_CLIENT_ID); apiError.setMessage("mrClientId " + key + " not found" ); return; } else { apiError.setCode(200); } - if ( updateTopicView == true ) { + if (updateTopicView) { TopicService topics = new TopicService(); Topic t = topics.getTopic(client.getFqtn(), apiError ); if ( t != null ) { - ArrayList tc = t.getClients(); + List tc = t.getClients(); for( MR_Client c: tc) { if ( c.getMrClientId().equals(client.getMrClientId())) { tc.remove(c); @@ -270,7 +293,6 @@ public class MR_ClientService extends BaseLoggingClass{ } - // remove from AAF if ( deleteLevel >= 2 ) { revokeClientPerms( client, apiError ); @@ -282,8 +304,6 @@ public class MR_ClientService extends BaseLoggingClass{ if ( deleteLevel >= 1 ) { mr_clients.remove(key); } - - return; } }