summaryrefslogtreecommitdiffstats
path: root/configserver/src/main/java/com/yahoo/vespa/config/server/session/ActivationTriggersSerializer.java
blob: 11a0f3cb935c87fc36c2b169f88c3a3f8828f4cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.yahoo.vespa.config.server.session;

import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Slime;
import com.yahoo.slime.SlimeUtils;
import com.yahoo.vespa.config.server.session.ActivationTriggers.NodeRestart;
import com.yahoo.vespa.config.server.session.ActivationTriggers.Reindexing;

import java.util.List;

import static com.yahoo.yolean.Exceptions.uncheck;

/**
 * @author jonmv
 */
public class ActivationTriggersSerializer {

    static final String NODE_RESTARTS = "nodeRestarts";
    static final String RESTARTING_CLUSTERS = "restartingClusters";
    static final String REINDEXINGS = "reindexings";
    static final String CLUSTER_NAME = "clusterName";
    static final String DOCUMENT_TYPE = "documentType";

    public static byte[] toJson(ActivationTriggers triggers) {
        Slime root = new Slime();
        toSlime(triggers, root.setObject());
        return uncheck(() -> SlimeUtils.toJsonBytes(root));
    }

    public static ActivationTriggers fromJson(byte[] json) {
        return fromSlime(SlimeUtils.jsonToSlime(json).get());
    }

    public static void toSlime(ActivationTriggers triggers, Cursor object) {
        Cursor nodeRestarts = object.setArray(NODE_RESTARTS);
        for (NodeRestart nodeRestart : triggers.nodeRestarts())
            nodeRestarts.addString(nodeRestart.hostname());

        Cursor restartingClusters = object.setArray(RESTARTING_CLUSTERS);
        for (ClusterSpec.Id clusterId : triggers.restartingClusters())
            restartingClusters.addString(clusterId.value());

        Cursor reindexings = object.setArray(REINDEXINGS);
        for (Reindexing reindexing : triggers.reindexings()) {
            Cursor entry = reindexings.addObject();
            entry.setString(CLUSTER_NAME, reindexing.clusterId());
            entry.setString(DOCUMENT_TYPE, reindexing.documentType());
        }
    }

    public static ActivationTriggers fromSlime(Cursor object) {
        if ( ! object.valid())
            return ActivationTriggers.empty();

        List<NodeRestart> nodeRestarts = SlimeUtils.entriesStream(object.field(NODE_RESTARTS))
                                                   .map(entry -> new NodeRestart(entry.asString()))
                                                   .toList();
        List<ClusterSpec.Id> restartingClusters = SlimeUtils.entriesStream(object.field(RESTARTING_CLUSTERS))
                                                            .map(entry -> ClusterSpec.Id.from(entry.asString()))
                                                            .toList();
        List<Reindexing> reindexings = SlimeUtils.entriesStream(object.field(REINDEXINGS))
                                                   .map(entry -> new Reindexing(entry.field(CLUSTER_NAME).asString(),
                                                                                entry.field(DOCUMENT_TYPE).asString()))
                                                   .toList();
        return new ActivationTriggers(nodeRestarts, restartingClusters, reindexings);
    }

}