blob: e2692d59d65512bcaf22d2238d60bc72a12ad80c [file] [log] [blame]
tomdc66b382014-09-22 17:05:47 -07001package org.onlab.onos.store.impl;
2
tom1a2908c2014-09-23 16:37:39 -07003import com.hazelcast.config.Config;
4import com.hazelcast.config.FileSystemXmlConfig;
tomdc66b382014-09-22 17:05:47 -07005import com.hazelcast.core.Hazelcast;
6import com.hazelcast.core.HazelcastInstance;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -07007
tom0872a172014-09-23 11:24:26 -07008import de.javakaffee.kryoserializers.URISerializer;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -07009
tomdc66b382014-09-22 17:05:47 -070010import org.apache.felix.scr.annotations.Activate;
11import org.apache.felix.scr.annotations.Component;
12import org.apache.felix.scr.annotations.Deactivate;
13import org.apache.felix.scr.annotations.Service;
tomb41d1ac2014-09-24 01:51:24 -070014import org.onlab.onos.cluster.ControllerNode;
15import org.onlab.onos.cluster.DefaultControllerNode;
16import org.onlab.onos.cluster.NodeId;
Yuta HIGUCHIa8a53eb2014-09-25 17:47:55 -070017import org.onlab.onos.net.ConnectPoint;
tom0872a172014-09-23 11:24:26 -070018import org.onlab.onos.net.DefaultDevice;
Yuta HIGUCHIa8a53eb2014-09-25 17:47:55 -070019import org.onlab.onos.net.DefaultLink;
tom0872a172014-09-23 11:24:26 -070020import org.onlab.onos.net.DefaultPort;
21import org.onlab.onos.net.Device;
22import org.onlab.onos.net.DeviceId;
23import org.onlab.onos.net.Element;
Yuta HIGUCHIa8a53eb2014-09-25 17:47:55 -070024import org.onlab.onos.net.Link;
25import org.onlab.onos.net.LinkKey;
tom0872a172014-09-23 11:24:26 -070026import org.onlab.onos.net.MastershipRole;
27import org.onlab.onos.net.Port;
28import org.onlab.onos.net.PortNumber;
29import org.onlab.onos.net.provider.ProviderId;
tom0755a362014-09-24 11:54:43 -070030import org.onlab.onos.store.common.StoreService;
Yuta HIGUCHIa8a53eb2014-09-25 17:47:55 -070031import org.onlab.onos.store.serializers.ConnectPointSerializer;
32import org.onlab.onos.store.serializers.DefaultLinkSerializer;
tom0872a172014-09-23 11:24:26 -070033import org.onlab.onos.store.serializers.DefaultPortSerializer;
34import org.onlab.onos.store.serializers.DeviceIdSerializer;
tomb41d1ac2014-09-24 01:51:24 -070035import org.onlab.onos.store.serializers.IpPrefixSerializer;
Yuta HIGUCHIa8a53eb2014-09-25 17:47:55 -070036import org.onlab.onos.store.serializers.LinkKeySerializer;
tomb41d1ac2014-09-24 01:51:24 -070037import org.onlab.onos.store.serializers.NodeIdSerializer;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070038import org.onlab.onos.store.serializers.OnosTimestampSerializer;
tom0872a172014-09-23 11:24:26 -070039import org.onlab.onos.store.serializers.PortNumberSerializer;
40import org.onlab.onos.store.serializers.ProviderIdSerializer;
tomb41d1ac2014-09-24 01:51:24 -070041import org.onlab.packet.IpPrefix;
tom0872a172014-09-23 11:24:26 -070042import org.onlab.util.KryoPool;
tomdc66b382014-09-22 17:05:47 -070043import org.slf4j.Logger;
44import org.slf4j.LoggerFactory;
45
tom1a2908c2014-09-23 16:37:39 -070046import java.io.FileNotFoundException;
tom0872a172014-09-23 11:24:26 -070047import java.net.URI;
48import java.util.ArrayList;
49import java.util.HashMap;
50
tomdc66b382014-09-22 17:05:47 -070051/**
52 * Auxiliary bootstrap of distributed store.
53 */
54@Component(immediate = true)
55@Service
56public class StoreManager implements StoreService {
57
Yuta HIGUCHIb4139d82014-09-23 18:41:33 -070058 protected static final String HAZELCAST_XML_FILE = "etc/hazelcast.xml";
tom1a2908c2014-09-23 16:37:39 -070059
tomdc66b382014-09-22 17:05:47 -070060 private final Logger log = LoggerFactory.getLogger(getClass());
61
tom85ff08b2014-09-22 17:14:18 -070062 protected HazelcastInstance instance;
tom0872a172014-09-23 11:24:26 -070063 private KryoPool serializerPool;
64
tomdc66b382014-09-22 17:05:47 -070065
66 @Activate
67 public void activate() {
tom1a2908c2014-09-23 16:37:39 -070068 try {
69 Config config = new FileSystemXmlConfig(HAZELCAST_XML_FILE);
70 instance = Hazelcast.newHazelcastInstance(config);
71 setupKryoPool();
72 log.info("Started");
73 } catch (FileNotFoundException e) {
74 log.error("Unable to configure Hazelcast", e);
75 }
tomdc66b382014-09-22 17:05:47 -070076 }
77
tom0872a172014-09-23 11:24:26 -070078 /**
79 * Sets up the common serialzers pool.
80 */
81 protected void setupKryoPool() {
82 // FIXME Slice out types used in common to separate pool/namespace.
83 serializerPool = KryoPool.newBuilder()
tomb41d1ac2014-09-24 01:51:24 -070084 .register(ArrayList.class,
85 HashMap.class,
tom0872a172014-09-23 11:24:26 -070086
tomb41d1ac2014-09-24 01:51:24 -070087 ControllerNode.State.class,
88 Device.Type.class,
tom0872a172014-09-23 11:24:26 -070089
tomb41d1ac2014-09-24 01:51:24 -070090 DefaultControllerNode.class,
91 DefaultDevice.class,
92 MastershipRole.class,
93 Port.class,
Yuta HIGUCHIa8a53eb2014-09-25 17:47:55 -070094 Element.class,
95
96 Link.Type.class
tom0872a172014-09-23 11:24:26 -070097 )
tomb41d1ac2014-09-24 01:51:24 -070098 .register(IpPrefix.class, new IpPrefixSerializer())
tom0872a172014-09-23 11:24:26 -070099 .register(URI.class, new URISerializer())
tomb41d1ac2014-09-24 01:51:24 -0700100 .register(NodeId.class, new NodeIdSerializer())
tom0872a172014-09-23 11:24:26 -0700101 .register(ProviderId.class, new ProviderIdSerializer())
102 .register(DeviceId.class, new DeviceIdSerializer())
103 .register(PortNumber.class, new PortNumberSerializer())
104 .register(DefaultPort.class, new DefaultPortSerializer())
Yuta HIGUCHI497c8842014-09-25 14:23:34 -0700105 .register(OnosTimestamp.class, new OnosTimestampSerializer())
Yuta HIGUCHIa8a53eb2014-09-25 17:47:55 -0700106 .register(LinkKey.class, new LinkKeySerializer())
107 .register(ConnectPoint.class, new ConnectPointSerializer())
108 .register(DefaultLink.class, new DefaultLinkSerializer())
tom0872a172014-09-23 11:24:26 -0700109 .build()
110 .populate(10);
111 }
112
tomdc66b382014-09-22 17:05:47 -0700113 @Deactivate
114 public void deactivate() {
tom0872a172014-09-23 11:24:26 -0700115 instance.shutdown();
tomdc66b382014-09-22 17:05:47 -0700116 log.info("Stopped");
117 }
118
119 @Override
120 public HazelcastInstance getHazelcastInstance() {
121 return instance;
122 }
tom0872a172014-09-23 11:24:26 -0700123
124
125 @Override
126 public byte[] serialize(final Object obj) {
127 return serializerPool.serialize(obj);
128 }
129
130 @Override
131 public <T> T deserialize(final byte[] bytes) {
132 if (bytes == null) {
133 return null;
134 }
135 return serializerPool.deserialize(bytes);
136 }
137
tomdc66b382014-09-22 17:05:47 -0700138}