@NonNull
    @Override
    public Set<Attribute<Jenkins, ?>> describe() {
        final Set<Attribute<Jenkins, ?>> attributes = super.describe();

        // Add remoting security, all legwork will be done by a configurator
        attributes.add(new Attribute<Jenkins, AdminWhitelistRule>("remotingSecurity", AdminWhitelistRule.class)
                .getter(j -> j.getInjector().getInstance(AdminWhitelistRule.class))
                .setter(noop()));

        // Override "nodes" getter so we don't export Nodes registered by Cloud plugins
        Attribute.<Jenkins, List<Node>>get(attributes, "nodes").ifPresent(attribute -> attribute
                .getter(jenkins -> jenkins.getNodes().stream()
                        .filter(node -> !isCloudNode(node))
                        .collect(Collectors.toList()))
                .setter((jenkins, configuredNodes) -> {
                    List<String> configuredNodesNames =
                            configuredNodes.stream().map(Node::getNodeName).collect(Collectors.toList());
                    List<Node> nodesToKeep = jenkins.getNodes().stream()
                            .filter(node -> !configuredNodesNames.contains(node.getNodeName()))
                            .filter(this::isCloudNode)
                            .collect(Collectors.toList());
                    nodesToKeep.addAll(configuredNodes);
                    jenkins.setNodes(nodesToKeep);
                }));

        // Add updateCenter, all legwork will be done by a configurator
        attributes.add(new Attribute<Jenkins, UpdateCenter>("updateCenter", UpdateCenter.class)
                .getter(Jenkins::getUpdateCenter)
                .setter(noop()));

        attributes.add(new MultivaluedAttribute<Jenkins, LabelAtom>("labelAtoms", LabelAtom.class)
                .getter(Jenkins::getLabelAtoms)
                .setter((jenkins, labelAtoms) -> {
                    for (LabelAtom labelAtom : labelAtoms) {
                        // Get or create a LabelAtom instance
                        LabelAtom atom = jenkins.getLabelAtom(labelAtom.getName());

                        if (atom != null) {
                            atom.getProperties().clear();
                            atom.getProperties().addAll(labelAtom.getProperties());
                        }
                    }
                }));

        attributes.add(new Attribute<Jenkins, ProxyConfiguration>("proxy", ProxyConfiguration.class)
                .getter(j -> j.proxy)
                .setter((o, v) -> o.proxy = v));

        attributes.add(new MultivaluedAttribute<Jenkins, NodeMonitor>("nodeMonitors", NodeMonitor.class)
                .getter(j -> ComputerSet.getMonitors())
                .setter((jenkins, nodeMonitors) -> {
                    DescribableList<NodeMonitor, Descriptor<NodeMonitor>> monitors = ComputerSet.getMonitors();
                    monitors.clear();
                    monitors.addAll(nodeMonitors);
                    for (Descriptor<NodeMonitor> d : NodeMonitor.all()) {
                        if (monitors.get(d) == null) {
                            NodeMonitor i = createDefaultInstance(d);
                            if (i != null) {
                                monitors.add(i);
                            }
                        }
                    }
                }));

        return attributes;
    }
@author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
plugin/src/main/java/io/jenkins/plugins/casc/core/JenkinsConfigurator.java