private ImmutableList<MySqlNode> getHealhtySlaves() { return FluentIterable.from(cluster.getMembers()) .filter(Predicates.not(MySqlClusterUtils.IS_MASTER)) .filter(EntityPredicates.attributeEqualTo(MySqlNode.SERVICE_UP, Boolean.TRUE)) .filter(MySqlNode.class) .toList(); }
@Override public MesosSlave getMesosSlave(String hostname) { Collection<Entity> slaves = sensors().get(MESOS_SLAVES).getMembers(); Optional<Entity> found = Iterables.tryFind(slaves, Predicates.or( EntityPredicates.attributeEqualTo(MesosSlave.HOSTNAME, hostname), EntityPredicates.attributeEqualTo(MesosSlave.ADDRESS, hostname))); if (found.isPresent()) { return (MesosSlave) found.get(); } else { throw new IllegalStateException("Cannot find slave for host: " + hostname); } }
BrooklynNode findMasterChild() { Collection<Entity> masters = FluentIterable.from(getMembers()) .filter(EntityPredicates.attributeEqualTo(BrooklynNode.MANAGEMENT_NODE_STATE, ManagementNodeState.MASTER)) .toList();
@Test public void testAttributeEqualTo() throws Exception { entity.sensors().set(TestEntity.NAME, "myname"); assertTrue(EntityPredicates.attributeEqualTo(TestEntity.NAME, "myname").apply(entity)); assertTrue(EntityPredicates.attributeEqualTo(TestEntity.NAME.getName(), "myname").apply(entity)); assertFalse(EntityPredicates.attributeEqualTo(TestEntity.NAME, "wrongname").apply(entity)); assertFalse(EntityPredicates.attributeEqualTo(TestEntity.NAME.getName(), "wrongname").apply(entity)); }
private void waitHealthy(VanillaSoftwareProcess proc) { Asserts.eventually(Suppliers.ofInstance(proc), EntityPredicates.attributeEqualTo(Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING), Duration.FIVE_MINUTES); } }
private void waitFailed(VanillaSoftwareProcess proc) { Asserts.eventually(Suppliers.ofInstance(proc), EntityPredicates.attributeEqualTo(Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE), Duration.FIVE_MINUTES); }
protected void onServerPoolMemberRemoved(final Entity member) { Map<Entity, String> nodes = MutableMap.copyOf(sensors().get(ETCD_CLUSTER_NODES)); Duration timeout = config().get(BrooklynConfigKeys.START_TIMEOUT); String name = nodes.get(member); if (nodes.containsKey(member)) { synchronized (clusterMutex) { Optional<Entity> otherNode = Iterables.tryFind(nodes.keySet(), Predicates.and( Predicates.instanceOf(EtcdNode.class), EntityPredicates.attributeEqualTo(EtcdNode.ETCD_NODE_HAS_JOINED_CLUSTER, Boolean.TRUE), Predicates.not(EntityPredicates.idEqualTo(member.getId())))); if (otherNode.isPresent()) { boolean ended = Entities.invokeEffectorWithArgs(this, otherNode.get(), EtcdNode.LEAVE_ETCD_CLUSTER, name).blockUntilEnded(timeout); if (!ended) { LOG.warn("Timeout invoking leaveCluster for {} on {}", member, otherNode.get()); } } removeNode(member, name); } } }
@Override public void stop() { super.stop(); // Stop all of our managed Marathon tasks Iterable<Entity> tasks = Iterables.filter(getTaskCluster().getMembers(), EntityPredicates.attributeEqualTo(MesosTask.MANAGED, Boolean.TRUE)); for (Entity task : tasks) { ((MarathonTask) task).stop(); } deleteLocation(); }
private static void waitBrieflyForServiceUpIfStateIsRunning(Entity entity, Lifecycle state) { if (state==Lifecycle.RUNNING) { Boolean up = ((EntityInternal)entity).getAttribute(Attributes.SERVICE_UP); if (!Boolean.TRUE.equals(up) && !Boolean.TRUE.equals(Entities.isReadOnly(entity))) { // pause briefly to allow any recent problem-clearing processing to complete Stopwatch timer = Stopwatch.createStarted(); boolean nowUp = Repeater.create() .every(ValueResolver.REAL_QUICK_PERIOD) .limitTimeTo(ValueResolver.PRETTY_QUICK_WAIT) .until(entity, EntityPredicates.attributeEqualTo(Attributes.SERVICE_UP, true)) .run(); if (nowUp) { log.debug("Had to wait "+Duration.of(timer)+" for "+entity+" "+Attributes.SERVICE_UP+" to be true before setting "+state); } else { log.warn("Service is not up when setting "+state+" on "+entity+"; delayed "+Duration.of(timer)+" " + "but "+Attributes.SERVICE_UP+" did not recover from "+up+"; not-up-indicators="+entity.getAttribute(Attributes.SERVICE_NOT_UP_INDICATORS)); } } } }
protected Collection<Entity> createNodes(int nodeCnt) { DynamicCluster cluster = (DynamicCluster)entity(); //1. Create the nodes Collection<Entity> newNodes = cluster.resizeByDelta(nodeCnt); //2. Wait for them to be RUNNING (or at least STARTING to have completed) // (should already be the case, because above is synchronous and, we think, it will fail if start does not succeed) DynamicTasks.queue(EntityTasks.requiringAttributeEventually(newNodes, Attributes.SERVICE_STATE_ACTUAL, Predicates.not(Predicates.equalTo(Lifecycle.STARTING)), Duration.minutes(30))); //3. Set HOT_STANDBY in case it is not enabled on the command line ... // TODO support via EntitySpec DynamicTasks.queue(Effectors.invocation( BrooklynNode.SET_HIGH_AVAILABILITY_MODE, MutableMap.of(SetHighAvailabilityModeEffector.MODE, HighAvailabilityMode.HOT_STANDBY), newNodes)).asTask().getUnchecked(); //... and wait until all of the nodes change state // TODO fail quicker if state changes to FAILED DynamicTasks.queue(EntityTasks.requiringAttributeEventually(newNodes, BrooklynNode.MANAGEMENT_NODE_STATE, Predicates.equalTo(ManagementNodeState.HOT_STANDBY), Duration.FIVE_MINUTES)); // TODO also check that the nodes created all report the original master, in case persistence changes it //5. Just in case check if all of the nodes are SERVICE_UP (which would rule out ON_FIRE as well) Collection<Entity> failedNodes = Collections2.filter(newNodes, EntityPredicates.attributeEqualTo(BrooklynNode.SERVICE_UP, Boolean.FALSE)); if (!failedNodes.isEmpty()) { throw new IllegalStateException("Nodes " + failedNodes + " are not " + BrooklynNode.SERVICE_UP + " though successfully in " + ManagementNodeState.HOT_STANDBY); } return newNodes; }
/** * Send a message to the {@link KafkaCluster} on the given topic. */ public void sendMessage(String topic, String message) { Optional<Entity> anyBrokerNodeInCluster = Iterables.tryFind(cluster.getCluster().getChildren(), Predicates.and( Predicates.instanceOf(KafkaBroker.class), EntityPredicates.attributeEqualTo(KafkaBroker.SERVICE_UP, true))); if (anyBrokerNodeInCluster.isPresent()) { KafkaBroker broker = (KafkaBroker)anyBrokerNodeInCluster.get(); Properties props = new Properties(); props.put("metadata.broker.list", format("%s:%d", broker.getAttribute(KafkaBroker.HOSTNAME), broker.getKafkaPort())); props.put("bootstrap.servers", format("%s:%d", broker.getAttribute(KafkaBroker.HOSTNAME), broker.getKafkaPort())); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); ((KafkaZooKeeper)cluster.getZooKeeper()).createTopic(topic); ProducerRecord<String, String> data = new ProducerRecord<>(topic, message); producer.send(data); producer.close(); } else { throw new InvalidParameterException("No kafka broker node found"); } }
Optional<Entity> anyBrokerNodeInCluster = Iterables.tryFind(cluster.getCluster().getChildren(), Predicates.and( Predicates.instanceOf(KafkaBroker.class), EntityPredicates.attributeEqualTo(KafkaBroker.SERVICE_UP, true))); if (anyBrokerNodeInCluster.isPresent()) { KafkaBroker broker = (KafkaBroker)anyBrokerNodeInCluster.get();
public static final VirtualNetwork lookupNetwork(final SdnProvider provider, final String networkId) { Task<Boolean> lookup = TaskBuilder.<Boolean> builder() .displayName("Waiting until virtual network is available") .body(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return Repeater.create() .every(Duration.TEN_SECONDS) .until(new Callable<Boolean>() { public Boolean call() { Optional<Entity> found = Iterables.tryFind(provider.sensors().get(SdnProvider.SDN_NETWORKS).getMembers(), EntityPredicates.attributeEqualTo(VirtualNetwork.NETWORK_ID, networkId)); return found.isPresent(); } }) .limitTimeTo(Duration.ONE_MINUTE) .run(); } }) .build(); Boolean result = DynamicTasks.queueIfPossible(lookup) .orSubmitAndBlock() .andWaitForSuccess(); if (!result) { throw new IllegalStateException(String.format("Cannot find virtual network entity for %s", networkId)); } VirtualNetwork network = (VirtualNetwork) Iterables.find(provider.sensors().get(SdnProvider.SDN_NETWORKS).getMembers(), EntityPredicates.attributeEqualTo(VirtualNetwork.NETWORK_ID, networkId)); return network; }
@Test public void testGroupDetectsChangedEntities() throws Exception { final AttributeSensor<String> MY_ATTRIBUTE = Sensors.newStringSensor("test.myAttribute", "My test attribute"); group.setEntityFilter(EntityPredicates.attributeEqualTo(MY_ATTRIBUTE, "yes")); group.addSubscription(null, MY_ATTRIBUTE); assertEqualsIgnoringOrder(group.getMembers(), ImmutableSet.of()); // When changed (such that subscription spots it), then entity added e1.sensors().set(MY_ATTRIBUTE, "yes"); Asserts.succeedsEventually(new Runnable() { @Override public void run() { assertEqualsIgnoringOrder(group.getMembers(), ImmutableSet.of(e1)); }}); // When it stops matching, entity is removed e1.sensors().set(MY_ATTRIBUTE, "no"); Asserts.succeedsEventually(new Runnable() { @Override public void run() { assertEqualsIgnoringOrder(group.getMembers(), ImmutableSet.of()); }}); }
@Override public synchronized void recompute() { if (subscriptionHandle != null) subscriptions().unsubscribe(subscriptionHandle); if (subscriptionHandle2 != null) subscriptions().unsubscribe(subscriptionHandle2); Entity t = getTarget(); if (t != null) { subscriptionHandle = subscriptions().subscribeToChildren(t, Startable.SERVICE_UP, new SensorEventListener<Boolean>() { @Override public void onEvent(SensorEvent<Boolean> event) { boolean changed = (event.getValue()) ? addMember(event.getSource()) : removeMember(event.getSource()); if (changed) { recomputeAddresses(); } }}); subscriptionHandle2 = subscriptions().subscribe(t, Changeable.MEMBER_REMOVED, new SensorEventListener<Entity>() { @Override public void onEvent(SensorEvent<Entity> event) { removeMember(event.getValue()); // recompute, irrespective of change, because framework may have already invoked the removeMember call recomputeAddresses(); }}); setMembers(t.getChildren(), EntityPredicates.attributeEqualTo(Startable.SERVICE_UP, true)); } recomputeAddresses(); }
.configure(DynamicGroup.ENTITY_FILTER, Predicates.and( Predicates.instanceOf(MesosTask.class), EntityPredicates.attributeEqualTo(MesosAttributes.MESOS_CLUSTER, this))) .displayName("Mesos Tasks"));
.configure(DynamicGroup.ENTITY_FILTER, Predicates.and(Predicates.instanceOf(DockerContainer.class), EntityPredicates.attributeEqualTo(DockerContainer.DOCKER_INFRASTRUCTURE, this))) .displayName("All Docker Containers"));
.configure(DynamicGroup.ENTITY_FILTER, Predicates.and(Predicates.instanceOf(StubContainer.class), EntityPredicates.attributeEqualTo(StubContainer.DOCKER_INFRASTRUCTURE, this))) .configure(DynamicGroup.MEMBER_DELEGATE_CHILDREN, true) .displayName("All Docker Containers"));