Long osTypeId = cmd.getOsTypeId();
String osStdName = cmd.getOsStdName();
String hypervisor = cmd.getHypervisor();
String hypervisorVersion = cmd.getHypervisorVersion();
String osNameForHypervisor = cmd.getOsNameForHypervisor();
GuestOS guestOs = null;
if ((osTypeId == null) && (osStdName == null || osStdName.isEmpty())) {
throw new InvalidParameterValueException("Please specify either a guest OS name or UUID");
}
HypervisorType hypervisorType = HypervisorType.getType(hypervisor);
if (!(hypervisorType == HypervisorType.KVM || hypervisorType == HypervisorType.XenServer || hypervisorType == HypervisorType.VMware)) {
throw new InvalidParameterValueException("Please specify a valid hypervisor : XenServer, KVM or VMware");
}
HypervisorCapabilitiesVO hypervisorCapabilities = _hypervisorCapabilitiesDao.findByHypervisorTypeAndVersion(hypervisorType, hypervisorVersion);
if (hypervisorCapabilities == null) {
throw new InvalidParameterValueException("Please specify a valid hypervisor and supported version");
}
//by this point either osTypeId or osStdType is non-empty. Find by either of them. ID takes preference if both are specified
if (osTypeId != null) {
guestOs = ApiDBUtils.findGuestOSById(osTypeId);
}
else if (osStdName != null) {
guestOs = ApiDBUtils.findGuestOSByDisplayName(osStdName);
}
if (guestOs == null) {
throw new InvalidParameterValueException("Unable to find the guest OS by name or UUID");
}
//check for duplicates
GuestOSHypervisorVO duplicate = _guestOSHypervisorDao.findByOsIdAndHypervisorAndUserDefined(guestOs.getId(), hypervisorType.toString(), hypervisorVersion, true);
if (duplicate != null) {
throw new InvalidParameterValueException("Mapping from hypervisor : " + hypervisorType.toString() + ", version : " + hypervisorVersion + " and guest OS : "
+ guestOs.getDisplayName() + " already exists!");
}
GuestOSHypervisorVO guestOsMapping = new GuestOSHypervisorVO();
guestOsMapping.setGuestOsId(guestOs.getId());
guestOsMapping.setGuestOsName(osNameForHypervisor);
guestOsMapping.setHypervisorType(hypervisorType.toString());
guestOsMapping.setHypervisorVersion(hypervisorVersion);
guestOsMapping.setIsUserDefined(true);
return _guestOSHypervisorDao.persist(guestOsMapping);