use of org.openkilda.testing.service.traffexam.networkpool.Inet4Network in project open-kilda by telstra.
the class TraffExamServiceImpl method initializePools.
@PostConstruct
void initializePools() {
baseUrl = labEndpoint + "/api/" + topology.getLabId() + "/traffgen/";
hostsPool = new ConcurrentHashMap<>();
for (TraffGen traffGen : topology.getActiveTraffGens()) {
URI controlEndpoint;
try {
controlEndpoint = new URI(traffGen.getControlEndpoint());
} catch (URISyntaxException e) {
throw new IllegalArgumentException(String.format("Invalid traffGen(%s) REST endpoint address \"%s\": %s", traffGen.getName(), traffGen.getControlEndpoint(), e.getMessage()), e);
}
UUID id = UUID.randomUUID();
Host host = new Host(id, traffGen.getIfaceName(), controlEndpoint, traffGen.getName());
try {
restTemplate.headForHeaders(makeHostUri(host).path("endpoint").build());
} catch (RestClientException ex) {
throw new IllegalArgumentException(String.format("The traffGen(%s) REST endpoint address \"%s\" can't be reached: %s", traffGen.getName(), traffGen.getControlEndpoint(), ex.getMessage()), ex);
}
hostsPool.put(id, host);
}
TraffGenConfig config = topology.getTraffGenConfig();
Inet4Network network;
try {
network = new Inet4Network((Inet4Address) Inet4Address.getByName(config.getAddressPoolBase()), config.getAddressPoolPrefixLen());
} catch (Inet4ValueException | UnknownHostException e) {
throw new InputMismatchException(String.format("Invalid traffGen address pool \"%s:%s\": %s", config.getAddressPoolBase(), config.getAddressPoolPrefixLen(), e));
}
addressPool = new Inet4NetworkPool(network, 30);
}
use of org.openkilda.testing.service.traffexam.networkpool.Inet4Network in project open-kilda by telstra.
the class TraffExamServiceImpl method startExam.
@Override
public synchronized ExamResources startExam(Exam exam) throws NoResultsFoundException, OperationalException {
checkHostPresence(exam.getSource());
checkHostPresence(exam.getDest());
Inet4Network subnet;
try {
subnet = addressPool.allocate();
} catch (Inet4ValueException e) {
throw new OperationalException("Unable to allocate subnet for exam. There is no more addresses available.");
}
ExamResources resources = null;
List<HostResource> supplied = new ArrayList<>(4);
try {
Address sourceAddress = new Address(subnet.address(1), subnet.getPrefix(), exam.getSourceVlans());
sourceAddress = assignAddress(exam.getSource(), sourceAddress);
supplied.add(sourceAddress);
Address destAddress = new Address(subnet.address(2), subnet.getPrefix(), exam.getDestVlans());
destAddress = assignAddress(exam.getDest(), destAddress);
supplied.add(destAddress);
ConsumerEndpoint consumer = assignEndpoint(exam.getDest(), new ConsumerEndpoint(destAddress.getId()));
supplied.add(consumer);
ProducerEndpoint producer = new ProducerEndpoint(sourceAddress.getId(), new EndpointAddress(destAddress.getAddress(), consumer.getBindPort()));
if (exam.getBandwidthLimit() != null) {
producer.setBandwidth(exam.getBandwidthLimit());
producer.setBurstPkt(exam.getBurstPkt());
}
if (exam.getTimeLimitSeconds() != null) {
producer.setTime(exam.getTimeLimitSeconds());
}
producer.setUseUdp(exam.isUdp());
producer.setBufferLength(exam.getBufferLength());
try {
// give consumer some time to fully roll. Probably should be fixed on service's side, this is workaround
TimeUnit.MILLISECONDS.sleep(300);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
producer = assignEndpoint(exam.getSource(), producer);
supplied.add(producer);
resources = new ExamResources(subnet, producer, consumer);
} catch (Inet4ValueException e) {
throw new OperationalException("Insufficient resources - not enough IP address in subnet. Check addressPool configuration.");
} finally {
if (resources == null) {
extendFailedToRelease(releaseResources(supplied));
try {
addressPool.free(subnet);
} catch (Inet4ValueException e) {
// Unreachable point, free throw exception only if invalid (not allocated before) address passed
}
}
}
return resources;
}
Aggregations