package com.sequenceiq.cloudbreak.cloud.azure.view;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sequenceiq.cloudbreak.cloud.azure.AzureDiskType;
import com.sequenceiq.cloudbreak.cloud.model.CloudInstance;
import com.sequenceiq.cloudbreak.cloud.model.Group;
import com.sequenceiq.cloudbreak.cloud.model.InstanceTemplate;
public class AzureStackView {
private static final int DEFAULT_FAULT_DOMAIN_COUNTER = 3;
private static final int DEFAULT_UPDATE_DOMAIN_COUNTER = 20;
private Map<String, List<AzureInstanceView>> groups = new HashMap<>();
private List<AzureInstanceGroupView> instanceGroups = new ArrayList<>();
private List<String> instanceGroupNames = new ArrayList<>();
public AzureStackView(String stackName, int stackNamePrefixLength, List<Group> groupList, AzureStorageView armStorageView) {
for (Group group : groupList) {
String groupName = group.getType().name();
List<AzureInstanceView> existingInstances = groups.get(groupName);
if (existingInstances == null) {
existingInstances = new ArrayList<>();
groups.put(groupName, existingInstances);
}
AzureInstanceGroupView instanceGroupView;
Map asMap = group.getParameter("availabilitySet", HashMap.class);
if (asMap != null) {
String asName = (String) asMap.get("name");
Integer faultDomainCount = (asMap != null && asMap.get("faultDomainCount") != null)
? (Integer) asMap.get("faultDomainCount") : DEFAULT_FAULT_DOMAIN_COUNTER;
Integer updateDomainCount = (asMap != null && asMap.get("updateDomainCount") != null)
? (Integer) asMap.get("updateDomainCount") : DEFAULT_UPDATE_DOMAIN_COUNTER;
instanceGroupView = new AzureInstanceGroupView(group.getName(), faultDomainCount, updateDomainCount,
asName);
} else {
instanceGroupView = new AzureInstanceGroupView(group.getName());
}
for (CloudInstance instance : group.getInstances()) {
InstanceTemplate template = instance.getTemplate();
String attachedDiskStorageName = armStorageView.getAttachedDiskStorageName(template);
AzureInstanceView azureInstance = new AzureInstanceView(stackName, stackNamePrefixLength, instance, group.getType(), attachedDiskStorageName,
template.getVolumeType(), group.getName(), instanceGroupView.getAvailabilitySetName());
existingInstances.add(azureInstance);
}
instanceGroupNames.add(group.getName());
instanceGroups.add(instanceGroupView);
}
}
public Map<String, List<AzureInstanceView>> getGroups() {
return groups;
}
public List<AzureInstanceGroupView> getInstanceGroups() {
return instanceGroups;
}
public List<String> getInstanceGroupNames() {
return instanceGroupNames;
}
public Map<String, AzureDiskType> getStorageAccounts() {
Map<String, AzureDiskType> storageAccounts = new HashMap<>();
for (List<AzureInstanceView> list : getGroups().values()) {
for (AzureInstanceView armInstanceView : list) {
storageAccounts.put(armInstanceView.getAttachedDiskStorageName(), AzureDiskType.getByValue(armInstanceView.getAttachedDiskStorageType()));
}
}
return storageAccounts;
}
}