Skip to content
This repository was archived by the owner on Jun 7, 2024. It is now read-only.

Commit 5a36c91

Browse files
authored
Merge pull request #1062 from zalando/ARUHA-2344
ARUHA-2344 Do not check authorization while creating system ET
2 parents 162ecd1 + 6d072fe commit 5a36c91

File tree

10 files changed

+148
-133
lines changed

10 files changed

+148
-133
lines changed

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: '3.7'
1+
version: '3'
22
services:
33

44
nakadi:
@@ -58,4 +58,4 @@ services:
5858
KAFKA_DELETE_TOPIC_ENABLE: 'true'
5959
KAFKA_BROKER_ID: 0
6060
volumes:
61-
- /var/run/docker.sock:/var/run/docker.sock
61+
- /var/run/docker.sock:/var/run/docker.sock

src/main/java/org/zalando/nakadi/controller/EventTypeController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public ResponseEntity<?> create(@Valid @RequestBody final EventTypeBase eventTyp
8888
throw new ValidationException(errors);
8989
}
9090

91-
eventTypeService.create(eventType);
91+
eventTypeService.create(eventType, true);
9292

9393
return ResponseEntity.status(HttpStatus.CREATED).headers(generateWarningHeaders(eventType)).build();
9494
}

src/main/java/org/zalando/nakadi/controller/VersionController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.web.bind.annotation.RestController;
1010

1111
import java.io.FileInputStream;
12+
import java.io.FileNotFoundException;
1213
import java.io.IOException;
1314
import java.io.InputStream;
1415

@@ -90,6 +91,8 @@ public VersionInfo getVersion() {
9091
private static ScmSource loadScmSource(final ObjectMapper objectMapper) {
9192
try (InputStream in = new FileInputStream(SCM_SOURCE_FILE)) {
9293
return objectMapper.readValue(in, ScmSource.class);
94+
} catch (FileNotFoundException ex) {
95+
LOG.warn("Failed to read scm-source.json file from " + SCM_SOURCE_FILE + ", file not found");
9396
} catch (IOException ex) {
9497
LOG.warn("Failed to read scm-source.json file from " + SCM_SOURCE_FILE, ex);
9598
}

src/main/java/org/zalando/nakadi/service/EventTypeService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public List<EventType> list() {
135135
return eventTypeRepository.list();
136136
}
137137

138-
public void create(final EventTypeBase eventType)
138+
public void create(final EventTypeBase eventType, final boolean checkAuth)
139139
throws TopicCreationException,
140140
InternalNakadiException,
141141
NoSuchPartitionStrategyException,
@@ -158,7 +158,9 @@ public void create(final EventTypeBase eventType)
158158
validateCompaction(eventType);
159159
enrichment.validate(eventType);
160160
partitionResolver.validate(eventType);
161-
authorizationValidator.validateAuthorization(eventType.asBaseResource());
161+
if (checkAuth) {
162+
authorizationValidator.validateAuthorization(eventType.asBaseResource());
163+
}
162164

163165
eventTypeRepository.saveEventType(eventType);
164166

src/main/java/org/zalando/nakadi/service/NakadiAuditLogInitialization.java

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,23 @@
11
package org.zalando.nakadi.service;
22

3-
import com.fasterxml.jackson.core.type.TypeReference;
4-
import com.fasterxml.jackson.databind.ObjectMapper;
5-
import com.google.common.base.Charsets;
6-
import com.google.common.io.Resources;
73
import org.slf4j.Logger;
84
import org.slf4j.LoggerFactory;
95
import org.springframework.beans.factory.annotation.Autowired;
106
import org.springframework.boot.context.properties.ConfigurationProperties;
117
import org.springframework.context.event.ContextRefreshedEvent;
128
import org.springframework.context.event.EventListener;
139
import org.springframework.stereotype.Component;
14-
import org.zalando.nakadi.domain.EventTypeBase;
15-
import org.zalando.nakadi.exceptions.runtime.DuplicatedEventTypeNameException;
16-
import org.zalando.nakadi.exceptions.runtime.NakadiBaseException;
1710

1811
import java.io.IOException;
12+
import java.util.HashMap;
13+
import java.util.Map;
1914

2015
@Component
2116
@ConfigurationProperties(prefix = "nakadi.audit")
2217
public class NakadiAuditLogInitialization {
2318
private static final Logger LOG = LoggerFactory.getLogger(NakadiAuditLogInitialization.class);
2419

25-
private final ObjectMapper objectMapper;
26-
private final EventTypeService eventTypeService;
20+
private final SystemEventTypeInitializer systemEventTypeInitializer;
2721
private final FeatureToggleService featureToggleService;
2822

2923
private String eventType;
@@ -32,10 +26,10 @@ public class NakadiAuditLogInitialization {
3226
private String authValue;
3327

3428
@Autowired
35-
public NakadiAuditLogInitialization(final ObjectMapper objectMapper, final EventTypeService eventTypeService,
36-
final FeatureToggleService featureToggleService) {
37-
this.objectMapper = objectMapper;
38-
this.eventTypeService = eventTypeService;
29+
public NakadiAuditLogInitialization(
30+
final SystemEventTypeInitializer systemEventTypeInitializer,
31+
final FeatureToggleService featureToggleService) {
32+
this.systemEventTypeInitializer = systemEventTypeInitializer;
3933
this.featureToggleService = featureToggleService;
4034
}
4135

@@ -45,28 +39,13 @@ public void onApplicationEvent(final ContextRefreshedEvent event) throws IOExcep
4539
LOG.debug("Audit log collection is disabled, skip creation of audit log event type");
4640
return;
4741
}
42+
final Map<String, String> replacements = new HashMap<>();
43+
replacements.put("event_type_name_placeholder", eventType);
44+
replacements.put("owning_application_placeholder", owningApplication);
45+
replacements.put("auth_data_type_placeholder", authDataType);
46+
replacements.put("auth_value_placeholder", authValue);
4847

49-
LOG.debug("Initializing Audit log event type");
50-
51-
String auditEventTypeString = Resources
52-
.toString(Resources.getResource("audit_event_type.json"), Charsets.UTF_8);
53-
54-
auditEventTypeString = auditEventTypeString.replaceAll("event_type_name_placeholder", eventType);
55-
auditEventTypeString = auditEventTypeString.replaceAll("owning_application_placeholder", owningApplication);
56-
auditEventTypeString = auditEventTypeString.replaceAll("auth_data_type_placeholder", authDataType);
57-
auditEventTypeString = auditEventTypeString.replaceAll("auth_value_placeholder", authValue);
58-
59-
final TypeReference<EventTypeBase> typeReference = new TypeReference<EventTypeBase>() {
60-
};
61-
final EventTypeBase eventType = objectMapper.readValue(auditEventTypeString, typeReference);
62-
63-
try {
64-
eventTypeService.create(eventType);
65-
} catch (final DuplicatedEventTypeNameException e) {
66-
LOG.debug("Audit event type already exists " + eventType.getName());
67-
} catch (final NakadiBaseException e) {
68-
LOG.debug("Problem creating audit event type " + eventType.getName(), e);
69-
}
48+
systemEventTypeInitializer.createEventTypesFromResource("audit_event_types.json", replacements);
7049
}
7150

7251
public String getEventType() {

src/main/java/org/zalando/nakadi/service/NakadiKpiInitialization.java

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,23 @@
11
package org.zalando.nakadi.service;
22

3-
import com.fasterxml.jackson.core.type.TypeReference;
4-
import com.fasterxml.jackson.databind.ObjectMapper;
5-
import com.google.common.base.Charsets;
6-
import com.google.common.io.Resources;
73
import org.slf4j.Logger;
84
import org.slf4j.LoggerFactory;
95
import org.springframework.beans.factory.annotation.Autowired;
106
import org.springframework.boot.context.properties.ConfigurationProperties;
117
import org.springframework.context.event.ContextRefreshedEvent;
128
import org.springframework.context.event.EventListener;
139
import org.springframework.stereotype.Component;
14-
import org.zalando.nakadi.domain.EventTypeBase;
15-
import org.zalando.nakadi.exceptions.runtime.DuplicatedEventTypeNameException;
16-
import org.zalando.nakadi.exceptions.runtime.NakadiBaseException;
1710

1811
import java.io.IOException;
1912
import java.util.HashMap;
20-
import java.util.List;
2113
import java.util.Map;
2214

2315
@Component
2416
@ConfigurationProperties(prefix = "nakadi.kpi.event-types")
2517
public class NakadiKpiInitialization {
2618
private static final Logger LOG = LoggerFactory.getLogger(NakadiKpiInitialization.class);
2719

28-
private final ObjectMapper objectMapper;
29-
private final EventTypeService eventTypeService;
20+
private final SystemEventTypeInitializer systemEventTypeInitializer;
3021
private final FeatureToggleService featureToggleService;
3122

3223
private String nakadiAccessLog;
@@ -37,10 +28,10 @@ public class NakadiKpiInitialization {
3728
private String nakadiEventTypeLog;
3829

3930
@Autowired
40-
public NakadiKpiInitialization(final ObjectMapper objectMapper, final EventTypeService eventTypeService,
41-
final FeatureToggleService featureToggleService) {
42-
this.objectMapper = objectMapper;
43-
this.eventTypeService = eventTypeService;
31+
public NakadiKpiInitialization(
32+
final SystemEventTypeInitializer systemEventTypeInitializer,
33+
final FeatureToggleService featureToggleService) {
34+
this.systemEventTypeInitializer = systemEventTypeInitializer;
4435
this.featureToggleService = featureToggleService;
4536
}
4637

@@ -50,12 +41,6 @@ public void onApplicationEvent(final ContextRefreshedEvent event) throws IOExcep
5041
LOG.debug("KPI collection is disabled, skip creation of kpi event types");
5142
return;
5243
}
53-
54-
LOG.debug("Initializing KPI event types");
55-
56-
String kpiEventTypesString = Resources
57-
.toString(Resources.getResource("kpi_event_types.json"), Charsets.UTF_8);
58-
5944
final Map<String, String> replacements = new HashMap<>();
6045
replacements.put("nakadi.event.type.log", nakadiEventTypeLog);
6146
replacements.put("nakadi.subscription.log", nakadiSubscriptionLog);
@@ -64,24 +49,7 @@ public void onApplicationEvent(final ContextRefreshedEvent event) throws IOExcep
6449
replacements.put("nakadi.access.log", nakadiAccessLog);
6550
replacements.put("owning_application_placeholder", owningApplication);
6651

67-
for (final Map.Entry<String, String> entry : replacements.entrySet()) {
68-
kpiEventTypesString = kpiEventTypesString.replaceAll(entry.getKey(), entry.getValue());
69-
}
70-
71-
final TypeReference<List<EventTypeBase>> typeReference = new TypeReference<List<EventTypeBase>>() {
72-
};
73-
final List<EventTypeBase> eventTypes = objectMapper.readValue(kpiEventTypesString, typeReference);
74-
75-
76-
eventTypes.forEach(et -> {
77-
try {
78-
eventTypeService.create(et);
79-
} catch (final DuplicatedEventTypeNameException e) {
80-
LOG.debug("KPI event type already exists " + et.getName());
81-
} catch (final NakadiBaseException e) {
82-
LOG.debug("Problem creating KPI event type " + et.getName(), e);
83-
}
84-
});
52+
systemEventTypeInitializer.createEventTypesFromResource("kpi_event_types.json", replacements);
8553
}
8654

8755
public String getNakadiAccessLog() {
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.zalando.nakadi.service;
2+
3+
import com.fasterxml.jackson.core.type.TypeReference;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.google.common.base.Charsets;
6+
import com.google.common.io.Resources;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.stereotype.Component;
11+
import org.zalando.nakadi.domain.EventTypeBase;
12+
import org.zalando.nakadi.exceptions.runtime.DuplicatedEventTypeNameException;
13+
import org.zalando.nakadi.exceptions.runtime.NakadiBaseException;
14+
15+
import java.io.IOException;
16+
import java.util.List;
17+
import java.util.Map;
18+
import java.util.regex.Matcher;
19+
import java.util.regex.Pattern;
20+
21+
@Component
22+
public class SystemEventTypeInitializer {
23+
private final ObjectMapper objectMapper;
24+
private final EventTypeService eventTypeService;
25+
private static final Logger LOG = LoggerFactory.getLogger(SystemEventTypeInitializer.class);
26+
27+
@Autowired
28+
public SystemEventTypeInitializer(
29+
final ObjectMapper objectMapper,
30+
final EventTypeService eventTypeService) {
31+
this.objectMapper = objectMapper;
32+
this.eventTypeService = eventTypeService;
33+
}
34+
35+
public void createEventTypesFromResource(
36+
final String resourceName,
37+
final Map<String, String> nameReplacements) throws IOException {
38+
LOG.debug("Initializing event types from {}", resourceName);
39+
String eventTypesString = Resources.toString(Resources.getResource(resourceName), Charsets.UTF_8);
40+
for (final Map.Entry<String, String> entry : nameReplacements.entrySet()) {
41+
eventTypesString = eventTypesString.replaceAll(
42+
Pattern.quote(entry.getKey()),
43+
Matcher.quoteReplacement(entry.getValue()));
44+
}
45+
46+
final TypeReference<List<EventTypeBase>> typeReference = new TypeReference<List<EventTypeBase>>() {
47+
};
48+
final List<EventTypeBase> eventTypes = objectMapper.readValue(eventTypesString, typeReference);
49+
50+
eventTypes.forEach(et -> {
51+
try {
52+
eventTypeService.create(et, false);
53+
} catch (final DuplicatedEventTypeNameException e) {
54+
LOG.debug("Event type {} from {} already exists", et.getName(), resourceName);
55+
} catch (final NakadiBaseException e) {
56+
LOG.debug("Problem creating event type {} from {}", et.getName(), resourceName, e);
57+
}
58+
});
59+
60+
}
61+
}

src/main/resources/audit_event_type.json

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
[
2+
{
3+
"name": "event_type_name_placeholder",
4+
"owning_application": "owning_application_placeholder",
5+
"category": "data",
6+
"enrichment_strategies": [
7+
"metadata_enrichment"
8+
],
9+
"partition_strategy": "hash",
10+
"partition_key_fields": [
11+
"resource_id"
12+
],
13+
"cleanup_policy": "delete",
14+
"ordering_key_fields": [],
15+
"ordering_instance_ids": [],
16+
"schema": {
17+
"type": "json_schema",
18+
"schema": "{\"properties\": {\"previous_object\": { \"type\": \"object\", \"description\": \"When modifying an already existent entity, its value is captured in this field as a JSON object. So, for example, when changing an Event Type attribute, this field contains the entire state before the changes are applied\"},\"previous_text\": { \"type\": \"string\", \"description\": \"Contains the same information as the field `previous_object` but as text, since the data lake stores a flat map of all the fields in the object, destroying information about its structure. Storing the text makes sure that the original data is not lost by any transformation that the data lake may apply on the data\"},\"new_object\": { \"type\": \"object\", \"description\": \"New value submitted by the user\"},\"new_text\": { \"type\": \"string\", \"description\": \"New value submitted by the user as text, in order to preserve the structure, if needed\"},\"resource_type\": { \"x-extensible-enum\": [ \"event_type\", \"subscription\", \"timeline\", \"storage\", \"feature\", \"admins\", \"cursors\", \"blacklist_entry\" ], \"type\":\"string\" },\"resource_id\": { \"description\": \"Resource identifier. Together with `resource_type` allows for the selection of a resource\", \"type\": \"string\"},\"user\": { \"description\": \"User or service that requested the changes\", \"type\": \"string\"},\"user_hash\": { \"description\": \"User hashed\", \"type\": \"string\"}},\"required\": [\"user\", \"user_hash\", \"resource_id\", \"resource_type\"]}"
19+
},
20+
"default_statistic": {
21+
"messages_per_minute": 100,
22+
"message_size": 100,
23+
"read_parallelism": 10,
24+
"write_parallelism": 10
25+
},
26+
"options": {
27+
"retention_time": 345600000
28+
},
29+
"compatibility_mode": "forward",
30+
"audience": "company-internal",
31+
"authorization": {
32+
"admins": [
33+
{
34+
"data_type": "auth_data_type_placeholder",
35+
"value": "auth_value_placeholder"
36+
}
37+
],
38+
"readers": [
39+
{
40+
"data_type": "auth_data_type_placeholder",
41+
"value": "auth_value_placeholder"
42+
}
43+
],
44+
"writers": [
45+
{
46+
"data_type": "auth_data_type_placeholder",
47+
"value": "auth_value_placeholder"
48+
}
49+
]
50+
}
51+
}
52+
]

0 commit comments

Comments
 (0)