/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.sa.service.vipr.block.tasks; import java.util.List; import java.util.Set; import com.emc.sa.service.vipr.block.BlockStorageUtils; import com.emc.sa.service.vipr.block.CreateBlockVolumeHelper; import com.emc.sa.service.vipr.tasks.WaitForTasks; import com.emc.storageos.model.block.VolumeCreate; import com.emc.storageos.model.block.VolumeRestRep; import com.emc.vipr.client.Tasks; import com.emc.vipr.client.exceptions.ServiceErrorException; import com.google.common.base.Joiner; import com.google.common.collect.Sets; /** * Task that will create multiple block volumes in parallel. Executes a single create volume API * call for each CreateBlockVolumeHelper instance and returns tasks for all volumes that are created. */ public class CreateMultipleBlockVolumes extends WaitForTasks<VolumeRestRep> { private final List<? extends CreateBlockVolumeHelper> helpers; public CreateMultipleBlockVolumes(List<? extends CreateBlockVolumeHelper> helpers) { this.helpers = helpers; if (!helpers.isEmpty()) { CreateBlockVolumeHelper helper = helpers.get(0); provideDetailArgs(helper.getVirtualPool(), helper.getVirtualArray(), helper.getProject(), getDetails(helpers)); } } @Override public Tasks<VolumeRestRep> doExecute() throws Exception { Set<String> errorMessages = Sets.newHashSet(); Tasks<VolumeRestRep> tasks = null; for (CreateBlockVolumeHelper param : helpers) { String volumeSize = BlockStorageUtils.gbToVolumeSize(param.getSizeInGb()); VolumeCreate create = new VolumeCreate(); create.setVpool(param.getVirtualPool()); create.setVarray(param.getVirtualArray()); create.setProject(param.getProject()); create.setName(param.getName()); create.setSize(volumeSize); create.setComputeResource(param.getComputeResource()); int numberOfVolumes = 1; if ((param.getCount() != null) && (param.getCount() > 1)) { numberOfVolumes = param.getCount(); } create.setCount(numberOfVolumes); create.setConsistencyGroup(param.getConsistencyGroup()); try { if (tasks == null) { tasks = getClient().blockVolumes().create(create); } else { tasks.getTasks().addAll(getClient().blockVolumes().create(create).getTasks()); } } catch (ServiceErrorException ex) { errorMessages.add(ex.getDetailedMessage()); logError(getMessage("CreateMultipleBlockVolumes.getTask.error", create.getName(), ex.getDetailedMessage())); } } if (tasks == null) { throw stateException("CreateMultipleBlockVolumes.illegalState.invalid", Joiner.on('\n').join(errorMessages)); } return tasks; } private String getDetails(List<? extends CreateBlockVolumeHelper> helpers) { String result = ""; for (CreateBlockVolumeHelper helper : helpers) { result += String.format("[Name: %s, Size: %s, Count: %s] ", helper.getName(), helper.getSizeInGb(), helper.getCount()); } result = result.trim(); return result; } }