/*
* Copyright 2015 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.netflix.fenzo;
import com.netflix.fenzo.functions.Action1;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
public class SingleOfferModelTests {
private TaskScheduler taskScheduler;
@Before
public void setUp() throws Exception {
taskScheduler = new TaskScheduler.Builder()
.withLeaseOfferExpirySecs(1000000)
.withSingleOfferPerVM(true)
.withLeaseRejectAction(new Action1<VirtualMachineLease>() {
@Override
public void call(VirtualMachineLease virtualMachineLease) {
System.out.println("Rejecting offer on host " + virtualMachineLease.hostname());
}
})
.build();
}
@After
public void tearDown() throws Exception {
}
@Test
public void testSingleOfferMultipleIterations() throws Exception {
List<VirtualMachineLease> leases = LeaseProvider.getLeases(1, 4, 100, 1, 10);
List<TaskRequest> taskRequests = new ArrayList<>();
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
Map<String,VMAssignmentResult> resultMap = taskScheduler.scheduleOnce(taskRequests, leases).getResultMap();
Assert.assertEquals(1, resultMap.size());
taskScheduler.getTaskAssigner().call(taskRequests.get(0), resultMap.keySet().iterator().next());
leases.clear();
taskRequests.clear();
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
resultMap = taskScheduler.scheduleOnce(taskRequests, leases).getResultMap();
Assert.assertEquals(1, resultMap.size());
Assert.assertEquals(3, resultMap.entrySet().iterator().next().getValue().getTasksAssigned().size());
for(Map.Entry<String, VMAssignmentResult> entry: resultMap.entrySet()) {
for(TaskAssignmentResult r: entry.getValue().getTasksAssigned()) {
taskScheduler.getTaskAssigner().call(r.getRequest(), entry.getKey());
}
}
taskRequests.clear();
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
resultMap = taskScheduler.scheduleOnce(taskRequests, leases).getResultMap();
Assert.assertEquals(0, resultMap.size());
}
@Test
public void testWithInitialJobsAlreadyOnHost() throws Exception {
List<VirtualMachineLease> leases = LeaseProvider.getLeases(1, 4, 100, 1, 10);
TaskRequest t = TaskRequestProvider.getTaskRequest(1, 10, 1);
// indicate that the host already has one task running on it.
taskScheduler.getTaskAssigner().call(t, leases.get(0).hostname());
// now send the one time resource offer to scheduler
List<TaskRequest> taskRequests = new ArrayList<>();
taskScheduler.scheduleOnce(taskRequests, leases);
leases.clear();
// now create 3 other tasks to fill rest of the host
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
Map<String,VMAssignmentResult> resultMap = taskScheduler.scheduleOnce(taskRequests, leases).getResultMap();
Assert.assertEquals(1, resultMap.size());
Assert.assertEquals(3, resultMap.entrySet().iterator().next().getValue().getTasksAssigned().size());
for(Map.Entry<String, VMAssignmentResult> entry: resultMap.entrySet()) {
for(TaskAssignmentResult r: entry.getValue().getTasksAssigned()) {
taskScheduler.getTaskAssigner().call(r.getRequest(), entry.getKey());
}
}
taskRequests.clear();
taskRequests.add(TaskRequestProvider.getTaskRequest(1, 10, 1));
resultMap = taskScheduler.scheduleOnce(taskRequests, leases).getResultMap();
Assert.assertEquals(0, resultMap.size());
}
@Test
public void testMultipleOffers() throws Exception {
VirtualMachineLease host1 = LeaseProvider.getLeaseOffer("host1", 4, 4000, 1, 10);
final TaskRequest taskRequest = TaskRequestProvider.getTaskRequest(1, 1000, 1);
taskScheduler.scheduleOnce(Collections.<TaskRequest>emptyList(), Collections.singletonList(host1));
host1 = LeaseProvider.getLeaseOffer("host1", 4, 4000, 1, 10);
SchedulingResult result = taskScheduler.scheduleOnce(Collections.singletonList(taskRequest), Collections.singletonList(host1));
final Map<String, VMAssignmentResult> resultMap = result.getResultMap();
for(Map.Entry<String, VMAssignmentResult> e: resultMap.entrySet()) {
Assert.assertEquals(1, e.getValue().getLeasesUsed().size());
}
}
}