Skip to content

Commit 293dabb

Browse files
authored
fix(jmc-agent): fix template validation error handling and notification content (#1563)
* chore(agent): update agent template utilities Signed-off-by: Thuan Vo <[email protected]> * deps(core): bump core version --------- Signed-off-by: Thuan Vo <[email protected]>
1 parent ccaad68 commit 293dabb

File tree

5 files changed

+50
-17
lines changed

5 files changed

+50
-17
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
<com.google.dagger.version>2.45</com.google.dagger.version>
8484
<com.google.dagger.compiler.version>2.45</com.google.dagger.compiler.version>
8585

86-
<io.cryostat.core.version>2.21.0</io.cryostat.core.version>
86+
<io.cryostat.core.version>2.21.1</io.cryostat.core.version>
8787

8888
<org.openjdk.nashorn.core.version>15.4</org.openjdk.nashorn.core.version>
8989
<org.apache.commons.lang3.version>3.12.0</org.apache.commons.lang3.version>

src/main/java/io/cryostat/net/web/http/api/v2/ProbeTemplateUploadHandler.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
package io.cryostat.net.web.http.api.v2;
3939

4040
import java.io.InputStream;
41+
import java.nio.file.FileAlreadyExistsException;
4142
import java.nio.file.Path;
4243
import java.util.EnumSet;
4344
import java.util.List;
@@ -48,6 +49,7 @@
4849

4950
import io.cryostat.configuration.CredentialsManager;
5051
import io.cryostat.core.agent.LocalProbeTemplateService;
52+
import io.cryostat.core.agent.ProbeTemplate;
5153
import io.cryostat.core.agent.ProbeValidationException;
5254
import io.cryostat.core.log.Logger;
5355
import io.cryostat.core.sys.FileSystem;
@@ -128,25 +130,22 @@ public IntermediateResponse<Void> handle(RequestParameters requestParams) throws
128130
for (FileUpload u : requestParams.getFileUploads()) {
129131
String templateName = requestParams.getPathParams().get("probetemplateName");
130132
Path path = fs.pathOf(u.uploadedFileName());
131-
if (!"probeTemplate".equals(u.name())) {
133+
if (!u.name().equals("probeTemplate")) {
132134
fs.deleteIfExists(path);
133135
continue;
134136
}
135137
try (InputStream is = fs.newInputStream(path)) {
136-
probeTemplateService.addTemplate(is, templateName);
137-
String template = probeTemplateService.getTemplate(templateName);
138+
ProbeTemplate template = probeTemplateService.addTemplate(is, templateName);
138139
notificationFactory
139140
.createBuilder()
140141
.metaCategory(NOTIFICATION_CATEGORY)
141142
.metaType(HttpMimeType.JSON)
142143
.message(
143144
Map.of(
144145
"probeTemplate",
145-
u.uploadedFileName(),
146-
"templateName",
147146
templateName,
148147
"templateContent",
149-
template))
148+
template.serialize()))
150149
.build()
151150
.send();
152151
} finally {
@@ -156,6 +155,9 @@ public IntermediateResponse<Void> handle(RequestParameters requestParams) throws
156155
} catch (ProbeValidationException pve) {
157156
logger.error(pve.getMessage());
158157
throw new ApiException(400, pve.getMessage(), pve);
158+
} catch (FileAlreadyExistsException faee) {
159+
logger.error(faee.getMessage());
160+
throw new ApiException(400, faee.getMessage(), faee);
159161
} catch (Exception e) {
160162
logger.error(e.getMessage());
161163
throw new ApiException(500, e.getMessage(), e);

src/main/java/io/cryostat/net/web/http/api/v2/TargetProbePostHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public IntermediateResponse<Void> handle(RequestParameters requestParams) throws
166166
getConnectionDescriptorFromParams(requestParams),
167167
connection -> {
168168
AgentJMXHelper helper = new AgentJMXHelper(connection.getHandle());
169-
String templateContent = probeTemplateService.getTemplate(probeTemplate);
169+
String templateContent = probeTemplateService.getTemplateContent(probeTemplate);
170170
helper.defineEventProbes(templateContent);
171171
ProbeTemplate template = new ProbeTemplate();
172172
template.deserialize(

src/test/java/io/cryostat/net/web/http/api/v2/ProbeTemplateUploadHandlerTest.java

+39-8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
import java.io.IOException;
4343
import java.io.InputStream;
44+
import java.nio.file.FileAlreadyExistsException;
4445
import java.nio.file.Path;
4546
import java.util.List;
4647
import java.util.Map;
@@ -49,6 +50,7 @@
4950
import io.cryostat.MainModule;
5051
import io.cryostat.configuration.CredentialsManager;
5152
import io.cryostat.core.agent.LocalProbeTemplateService;
53+
import io.cryostat.core.agent.ProbeTemplate;
5254
import io.cryostat.core.agent.ProbeValidationException;
5355
import io.cryostat.core.log.Logger;
5456
import io.cryostat.core.sys.FileSystem;
@@ -202,7 +204,7 @@ void shouldRespond400IfXmlInvalid() throws Exception {
202204
}
203205

204206
@Test
205-
void shouldProcessGoodRequest() throws Exception {
207+
void shouldRespond400IfFileExists() throws Exception {
206208
FileUpload upload = Mockito.mock(FileUpload.class);
207209
Mockito.when(upload.name()).thenReturn("probeTemplate");
208210
Mockito.when(upload.uploadedFileName()).thenReturn("/file-uploads/abcd-1234");
@@ -214,23 +216,52 @@ void shouldProcessGoodRequest() throws Exception {
214216
Path uploadPath = Mockito.mock(Path.class);
215217
Mockito.when(fs.pathOf("/file-uploads/abcd-1234")).thenReturn(uploadPath);
216218

219+
InputStream stream = Mockito.mock(InputStream.class);
220+
Mockito.when(fs.newInputStream(Mockito.any())).thenReturn(stream);
221+
222+
Mockito.doThrow(FileAlreadyExistsException.class)
223+
.when(templateService)
224+
.addTemplate(stream, "foo.xml");
225+
226+
ApiException ex =
227+
Assertions.assertThrows(
228+
ApiException.class, () -> handler.handle(requestParams));
229+
MatcherAssert.assertThat(ex.getStatusCode(), Matchers.equalTo(400));
230+
Mockito.verify(fs).deleteIfExists(uploadPath);
231+
}
232+
233+
@Test
234+
void shouldProcessGoodRequest() throws Exception {
235+
String templateName = "foo.xml";
236+
FileUpload upload = Mockito.mock(FileUpload.class);
237+
Mockito.when(upload.name()).thenReturn("probeTemplate");
238+
Mockito.when(upload.uploadedFileName()).thenReturn("/file-uploads/abcd-1234");
239+
240+
Mockito.when(requestParams.getFileUploads()).thenReturn(Set.of(upload));
241+
Mockito.when(requestParams.getPathParams())
242+
.thenReturn(Map.of("probetemplateName", templateName));
243+
244+
Path uploadPath = Mockito.mock(Path.class);
245+
Mockito.when(fs.pathOf("/file-uploads/abcd-1234")).thenReturn(uploadPath);
246+
217247
InputStream stream = Mockito.mock(InputStream.class);
218248
Mockito.when(fs.newInputStream(uploadPath)).thenReturn(stream);
219-
Mockito.when(templateService.getTemplate(Mockito.anyString()))
220-
.thenReturn("someContent");
249+
250+
ProbeTemplate template = Mockito.mock(ProbeTemplate.class);
251+
String templateContent = "someContent";
252+
Mockito.when(templateService.addTemplate(stream, templateName)).thenReturn(template);
253+
Mockito.when(template.serialize()).thenReturn(templateContent);
221254

222255
IntermediateResponse<Void> response = handler.handle(requestParams);
223256

224-
Mockito.verify(templateService).addTemplate(stream, "foo.xml");
257+
Mockito.verify(templateService).addTemplate(stream, templateName);
225258
Mockito.verify(notificationBuilder)
226259
.message(
227260
Map.of(
228261
"probeTemplate",
229-
"/file-uploads/abcd-1234",
230-
"templateName",
231-
"foo.xml",
262+
templateName,
232263
"templateContent",
233-
"someContent"));
264+
templateContent));
234265
Mockito.verifyNoMoreInteractions(templateService);
235266
Mockito.verify(fs).deleteIfExists(uploadPath);
236267

src/test/java/io/cryostat/net/web/http/api/v2/TargetProbePostHandlerTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public void shouldRespondOK() throws Exception {
190190
+ " <name>handleAuthenticated</name>"
191191
+ " <descriptor>(Lio/vertx/ext/web/RoutingContext;)V</descriptor> </method>"
192192
+ " </event> </events> </jfragent>";
193-
Mockito.when(templateService.getTemplate(Mockito.anyString()))
193+
Mockito.when(templateService.getTemplateContent(Mockito.anyString()))
194194
.thenReturn(templateContent);
195195
Mockito.when(connection.getHandle()).thenReturn(handle);
196196
Mockito.when(handle.getServiceOrDummy(MBeanServerConnection.class)).thenReturn(mbsc);

0 commit comments

Comments
 (0)