Skip to content

Commit 2dd5290

Browse files
authored
#474 Fixing error when fallback to host machine IP (#477)
* logging net name * leading with no ipam config and testing * dont use networks without ip * release notes * [Gradle Release Plugin] - new version commit: '3.19.5-snapshot'.
1 parent 80cb3b1 commit 2dd5290

File tree

11 files changed

+118
-15
lines changed

11 files changed

+118
-15
lines changed

RELEASE-NOTES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 3.19.5
2+
* #474: Fixing errors log occurs when fallback to host machine IP.
3+
14
## 3.19.4
25
* #476: Fixing invalid IP parsing usecase
36

gradle.properties

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

src/main/java/com/mageddo/dnsproxyserver/docker/domain/Drivers.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
public class Drivers {
44
public static final String BRIDGE = "bridge";
55
public static final String OVERLAY = "overlay";
6+
public static final String HOST = "host";
67
}

src/main/java/com/mageddo/dnsproxyserver/solver/docker/Network.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ public IP getGateway(IP.Version version) {
3434
.orElse(null);
3535
}
3636

37+
public boolean hasAnyGateway() {
38+
return !this.gateways.isEmpty();
39+
}
40+
41+
public boolean hasAnyGatewayWith(IP.Version version) {
42+
return this.gateways
43+
.stream()
44+
.anyMatch(it -> Objects.equals(it.version(), version))
45+
;
46+
}
47+
3748
public enum Name {
3849

3950
DPS,

src/main/java/com/mageddo/dnsproxyserver/solver/docker/dataprovider/DockerDAODefault.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ public IP findHostMachineIp(IP.Version version) {
3636
}
3737

3838
Network findBestNetwork(IP.Version version) {
39-
final var network = this.findNetworks()
39+
final var network = this.findNetworksWithIp(version)
4040
.stream()
41-
.filter(it -> java.util.Objects.equals(it.isIpv6Active(), version.isIpv6()))
4241
.min(NetworkComparator::compare)
4342
.orElse(null);
4443
log.debug("status=bestNetwork, network={}", network);
@@ -52,4 +51,11 @@ List<Network> findNetworks() {
5251
.map(NetworkMapper::of)
5352
.toList();
5453
}
54+
55+
List<Network> findNetworksWithIp(IP.Version version) {
56+
return this.findNetworks()
57+
.stream()
58+
.filter(it -> it.hasAnyGatewayWith(version))
59+
.toList();
60+
}
5561
}

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import com.mageddo.dnsproxyserver.solver.docker.Network;
44
import com.mageddo.net.IP;
5+
import lombok.extern.slf4j.Slf4j;
56

67
import java.util.Objects;
78
import java.util.stream.Stream;
89

10+
@Slf4j
911
public class NetworkMapper {
1012

1113
public static Network of(com.github.dockerjava.api.model.Network n) {
14+
log.debug("status=mapping, networkName={}", n.getName());
1215
return Network.builder()
1316
.name(n.getName())
1417
.driver(n.getDriver())
@@ -33,15 +36,18 @@ static IP findGatewayIp(com.github.dockerjava.api.model.Network network, IP.Vers
3336
if (network == null) {
3437
return null;
3538
}
36-
return network
37-
.getIpam()
38-
.getConfig()
39-
.stream()
40-
.map(com.github.dockerjava.api.model.Network.Ipam.Config::getGateway)
41-
.map(IP::of)
42-
.filter(it -> it.version() == version)
43-
.findFirst()
44-
.orElse(null)
45-
;
39+
final var ipam = network.getIpam();
40+
if (ipam != null && ipam.getConfig() != null) {
41+
return ipam
42+
.getConfig()
43+
.stream()
44+
.map(com.github.dockerjava.api.model.Network.Ipam.Config::getGateway)
45+
.map(IP::of)
46+
.filter(it -> it.version() == version)
47+
.findFirst()
48+
.orElse(null)
49+
;
50+
}
51+
return null;
4652
}
4753
}

src/test/java/com/mageddo/dnsproxyserver/solver/docker/dataprovider/DockerDAODefaultTest.java

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

3-
import com.mageddo.dnsproxyserver.solver.docker.dataprovider.DockerDAODefault;
43
import com.mageddo.net.IP;
54
import org.junit.jupiter.api.Test;
65
import org.junit.jupiter.api.extension.ExtendWith;
@@ -64,4 +63,28 @@ void mustRespectPriorityOrder() {
6463

6564
}
6665

66+
@Test
67+
void mustIgnoreNetworksWithoutIP() {
68+
69+
// arrange
70+
final var version = IP.Version.IPV4;
71+
final var networks = List.of(
72+
NetworkTemplates.withHostDriverWithoutIps(),
73+
NetworkTemplates.withBridgeIpv4AndIpv6Network()
74+
);
75+
76+
doReturn(networks)
77+
.when(this.dockerDAO)
78+
.findNetworks();
79+
80+
// act
81+
final var ip = this.dockerDAO.findHostMachineIp(version);
82+
83+
// assert
84+
assertNotNull(ip);
85+
assertEquals(IP.of("172.21.0.1"), ip);
86+
87+
}
88+
89+
6790
}

src/test/java/com/mageddo/dnsproxyserver/solver/docker/dataprovider/mapper/NetworkMapperTest.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.mageddo.dnsproxyserver.solver.docker.dataprovider.mapper;
22

33
import com.mageddo.dnsproxyserver.docker.domain.Drivers;
4-
import com.mageddo.dnsproxyserver.solver.docker.dataprovider.mapper.NetworkMapper;
54
import org.junit.jupiter.api.Test;
65
import org.junit.jupiter.api.extension.ExtendWith;
76
import org.mockito.junit.jupiter.MockitoExtension;
87
import testing.templates.docker.NetworkTemplates;
98

109
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertFalse;
1111
import static org.junit.jupiter.api.Assertions.assertNotNull;
1212
import static org.junit.jupiter.api.Assertions.assertTrue;
1313
import static testing.templates.docker.NetworkTemplates.buildBridgeIpv4AndIpv6Network;
1414
import static testing.templates.docker.NetworkTemplates.buildBridgeIpv4OnlyNetwork;
15+
import static testing.templates.docker.NetworkTemplates.buildHostNetworkWithNoIpam;
1516

1617
@ExtendWith(MockitoExtension.class)
1718
class NetworkMapperTest {
@@ -60,4 +61,19 @@ void mustLeadWhenNoIpv6IsReturned(){
6061
assertEquals("[172.21.0.1]", network.getGateways().toString());
6162
}
6263

64+
@Test
65+
void mustLeadWhenNoIpamConfigIsAvailable(){
66+
67+
// arrange
68+
final var dockerNetwork = buildHostNetworkWithNoIpam();
69+
70+
// act
71+
final var network = NetworkMapper.of(dockerNetwork);
72+
73+
// assert
74+
assertNotNull(network);
75+
assertFalse(network.hasAnyGateway());
76+
assertEquals("[]", network.getGateways().toString());
77+
}
78+
6379
}

src/test/java/testing/templates/docker/NetworkTemplates.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,8 @@ public static Network buildBridgeIpv4OnlyNetwork() {
4040
return JsonUtils.readValue(readString("/templates/docker/network/002.json"), Network.class);
4141
}
4242

43+
public static Network buildHostNetworkWithNoIpam() {
44+
return JsonUtils.readValue(readString("/templates/docker/network/003.json"), Network.class);
45+
}
46+
4347
}

src/test/java/testing/templates/server/dns/solver/docker/NetworkTemplates.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,16 @@ public static Network withOverlayIpv4AndIpv6Network() {
4545
;
4646
}
4747

48+
public static Network withHostDriverWithoutIps() {
49+
return builder()
50+
.name("host")
51+
.driver(Drivers.HOST)
52+
.gateways(Collections.emptyList())
53+
.ipv6Active(false)
54+
.build()
55+
;
56+
}
57+
4858
static Network.NetworkBuilder builder() {
4959
return Network.builder()
5060
.gateways(Collections.emptyList())

0 commit comments

Comments
 (0)