Charlie,

I modified my code so that it would  create a controller first and then enable 
it thought the Post request, but I am getting the same error message during the 
initial creation step. Thank you for your suggestion about checking how this 
works out in the browser. I will check that next.

    public ControllerServiceEntity createDbcp(String groupId,
                                              String dbUrl,
                                              String driverClass,
                                              String driverDirectory,
                                              String dbUser,
                                              String pwd,
                                              int    maxWaitTime,
                                              int    maxConnectionTotal,
                                              String validationQuery ) {

         Map<String,String> props = new HashMap<>();

         props.put("Database Connection URL", "dbUrl");
         props.put("Database Driver Class Name", "driverClass");
         props.put("Database Driver Location(s)", "driverDirectory");
         props.put("Database User", "dbUser");
         props.put("Password", "pwd");
         props.put("Max Wait Time", "maxWaitTime");
         props.put("Max Total Connections", "maxConnectionTotal");
         props.put("Validation query", "validationQuery");

         RevisionDTO revision = new RevisionDTO()
                 .clientId(clientId)
                 .version(0L);

//       ControllerServiceDTO component = new ControllerServiceDTO()
//               .parentGroupId(groupId)
//               .name("DBCPConnectionPool")
//               .type("DBCPConnectionPool 1.6.0-SNAPSHOT")
//               .state(ControllerServiceDTO.StateEnum.ENABLED)
//               .properties(props);

         ControllerServiceDTO component = new ControllerServiceDTO()
                 .parentGroupId(groupId)
                 .name("DBCPConnectionPool")
                 .type("DBCPConnectionPool 1.6.0-SNAPSHOT")
                 .properties(props);

         ControllerServiceEntity dbcp = new ControllerServiceEntity()
                 .component(component)
                 .revision(revision);

         dbcp = createControllerService(groupId, dbcp);

         // now enable it
    component.state(ControllerServiceDTO.StateEnum.ENABLED);
         dbcp = updateControllerService(groupId, dbcp);


         return dbcp;
    }


From: Charlie Meyer [mailto:[email protected]]
Sent: Tuesday, April 17, 2018 4:00 PM
To: [email protected]
Subject: Re: Security issue when programmatically trying to create DBCP 
Controller Service

We use a swagger-generated client as well and the main difference that I see is 
that I do not set

.state(ControllerServiceDTO.StateEnum.ENABLED)

But rather create it, then enable it as a next step.

In debugging these things, I have extensively used the chrome developer tools 
as I make actions in the UI, then get my payloads from my java client to match 
those exactly. If a field isnt set by the UI, I dont set it in my payloads from 
my code either (and the inverse).

Hope that helps


On Tue, Apr 17, 2018 at 2:42 PM, Vitaly Krivoy 
<[email protected]<mailto:[email protected]>> wrote:
Hi,
I am trying to programmatically create a DBCP Controller Service from a Java 
program and I am getting an error returned from 
POST/process-groups/{id}/controller-services.
Exception when calling: ControllerServicesApi#createControllerService
               Response body: Unable to create component to verify if it 
references any Controller Services. Contact the system administrator.
               io.swagger.client.ApiException: Unauthorized
                              at 
io.swagger.client.ApiClient.handleResponse(ApiClient.java:1058)
                              at 
io.swagger.client.ApiClient.execute(ApiClient.java:981)
                              at 
io.swagger.client.api.ProcessgroupsApi.createControllerServiceWithHttpInfo(ProcessgroupsApi.java:396)
                              at 
io.swagger.client.api.ProcessgroupsApi.createControllerService(ProcessgroupsApi.java:381)
                              at 
com.bdss.nifi.trickle.NiFiRestClient.createControllerService(NiFiRestClient.java:304)
                              at 
com.bdss.nifi.trickle.NiFiRestClient.createDbcp(NiFiRestClient.java:347)
                              at 
com.bdss.nifi.trickle.resources.NiFiResourceManager.getMdmDbcp(NiFiResourceManager.java:45)
                              at 
com.bdss.nifi.trickle.Trickle.createTemplateConfig(Trickle.java:57)
                              at 
com.bdss.nifi.trickle.Trickle.main(Trickle.java:212)

I don’t have any security mechanisms enabled yet. I have no problems creating 
Database Connection Pooling Service Controller from NiFi gui and using it with 
ExecuteSQL processor. Below is my code which tries to generate DBCP Controller 
Service.
processgroupsApi.createControllerService(groupId, controllerServiceEntity) call 
in createControllerService method maps directly to 
POST/process-groups/{id}/controller-services and the rest of the logic should 
be straight-forward.  What am I missing in my code? Thanks very much!

public ControllerServiceEntity createControllerService(String groupId,
                                                                      
ControllerServiceEntity  controllerServiceEntity) {

                              try {
                              // processgroupsApi.createControllerService wraps 
POST/process-groups/{id}/controller-services
                                             controllerServiceEntity = 
processgroupsApi.createControllerService(groupId, controllerServiceEntity);
                              } catch (ApiException e) {
                                             
printException("ControllerServicesApi#createControllerService", e);
                              }
                              return controllerServiceEntity;
               }

               public ControllerServiceEntity createDbcp(String groupId,
                                                         String dbUrl,
                                                         String driverClass,
                                                         String driverDirectory,
                                                         String dbUser,
                                                         String pwd,
                                                         int    maxWaitTime,
                                                         int    
maxConnectionTotal,
                                                         String validationQuery 
) {

                              Map<String,String> props = new HashMap<>();

                              props.put("Database Connection URL", "dbUrl");
                              props.put("Database Driver Class Name", 
"driverClass");
                              props.put("Database Driver Location(s)", 
"driverDirectory");
                              props.put("Database User", "dbUser");
                              props.put("Password", "pwd");
                              props.put("Max Wait Time", "maxWaitTime");
                              props.put("Max Total Connections", 
"maxConnectionTotal");
                              props.put("Validation query", "validationQuery");

                              RevisionDTO revision = new RevisionDTO()
                                                            .clientId(clientId)
                                                            .version(0L);

                              ControllerServiceDTO component = new 
ControllerServiceDTO()
                                                            
.parentGroupId(groupId)
                                                            
.name("DBCPConnectionPool")
                                                            
.type("DBCPConnectionPool 1.6.0-SNAPSHOT")
                                                            
.state(ControllerServiceDTO.StateEnum.ENABLED)
                                                            .properties(props);

                              ControllerServiceEntity dbcp = new 
ControllerServiceEntity()
                                                            
.component(component)
                                                            .revision(revision);

                              dbcp = createControllerService(groupId, dbcp);

                              return dbcp;
               }


STATEMENT OF CONFIDENTIALITY The information contained in this email message 
and any attachments may be confidential and legally privileged and is intended 
for the use of the addressee(s) only. If you are not an intended recipient, 
please: (1) notify me immediately by replying to this message; (2) do not use, 
disseminate, distribute or reproduce any part of the message or any attachment; 
and (3) destroy all copies of this message and any attachments.


STATEMENT OF CONFIDENTIALITY The information contained in this email message 
and any attachments may be confidential and legally privileged and is intended 
for the use of the addressee(s) only. If you are not an intended recipient, 
please: (1) notify me immediately by replying to this message; (2) do not use, 
disseminate, distribute or reproduce any part of the message or any attachment; 
and (3) destroy all copies of this message and any attachments.

Reply via email to