@Test
    void generator_params_can_inherit_values_from_controller_options() {
        FleetControllerOptions options = new FleetControllerOptions.Builder("foocluster", Set.of(new ConfiguredNode(0, false)))
                .setMaxPrematureCrashes(1)
                .setMinStorageNodesUp(2)
                .setMinDistributorNodesUp(3)
                .setMinRatioOfStorageNodesUp(0.4)
                .setMinRatioOfDistributorNodesUp(0.5)
                .setMinNodeRatioPerGroup(0.6)
                .setDistributionBits(7)
                .setMaxTransitionTime(NodeType.DISTRIBUTOR, 1000)
                .setMaxTransitionTime(NodeType.STORAGE, 2000)
                .setZooKeeperServerAddress("localhost:2181")
                .build();

        final ClusterStateGenerator.Params params = ClusterStateGenerator.Params.fromOptions(options);
        assertThat(params.maxPrematureCrashes, equalTo(options.maxPrematureCrashes()));
        assertThat(params.minStorageNodesUp, equalTo(options.minStorageNodesUp()));
        assertThat(params.minDistributorNodesUp, equalTo(options.minDistributorNodesUp()));
        assertThat(params.minRatioOfStorageNodesUp, equalTo(options.minRatioOfStorageNodesUp()));
        assertThat(params.minRatioOfDistributorNodesUp, equalTo(options.minRatioOfDistributorNodesUp()));
        assertThat(params.minNodeRatioPerGroup, equalTo(options.minNodeRatioPerGroup()));
        assertThat(params.transitionTimes, equalTo(options.maxTransitionTime()));
    }
The generated state must be considered over the Reported state when deciding whether
to override it with the Wanted state. Otherwise, an unstable retired node could have
its generated state be Retired instead of Down. We want it to stay down instead of
potentially contributing additional instability to the cluster.
clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterStateGeneratorTest.java