Skip to content

Commit 1a52deb

Browse files
committed
Merge branch 'main' into endpoint-slices
2 parents 823aa15 + c20b8a0 commit 1a52deb

39 files changed

+369
-255
lines changed

compose/auth_certs/generate.sh

100644100755
File mode changed.

compose/cryostat.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,5 @@ volumes:
5353
external: true
5454
probes:
5555
external: true
56+
credentials:
57+
external: true

compose/reports.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ services:
3030
-Dcom.sun.management.jmxremote.ssl=false
3131
-Dcom.sun.management.jmxremote.local.only=false
3232
QUARKUS_HTTP_PORT: 10001
33+
CRYOSTAT_STORAGE_BASE_URI: http://s3:8333
3334
healthcheck:
3435
test: curl --fail http://localhost:10001/ || exit 1
3536
retries: 3

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
<build.arch>amd64</build.arch>
3434

3535
<io.cryostat.core.version>4.1.0-SNAPSHOT</io.cryostat.core.version>
36-
<org.openjdk.jmc.version>9.0.0</org.openjdk.jmc.version>
36+
<org.openjdk.jmc.version>9.1.0</org.openjdk.jmc.version>
3737

3838
<org.apache.commons.io.version>2.16.1</org.apache.commons.io.version>
3939
<org.apache.commons.collections.version>4.4</org.apache.commons.collections.version>
@@ -45,7 +45,7 @@
4545
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
4646
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
4747
<quarkus.platform.version>3.15.4</quarkus.platform.version>
48-
<quarkus-quinoa.version>2.5.3</quarkus-quinoa.version>
48+
<quarkus-quinoa.version>2.5.4</quarkus-quinoa.version>
4949
<org.hibernate.orm.hibernate.jfr.version>6.6.7.Final</org.hibernate.orm.hibernate.jfr.version><!-- TODO is there some way to grab the Hibernate version used by Quarkus to match this version? -->
5050
<org.codehaus.mojo.build.helper.plugin.version>3.6.0</org.codehaus.mojo.build.helper.plugin.version>
5151
<org.codehaus.mojo.exec.plugin.version>3.5.0</org.codehaus.mojo.exec.plugin.version>

schema/openapi.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,10 +319,6 @@ components:
319319
statusMessage:
320320
type: string
321321
type: object
322-
Instant:
323-
example: 2022-03-10T16:15:50Z
324-
format: date-time
325-
type: string
326322
JsonObject:
327323
items:
328324
properties:
@@ -397,8 +393,6 @@ components:
397393
type: object
398394
Metadata:
399395
properties:
400-
expiry:
401-
$ref: '#/components/schemas/Instant'
402396
labels:
403397
additionalProperties:
404398
type: string

schema/schema.graphql

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,6 @@ type MemoryUtilization {
122122
}
123123

124124
type Metadata {
125-
"ISO-8601"
126-
expiry: DateTime
127125
labels(
128126
"Get entry/entries for a certain key/s"
129127
key: [String]

smoketest.bash

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,15 @@ createProbeTemplateVolume() {
354354
}
355355
createProbeTemplateVolume
356356

357+
createCredentialVolume() {
358+
"${container_engine}" volume create credentials
359+
"${container_engine}" container create --name credentials_helper -v credentials:/credentials registry.access.redhat.com/ubi9/ubi-micro
360+
if [ -d "${DIR}/credentials" ]; then
361+
"${container_engine}" cp "${DIR}/credentials" credentials_helper:/credentials
362+
fi
363+
}
364+
createCredentialVolume
365+
357366
setupUserHosts() {
358367
# This requires https://github.com/figiel/hosts to work. See README.
359368
truncate -s 0 "${HOSTSFILE}"

src/main/java/io/cryostat/ConfigProperties.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ public class ConfigProperties {
2121
"storage.buckets.event-templates.name";
2222
public static final String AWS_BUCKET_NAME_PROBE_TEMPLATES =
2323
"storage.buckets.probe-templates.name";
24-
public static final String AWS_OBJECT_EXPIRATION_LABELS =
25-
"storage.buckets.archives.expiration-label";
2624

2725
public static final String CONTAINERS_POLL_PERIOD = "cryostat.discovery.containers.poll-period";
2826
public static final String CONTAINERS_REQUEST_TIMEOUT =
@@ -35,6 +33,8 @@ public class ConfigProperties {
3533
public static final String CONNECTIONS_UPLOAD_TIMEOUT = "cryostat.connections.upload-timeout";
3634

3735
public static final String REPORTS_SIDECAR_URL = "quarkus.rest-client.reports.url";
36+
public static final String REPORTS_USE_PRESIGNED_TRANSFER =
37+
"cryostat.services.reports.use-presigned-transfer";
3838
public static final String REPORTS_MEMORY_CACHE_ENABLED =
3939
"cryostat.services.reports.memory-cache.enabled";
4040
public static final String REPORTS_STORAGE_CACHE_ENABLED =
@@ -51,15 +51,13 @@ public class ConfigProperties {
5151
public static final String STORAGE_EXT_URL = "storage-ext.url";
5252
public static final String STORAGE_PRESIGNED_DOWNLOADS_ENABLED =
5353
"storage.presigned-downloads.enabled";
54-
public static final String STORAGE_TRANSIENT_ARCHIVES_ENABLED =
55-
"storage.transient-archives.enabled";
56-
public static final String STORAGE_TRANSIENT_ARCHIVES_TTL = "storage.transient-archives.ttl";
5754

5855
public static final String CUSTOM_TEMPLATES_DIR = "templates-dir";
5956
public static final String PRESET_TEMPLATES_DIR = "preset-templates-dir";
6057
public static final String PROBE_TEMPLATES_DIR = "probe-templates-dir";
6158
public static final String SSL_TRUSTSTORE_DIR = "ssl.truststore.dir";
6259
public static final String RULES_DIR = "rules-dir";
60+
public static final String CREDENTIALS_DIR = "credentials-dir";
6361

6462
public static final String URI_RANGE = "cryostat.target.uri-range";
6563

src/main/java/io/cryostat/MessageCodecs.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import io.quarkus.runtime.StartupEvent;
2121
import io.quarkus.vertx.LocalEventBusCodec;
22-
import io.vertx.core.eventbus.EventBus;
22+
import io.vertx.mutiny.core.eventbus.EventBus;
2323
import jakarta.enterprise.event.Observes;
2424
import jakarta.inject.Inject;
2525

@@ -28,6 +28,7 @@ public class MessageCodecs {
2828
@Inject EventBus bus;
2929

3030
void onStart(@Observes StartupEvent evt) {
31-
bus.registerDefaultCodec(LinkedRecordingDescriptor.class, new LocalEventBusCodec<>());
31+
bus.getDelegate()
32+
.registerDefaultCodec(LinkedRecordingDescriptor.class, new LocalEventBusCodec<>());
3233
}
3334
}

src/main/java/io/cryostat/credentials/Credentials.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,30 @@
1515
*/
1616
package io.cryostat.credentials;
1717

18+
import java.io.BufferedInputStream;
19+
import java.io.IOException;
1820
import java.net.URISyntaxException;
21+
import java.nio.file.Files;
1922
import java.util.ArrayList;
2023
import java.util.Collection;
24+
import java.util.HashMap;
2125
import java.util.List;
26+
import java.util.Map;
2227
import java.util.Objects;
2328
import java.util.Optional;
2429

30+
import io.cryostat.ConfigProperties;
2531
import io.cryostat.expressions.MatchExpression;
2632
import io.cryostat.expressions.MatchExpression.TargetMatcher;
2733
import io.cryostat.targets.Target;
2834
import io.cryostat.targets.TargetConnectionManager;
2935

36+
import com.fasterxml.jackson.databind.ObjectMapper;
37+
import io.quarkus.runtime.StartupEvent;
3038
import io.smallrye.common.annotation.Blocking;
3139
import io.smallrye.mutiny.Uni;
3240
import jakarta.annotation.security.RolesAllowed;
41+
import jakarta.enterprise.event.Observes;
3342
import jakarta.inject.Inject;
3443
import jakarta.transaction.Transactional;
3544
import jakarta.ws.rs.DELETE;
@@ -39,6 +48,7 @@
3948
import jakarta.ws.rs.Path;
4049
import jakarta.ws.rs.core.Context;
4150
import jakarta.ws.rs.core.UriInfo;
51+
import org.eclipse.microprofile.config.inject.ConfigProperty;
4252
import org.jboss.logging.Logger;
4353
import org.jboss.resteasy.reactive.RestForm;
4454
import org.jboss.resteasy.reactive.RestPath;
@@ -49,9 +59,59 @@
4959
@Path("/api/v4/credentials")
5060
public class Credentials {
5161

62+
@ConfigProperty(name = ConfigProperties.CREDENTIALS_DIR)
63+
java.nio.file.Path dir;
64+
5265
@Inject TargetConnectionManager connectionManager;
5366
@Inject TargetMatcher targetMatcher;
5467
@Inject Logger logger;
68+
@Inject ObjectMapper mapper;
69+
70+
@Transactional
71+
void onStart(@Observes StartupEvent evt) {
72+
if (!checkDir()) {
73+
return;
74+
}
75+
try {
76+
Files.walk(dir)
77+
.filter(Files::isRegularFile)
78+
.filter(Files::isReadable)
79+
.forEach(this::createFromFile);
80+
} catch (IOException e) {
81+
logger.error(e);
82+
}
83+
}
84+
85+
private boolean checkDir() {
86+
return Files.exists(dir)
87+
&& Files.isReadable(dir)
88+
&& Files.isExecutable(dir)
89+
&& Files.isDirectory(dir);
90+
}
91+
92+
private void createFromFile(java.nio.file.Path path) {
93+
try (var is = new BufferedInputStream(Files.newInputStream(path))) {
94+
var credential = mapper.readValue(is, Credential.class);
95+
Map<String, Object> params = new HashMap<String, Object>();
96+
params.put("username", credential.username);
97+
params.put("password", credential.password);
98+
params.put("matchExpression", credential.matchExpression);
99+
var exists =
100+
Credential.find(
101+
"username = :username"
102+
+ " and password = :password"
103+
+ " and matchExpression = :matchExpression",
104+
params)
105+
.count()
106+
!= 0;
107+
if (exists) {
108+
return;
109+
}
110+
credential.persist();
111+
} catch (Exception e) {
112+
logger.error("Failed to create credentials from file", e);
113+
}
114+
}
55115

56116
@POST
57117
@Blocking

src/main/java/io/cryostat/discovery/DiscoveryNode.java

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import java.util.Map;
2222
import java.util.Objects;
2323
import java.util.Optional;
24+
import java.util.function.Consumer;
2425
import java.util.function.Predicate;
2526

27+
import io.cryostat.discovery.NodeType.BaseNodeType;
2628
import io.cryostat.targets.Target;
2729

2830
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -41,6 +43,7 @@
4143
import jakarta.persistence.Entity;
4244
import jakarta.persistence.EntityListeners;
4345
import jakarta.persistence.FetchType;
46+
import jakarta.persistence.Index;
4447
import jakarta.persistence.JoinColumn;
4548
import jakarta.persistence.ManyToOne;
4649
import jakarta.persistence.NamedQueries;
@@ -51,6 +54,7 @@
5154
import jakarta.persistence.PostRemove;
5255
import jakarta.persistence.PostUpdate;
5356
import jakarta.persistence.PrePersist;
57+
import jakarta.persistence.Table;
5458
import jakarta.validation.constraints.NotBlank;
5559
import jakarta.validation.constraints.NotNull;
5660
import org.hibernate.annotations.JdbcTypeCode;
@@ -64,6 +68,7 @@
6468
name = "DiscoveryNode.byTypeWithName",
6569
query = "from DiscoveryNode where nodeType = :nodeType and name = :name")
6670
})
71+
@Table(indexes = {@Index(columnList = "nodeType"), @Index(columnList = "nodeType, name")})
6772
public class DiscoveryNode extends PanacheEntity {
6873

6974
public static final String NODE_TYPE = "nodeType";
@@ -119,24 +124,22 @@ public static DiscoveryNode getUniverse() {
119124
}
120125

121126
public static Optional<DiscoveryNode> getRealm(String name) {
122-
return getUniverse().children.stream().filter(n -> name.equals(n.name)).findFirst();
127+
return DiscoveryNode.<DiscoveryNode>find(
128+
"#DiscoveryNode.byTypeWithName",
129+
Parameters.with("nodeType", BaseNodeType.REALM.getKind()).and("name", name))
130+
.firstResultOptional();
123131
}
124132

125133
public static Optional<DiscoveryNode> getChild(
126134
DiscoveryNode node, Predicate<DiscoveryNode> predicate) {
127135
return node.children.stream().filter(predicate).findFirst();
128136
}
129137

130-
public static Optional<DiscoveryNode> getNode(Predicate<DiscoveryNode> predicate) {
131-
List<DiscoveryNode> nodes = listAll();
132-
return nodes.stream().filter(predicate).findFirst();
133-
}
134-
135-
public static List<DiscoveryNode> findAllByNodeType(NodeType nodeType) {
136-
return DiscoveryNode.find(DiscoveryNode.NODE_TYPE, nodeType.getKind()).list();
137-
}
138-
139-
public static DiscoveryNode environment(String name, NodeType nodeType) {
138+
static DiscoveryNode byTypeWithName(
139+
NodeType nodeType,
140+
String name,
141+
Predicate<DiscoveryNode> predicate,
142+
Consumer<DiscoveryNode> customizer) {
140143
var kind = nodeType.getKind();
141144
return DiscoveryNode.<DiscoveryNode>find(
142145
"#DiscoveryNode.byTypeWithName",
@@ -153,32 +156,29 @@ public static DiscoveryNode environment(String name, NodeType nodeType) {
153156
node.labels = new HashMap<>();
154157
node.children = new ArrayList<>();
155158
node.target = null;
159+
customizer.accept(node);
156160
node.persist();
157161
return node;
158162
}));
159163
}
160164

165+
public static List<DiscoveryNode> findAllByNodeType(NodeType nodeType) {
166+
return DiscoveryNode.find(DiscoveryNode.NODE_TYPE, nodeType.getKind()).list();
167+
}
168+
169+
public static DiscoveryNode environment(String name, NodeType nodeType) {
170+
return byTypeWithName(nodeType, name, n -> true, n -> {});
171+
}
172+
161173
public static DiscoveryNode target(Target target, NodeType nodeType) {
162-
var kind = nodeType.getKind();
163-
var connectUrl = target.connectUrl.toString();
164-
return DiscoveryNode.<DiscoveryNode>find(
165-
"#DiscoveryNode.byTypeWithName",
166-
Parameters.with("nodeType", kind).and("name", connectUrl))
167-
.firstResultOptional()
168-
.orElseGet(
169-
() ->
170-
QuarkusTransaction.joiningExisting()
171-
.call(
172-
() -> {
173-
DiscoveryNode node = new DiscoveryNode();
174-
node.name = connectUrl;
175-
node.nodeType = kind;
176-
node.labels = new HashMap<>(target.labels);
177-
node.children = null;
178-
node.target = target;
179-
node.persist();
180-
return node;
181-
}));
174+
return byTypeWithName(
175+
nodeType,
176+
target.connectUrl.toString(),
177+
n -> true,
178+
n -> {
179+
n.target = target;
180+
n.labels.putAll(target.labels);
181+
});
182182
}
183183

184184
@Override

src/main/java/io/cryostat/discovery/JDPDiscovery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import io.quarkus.runtime.StartupEvent;
3636
import io.quarkus.vertx.ConsumeEvent;
3737
import io.vertx.core.Vertx;
38-
import io.vertx.core.eventbus.EventBus;
38+
import io.vertx.mutiny.core.eventbus.EventBus;
3939
import jakarta.enterprise.context.ApplicationScoped;
4040
import jakarta.enterprise.event.Observes;
4141
import jakarta.enterprise.inject.Produces;

src/main/java/io/cryostat/discovery/KubeEndpointSlicesDiscovery.java

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -511,29 +511,19 @@ private Pair<HasMetadata, DiscoveryNode> queryForNode(
511511
nodeType.getQueryFunction().apply(client).apply(namespace).apply(name);
512512

513513
DiscoveryNode node =
514-
DiscoveryNode.getNode(
515-
n -> {
516-
return nodeType.getKind().equals(n.nodeType)
517-
&& name.equals(n.name)
518-
&& namespace.equals(
519-
n.labels.get(DISCOVERY_NAMESPACE_LABEL_KEY));
520-
})
521-
.orElseGet(
522-
() -> {
523-
DiscoveryNode newNode = new DiscoveryNode();
524-
newNode.name = name;
525-
newNode.nodeType = nodeType.getKind();
526-
newNode.children = new ArrayList<>();
527-
newNode.target = null;
528-
Map<String, String> labels =
529-
kubeObj != null
530-
? kubeObj.getMetadata().getLabels()
531-
: new HashMap<>();
532-
// Add namespace to label to retrieve node later
533-
labels.put(DISCOVERY_NAMESPACE_LABEL_KEY, namespace);
534-
newNode.labels = labels;
535-
return newNode;
536-
});
514+
DiscoveryNode.byTypeWithName(
515+
nodeType,
516+
name,
517+
n -> namespace.equals(n.labels.get(DISCOVERY_NAMESPACE_LABEL_KEY)),
518+
n -> {
519+
Map<String, String> labels =
520+
kubeObj != null
521+
? kubeObj.getMetadata().getLabels()
522+
: new HashMap<>();
523+
// Add namespace to label to retrieve node later
524+
labels.put(DISCOVERY_NAMESPACE_LABEL_KEY, namespace);
525+
n.labels.putAll(labels);
526+
});
537527
return Pair.of(kubeObj, node);
538528
}
539529

0 commit comments

Comments
 (0)