/** * Creates a MachineDetails for the given location by SSHing to the machine and * running a Bash script to gather data. Should only be called from within a * task context. If this might not be the case then use {@link * #taskForSshMachineLocation(SshMachineLocation)} instead. */ @Beta public static BasicMachineDetails forSshMachineLocationLive(SshMachineLocation location) { return TaskTags.markInessential(DynamicTasks.queueIfPossible(taskForSshMachineLocation(location)) .orSubmitAsync() .asTask()) .getUnchecked(); }
protected MachineDetails inferMachineDetails() { boolean detectionEnabled = getConfig(DETECT_MACHINE_DETAILS); if (!detectionEnabled) { return new BasicMachineDetails(new BasicHardwareDetails(-1, -1), new BasicOsDetails("UNKNOWN", "UNKNOWN", "UNKNOWN")); } else if (!isManaged()) { return new BasicMachineDetails(new BasicHardwareDetails(-1, -1), new BasicOsDetails("UNKNOWN", "UNKNOWN", "UNKNOWN")); } Tasks.setBlockingDetails("Waiting for machine details"); try { return BasicMachineDetails.forSshMachineLocationLive(this); } finally { Tasks.resetBlockingDetails(); } }
if (input.getExitCode() != 0) { LOG.warn("Non-zero exit code when fetching machine details for {}; guessing anonymous linux", location); return new BasicMachineDetails(new BasicHardwareDetails(null, null), BasicOsDetails.Factory.ANONYMOUS_LINUX); BasicMachineDetails machineDetails = new BasicMachineDetails(hardwareDetails, osDetails);
/** * @return A task that gathers machine details by SSHing to the machine and running * a Bash script to gather data. */ public static Task<BasicMachineDetails> taskForSshMachineLocation(SshMachineLocation location) { BufferedReader reader = new BufferedReader(Streams.reader( new ResourceUtils(BasicMachineDetails.class).getResourceFromUrl( "classpath://org/apache/brooklyn/location/basic/os-details.sh"))); List<String> script; try { script = CharStreams.readLines(reader); } catch (IOException e) { LOG.error("Error reading os-details script", e); throw Throwables.propagate(e); } finally { try { reader.close(); } catch (IOException e) { // Not rethrowing e because it might obscure an exception caught by the first catch LOG.error("Error closing os-details script reader", e); } } Task<BasicMachineDetails> task = new PlainSshExecTaskFactory<String>(location, script) .summary("Getting machine details for: " + location) .requiringZeroAndReturningStdout() .returning(taskToMachineDetailsFunction(location)) .newTask() .asTask(); return task; }
@Override public MachineDetails getMachineDetails() { HardwareDetails hardwareDetails = new BasicHardwareDetails(null, null); OsDetails osDetails = BasicOsDetails.Factory.ANONYMOUS_LINUX; return new BasicMachineDetails(hardwareDetails, osDetails); } }
@Test(groups = "Integration") public void testGetMachineDetails() { Task<BasicMachineDetails> detailsTask = app.getExecutionContext().submit( BasicMachineDetails.taskForSshMachineLocation(host)); MachineDetails machine = detailsTask.getUnchecked(); LOG.info("Found the following on localhost: {}", machine); assertNotNull(machine); OsDetails details = machine.getOsDetails(); assertNotNull(details); assertNotNull(details.getArch()); assertNotNull(details.getName()); assertNotNull(details.getVersion()); assertFalse(details.getArch().startsWith("architecture:"), "architecture prefix not removed from details"); assertFalse(details.getName().startsWith("name:"), "name prefix not removed from details"); assertFalse(details.getVersion().startsWith("version:"), "version prefix not removed from details"); } }
@Test public void testSupplyingMachineDetails() throws Exception { MachineDetails machineDetails = new BasicMachineDetails(new BasicHardwareDetails(1, 1024), new BasicOsDetails("myname", "myarch", "myversion")); SshMachineLocation host2 = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) .configure(SshMachineLocation.MACHINE_DETAILS, machineDetails)); assertSame(host2.getMachineDetails(), machineDetails); }
@Override protected void doTest(Location loc) throws Exception { Entity testEntity = app.createAndManageChild(EntitySpec.create(EmptySoftwareProcess.class)); app.start(ImmutableList.of(loc)); EntityAsserts.assertAttributeEqualsEventually(testEntity, Startable.SERVICE_UP, true); SshMachineLocation sshLoc = Locations.findUniqueSshMachineLocation(testEntity.getLocations()).get(); MachineDetails machine = app.getExecutionContext() .submit(BasicMachineDetails.taskForSshMachineLocation(sshLoc)) .getUnchecked(); LOG.info("Found the following at {}: {}", loc, machine); assertNotNull(machine); OsDetails details = machine.getOsDetails(); assertNotNull(details); assertNotNull(details.getArch()); assertNotNull(details.getName()); assertNotNull(details.getVersion()); assertFalse(details.getArch().startsWith("architecture:")); assertFalse(details.getName().startsWith("name:")); assertFalse(details.getVersion().startsWith("version:")); } }
@Override protected void doTest(Location loc) throws Exception { Entity testEntity = app.createAndManageChild(EntitySpec.create(EmptySoftwareProcess.class)); app.start(ImmutableList.of(loc)); EntityAsserts.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), testEntity, Startable.SERVICE_UP, true); SshMachineLocation sshLoc = Locations.findUniqueSshMachineLocation(testEntity.getLocations()).get(); MachineDetails machine = app.getExecutionContext() .submit(BasicMachineDetails.taskForSshMachineLocation(sshLoc)) .getUnchecked(); LOG.info("Found the following at {}: {}", loc, machine); assertNotNull(machine); OsDetails details = machine.getOsDetails(); assertNotNull(details); assertNotNull(details.getArch()); assertNotNull(details.getName()); assertNotNull(details.getVersion()); assertFalse(details.getArch().startsWith("architecture:")); assertFalse(details.getName().startsWith("name:")); assertFalse(details.getVersion().startsWith("version:")); } }