use of org.candlepin.resource.dto.HypervisorCheckInResult in project candlepin by candlepin.
the class HypervisorResourceTest method hypervisorCheckInCreatesNewConsumer.
@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
@Test
public void hypervisorCheckInCreatesNewConsumer() throws Exception {
Owner owner = new Owner("admin");
owner.setId("test-id");
Map<String, List<GuestIdDTO>> hostGuestMap = new HashMap<>();
hostGuestMap.put("test-host", new ArrayList(Arrays.asList(TestUtil.createGuestIdDTO("GUEST_A"), TestUtil.createGuestIdDTO("GUEST_B"))));
when(ownerCurator.lookupByKey(eq(owner.getKey()))).thenReturn(owner);
when(consumerCurator.getHostConsumersMap(any(Owner.class), any(Set.class))).thenReturn(new VirtConsumerMap());
when(consumerCurator.getGuestConsumersMap(any(String.class), any(Set.class))).thenReturn(new VirtConsumerMap());
when(ownerCurator.lookupByKey(eq(owner.getKey()))).thenReturn(owner);
when(principal.canAccess(eq(owner), eq(SubResource.CONSUMERS), eq(Access.CREATE))).thenReturn(true);
when(idCertService.generateIdentityCert(any(Consumer.class))).thenReturn(new IdentityCertificate());
HypervisorCheckInResult result = hypervisorResource.hypervisorUpdate(hostGuestMap, principal, owner.getKey(), true);
Set<Consumer> created = result.getCreated();
assertEquals(1, created.size());
Consumer c1 = created.iterator().next();
assertEquals("test-host", c1.getHypervisorId().getHypervisorId());
assertEquals(2, c1.getGuestIds().size());
assertEquals("GUEST_A", c1.getGuestIds().get(0).getGuestId());
assertEquals("GUEST_B", c1.getGuestIds().get(1).getGuestId());
assertEquals("x86_64", c1.getFact("uname.machine"));
assertEquals(this.hypervisorType.getId(), c1.getTypeId());
}
use of org.candlepin.resource.dto.HypervisorCheckInResult in project candlepin by candlepin.
the class HypervisorResourceTest method treatNullGuestListsAsEmptyGuestLists.
@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
@Test
public void treatNullGuestListsAsEmptyGuestLists() throws Exception {
Owner owner = new Owner("admin");
Map<String, List<GuestIdDTO>> hostGuestMap = new HashMap<>();
hostGuestMap.put("HYPERVISOR_A", null);
when(ownerCurator.lookupByKey(eq(owner.getKey()))).thenReturn(owner);
when(consumerCurator.getHostConsumersMap(any(Owner.class), any(Set.class))).thenReturn(new VirtConsumerMap());
when(consumerCurator.getGuestConsumersMap(any(String.class), any(Set.class))).thenReturn(new VirtConsumerMap());
when(principal.canAccess(eq(owner), eq(SubResource.CONSUMERS), eq(Access.CREATE))).thenReturn(true);
when(idCertService.generateIdentityCert(any(Consumer.class))).thenReturn(new IdentityCertificate());
HypervisorCheckInResult result = hypervisorResource.hypervisorUpdate(hostGuestMap, principal, owner.getKey(), true);
assertNotNull(result);
assertNotNull(result.getCreated());
List<Consumer> created = new ArrayList<>(result.getCreated());
assertEquals(1, created.size());
List<GuestId> gids = created.get(0).getGuestIds();
assertEquals(0, gids.size());
}
use of org.candlepin.resource.dto.HypervisorCheckInResult in project candlepin by candlepin.
the class HypervisorResource method hypervisorUpdate.
/**
* @deprecated Use the asynchronous method
* @return HypervisorCheckInResult
*/
@ApiOperation(notes = "Updates the list of Hypervisor Guests Allows agents such as " + "virt-who to update its host list and associate the guests for each host. This is " + "typically used when a host is unable to register to candlepin via subscription" + " manager. In situations where consumers already exist it is probably best not " + "to allow creation of new hypervisor consumers. Most consumers do not have a" + " hypervisorId attribute, so that should be added manually when necessary by the " + "management environment. @deprecated Use the asynchronous method", value = "hypervisorUpdate")
@ApiResponses({ @ApiResponse(code = 202, message = "") })
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Deprecated
@Transactional
@UpdateConsumerCheckIn
@SuppressWarnings("checkstyle:indentation")
public HypervisorCheckInResult hypervisorUpdate(Map<String, List<GuestIdDTO>> hostGuestDTOMap, @Context Principal principal, @QueryParam("owner") @Verify(value = Owner.class, require = Access.READ_ONLY, subResource = SubResource.HYPERVISOR) String ownerKey, @ApiParam("specify whether or not to create missing hypervisors." + "Default is true. If false is specified, hypervisorIds that are not found" + "will result in failed entries in the resulting HypervisorCheckInResult") @QueryParam("create_missing") @DefaultValue("true") boolean createMissing) {
log.debug("Hypervisor check-in by principal: {}", principal);
if (hostGuestDTOMap == null) {
log.debug("Host/Guest mapping provided during hypervisor checkin was null.");
throw new BadRequestException(i18n.tr("Host to guest mapping was not provided for hypervisor check-in."));
}
Owner owner = this.getOwner(ownerKey);
if (owner.isAutobindDisabled()) {
log.debug("Could not update host/guest mapping. Auto-attach is disabled for owner {}", owner.getKey());
throw new BadRequestException(i18n.tr("Could not update host/guest mapping. Auto-attach is disabled for owner {0}.", owner.getKey()));
}
if (hostGuestDTOMap.remove("") != null) {
log.warn("Ignoring empty hypervisor id");
}
// Maps virt hypervisor ID to registered consumer for that hypervisor, should one exist:
VirtConsumerMap hypervisorConsumersMap = consumerCurator.getHostConsumersMap(owner, hostGuestDTOMap.keySet());
int emptyGuestIdCount = 0;
Set<String> allGuestIds = new HashSet<>();
Collection<List<GuestIdDTO>> idsLists = hostGuestDTOMap.values();
for (List<GuestIdDTO> guestIds : idsLists) {
// See bzs 1332637, 1332635
if (guestIds == null) {
continue;
}
for (Iterator<GuestIdDTO> guestIdsItr = guestIds.iterator(); guestIdsItr.hasNext(); ) {
String id = guestIdsItr.next().getGuestId();
if (StringUtils.isEmpty(id)) {
emptyGuestIdCount++;
guestIdsItr.remove();
} else {
allGuestIds.add(id);
}
}
}
if (emptyGuestIdCount > 0) {
log.warn("Ignoring {} empty/null guest id(s).", emptyGuestIdCount);
}
HypervisorCheckInResult result = new HypervisorCheckInResult();
for (Entry<String, List<GuestIdDTO>> hostEntry : hostGuestDTOMap.entrySet()) {
String hypervisorId = hostEntry.getKey();
// See bzs 1332637, 1332635
if (hostEntry.getValue() == null) {
hostEntry.setValue(new ArrayList<>());
}
try {
log.debug("Syncing virt host: {} ({} guest IDs)", hypervisorId, hostEntry.getValue().size());
boolean hostConsumerCreated = false;
boolean updatedType = false;
// Attempt to find a consumer for the given hypervisorId
Consumer consumer = null;
if (hypervisorConsumersMap.get(hypervisorId) == null) {
if (!createMissing) {
log.info("Unable to find hypervisor with id {} in org {}", hypervisorId, ownerKey);
result.failed(hypervisorId, i18n.tr("Unable to find hypervisor in org \"{0}\"", ownerKey));
continue;
}
log.debug("Registering new host consumer for hypervisor ID: {}", hypervisorId);
consumer = createConsumerForHypervisorId(hypervisorId, owner, principal);
hostConsumerCreated = true;
} else {
consumer = hypervisorConsumersMap.get(hypervisorId);
if (!hypervisorType.getId().equals(consumer.getTypeId())) {
consumer.setType(hypervisorType);
updatedType = true;
}
}
List<GuestId> guestIds = new ArrayList<>();
guestIdResource.populateEntities(guestIds, hostEntry.getValue());
boolean guestIdsUpdated = addGuestIds(consumer, guestIds);
Date now = new Date();
consumerCurator.updateLastCheckin(consumer, now);
consumer.setLastCheckin(now);
// Populate the result with the processed consumer.
if (hostConsumerCreated) {
result.created(consumer);
} else if (guestIdsUpdated || updatedType) {
result.updated(consumer);
} else {
result.unchanged(consumer);
}
} catch (Exception e) {
log.error("Hypervisor checkin failed", e);
result.failed(hypervisorId, e.getMessage());
}
}
log.info("Summary of hypervisor checkin by principal \"{}\": {}", principal, result);
return result;
}
Aggregations