1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.node.admin.integrationTests;
import com.yahoo.metrics.simple.MetricReceiver;
import com.yahoo.vespa.hosted.dockerapi.ContainerName;
import com.yahoo.vespa.hosted.dockerapi.Docker;
import com.yahoo.vespa.hosted.dockerapi.DockerImage;
import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper;
import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec;
import com.yahoo.vespa.hosted.node.admin.docker.DockerOperationsImpl;
import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdmin;
import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminImpl;
import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater;
import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgent;
import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.provision.Node;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.Optional;
import java.util.function.Function;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
/**
* @author valerijf
*/
public class DockerFailTest {
private CallOrderVerifier callOrder;
private Docker dockerMock;
private NodeAdminStateUpdater updater;
private ContainerNodeSpec initialContainerNodeSpec;
@Before
public void before() throws InterruptedException, UnknownHostException {
callOrder = new CallOrderVerifier();
MaintenanceSchedulerMock maintenanceSchedulerMock = new MaintenanceSchedulerMock(callOrder);
OrchestratorMock orchestratorMock = new OrchestratorMock(callOrder);
NodeRepoMock nodeRepositoryMock = new NodeRepoMock(callOrder);
dockerMock = new DockerMock(callOrder);
Environment environment = mock(Environment.class);
when(environment.getConfigServerHosts()).thenReturn(Collections.emptySet());
when(environment.getInetAddressForHost(any(String.class))).thenReturn(InetAddress.getByName("1.1.1.1"));
Function<String, NodeAgent> nodeAgentFactory = (hostName) ->
new NodeAgentImpl(hostName, nodeRepositoryMock, orchestratorMock, new DockerOperationsImpl(dockerMock, environment), maintenanceSchedulerMock);
NodeAdmin nodeAdmin = new NodeAdminImpl(dockerMock, nodeAgentFactory, maintenanceSchedulerMock, 100,
new MetricReceiverWrapper(MetricReceiver.nullImplementation));
initialContainerNodeSpec = new ContainerNodeSpec(
"hostName",
Optional.of(new DockerImage("dockerImage")),
new ContainerName("container"),
Node.State.active,
"tenant",
"docker",
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.of(1L),
Optional.of(1L),
Optional.of(1d),
Optional.of(1d),
Optional.of(1d));
nodeRepositoryMock.addContainerNodeSpec(initialContainerNodeSpec);
updater = new NodeAdminStateUpdater(nodeRepositoryMock, nodeAdmin, 1, 1, orchestratorMock, "basehostname");
// Wait for node admin to be notified with node repo state and the docker container has been started
while (nodeAdmin.getListOfHosts().size() == 0) {
Thread.sleep(10);
}
assert callOrder.verifyInOrder(1000,
"createContainerCommand with DockerImage: DockerImage { imageId=dockerImage }, HostName: hostName, ContainerName: ContainerName { name=container }",
"executeInContainer with ContainerName: ContainerName { name=container }, args: [/usr/bin/env, test, -x, /opt/yahoo/vespa/bin/vespa-nodectl]",
"executeInContainer with ContainerName: ContainerName { name=container }, args: [/opt/yahoo/vespa/bin/vespa-nodectl, resume]");
}
@After
public void after() {
updater.deconstruct();
}
@Test
public void dockerFailTest() throws InterruptedException {
dockerMock.deleteContainer(initialContainerNodeSpec.containerName);
assertTrue(callOrder.verifyInOrder(1000,
"deleteContainer with ContainerName: ContainerName { name=container }",
"createContainerCommand with DockerImage: DockerImage { imageId=dockerImage }, HostName: hostName, ContainerName: ContainerName { name=container }",
"executeInContainer with ContainerName: ContainerName { name=container }, args: [/usr/bin/env, test, -x, /opt/yahoo/vespa/bin/vespa-nodectl]",
"executeInContainer with ContainerName: ContainerName { name=container }, args: [/opt/yahoo/vespa/bin/vespa-nodectl, resume]"));
}
}
|