/*******************************************************************************
* Copyright (c) 2015 Red Hat, Inc. Distributed under license by Red Hat, Inc.
* All rights reserved. This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: Red Hat, Inc.
******************************************************************************/
package com.openshift.internal.restclient.model.v1;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.jboss.dmr.ModelNode;
import org.junit.Before;
import org.junit.Test;
import com.openshift.internal.restclient.model.ExecAction;
import com.openshift.internal.restclient.model.Lifecycle;
import com.openshift.internal.restclient.model.Pod;
import com.openshift.internal.restclient.model.Port;
import com.openshift.internal.restclient.model.properties.ResourcePropertiesRegistry;
import com.openshift.restclient.IClient;
import com.openshift.restclient.ResourceKind;
import com.openshift.restclient.model.IContainer;
import com.openshift.restclient.model.IExecAction;
import com.openshift.restclient.model.IPod;
import com.openshift.restclient.model.IPort;
import com.openshift.restclient.utils.Samples;
/**
* @author Jeff Cantrill
*/
public class PodTest {
private static final String VERSION = "v1";
private IPod pod;
@Before
public void setup() {
IClient client = mock(IClient.class);
ModelNode node = ModelNode.fromJSONString(Samples.V1_POD.getContentAsString());
pod = new Pod(node, client, ResourcePropertiesRegistry.getInstance().get(VERSION, ResourceKind.POD));
}
@Test
public void testGetHost() {
assertEquals("127.0.0.1", pod.getHost());
}
@Test
public void testGetStatusPhase() {
assertEquals("Running", pod.getStatus());
}
@Test
public void testGetStatusDeletion() {
((Pod)pod).getNode().get("metadata", "deletionTimestamp").set("2016-11-02T16:31:55Z");
assertEquals(pod.getStatus(), "Terminating");
}
@Test
public void testGetStatusWaitingReason() {
((Pod)pod).getNode().get("status", "containerStatuses").asList().get(0).get("state")
.set("waiting", new ModelNode().set("reason", "ReasonNotToWork"));
assertEquals(pod.getStatus(), "ReasonNotToWork");
}
@Test
public void testGetStatusTerminateReason() {
((Pod)pod).getNode().get("status", "containerStatuses").asList().get(0).get("state")
.set("terminated", new ModelNode().set("reason", "ReasonToTerminate"));
assertEquals(pod.getStatus(), "ReasonToTerminate");
}
/**
* Check that if both reason and exit code are set, status returns the reason.
*/
@Test
public void testGetStatusTerminateReasonAndExit() {
ModelNode node = new ModelNode();
node.get("reason").set("ReasonToTerminate");
node.get("exitCode").set("Let's go! Time to exit!");
((Pod)pod).getNode().get("status", "containerStatuses").asList().get(0).get("state")
.set("terminated", node);
assertEquals(pod.getStatus(), "ReasonToTerminate");
}
@Test
public void testGetStatusTerminatedSignal() {
((Pod)pod).getNode().get("status", "containerStatuses").asList().get(0).get("state")
.set("terminated", new ModelNode().set("signal", "Alarm! Terminate!"));
assertEquals(pod.getStatus(), "Signal: Alarm! Terminate!");
}
/**
* Check that if both signal and exit code are set, status returns the signal.
*/
@Test
public void testGetStatusTerminatedSignalAndExit() {
ModelNode node = new ModelNode();
node.get("signal").set("Alarm! Terminate!");
node.get("exitCode").set("Let's go! Time to exit!");
((Pod)pod).getNode().get("status", "containerStatuses").asList().get(0).get("state")
.set("terminated", node);
assertEquals(pod.getStatus(), "Signal: Alarm! Terminate!");
}
@Test
public void testGetStatusTerminatedExit() {
((Pod)pod).getNode().get("status", "containerStatuses").asList().get(0).get("state")
.set("terminated", new ModelNode().set("exitCode", "Let's go! Time to exit!"));
assertEquals(pod.getStatus(), "Exit Code: Let's go! Time to exit!");
}
@Test
public void testGetImages() {
String [] exp = new String []{"openshift/origin-deployer:v0.6"};
assertArrayEquals(exp, pod.getImages().toArray());
}
@Test
public void getIP() {
assertEquals("1.2.3.4", pod.getIP());
}
@Test
public void getContainerPorts() {
Set<IPort> ports = new HashSet<IPort>();
Port port = new Port(new ModelNode());
port.setName("http");
port.setProtocol("TCP");
port.setContainerPort(8080);
ports.add(port);
assertEquals(ports, pod.getContainerPorts());
}
@Test
public void testAddContainer() {
Collection<IContainer> initial = pod.getContainers();
IContainer foo = pod.addContainer("foo");
foo.setLifecycle(new Lifecycle.Builder()
.preStop(new ExecAction.Builder()
.command("cmd1")
.command("cmd2")
.build())
.build());
Collection<IContainer> containers = pod.getContainers();
assertEquals(initial.size() + 1, containers.size());
Optional<IContainer> container = containers.stream().filter(c->"foo".equals(c.getName()) && "cmd1".equals(((IExecAction)c.getLifecycle().getPreStop().get()).getCommand().get(0))).findFirst();
assertTrue("Exp. the container to be added", container.isPresent());
}
@Test
public void getContainerCommands() {
Collection<IContainer> containers = pod.getContainers();
IContainer container = containers.iterator().next();
List<String> cmd = container.getCommand();
List<String> cmdArgs = container.getCommandArgs();
assertEquals(cmd.get(0),"/bin/sh");
assertEquals(cmdArgs.get(0), "-c");
assertEquals(cmdArgs.get(1), "echo 'hello'");
}
}