public void proposeNewNodeState(ClusterState currentClusterState, NodeInfo node, NodeState proposedState) {
        NodeState currentState = currentClusterState.getNodeState(node.getNode());

        if (currentState.getState().equals(proposedState.getState()))
            return;

        stateMayHaveChanged = true;

        log.log(FINE, () -> String.format("Got new wanted nodestate for %s: %s", node, currentState.getTextualDifference(proposedState)));
        // Should be checked earlier before state was set in cluster
        assert(proposedState.getState().validWantedNodeState(node.getNode().getType()));
        long timeNow = timer.getCurrentTimeInMillis();
        NodeState currentReported = node.getReportedState();
        if (proposedState.above(currentReported)) {
            eventLog.add(NodeEvent.forBaseline(node, String.format("Wanted state %s, but we cannot force node into that " +
                    "state yet as it is currently in %s", proposedState, currentReported),
                    NodeEvent.Type.REPORTED, timeNow), isMaster);
            return;
        }
        if ( ! proposedState.similarTo(currentState)) {
            eventLog.add(NodeEvent.forBaseline(node, String.format("Node state set to %s.", proposedState),
                    NodeEvent.Type.WANTED, timeNow), isMaster);
        }
    }
Propose a new state for a node. This may happen due to an administrator action, orchestration, or
a configuration change.

If the newly proposed state differs from the state the node currently has in the system,
a cluster state regeneration will be triggered.
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java