package org.csanchez.jenkins.plugins.kubernetes;
import com.google.common.base.Preconditions;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import hudson.model.Label;
import hudson.model.labels.LabelAtom;
import jenkins.model.Jenkins;
import static org.junit.Assert.*;
import static org.csanchez.jenkins.plugins.kubernetes.PodTemplateUtils.*;
import static org.mockito.Matchers.anyString;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Jenkins.class})
public class PodTemplateUtilsTest {
private static final PodImagePullSecret SECRET_1 = new PodImagePullSecret("secret1");
private static final PodImagePullSecret SECRET_2 = new PodImagePullSecret("secret2");
private static final PodImagePullSecret SECRET_3 = new PodImagePullSecret("secret3");
private static final ContainerTemplate JNLP_1 = new ContainerTemplate("jnlp", "jnlp:1");
private static final ContainerTemplate JNLP_2 = new ContainerTemplate("jnlp", "jnlp:2");
private static final ContainerTemplate MAVEN_1 = new ContainerTemplate("maven", "maven:1", "sh -c", "cat");
private static final ContainerTemplate MAVEN_2 = new ContainerTemplate("maven", "maven:2");
private static final ContainerTemplate GOLANG_1 = new ContainerTemplate("golang", "golang:1");
private static final PodTemplate TEMPLATE_1 = new PodTemplate();
@Mock
private Jenkins jenkins;
@Before
public void setUp() {
PowerMockito.mockStatic(Jenkins.class);
PowerMockito.when(Jenkins.getInstance()).thenReturn(jenkins);
Answer<Label> labeler = invocation -> {
Preconditions.checkArgument(invocation != null && invocation.getArguments().length == 1 && invocation.getArguments()[0] instanceof String);
return new LabelAtom((String)invocation.getArguments()[0]);
};
PowerMockito.doAnswer(labeler).when(jenkins).getLabel(anyString());
PowerMockito.doAnswer(labeler).when(jenkins).getLabelAtom(anyString());
}
@Test
public void shouldReturnContainerTemplateWhenParentIsNull() {
ContainerTemplate result = combine(null, JNLP_2);
assertEquals(result, JNLP_2);
}
@Test
public void shouldOverrideTheImageAndInheritTheRest() {
ContainerTemplate result = combine(MAVEN_1, MAVEN_2);
assertEquals("maven:2", result.getImage());
assertEquals("cat", result.getArgs());
}
@Test
public void shouldReturnPodTemplateWhenParentIsNull() {
PodTemplate template = new PodTemplate();
template.setName("template");
template.setServiceAccount("sa1");
PodTemplate result = combine(null, template);
assertEquals(result, template);
}
@Test
public void shouldOverrideServiceAccountIfSpecified() {
PodTemplate parent = new PodTemplate();
parent.setName("parent");
parent.setServiceAccount("sa");
PodTemplate template1 = new PodTemplate();
template1.setName("template1");
template1.setServiceAccount("sa1");
PodTemplate template2 = new PodTemplate();
template1.setName("template2");
PodTemplate result = combine(parent, template1);
assertEquals("sa1", result.getServiceAccount());
result = combine(parent, template2);
assertEquals("sa", result.getServiceAccount());
}
@Test
public void shouldOverrideNodeSelectorIfSpecified() {
PodTemplate parent = new PodTemplate();
parent.setName("parent");
parent.setNodeSelector("key:value");
PodTemplate template1 = new PodTemplate();
template1.setName("template1");
template1.setNodeSelector("key:value1");
PodTemplate template2 = new PodTemplate();
template2.setName("template2");
PodTemplate result = combine(parent, template1);
assertEquals("key:value1", result.getNodeSelector());
result = combine(parent, template2);
assertEquals("key:value", result.getNodeSelector());
}
@Test
public void shouldCombineAllImagePullSecrets() {
PodTemplate parent = new PodTemplate();
parent.setName("parent");
parent.setNodeSelector("key:value");
parent.setImagePullSecrets(Arrays.asList(SECRET_1));
PodTemplate template1 = new PodTemplate();
template1.setName("template1");
template1.setImagePullSecrets(Arrays.asList(SECRET_1, SECRET_2, SECRET_3));
PodTemplate template2 = new PodTemplate();
template2.setName("template2");
template2.setImagePullSecrets(Arrays.asList(SECRET_2, SECRET_3));
PodTemplate template3 = new PodTemplate();
template3.setName("template3");
PodTemplate result = combine(parent, template1);
assertEquals(3, result.getImagePullSecrets().size());
result = combine(parent, template2);
assertEquals(3, result.getImagePullSecrets().size());
result = combine(parent, template3);
assertEquals(1, result.getImagePullSecrets().size());
}
@Test
public void shouldUnwrapParent() {
PodTemplate parent = new PodTemplate();
parent.setName("parent");
parent.setLabel("parent");
parent.setServiceAccount("sa");
parent.setNodeSelector("key:value");
parent.setImagePullSecrets(Arrays.asList(SECRET_1));
PodTemplate template1 = new PodTemplate();
template1.setName("template1");
template1.setInheritFrom("parent");
template1.setServiceAccount("sa1");
template1.setImagePullSecrets(Arrays.asList(SECRET_2, SECRET_3));
PodTemplate result = unwrap(template1, Arrays.asList(parent, template1));
assertEquals(3, result.getImagePullSecrets().size());
assertEquals("sa1", result.getServiceAccount());
assertEquals("key:value", result.getNodeSelector());
}
@Test
public void shouldUnwrapMultipleParents() {
PodTemplate parent = new PodTemplate();
parent.setName("parent");
parent.setLabel("parent");
parent.setServiceAccount("sa");
parent.setNodeSelector("key:value");
parent.setImagePullSecrets(Arrays.asList(SECRET_1));
parent.setContainers(Arrays.asList(JNLP_1, MAVEN_2));
PodTemplate template1 = new PodTemplate();
template1.setName("template1");
template1.setLabel("template1");
template1.setInheritFrom("parent");
template1.setServiceAccount("sa1");
template1.setImagePullSecrets(Arrays.asList(SECRET_2));
template1.setContainers(Arrays.asList(JNLP_2));
PodTemplate template2 = new PodTemplate();
template2.setName("template2");
template2.setLabel("template2");
template2.setImagePullSecrets(Arrays.asList(SECRET_3));
template2.setContainers(Arrays.asList(MAVEN_2));
PodTemplate toUnwrap = new PodTemplate();
toUnwrap.setName("toUnwrap");
toUnwrap.setInheritFrom("template1 template2");
PodTemplate result = unwrap(toUnwrap, Arrays.asList(parent, template1, template2));
assertEquals(3, result.getImagePullSecrets().size());
assertEquals("sa1", result.getServiceAccount());
assertEquals("key:value", result.getNodeSelector());
assertEquals(2, result.getContainers().size());
ContainerTemplate mavenTemplate = result.getContainers().stream().filter(c -> c.getName().equals("maven")).findFirst().orElse(null);
assertNotNull(mavenTemplate);
assertEquals("maven:2", mavenTemplate.getImage());
}
}