Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;

import io.aklivity.zilla.runtime.common.openapi.config.OpenapiServerConfig;
import io.aklivity.zilla.runtime.common.openapi.model.OpenapiOperation;
import io.aklivity.zilla.runtime.common.openapi.model.OpenapiServer;
import io.aklivity.zilla.runtime.common.openapi.model.resolver.OpenapiResolver;

public final class OpenapiOperationView
Expand Down Expand Up @@ -50,6 +52,7 @@ public final class OpenapiOperationView
OpenapiResolver resolver,
String method,
String path,
List<OpenapiServer> pathServers,
OpenapiOperation model)
{
this.specification = specification;
Expand Down Expand Up @@ -83,9 +86,13 @@ public final class OpenapiOperationView
.toList()
: specification.security;

this.servers = model.servers != null
? model.servers.stream()
.flatMap(s -> configs.stream().map(c -> new OpenapiServerView(resolver, s, c)))
List<OpenapiServer> effectiveServers = model.servers != null ? model.servers : pathServers;

this.servers = effectiveServers != null
? effectiveServers.stream()
.flatMap(s -> configs.isEmpty()
? Stream.of(new OpenapiServerView(resolver, s, null))
: configs.stream().map(c -> new OpenapiServerView(resolver, s, c)))
.toList()
: specification.servers;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public final class OpenapiPathView
.filter(e -> e.getValue().apply(model) != null)
.collect(Collectors.toMap(Map.Entry::getKey, e ->
new OpenapiOperationView(specification, supplyCompositeId.getAsLong(),
configs, resolver, e.getKey(), path, e.getValue().apply(model))));
configs, resolver, e.getKey(), path, model.servers, e.getValue().apply(model))));
this.extensions = model.extensions;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import io.aklivity.zilla.runtime.common.openapi.model.OpenapiSchema;
import io.aklivity.zilla.runtime.common.openapi.model.OpenapiSecurityScheme;
import io.aklivity.zilla.runtime.common.openapi.model.OpenapiServer;
import io.aklivity.zilla.runtime.common.openapi.model.OpenapiServerVariable;

public class OpenapiViewTest
{
Expand Down Expand Up @@ -305,6 +306,154 @@ public void shouldNotResolveScopesWithoutFlows() throws Exception
assertEquals(List.of(), schemeView.scopes);
}

@Test
public void shouldResolveOperationLevelServersOverPathAndRoot() throws Exception
{
OpenapiServer rootServer = new OpenapiServer();
rootServer.url = "http://root.example.com";

OpenapiServer pathServer = new OpenapiServer();
pathServer.url = "http://path.example.com";

OpenapiServer operationServer = new OpenapiServer();
operationServer.url = "http://operation.example.com";

OpenapiOperation operation = new OpenapiOperation();
operation.operationId = "ReadItems";
operation.servers = List.of(operationServer);

OpenapiPath path = new OpenapiPath();
path.get = operation;
path.servers = List.of(pathServer);

Openapi model = new Openapi();
model.servers = List.of(rootServer);
model.paths = Map.of("/items", path);

OpenapiServerConfig config = OpenapiServerConfig.builder().build();
OpenapiView view = OpenapiView.of(model, List.of(config));
OpenapiOperationView operationView = view.paths.get("/items").methods.get("GET");

assertEquals(1, operationView.servers.size());
assertEquals(URI.create("http://operation.example.com:80"), operationView.servers.get(0).url);
}

@Test
public void shouldResolvePathLevelServersOverRootWhenOperationHasNone() throws Exception
{
OpenapiServer rootServer = new OpenapiServer();
rootServer.url = "http://root.example.com";

OpenapiServer pathServer = new OpenapiServer();
pathServer.url = "http://path.example.com";

OpenapiOperation operation = new OpenapiOperation();
operation.operationId = "ReadItems";

OpenapiPath path = new OpenapiPath();
path.get = operation;
path.servers = List.of(pathServer);

Openapi model = new Openapi();
model.servers = List.of(rootServer);
model.paths = Map.of("/items", path);

OpenapiServerConfig config = OpenapiServerConfig.builder().build();
OpenapiView view = OpenapiView.of(model, List.of(config));
OpenapiOperationView operationView = view.paths.get("/items").methods.get("GET");

assertEquals(1, operationView.servers.size());
assertEquals(URI.create("http://path.example.com:80"), operationView.servers.get(0).url);
}

@Test
public void shouldResolveRootLevelServersWhenNoOperationOrPathServers() throws Exception
{
OpenapiServer rootServer = new OpenapiServer();
rootServer.url = "http://root.example.com";

OpenapiOperation operation = new OpenapiOperation();
operation.operationId = "ReadItems";

OpenapiPath path = new OpenapiPath();
path.get = operation;

Openapi model = new Openapi();
model.servers = List.of(rootServer);
model.paths = Map.of("/items", path);

OpenapiServerConfig config = OpenapiServerConfig.builder().build();
OpenapiView view = OpenapiView.of(model, List.of(config));
OpenapiOperationView operationView = view.paths.get("/items").methods.get("GET");

assertEquals(1, operationView.servers.size());
assertEquals(URI.create("http://root.example.com:80"), operationView.servers.get(0).url);
}

@Test
public void shouldResolveServerUrlVariableDefaultWhenNoOverride() throws Exception
{
OpenapiServerVariable variable = new OpenapiServerVariable();
variable.values = List.of("prod", "staging");
variable.defaultValue = "prod";

OpenapiServer server = new OpenapiServer();
server.url = "http://{env}.example.com";
server.variables = Map.of("env", variable);

Openapi model = new Openapi();
model.servers = List.of(server);

OpenapiServerConfig config = OpenapiServerConfig.builder().build();
OpenapiView view = OpenapiView.of(model, List.of(config));

assertEquals(URI.create("http://prod.example.com:80"), view.servers.get(0).url);
}

@Test
public void shouldResolveServerUrlVariableOverrideMatchingPattern() throws Exception
{
OpenapiServerVariable variable = new OpenapiServerVariable();
variable.values = List.of("prod", "staging");
variable.defaultValue = "prod";

OpenapiServer server = new OpenapiServer();
server.url = "http://{env}.example.com";
server.variables = Map.of("env", variable);

Openapi model = new Openapi();
model.servers = List.of(server);

OpenapiServerConfig config = OpenapiServerConfig.builder()
.url("http://staging.example.com")
.build();
OpenapiView view = OpenapiView.of(model, List.of(config));

assertEquals(URI.create("http://staging.example.com:80"), view.servers.get(0).url);
}

@Test
public void shouldDefaultServerUrlVariableWhenOverrideDoesNotMatchPattern() throws Exception
{
OpenapiServerVariable variable = new OpenapiServerVariable();
variable.values = List.of("prod", "staging");
variable.defaultValue = "prod";

OpenapiServer server = new OpenapiServer();
server.url = "http://{env}.example.com";
server.variables = Map.of("env", variable);

Openapi model = new Openapi();
model.servers = List.of(server);

OpenapiServerConfig config = OpenapiServerConfig.builder()
.url("http://dev.example.com")
.build();
OpenapiView view = OpenapiView.of(model, List.of(config));

assertEquals(URI.create("http://prod.example.com:80"), view.servers.get(0).url);
}

public static final class SampleExtension
{
public String key;
Expand Down
Loading