/*
* Copyright (c) 2012 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.hds.prov.job;
import java.net.URI;
import java.util.concurrent.atomic.AtomicReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.TenantOrg;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.db.client.util.NameGenerator;
import com.emc.storageos.db.exceptions.DatabaseException;
import com.emc.storageos.hds.HDSConstants;
import com.emc.storageos.hds.api.HDSApiClient;
import com.emc.storageos.volumecontroller.TaskCompleter;
import com.emc.storageos.volumecontroller.impl.ControllerServiceImpl;
/**
* A HDS Volume Create job
*/
public class HDSCreateVolumeJob extends HDSAbstractCreateVolumeJob {
private static final Logger log = LoggerFactory.getLogger(HDSCreateVolumeJob.class);
// These atomic references are for use in the volume rename step in processVolume
private static final AtomicReference<NameGenerator> _nameGeneratorRef = new AtomicReference<NameGenerator>();
public HDSCreateVolumeJob(String hdsJob,
URI storageSystem,
URI storagePool,
TaskCompleter taskCompleter) {
super(hdsJob, storageSystem, storagePool, taskCompleter, "CreateSingleVolume");
// Keep a reference to these singletons
_nameGeneratorRef.compareAndSet(null,
(NameGenerator) ControllerServiceImpl.getBean("defaultNameGenerator"));
}
public HDSCreateVolumeJob(String hdsJob,
URI storageSystem,
URI storagePool,
TaskCompleter taskCompleter,
String name) {
super(hdsJob, storageSystem, storagePool, taskCompleter, name);
}
/**
* This simply updates the deviceLabel name for the single volume that was created.
*
* @param dbClient [in] - Client for reading/writing from/to database.
* @param client [in] - HDSAPI Client for accessing HiCommand DM data
* @param volume [in] - Reference to Bourne's Volume object
*/
@Override
void specificProcessing(DbClient dbClient, HDSApiClient client, Volume volume) {
try {
// Get the tenant name from the volume
TenantOrg tenant = dbClient.queryObject(TenantOrg.class, volume.getTenant().getURI());
String tenantName = tenant.getLabel();
// Generate the name, then modify the volume instance
// that was successfully created
if (_nameGeneratorRef.get() == null) {
_nameGeneratorRef.compareAndSet(null,
(NameGenerator) ControllerServiceImpl.getBean("defaultNameGenerator"));
}
String generatedName = _nameGeneratorRef.get().generate(tenantName, volume.getLabel(),
volume.getId().toString(), '-', HDSConstants.MAX_VOLUME_NAME_LENGTH);
changeVolumeName(dbClient, client, volume, generatedName);
} catch (DatabaseException e) {
log.error("Encountered an error while trying to set the volume name", e);
} catch (Exception e) {
log.error("Encountered an error while trying to set the volume name", e);
}
}
}