Skip to content

Commit ea2c529

Browse files
committed
add system label utils
1 parent b8943d0 commit ea2c529

File tree

2 files changed

+92
-44
lines changed

2 files changed

+92
-44
lines changed

labels-config-service-impl/src/main/java/org/hypertrace/label/config/service/LabelsConfigServiceImpl.java

Lines changed: 11 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77
import com.github.rholder.retry.RetryerBuilder;
88
import com.google.common.collect.ImmutableMap;
9-
import com.google.protobuf.util.JsonFormat;
109
import com.typesafe.config.Config;
11-
import com.typesafe.config.ConfigObject;
1210
import io.grpc.Channel;
1311
import io.grpc.Status;
1412
import io.grpc.StatusRuntimeException;
@@ -23,7 +21,6 @@
2321
import java.util.concurrent.TimeUnit;
2422
import java.util.function.Function;
2523
import java.util.stream.Collectors;
26-
import lombok.SneakyThrows;
2724
import lombok.extern.slf4j.Slf4j;
2825
import org.hypertrace.config.objectstore.ContextualConfigObject;
2926
import org.hypertrace.config.service.change.event.api.ConfigChangeEventGenerator;
@@ -51,9 +48,7 @@ public class LabelsConfigServiceImpl extends LabelsConfigServiceGrpc.LabelsConfi
5148
private static final String LABELS_CONFIG_SERVICE_CONFIG = "labels.config.service";
5249
private static final String SYSTEM_LABELS = "system.labels";
5350
private final LabelStore labelStore;
54-
private final List<Label> systemLabels;
55-
private final Map<String, Label> systemLabelsIdLabelMap;
56-
private final Map<String, Label> systemLabelsKeyLabelMap;
51+
private final SystemLabelInfoUtils systemLabelInfoUtils;
5752

5853
public LabelsConfigServiceImpl(
5954
Channel configChannel, Config config, ConfigChangeEventGenerator configChangeEventGenerator) {
@@ -64,39 +59,7 @@ public LabelsConfigServiceImpl(
6459
RequestContextClientCallCredsProviderFactory.getClientCallCredsProvider()
6560
.get()),
6661
configChangeEventGenerator);
67-
List<? extends ConfigObject> systemLabelsObjectList = null;
68-
if (config.hasPath(LABELS_CONFIG_SERVICE_CONFIG)) {
69-
Config labelConfig = config.getConfig(LABELS_CONFIG_SERVICE_CONFIG);
70-
if (labelConfig.hasPath(SYSTEM_LABELS)) {
71-
systemLabelsObjectList = labelConfig.getObjectList(SYSTEM_LABELS);
72-
}
73-
}
74-
if (systemLabelsObjectList != null) {
75-
systemLabels = buildSystemLabelList(systemLabelsObjectList);
76-
systemLabelsIdLabelMap =
77-
systemLabels.stream().collect(Collectors.toUnmodifiableMap(Label::getId, identity()));
78-
systemLabelsKeyLabelMap =
79-
systemLabels.stream()
80-
.collect(Collectors.toUnmodifiableMap(label -> label.getData().getKey(), identity()));
81-
} else {
82-
systemLabels = Collections.emptyList();
83-
systemLabelsIdLabelMap = Collections.emptyMap();
84-
systemLabelsKeyLabelMap = Collections.emptyMap();
85-
}
86-
}
87-
88-
private List<Label> buildSystemLabelList(List<? extends ConfigObject> configObjectList) {
89-
return configObjectList.stream()
90-
.map(LabelsConfigServiceImpl::buildLabelFromConfig)
91-
.collect(Collectors.toUnmodifiableList());
92-
}
93-
94-
@SneakyThrows
95-
private static Label buildLabelFromConfig(ConfigObject configObject) {
96-
String jsonString = configObject.render();
97-
Label.Builder builder = Label.newBuilder();
98-
JsonFormat.parser().merge(jsonString, builder);
99-
return builder.build();
62+
systemLabelInfoUtils = new SystemLabelInfoUtils(config, labelStore);
10063
}
10164

10265
@Override
@@ -200,7 +163,8 @@ public void getLabel(GetLabelRequest request, StreamObserver<GetLabelResponse> r
200163
.getData(requestContext, labelId)
201164
.orElseGet(
202165
() ->
203-
Optional.ofNullable(systemLabelsIdLabelMap.get(labelId))
166+
Optional.ofNullable(
167+
systemLabelInfoUtils.getSystemLabelsIdLabelMap().get(labelId))
204168
.orElseThrow(Status.NOT_FOUND::asRuntimeException));
205169
responseObserver.onNext(GetLabelResponse.newBuilder().setLabel(label).build());
206170
responseObserver.onCompleted();
@@ -221,7 +185,7 @@ public void getLabels(
221185
tenantLabels.stream()
222186
.collect(Collectors.toUnmodifiableMap(Label::getId, Function.identity()));
223187
List<Label> allLabels = new ArrayList<>(tenantLabels);
224-
systemLabels.stream()
188+
systemLabelInfoUtils.getSystemLabels().stream()
225189
.filter(label -> !tenantLabelsMap.containsKey(label.getId()))
226190
.forEach(allLabels::add);
227191
responseObserver.onNext(GetLabelsResponse.newBuilder().addAllLabels(allLabels).build());
@@ -244,10 +208,12 @@ public void updateLabel(
244208
.getData(requestContext, request.getId())
245209
.orElseGet(
246210
() ->
247-
Optional.ofNullable(systemLabelsIdLabelMap.get(request.getId()))
211+
Optional.ofNullable(
212+
systemLabelInfoUtils.getSystemLabelsIdLabelMap().get(request.getId()))
248213
.orElseThrow(Status.NOT_FOUND::asRuntimeException));
249214
Label updateLabel = oldLabel.toBuilder().setData(updateLabelData).build();
250215
Label updateLabelInRes = labelStore.upsertObject(requestContext, updateLabel).getData();
216+
systemLabelInfoUtils.updateSystemLabelInfo(updateLabelInRes);
251217
responseObserver.onNext(UpdateLabelResponse.newBuilder().setLabel(updateLabelInRes).build());
252218
responseObserver.onCompleted();
253219
} catch (Exception e) {
@@ -261,7 +227,7 @@ public void deleteLabel(
261227
try {
262228
RequestContext requestContext = RequestContext.CURRENT.get();
263229
String labelId = request.getId();
264-
if (systemLabelsIdLabelMap.containsKey(labelId)) {
230+
if (systemLabelInfoUtils.getSystemLabelsIdLabelMap().containsKey(labelId)) {
265231
// Deleting a system label
266232
responseObserver.onError(new StatusRuntimeException(Status.INVALID_ARGUMENT));
267233
return;
@@ -287,7 +253,8 @@ private boolean isDuplicateKey(RequestContext requestContext, String key) {
287253
}
288254

289255
private Map<String, Label> getLabelsMap(RequestContext requestContext) {
290-
Map<String, Label> existingLabelsMap = new HashMap<>(systemLabelsKeyLabelMap);
256+
Map<String, Label> existingLabelsMap =
257+
new HashMap<>(systemLabelInfoUtils.getSystemLabelsKeyLabelMap());
291258
labelStore.getAllObjects(requestContext).stream()
292259
.map(ContextualConfigObject::getData)
293260
.forEach(label -> existingLabelsMap.put(label.getData().getKey(), label));
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.hypertrace.label.config.service;
2+
3+
import static java.util.function.Function.identity;
4+
5+
import com.google.protobuf.util.JsonFormat;
6+
import com.typesafe.config.Config;
7+
import com.typesafe.config.ConfigObject;
8+
import java.util.Collections;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Objects;
12+
import java.util.stream.Collectors;
13+
import lombok.Getter;
14+
import lombok.SneakyThrows;
15+
import org.hypertrace.config.objectstore.ContextualConfigObject;
16+
import org.hypertrace.core.grpcutils.context.RequestContext;
17+
import org.hypertrace.label.config.service.v1.Label;
18+
19+
public class SystemLabelInfoUtils {
20+
21+
private static final String LABELS_CONFIG_SERVICE_CONFIG = "labels.config.service";
22+
private static final String SYSTEM_LABELS = "system.labels";
23+
24+
private final LabelStore labelStore;
25+
26+
@Getter private List<Label> systemLabels;
27+
@Getter private Map<String, Label> systemLabelsIdLabelMap;
28+
@Getter private Map<String, Label> systemLabelsKeyLabelMap;
29+
30+
public SystemLabelInfoUtils(Config config, LabelStore labelStore) {
31+
this.labelStore = labelStore;
32+
List<? extends ConfigObject> systemLabelsObjectList = null;
33+
if (config.hasPath(LABELS_CONFIG_SERVICE_CONFIG)) {
34+
Config labelConfig = config.getConfig(LABELS_CONFIG_SERVICE_CONFIG);
35+
if (labelConfig.hasPath(SYSTEM_LABELS)) {
36+
systemLabelsObjectList = labelConfig.getObjectList(SYSTEM_LABELS);
37+
}
38+
}
39+
if (Objects.nonNull(systemLabelsObjectList)) {
40+
systemLabels = buildSystemLabelList(systemLabelsObjectList);
41+
systemLabelsIdLabelMap =
42+
systemLabels.stream().collect(Collectors.toUnmodifiableMap(Label::getId, identity()));
43+
systemLabelsKeyLabelMap =
44+
systemLabels.stream()
45+
.collect(Collectors.toUnmodifiableMap(label -> label.getData().getKey(), identity()));
46+
} else {
47+
systemLabels = Collections.emptyList();
48+
systemLabelsIdLabelMap = Collections.emptyMap();
49+
systemLabelsKeyLabelMap = Collections.emptyMap();
50+
}
51+
}
52+
53+
public void updateSystemLabelInfo(Label label) {
54+
if (systemLabelsIdLabelMap.containsKey(label.getId())) {
55+
systemLabelsIdLabelMap.put(label.getId(), label);
56+
systemLabelsKeyLabelMap.put(label.getData().getKey(), label);
57+
systemLabels =
58+
systemLabelsIdLabelMap.values().stream().collect(Collectors.toUnmodifiableList());
59+
}
60+
}
61+
62+
private List<Label> buildSystemLabelList(List<? extends ConfigObject> configObjectList) {
63+
Map<String, Label> labelIdMap =
64+
configObjectList.stream()
65+
.map(SystemLabelInfoUtils::buildLabelFromConfig)
66+
.collect(Collectors.toMap(Label::getId, identity()));
67+
labelStore.getAllObjects(RequestContext.CURRENT.get()).stream()
68+
.map(ContextualConfigObject::getData)
69+
.filter(label -> labelIdMap.containsKey(label.getId()))
70+
.forEach(label -> labelIdMap.put(label.getId(), label));
71+
return labelIdMap.values().stream().collect(Collectors.toUnmodifiableList());
72+
}
73+
74+
@SneakyThrows
75+
private static Label buildLabelFromConfig(ConfigObject configObject) {
76+
String jsonString = configObject.render();
77+
Label.Builder builder = Label.newBuilder();
78+
JsonFormat.parser().merge(jsonString, builder);
79+
return builder.build();
80+
}
81+
}

0 commit comments

Comments
 (0)