selectedVol = _netappAllocator.chooseLeastFullVolumeFromPool(poolName, lunSize);
}
if (selectedVol == null) {
throw new ServerException("Could not find a suitable volume to create lun on");
}
if (s_logger.isDebugEnabled())
s_logger.debug("Request --> createLun " + "serverIp:" + selectedVol.getIpAddress());
StringBuilder exportPath = new StringBuilder("/vol/");
exportPath.append(selectedVol.getVolumeName());
exportPath.append("/");
lun = new LunVO(exportPath.toString(), selectedVol.getId(), lunSize, "", "");
lun = _lunDao.persist(lun);
//Lun id created: 6 digits right justified eg. 000045
String lunIdStr = String.valueOf(lun.getId());
String zeroStr = "000000";
int length = lunIdStr.length();
int offset = 6 - length;
StringBuilder lunIdOnPath = new StringBuilder();
lunIdOnPath.append(zeroStr.substring(0, offset));
lunIdOnPath.append(lunIdStr);
exportPath.append("lun-").append(lunIdOnPath.toString());
lunName.append(lunIdOnPath.toString());
//update lun name
lun.setLunName(lunName.toString());
_lunDao.update(lun.getId(), lun);
NaElement xi;
NaElement xi1;
long lSizeBytes = 1L * lunSize * 1024 * 1024 * 1024; //This prevents integer overflow
Long lunSizeBytes = new Long(lSizeBytes);
s = getServer(selectedVol.getIpAddress(), selectedVol.getUsername(), selectedVol.getPassword());
//create lun
xi = new NaElement("lun-create-by-size");
xi.addNewChild("ostype", "linux");
xi.addNewChild("path", exportPath.toString());
xi.addNewChild("size", (lunSizeBytes.toString()));
s.invokeElem(xi);
try {
//now create an igroup
xi1 = new NaElement("igroup-create");
xi1.addNewChild("initiator-group-name", lunName.toString());
xi1.addNewChild("initiator-group-type", "iscsi");
xi1.addNewChild("os-type", "linux");
s.invokeElem(xi1);
} catch (NaAPIFailedException e) {
if (e.getErrno() == 9004) {
//igroup already exists hence no error
s_logger.warn("Igroup already exists");
}
}
//get target iqn
NaElement xi4 = new NaElement("iscsi-node-get-name");
NaElement xo = s.invokeElem(xi4);
String iqn = xo.getChildContent("node-name");
lun.setTargetIqn(iqn);
_lunDao.update(lun.getId(), lun);
//create lun mapping
//now map the lun to the igroup
NaElement xi3 = new NaElement("lun-map");
xi3.addNewChild("force", "true");
xi3.addNewChild("initiator-group", lunName.toString());
xi3.addNewChild("path", lun.getPath() + lun.getLunName());
xi3.addNewChild("lun-id", lunIdStr);
s.invokeElem(xi3);
txn.commit();
//set the result
result[0] = lunName.toString();//lunname
result[1] = iqn;//iqn
result[2] = selectedVol.getIpAddress();
return result;
} catch (NaAPIFailedException naf) {
if (naf.getErrno() == 9023) { //lun is already mapped to this group
result[0] = lunName.toString();//lunname;
result[1] = lun.getTargetIqn();//iqn
result[2] = selectedVol.getIpAddress();
return result;
}
if (naf.getErrno() == 9024) { //another lun mapped at this group
result[0] = lunName.toString();//lunname;
result[1] = lun.getTargetIqn();//iqn
result[2] = selectedVol.getIpAddress();
return result;
}
} catch (NaException nae) {
txn.rollback();
throw new ServerException("Unable to create LUN", nae);
} catch (IOException ioe) {
txn.rollback();
throw new ServerException("Unable to create LUN", ioe);
} finally {
if (pool != null) {
_poolDao.releaseFromLockTable(pool.getId());
}
if (s != null) {