Skip to content

Commit

Permalink
#474 Fixing error when fallback to host machine IP (#477)
Browse files Browse the repository at this point in the history
* 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'.
  • Loading branch information
mageddo authored Jun 17, 2024
1 parent 80cb3b1 commit 2dd5290
Show file tree
Hide file tree
Showing 11 changed files with 118 additions and 15 deletions.
3 changes: 3 additions & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## 3.19.5
* #474: Fixing errors log occurs when fallback to host machine IP.

## 3.19.4
* #476: Fixing invalid IP parsing usecase

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
version=3.19.4-snapshot
version=3.19.5-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
public class Drivers {
public static final String BRIDGE = "bridge";
public static final String OVERLAY = "overlay";
public static final String HOST = "host";
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,17 @@ public IP getGateway(IP.Version version) {
.orElse(null);
}

public boolean hasAnyGateway() {
return !this.gateways.isEmpty();
}

public boolean hasAnyGatewayWith(IP.Version version) {
return this.gateways
.stream()
.anyMatch(it -> Objects.equals(it.version(), version))
;
}

public enum Name {

DPS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,8 @@ public IP findHostMachineIp(IP.Version version) {
}

Network findBestNetwork(IP.Version version) {
final var network = this.findNetworks()
final var network = this.findNetworksWithIp(version)
.stream()
.filter(it -> java.util.Objects.equals(it.isIpv6Active(), version.isIpv6()))
.min(NetworkComparator::compare)
.orElse(null);
log.debug("status=bestNetwork, network={}", network);
Expand All @@ -52,4 +51,11 @@ List<Network> findNetworks() {
.map(NetworkMapper::of)
.toList();
}

List<Network> findNetworksWithIp(IP.Version version) {
return this.findNetworks()
.stream()
.filter(it -> it.hasAnyGatewayWith(version))
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

import com.mageddo.dnsproxyserver.solver.docker.Network;
import com.mageddo.net.IP;
import lombok.extern.slf4j.Slf4j;

import java.util.Objects;
import java.util.stream.Stream;

@Slf4j
public class NetworkMapper {

public static Network of(com.github.dockerjava.api.model.Network n) {
log.debug("status=mapping, networkName={}", n.getName());
return Network.builder()
.name(n.getName())
.driver(n.getDriver())
Expand All @@ -33,15 +36,18 @@ static IP findGatewayIp(com.github.dockerjava.api.model.Network network, IP.Vers
if (network == null) {
return null;
}
return network
.getIpam()
.getConfig()
.stream()
.map(com.github.dockerjava.api.model.Network.Ipam.Config::getGateway)
.map(IP::of)
.filter(it -> it.version() == version)
.findFirst()
.orElse(null)
;
final var ipam = network.getIpam();
if (ipam != null && ipam.getConfig() != null) {
return ipam
.getConfig()
.stream()
.map(com.github.dockerjava.api.model.Network.Ipam.Config::getGateway)
.map(IP::of)
.filter(it -> it.version() == version)
.findFirst()
.orElse(null)
;
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.mageddo.dnsproxyserver.solver.docker.dataprovider;

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

}

@Test
void mustIgnoreNetworksWithoutIP() {

// arrange
final var version = IP.Version.IPV4;
final var networks = List.of(
NetworkTemplates.withHostDriverWithoutIps(),
NetworkTemplates.withBridgeIpv4AndIpv6Network()
);

doReturn(networks)
.when(this.dockerDAO)
.findNetworks();

// act
final var ip = this.dockerDAO.findHostMachineIp(version);

// assert
assertNotNull(ip);
assertEquals(IP.of("172.21.0.1"), ip);

}


}
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package com.mageddo.dnsproxyserver.solver.docker.dataprovider.mapper;

import com.mageddo.dnsproxyserver.docker.domain.Drivers;
import com.mageddo.dnsproxyserver.solver.docker.dataprovider.mapper.NetworkMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import testing.templates.docker.NetworkTemplates;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static testing.templates.docker.NetworkTemplates.buildBridgeIpv4AndIpv6Network;
import static testing.templates.docker.NetworkTemplates.buildBridgeIpv4OnlyNetwork;
import static testing.templates.docker.NetworkTemplates.buildHostNetworkWithNoIpam;

@ExtendWith(MockitoExtension.class)
class NetworkMapperTest {
Expand Down Expand Up @@ -60,4 +61,19 @@ void mustLeadWhenNoIpv6IsReturned(){
assertEquals("[172.21.0.1]", network.getGateways().toString());
}

@Test
void mustLeadWhenNoIpamConfigIsAvailable(){

// arrange
final var dockerNetwork = buildHostNetworkWithNoIpam();

// act
final var network = NetworkMapper.of(dockerNetwork);

// assert
assertNotNull(network);
assertFalse(network.hasAnyGateway());
assertEquals("[]", network.getGateways().toString());
}

}
4 changes: 4 additions & 0 deletions src/test/java/testing/templates/docker/NetworkTemplates.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,8 @@ public static Network buildBridgeIpv4OnlyNetwork() {
return JsonUtils.readValue(readString("/templates/docker/network/002.json"), Network.class);
}

public static Network buildHostNetworkWithNoIpam() {
return JsonUtils.readValue(readString("/templates/docker/network/003.json"), Network.class);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@ public static Network withOverlayIpv4AndIpv6Network() {
;
}

public static Network withHostDriverWithoutIps() {
return builder()
.name("host")
.driver(Drivers.HOST)
.gateways(Collections.emptyList())
.ipv6Active(false)
.build()
;
}

static Network.NetworkBuilder builder() {
return Network.builder()
.gateways(Collections.emptyList())
Expand Down
23 changes: 23 additions & 0 deletions src/test/resources/templates/docker/network/003.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"Name": "host",
"Id": "c0e229b3e0dfc6265fe508026ad5e71199abac6f4dda240d9dd53c2192b3e5ed",
"Created": "2022-03-24T15:56:28.398813695Z",
"Scope": "local",
"Driver": "host",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": null
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}

0 comments on commit 2dd5290

Please sign in to comment.