package com.sequenceiq.cloudbreak.converter;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;
import com.sequenceiq.cloudbreak.TestUtil;
import com.sequenceiq.cloudbreak.api.model.CloudbreakDetailsJson;
import com.sequenceiq.cloudbreak.api.model.ClusterResponse;
import com.sequenceiq.cloudbreak.api.model.CredentialResponse;
import com.sequenceiq.cloudbreak.api.model.FailurePolicyResponse;
import com.sequenceiq.cloudbreak.api.model.ImageJson;
import com.sequenceiq.cloudbreak.api.model.InstanceGroupRequest;
import com.sequenceiq.cloudbreak.api.model.NetworkResponse;
import com.sequenceiq.cloudbreak.api.model.OrchestratorResponse;
import com.sequenceiq.cloudbreak.api.model.StackResponse;
import com.sequenceiq.cloudbreak.cloud.model.AmbariDatabase;
import com.sequenceiq.cloudbreak.cloud.model.AmbariRepo;
import com.sequenceiq.cloudbreak.cloud.model.CloudbreakDetails;
import com.sequenceiq.cloudbreak.cloud.model.HDPRepo;
import com.sequenceiq.cloudbreak.cloud.model.Image;
import com.sequenceiq.cloudbreak.cloud.model.StackTemplate;
import com.sequenceiq.cloudbreak.common.type.ResourceType;
import com.sequenceiq.cloudbreak.core.CloudbreakImageNotFoundException;
import com.sequenceiq.cloudbreak.domain.Cluster;
import com.sequenceiq.cloudbreak.domain.FailurePolicy;
import com.sequenceiq.cloudbreak.domain.Network;
import com.sequenceiq.cloudbreak.domain.Orchestrator;
import com.sequenceiq.cloudbreak.domain.Resource;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.service.ClusterComponentConfigProvider;
import com.sequenceiq.cloudbreak.service.ComponentConfigProvider;
import com.sequenceiq.cloudbreak.service.image.ImageService;
public class StackToJsonConverterTest extends AbstractEntityConverterTest<Stack> {
@InjectMocks
private StackToJsonConverter underTest;
@Mock
private ConversionService conversionService;
@Mock
private ImageService imageService;
@Mock
private ClusterComponentConfigProvider clusterComponentConfigProvider;
@Mock
private ComponentConfigProvider componentConfigProvider;
@Before
public void setUp() throws CloudbreakImageNotFoundException {
underTest = new StackToJsonConverter();
MockitoAnnotations.initMocks(this);
when(imageService.getImage(anyLong())).thenReturn(new Image("testimage", new HashMap<>()));
when(componentConfigProvider.getCloudbreakDetails(anyLong())).thenReturn(new CloudbreakDetails("version"));
when(componentConfigProvider.getStackTemplate(anyLong())).thenReturn(new StackTemplate("{}", "version"));
when(clusterComponentConfigProvider.getHDPRepo(anyLong())).thenReturn(new HDPRepo());
when(clusterComponentConfigProvider.getAmbariDatabase(anyLong())).thenReturn(new AmbariDatabase());
when(clusterComponentConfigProvider.getAmbariRepo(anyLong())).thenReturn(new AmbariRepo());
}
@Test
public void testConvert() {
// GIVEN
given(conversionService.convert(any(Object.class), any(Class.class)))
.willReturn(new ImageJson())
.willReturn(new CredentialResponse())
.willReturn(new ClusterResponse())
.willReturn(new FailurePolicyResponse())
.willReturn(new NetworkResponse())
.willReturn(new OrchestratorResponse())
.willReturn(new CloudbreakDetailsJson());
given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class)))
.willReturn(new HashSet<InstanceGroupRequest>());
// WHEN
StackResponse result = underTest.convert(getSource());
// THEN
assertAllFieldsNotNull(result, Arrays.asList("platformVariant", "ambariVersion", "hdpVersion", "flexSubscription"));
}
@Test
public void testConvertWithoutCredential() {
// GIVEN
given(conversionService.convert(any(Object.class), any(Class.class)))
.willReturn(new ImageJson())
.willReturn(new CredentialResponse())
.willReturn(new ClusterResponse())
.willReturn(new FailurePolicyResponse())
.willReturn(new NetworkResponse())
.willReturn(new OrchestratorResponse())
.willReturn(new CredentialResponse());
given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class)))
.willReturn(new HashSet<InstanceGroupRequest>());
// WHEN
StackResponse result = underTest.convert(getSource());
// THEN
assertAllFieldsNotNull(result, Arrays.asList("credentialId", "cloudPlatform", "platformVariant", "ambariVersion", "hdpVersion",
"stackTemplate", "cloudbreakDetails", "flexSubscription"));
}
@Test
public void testConvertWithoutCluster() {
// GIVEN
getSource().setCluster(null);
given(conversionService.convert(any(Object.class), any(Class.class)))
.willReturn(new ImageJson())
.willReturn(new CredentialResponse())
.willReturn(new FailurePolicyResponse())
.willReturn(new NetworkResponse())
.willReturn(new OrchestratorResponse())
.willReturn(new CloudbreakDetailsJson());
given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class)))
.willReturn(new HashSet<InstanceGroupRequest>());
getSource().setCluster(null);
// WHEN
StackResponse result = underTest.convert(getSource());
// THEN
assertAllFieldsNotNull(result, Arrays.asList("cluster", "platformVariant", "ambariVersion", "hdpVersion", "flexSubscription"));
}
@Test
public void testConvertWithoutFailurePolicy() {
// GIVEN
getSource().setFailurePolicy(null);
given(conversionService.convert(any(Object.class), any(Class.class)))
.willReturn(new ImageJson())
.willReturn(new CredentialResponse())
.willReturn(new ClusterResponse())
.willReturn(new NetworkResponse())
.willReturn(new OrchestratorResponse())
.willReturn(new CloudbreakDetailsJson())
.willReturn(new CredentialResponse())
.willReturn(new NetworkResponse());
given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class)))
.willReturn(new HashSet<InstanceGroupRequest>());
// WHEN
StackResponse result = underTest.convert(getSource());
// THEN
assertAllFieldsNotNull(result, Arrays.asList("failurePolicy", "platformVariant", "ambariVersion", "hdpVersion", "stackTemplate",
"cloudbreakDetails", "flexSubscription"));
}
@Test
public void testConvertWithoutNetwork() {
// GIVEN
getSource().setNetwork(null);
given(conversionService.convert(any(Object.class), any(Class.class)))
.willReturn(new ImageJson())
.willReturn(new CredentialResponse())
.willReturn(new ClusterResponse())
.willReturn(new FailurePolicyResponse())
.willReturn(new OrchestratorResponse())
.willReturn(new CloudbreakDetailsJson());
given(conversionService.convert(any(Object.class), any(TypeDescriptor.class), any(TypeDescriptor.class)))
.willReturn(new HashSet<InstanceGroupRequest>());
// WHEN
StackResponse result = underTest.convert(getSource());
// THEN
assertAllFieldsNotNull(result, Arrays.asList("networkId", "platformVariant", "ambariVersion", "hdpVersion", "network", "flexSubscription"));
}
@Override
public Stack createSource() {
Stack stack = TestUtil.stack();
Cluster cluster = TestUtil.cluster(TestUtil.blueprint(), stack, 1L);
stack.setCluster(cluster);
stack.setAvailabilityZone("avZone");
Network network = new Network();
network.setId(1L);
stack.setNetwork(network);
stack.setFailurePolicy(new FailurePolicy());
Orchestrator orchestrator = new Orchestrator();
orchestrator.setId(1L);
orchestrator.setApiEndpoint("endpoint");
orchestrator.setType("type");
stack.setOrchestrator(orchestrator);
stack.setParameters(new HashMap<>());
stack.setCloudPlatform("OPENSTACK");
stack.setGatewayPort(9443);
Resource s3ArnResource = new Resource(ResourceType.S3_ACCESS_ROLE_ARN, "s3Arn", stack);
stack.setResources(Collections.singleton(s3ArnResource));
return stack;
}
}