4747
4848import com .cloud .api .ApiServlet ;
4949import com .cloud .domain .Domain ;
50+ import com .cloud .exception .InternalErrorException ;
5051import com .cloud .exception .InvalidParameterValueException ;
52+ import com .cloud .exception .PermissionDeniedException ;
5153import com .cloud .user .Account ;
5254import com .cloud .user .AccountService ;
5355import com .cloud .user .DomainService ;
5456import com .cloud .utils .Pair ;
57+ import com .cloud .utils .component .ManagerBase ;
5558import com .cloud .utils .db .Filter ;
5659import com .cloud .utils .db .SearchBuilder ;
5760import com .cloud .utils .db .SearchCriteria ;
61+ import com .cloud .utils .db .Transaction ;
62+ import com .cloud .utils .db .TransactionCallbackWithException ;
5863import com .cloud .utils .exception .CloudRuntimeException ;
5964import com .cloud .utils .net .NetUtils ;
6065
61- public class LogsWebSessionApiServiceImpl implements LogsWebSessionApiService {
66+ public class LogsWebSessionApiServiceImpl extends ManagerBase implements LogsWebSessionApiService {
6267
6368 @ Inject
6469 LogsWebSessionManager logsWSManager ;
@@ -72,6 +77,9 @@ public class LogsWebSessionApiServiceImpl implements LogsWebSessionApiService {
7277 @ Override
7378 public ListResponse <LogsWebSessionResponse > listLogsWebSessions (ListLogsWebSessionsCmd cmd ) {
7479 final Long id = cmd .getId ();
80+ if (!accountService .isRootAdmin (CallContext .current ().getCallingAccountId ())) {
81+ throw new PermissionDeniedException ("Invalid request" );
82+ }
7583 List <LogsWebSessionResponse > responsesList = new ArrayList <>();
7684 SearchBuilder <LogsWebSessionVO > sb = logsWebSessionDao .createSearchBuilder ();
7785 sb .and ("id" , sb .entity ().getId (), SearchCriteria .Op .EQ );
@@ -82,24 +90,34 @@ public ListResponse<LogsWebSessionResponse> listLogsWebSessions(ListLogsWebSessi
8290
8391 Filter searchFilter = new Filter (LogsWebSessionVO .class , "id" , true , cmd .getStartIndex (),
8492 cmd .getPageSizeVal ());
85- Pair <List <LogsWebSessionVO >, Integer > webhooksAndCount = logsWebSessionDao .searchAndCount (sc , searchFilter );
86- for (LogsWebSessionVO webhook : webhooksAndCount .first ()) {
87- LogsWebSessionResponse response = createLogsWebSessionResponse (webhook );
88- responsesList .add (response );
93+ Pair <List <LogsWebSessionVO >, Integer > logsWebSessionsAndCount = logsWebSessionDao .searchAndCount (sc , searchFilter );
94+ for (LogsWebSessionVO session : logsWebSessionsAndCount .first ()) {
95+ try {
96+ LogsWebSessionResponse response = createLogsWebSessionResponse (session );
97+ responsesList .add (response );
98+ } catch (InternalErrorException exception ) {
99+ logger .error ("Failed to create response for {}" , session , exception );
100+ }
89101 }
90102 ListResponse <LogsWebSessionResponse > response = new ListResponse <>();
91- response .setResponses (responsesList , webhooksAndCount .second ());
103+ response .setResponses (responsesList , logsWebSessionsAndCount .second ());
92104 return response ;
93105 }
94106
95107 @ Override
96108 public LogsWebSessionResponse createLogsWebSession (CreateLogsWebSessionCmd cmd ) throws CloudRuntimeException {
109+ final Account caller = CallContext .current ().getCallingAccount ();
97110 final List <String > filters = cmd .getFilters ();
111+ final Map <String , String > params = cmd .getFullUrlParams ();
98112 final String extraSecurityToken = cmd .getExtraSecurityToken ();
99- String clientAddress = null ;
100- Map <String , String > params = cmd .getFullUrlParams ();
113+ String clientAddress ;
101114 if (MapUtils .isNotEmpty (params )) {
102115 clientAddress = params .get (ApiServlet .CLIENT_INET_ADDRESS_KEY );
116+ } else {
117+ clientAddress = null ;
118+ }
119+ if (!accountService .isRootAdmin (caller .getAccountId ())) {
120+ throw new PermissionDeniedException ("Invalid request" );
103121 }
104122 for (String filter : filters ) {
105123 if (StringUtils .isBlank (filter )) {
@@ -108,18 +126,26 @@ public LogsWebSessionResponse createLogsWebSession(CreateLogsWebSessionCmd cmd)
108126 }
109127 }
110128 if (!logsWSManager .canCreateNewLogsWebSession ()) {
111- throw new CloudRuntimeException ("Max Logs Web Session limit reached" );
129+ throw new CloudRuntimeException ("Failed to create logs web session as max session limit reached" );
130+ }
131+ try {
132+ return Transaction .execute ((TransactionCallbackWithException <LogsWebSessionResponse , InternalErrorException >) status -> {
133+ LogsWebSessionVO logsWebSessionVO = new LogsWebSessionVO (filters , caller .getDomainId (), caller .getAccountId (),
134+ clientAddress );
135+ logsWebSessionVO = logsWebSessionDao .persist (logsWebSessionVO );
136+ return createLogsWebSessionResponse (logsWebSessionVO );
137+ });
138+ } catch (InternalErrorException e ) {
139+ throw new CloudRuntimeException ("Failed to create logs web session as unable to prepare response" , e );
112140 }
113- final Account account = CallContext .current ().getCallingAccount ();
114- LogsWebSessionVO logsWebSessionVO = new LogsWebSessionVO (filters , account .getDomainId (), account .getAccountId (),
115- clientAddress );
116- logsWebSessionVO = logsWebSessionDao .persist (logsWebSessionVO );
117- return createLogsWebSessionResponse (logsWebSessionVO );
118141 }
119142
120143 @ Override
121144 public boolean deleteLogsWebSession (DeleteLogsWebSession cmd ) throws CloudRuntimeException {
122145 final long id = cmd .getId ();
146+ if (!accountService .isRootAdmin (CallContext .current ().getCallingAccountId ())) {
147+ throw new PermissionDeniedException ("Invalid request" );
148+ }
123149 return logsWebSessionDao .remove (id );
124150 }
125151
@@ -142,7 +168,7 @@ protected String getRealIp4Address() {
142168 }
143169
144170 protected Set <LogsWebSessionWebSocketResponse > getLogsWebSessionWebSocketResponses (
145- final LogsWebSessionVO logsWebSessionVO ) {
171+ final LogsWebSessionVO logsWebSessionVO ) throws InternalErrorException {
146172 Set <LogsWebSessionWebSocketResponse > responses = new HashSet <>();
147173 List <LogsWebSessionWebSocket > webSockets = logsWSManager .getLogsWebSessionWebSockets (logsWebSessionVO );
148174 for (LogsWebSessionWebSocket socket : webSockets ) {
@@ -164,7 +190,7 @@ protected Set<LogsWebSessionWebSocketResponse> getLogsWebSessionWebSocketRespons
164190 return responses ;
165191 }
166192
167- protected LogsWebSessionResponse createLogsWebSessionResponse (final LogsWebSessionVO logsWebSessionVO ) {
193+ protected LogsWebSessionResponse createLogsWebSessionResponse (final LogsWebSessionVO logsWebSessionVO ) throws InternalErrorException {
168194 LogsWebSessionResponse response = new LogsWebSessionResponse ();
169195 response .setObjectName ("logswebsession" );
170196 response .setId (logsWebSessionVO .getUuid ());
@@ -183,15 +209,6 @@ protected LogsWebSessionResponse createLogsWebSessionResponse(final LogsWebSessi
183209 return response ;
184210 }
185211
186- @ Override
187- public LogsWebSessionResponse createLogsWebSessionResponse (long logsEndpointId ) {
188- LogsWebSessionVO logsWebSessionVO = logsWebSessionDao .findById (logsEndpointId );
189- if (logsWebSessionVO == null ) {
190- return null ;
191- }
192- return createLogsWebSessionResponse (logsWebSessionVO );
193- }
194-
195212 @ Override
196213 public List <Class <?>> getCommands () {
197214 if (!LogsWebSessionManager .LogsWebServerEnabled .value ()) {
0 commit comments