Skip to content

Commit db2cc0a

Browse files
authored
Docker Solver: Specify Preferred Networks to use when solving container IP (#662)
1 parent d22fbbf commit db2cc0a

File tree

12 files changed

+287
-29
lines changed

12 files changed

+287
-29
lines changed

RELEASE-NOTES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 5.3.0
2+
* Docker Solver: Specify Preferred Networks to use when solving container IP #662
3+
14
## 5.2.0
25
Docker Solver
36
* Fixing DPS Docker Network IP Range

docs/content/2-features/specify-from-which-network-solve-container/_index.en.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,10 @@ Non-authoritative answer:
3232
Name: server1.acme.com
3333
Address: 192.168.16.2
3434
```
35+
36+
You can also specify default preferred networks
37+
38+
| Name | Description | Default Value |
39+
|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
40+
| `solver.docker.networks.preferred.names` | Which networks DPS must prioritize when discovering container IP | |
41+
| `solver.docker.networks.preferred.overrideDefault` | If will disable DPS and BRIDGE default networks when solving | false |

docs/content/3-configuration/_index.en.md

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,23 @@ Common DNS resolution mechanisms used by DPS. Solvers are evaluated according to
4848

4949
### Docker Solver
5050

51-
| Name | Description | Default Value |
52-
|----------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
53-
| `solver.docker.registerContainerNames` | Whether container or service names should be registered as DNS hostnames. | `false` |
54-
| `solver.docker.domain` | Domain suffix used when registering Docker containers and services. | `docker` |
55-
| `solver.docker.hostMachineFallback` | Whether the host machine IP should be returned when a container is found but has no IP. | `true` |
56-
| `solver.docker.dockerDaemonUri` | Docker daemon URI used to connect to Docker. | OS dependent |
57-
| `solver.docker.dpsNetwork.autoCreate` | Whether DPS should automatically create a Docker bridge network. | `false` |
58-
| `solver.docker.dpsNetwork.autoConnect` | Whether all containers should be auto-connected to the DPS network. | `false` |
59-
| `solver.docker.dpsNetwork.configs` | Docker network IP configuration | |
60-
| `solver.docker.dpsNetwork.configs[].subNet` | Subnet | `172.20.0.0/16` |
61-
| `solver.docker.dpsNetwork.configs[].ipRange` | Ip Range | `172.20.5.0/24` |
62-
| `solver.docker.dpsNetwork.configs[].gateway` | Gateway | `172.20.5.1` |
51+
| Name | Description | Default Value |
52+
|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
53+
| `solver.docker.registerContainerNames` | Whether container or service names should be registered as DNS hostnames. | `false` |
54+
| `solver.docker.domain` | Domain suffix used when registering Docker containers and services. | `docker` |
55+
| `solver.docker.hostMachineFallback` | Whether the host machine IP should be returned when a container is found but has no IP. | `true` |
56+
| `solver.docker.dockerDaemonUri` | Docker daemon URI used to connect to Docker. | OS dependent |
57+
58+
#### DPS Network
59+
| Name | Description | Default Value |
60+
|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
61+
| `solver.docker.dpsNetwork.autoCreate` | Whether DPS should automatically create a Docker bridge network. | `false` |
62+
| `solver.docker.dpsNetwork.autoConnect` | Whether all containers should be auto-connected to the DPS network. | `false` |
63+
| `solver.docker.dpsNetwork.configs` | Docker network IP configuration | |
64+
| `solver.docker.dpsNetwork.configs[].subNet` | Subnet | `172.20.0.0/16` |
65+
| `solver.docker.dpsNetwork.configs[].ipRange` | Ip Range | `172.20.5.0/24` |
66+
| `solver.docker.dpsNetwork.configs[].gateway` | Gateway | `172.20.5.1` |
67+
6368

6469
Default DPS network settings
6570

@@ -72,7 +77,14 @@ Default DPS network settings
7277
gateway: fc00:5c6f:db50::1
7378
```
7479
75-
---
80+
#### Network Priority when Solving Container IP
81+
| Name | Description | Default Value |
82+
|----------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------|
83+
| `solver.docker.networks.preferred.names` | Which networks DPS must prioritize when discovering container IP | |
84+
| `solver.docker.networks.preferred.overrideDefault` | If will disable DPS and BRIDGE default networks when solving | false |
85+
86+
See more on [specify from which network solve container][6].
87+
7688

7789
### System Solver
7890

@@ -154,6 +166,10 @@ solver:
154166
- subNet: fc00:5c6f:db50::/64
155167
gateway: fc00:5c6f:db50::1
156168
dockerDaemonUri:
169+
networks:
170+
preferred:
171+
names:
172+
- my-awesome-network
157173
system:
158174
hostMachineHostname: host.docker
159175
local:
@@ -186,3 +202,4 @@ log:
186202
[3]: {{%relref "2-features/remote-solver-circuitbreaker/_index.en.md" %}}
187203
[4]: {{%relref "3-configuration/legacy.en.md" %}}
188204
[5]: {{%relref "3-configuration/format.en.md" %}}
205+
[6]: {{%relref "2-features/specify-from-which-network-solve-container/_index.en.md" %}}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=5.2.0-snapshot
1+
version=5.3.0-snapshot

src/main/java/com/mageddo/dnsproxyserver/config/Config.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,13 @@ public String getActiveEnv() {
220220
return this.solverLocal.getActiveEnv();
221221
}
222222

223+
public SolverDocker.Networks getDockerSolverNetworks() {
224+
if (this.solverDocker == null) {
225+
return null;
226+
}
227+
return this.solverDocker.networks;
228+
}
229+
223230
@Value
224231
@Builder(toBuilder = true)
225232
public static class DefaultDns {
@@ -483,6 +490,8 @@ public static class SolverDocker {
483490
DpsNetwork dpsNetwork;
484491
Boolean hostMachineFallback;
485492

493+
Networks networks;
494+
486495
public boolean shouldUseHostMachineFallback() {
487496
return BooleanUtils.toBoolean(hostMachineFallback);
488497
}
@@ -501,6 +510,23 @@ public boolean shouldAutoConnect() {
501510
return this.dpsNetwork.shouldAutoConnect();
502511
}
503512

513+
@Value
514+
@Builder
515+
public static class Networks {
516+
517+
Preferred preferred;
518+
519+
@Value
520+
@Builder
521+
public static class Preferred {
522+
523+
boolean overrideDefault;
524+
525+
List<String> names;
526+
527+
}
528+
}
529+
504530
@Value
505531
@Builder
506532
public static class DpsNetwork {

src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/ConfigV3.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ static public class Docker {
8585
String domain;
8686
Boolean hostMachineFallback;
8787
DpsNetwork dpsNetwork;
88-
// Networks networks;
88+
Networks networks;
8989
String dockerDaemonUri;
9090
}
9191

@@ -148,13 +148,27 @@ static public class Log {
148148
@Accessors(chain = true)
149149
@FieldDefaults(level = AccessLevel.PRIVATE)
150150
static public class Networks {
151-
List<String> preferredNetworkNames;
151+
152+
Preferred preferred;
153+
154+
@Data
155+
@Accessors(chain = true)
156+
@FieldDefaults(level = AccessLevel.PRIVATE)
157+
public static class Preferred {
158+
159+
List<String> names;
160+
161+
Boolean overrideDefault;
162+
163+
164+
}
152165
}
153166

154167
@Data
155168
@Accessors(chain = true)
156169
@FieldDefaults(level = AccessLevel.PRIVATE)
157170
static public class Remote {
171+
158172
Boolean active;
159173
List<String> dnsServers;
160174

src/main/java/com/mageddo/dnsproxyserver/config/dataformat/v3/mapper/ConfigMapper.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.mageddo.dnsproxyserver.config.NonResilientCircuitBreakerStrategyConfig;
1515
import com.mageddo.dnsproxyserver.config.StaticThresholdCircuitBreakerStrategyConfig;
1616
import com.mageddo.dnsproxyserver.config.dataformat.v3.ConfigV3;
17+
import com.mageddo.dnsproxyserver.utils.Booleans;
1718
import com.mageddo.dnsserver.SimpleServer;
1819
import com.mageddo.net.IP;
1920
import com.mageddo.net.IpAddr;
@@ -192,6 +193,21 @@ private static Config.SolverDocker mapSolverDocker(final ConfigV3.Solver s) {
192193
: null
193194
)
194195
.dpsNetwork(mapDomainDpsNetwork(s))
196+
.networks(mapNetworks(docker.getNetworks()))
197+
.build();
198+
}
199+
200+
private static Config.SolverDocker.Networks mapNetworks(ConfigV3.Networks networks) {
201+
if (networks == null) {
202+
return null;
203+
}
204+
final var preferred = networks.getPreferred();
205+
return Config.SolverDocker.Networks.builder()
206+
.preferred(Config.SolverDocker.Networks.Preferred.builder()
207+
.names(preferred.getNames())
208+
.overrideDefault(Booleans.getOrDefault(preferred.getOverrideDefault(), false))
209+
.build()
210+
)
195211
.build();
196212
}
197213

@@ -289,7 +305,8 @@ private static ConfigV3.Solver mapSolverV3(final Config config) {
289305
);
290306
}
291307

292-
if (config.getSolverDocker() != null) {
308+
final var solverDocker = config.getSolverDocker();
309+
if (solverDocker != null) {
293310
final var dpsNetwork = config.getDockerSolverDpsNetwork();
294311
solver.setDocker(new ConfigV3.Docker()
295312
.setDomain(config.getDockerDomain())
@@ -307,6 +324,7 @@ private static ConfigV3.Solver mapSolverV3(final Config config) {
307324
Collections.map(dpsNetwork.getConfigs(), ConfigMapper::mapDpsNetworkConfigV3)
308325
)
309326
)
327+
.setNetworks(mapNetworksDf(solverDocker.getNetworks()))
310328
);
311329
}
312330

@@ -348,6 +366,18 @@ private static ConfigV3.Solver mapSolverV3(final Config config) {
348366
return solver;
349367
}
350368

369+
private static ConfigV3.Networks mapNetworksDf(Config.SolverDocker.Networks networks) {
370+
if (networks == null) {
371+
return null;
372+
}
373+
final var preferred = networks.getPreferred();
374+
return new ConfigV3.Networks()
375+
.setPreferred(new ConfigV3.Networks.Preferred()
376+
.setNames(preferred.getNames())
377+
.setOverrideDefault(preferred.isOverrideDefault())
378+
);
379+
}
380+
351381
private static ConfigV3.Hostname mapEntryV3(Entry entry) {
352382
return new ConfigV3.Hostname()
353383
.setHostname(entry.getHostname())

src/main/java/com/mageddo/dnsproxyserver/config/mapper/ConfigMapper.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,28 +204,36 @@ private Config mapFrom0(List<Config> configs) {
204204
))
205205
.dpsNetwork(
206206
SolverDocker.DpsNetwork.builder()
207-
.name(ValueResolver.findFirst(
207+
.name(ValueResolver.findFirstOrThrow(
208208
configs,
209209
Config::getDockerSolverDpsNetwork,
210210
SolverDocker.DpsNetwork::getName
211211
))
212-
.autoCreate(ValueResolver.findFirst(
212+
.autoCreate(ValueResolver.findFirstOrThrow(
213213
configs,
214214
Config::getDockerSolverDpsNetwork,
215215
SolverDocker.DpsNetwork::getAutoCreate
216216
))
217-
.autoConnect(ValueResolver.findFirst(
217+
.autoConnect(ValueResolver.findFirstOrThrow(
218218
configs,
219219
Config::getDockerSolverDpsNetwork,
220220
SolverDocker.DpsNetwork::getAutoConnect
221221
))
222-
.configs(ValueResolver.findFirst(
222+
.configs(ValueResolver.findFirstOrThrow(
223223
configs,
224224
Config::getDockerSolverDpsNetwork,
225225
SolverDocker.DpsNetwork::getConfigs
226226
))
227227
.build()
228228
)
229+
.networks(SolverDocker.Networks.builder()
230+
.preferred(ValueResolver.findFirstOrThrow(
231+
configs,
232+
Config::getDockerSolverNetworks,
233+
SolverDocker.Networks::getPreferred
234+
))
235+
.build()
236+
)
229237
.build()
230238
)
231239
.solverSystem(Config.SolverSystem
@@ -295,6 +303,13 @@ static Config buildDefault() {
295303
))
296304
.build()
297305
)
306+
.networks(SolverDocker.Networks.builder()
307+
.preferred(SolverDocker.Networks.Preferred.builder()
308+
.overrideDefault(false)
309+
.build()
310+
)
311+
.build()
312+
)
298313
.build()
299314
)
300315
.solverLocal(Config.SolverLocal.builder()

src/main/java/com/mageddo/dnsproxyserver/solver/docker/dataprovider/mapper/ContainerMapper.java

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.mageddo.dnsproxyserver.solver.docker.dataprovider.mapper;
22

3+
import java.util.Collection;
34
import java.util.LinkedHashMap;
45
import java.util.LinkedHashSet;
56
import java.util.Map;
@@ -10,6 +11,8 @@
1011

1112
import com.github.dockerjava.api.command.InspectContainerResponse;
1213
import com.github.dockerjava.api.model.ContainerNetwork;
14+
import com.mageddo.dnsproxyserver.config.Config.SolverDocker;
15+
import com.mageddo.dnsproxyserver.config.application.Configs;
1316
import com.mageddo.dnsproxyserver.docker.application.Labels;
1417
import com.mageddo.dnsproxyserver.solver.docker.Container;
1518
import com.mageddo.dnsproxyserver.solver.docker.Network;
@@ -23,8 +26,14 @@ public class ContainerMapper {
2326
public static final String DEFAULT_NETWORK_LABEL = "dps.network";
2427

2528
public static Container of(InspectContainerResponse inspect) {
29+
return of(inspect, findPreferred());
30+
}
31+
32+
public static Container of(
33+
InspectContainerResponse inspect, SolverDocker.Networks.Preferred preferred
34+
) {
2635
final var foundNetworks = buildNetworks(inspect);
27-
final var possibleNetworksNames = buildNetworkNames(inspect);
36+
final var possibleNetworksNames = buildNetworkNames(inspect, preferred);
2837
return Container
2938
.builder()
3039
.id(inspect.getId())
@@ -66,16 +75,62 @@ static Container.Network toNetwork(ContainerNetwork n) {
6675
;
6776
}
6877

69-
static Set<String> buildNetworkNames(InspectContainerResponse c) {
78+
static Set<String> buildNetworkNames(
79+
InspectContainerResponse c, SolverDocker.Networks.Preferred preferred
80+
) {
81+
if (preferred.isOverrideDefault() && preferred.getNames() != null) {
82+
return mapPrincipalNetworkWith(c, preferred.getNames());
83+
}
84+
if (preferred.getNames() == null) {
85+
return buildDefaultWithPrincipal(c);
86+
}
87+
return mapPrincipalNetworkWith(c, preferred.getNames(), buildDefault());
88+
}
89+
90+
@SafeVarargs
91+
private static Set<String> mapPrincipalNetworkWith(
92+
InspectContainerResponse c, Collection<String>... namesCollections
93+
) {
94+
final var set = new LinkedHashSet<String>();
95+
final var principal = mapPrincipalNetworkName(c);
96+
if (StringUtils.isNotBlank(principal)) {
97+
set.add(principal);
98+
}
99+
for (var names : namesCollections) {
100+
set.addAll(names);
101+
}
102+
return set;
103+
}
104+
105+
private static LinkedHashSet<String> buildDefault() {
106+
return buildDefault(null);
107+
}
108+
109+
private static LinkedHashSet<String> buildDefaultWithPrincipal(InspectContainerResponse c) {
110+
return buildDefault(mapPrincipalNetworkName(c));
111+
}
112+
113+
private static String mapPrincipalNetworkName(InspectContainerResponse c) {
114+
return Labels.findLabelValue(c.getConfig(), DEFAULT_NETWORK_LABEL);
115+
}
116+
117+
private static LinkedHashSet<String> buildDefault(String principalNetworkName) {
70118
return Stream.of(
71-
Labels.findLabelValue(c.getConfig(), DEFAULT_NETWORK_LABEL),
119+
principalNetworkName,
72120
Network.Name.DPS.lowerCaseName(),
73121
Network.Name.BRIDGE.lowerCaseName()
74122
)
75123
.filter(Objects::nonNull)
76124
.collect(Collectors.toCollection(LinkedHashSet::new));
77125
}
78126

127+
private static SolverDocker.Networks.Preferred findPreferred() {
128+
return Configs.getInstance()
129+
.getSolverDocker()
130+
.getNetworks()
131+
.getPreferred();
132+
}
133+
79134
static IP buildDefaultIp(InspectContainerResponse c, IP.Version version) {
80135
final var settings = c.getNetworkSettings();
81136
if (settings == null) {

0 commit comments

Comments
 (0)