Merge pull request #2307 from cygnusv/champis

Blue Oyster Mushrooms aftertaste
pull/2318/head
K Prasch 2020-09-29 17:03:55 -07:00 committed by GitHub
commit 0a12d5c4bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 14 deletions

View File

@ -1382,6 +1382,7 @@ class Teacher:
"last_seen": last_seen,
"fleet_state": node.fleet_state_checksum or 'unknown',
"fleet_state_icon": fleet_icon,
"domain": node.learning_domain,
'version': nucypher.__version__}
return payload

View File

@ -32,7 +32,6 @@ from web3.exceptions import TimeExhausted
import nucypher
from nucypher.crypto.api import InvalidNodeCertificate
from nucypher.config.constants import MAX_UPLOAD_CONTENT_LENGTH
from nucypher.config.storages import ForgetfulNodeStorage
from nucypher.crypto.keypairs import HostingKeypair
from nucypher.crypto.kits import UmbralMessageKit
from nucypher.crypto.powers import KeyPairBasedPower, PowerUpError
@ -103,9 +102,7 @@ def make_rest_app(
return rest_app, datastore
def _make_rest_app(datastore: Datastore, this_node, serving_domain: str, log: Logger) -> Tuple[Flask, Datastore]:
forgetful_node_storage = ForgetfulNodeStorage(federated_only=this_node.federated_only) # FIXME: Seems unused
def _make_rest_app(datastore: Datastore, this_node, serving_domain: str, log: Logger) -> Flask:
from nucypher.characters.lawful import Alice, Ursula
_alice_class = Alice
@ -180,8 +177,8 @@ def _make_rest_app(datastore: Datastore, this_node, serving_domain: str, log: Lo
@rest_app.route('/node_metadata', methods=["POST"])
def node_metadata_exchange():
# If these nodes already have the same fleet state, no exchange is necessary.
# If these nodes already have the same fleet state, no exchange is necessary.
learner_fleet_state = request.args.get('fleet')
if learner_fleet_state == this_node.known_nodes.checksum:
log.debug("Learner already knew fleet state {}; doing nothing.".format(learner_fleet_state))

View File

@ -107,7 +107,7 @@
<h5>({{ checksum_address }})</h5>
{{ this_node.nickname_icon }}
<h4>v{{ version }}</h4>
<h4>Domains: {% for domain in domains %}{{ domain }} {% endfor %}</h4>
<h4>Domain: {{ domain }}</h4>
<h3>Fleet State</h3>
<div class="state">

View File

@ -99,17 +99,17 @@ class UrsulaInfoMetricsCollector(BaseMetricsCollector):
"learning_status": Enum(f'{metrics_prefix}_node_discovery', 'Learning loop status',
states=['starting', 'running', 'stopped'], registry=registry),
"known_nodes_gauge": Gauge(f'{metrics_prefix}_known_nodes',
'Number of currently known nodes',
registry=registry),
'Number of currently known nodes',
registry=registry),
"work_orders_gauge": Gauge(f'{metrics_prefix}_work_orders',
'Number of accepted work orders',
registry=registry),
'Number of accepted work orders',
registry=registry),
"policies_held_gauge": Gauge(f'{metrics_prefix}_policies_held',
'Policies held',
registry=registry),
'Policies held',
registry=registry),
"availability_score_gauge": Gauge(f'{metrics_prefix}_availability_score',
'Availability score',
registry=registry),
'Availability score',
registry=registry),
}
def _collect_internal(self) -> None:
@ -118,6 +118,8 @@ class UrsulaInfoMetricsCollector(BaseMetricsCollector):
'teacher_version': str(self.ursula.TEACHER_VERSION),
'host': str(self.ursula.rest_interface),
'domain': self.ursula.learning_domain,
'nickname': self.ursula.nickname,
'nickname_icon': self.ursula.nickname_icon,
'fleet_state': str(self.ursula.known_nodes.checksum),
'known_nodes': str(len(self.ursula.known_nodes))
}

View File

@ -103,3 +103,25 @@ def test_state_is_recorded_after_learning(federated_ursulas, lonely_ursula_maker
assert len(states[0].nodes) == 2 # The first fleet state is just us and the one about whom we learned, which is part of the fleet.
assert len(states[1].nodes) == len(federated_ursulas) + 1 # When we ran learn_from_teacher_node, we also loaded the rest of the fleet.
def test_teacher_records_new_fleet_state_upon_hearing_about_new_node(federated_ursulas, lonely_ursula_maker):
_lonely_ursula_maker = partial(lonely_ursula_maker, quantity=1)
lonely_learner = _lonely_ursula_maker().pop()
some_ursula_in_the_fleet = list(federated_ursulas)[0]
lonely_learner.remember_node(some_ursula_in_the_fleet)
teacher_states_before = list(some_ursula_in_the_fleet.known_nodes.states.values())
lonely_learner.learn_from_teacher_node()
teacher_states_after = list(some_ursula_in_the_fleet.known_nodes.states.values())
# We added one fleet state.
len(teacher_states_after) == len(teacher_states_before) + 1
# The current fleet state of the Teacher...
teacher_fleet_state_checksum = some_ursula_in_the_fleet.fleet_state_checksum
# ...is the same as the learner, because both have learned about everybody at this point.
teacher_fleet_state_checksum in lonely_learner.known_nodes.states