blob: 4f1a48ac69b87bd4c0672dced4a9ff6a60f8d0c8 [file] [log] [blame]
Jonathan Hart74f9c3b2014-09-29 20:03:50 -07001package org.onlab.onos.config;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.io.File;
6import java.io.FileNotFoundException;
7import java.io.IOException;
Jonathan Hart70da5122014-10-01 16:37:42 -07008import java.util.HashSet;
9import java.util.Set;
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070010
11import org.apache.felix.scr.annotations.Activate;
12import org.apache.felix.scr.annotations.Component;
13import org.apache.felix.scr.annotations.Deactivate;
14import org.apache.felix.scr.annotations.Reference;
15import org.apache.felix.scr.annotations.ReferenceCardinality;
16import org.codehaus.jackson.map.ObjectMapper;
17import org.onlab.onos.net.ConnectPoint;
18import org.onlab.onos.net.DeviceId;
19import org.onlab.onos.net.PortNumber;
20import org.onlab.onos.net.host.HostAdminService;
21import org.onlab.onos.net.host.PortAddresses;
Jonathan Hart70da5122014-10-01 16:37:42 -070022import org.onlab.packet.IpPrefix;
23import org.onlab.packet.MacAddress;
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070024import org.slf4j.Logger;
25
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070026/**
27 * Simple configuration module to read in supplementary network configuration
28 * from a file.
29 */
30@Component(immediate = true)
31public class NetworkConfigReader {
32
33 private final Logger log = getLogger(getClass());
34
35 private static final String DEFAULT_CONFIG_FILE = "config/addresses.json";
36 private String configFileName = DEFAULT_CONFIG_FILE;
37
38 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
39 protected HostAdminService hostAdminService;
40
41 @Activate
42 protected void activate() {
43 log.info("Started network config reader");
44
45 log.info("Config file set to {}", configFileName);
46
47 AddressConfiguration config = readNetworkConfig();
48
49 if (config != null) {
50 for (AddressEntry entry : config.getAddresses()) {
51
52 ConnectPoint cp = new ConnectPoint(
53 DeviceId.deviceId(dpidToUri(entry.getDpid())),
54 PortNumber.portNumber(entry.getPortNumber()));
55
Jonathan Hart70da5122014-10-01 16:37:42 -070056 Set<IpPrefix> ipAddresses = new HashSet<IpPrefix>();
57
58 for (String strIp : entry.getIpAddresses()) {
59 try {
60 IpPrefix address = IpPrefix.valueOf(strIp);
61 ipAddresses.add(address);
62 } catch (IllegalArgumentException e) {
63 log.warn("Bad format for IP address in config: {}", strIp);
64 }
65 }
66
67 MacAddress macAddress = null;
68 if (entry.getMacAddress() != null) {
69 try {
70 macAddress = MacAddress.valueOf(entry.getMacAddress());
71 } catch (IllegalArgumentException e) {
72 log.warn("Bad format for MAC address in config: {}",
73 entry.getMacAddress());
74 }
75 }
76
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070077 PortAddresses addresses = new PortAddresses(cp,
Jonathan Hart70da5122014-10-01 16:37:42 -070078 ipAddresses, macAddress);
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070079
80 hostAdminService.bindAddressesToPort(addresses);
81 }
82 }
83 }
84
85 @Deactivate
86 protected void deactivate() {
87 log.info("Stopped");
88 }
89
90 private AddressConfiguration readNetworkConfig() {
91 File configFile = new File(configFileName);
92
93 ObjectMapper mapper = new ObjectMapper();
94
95 try {
96 AddressConfiguration config =
97 mapper.readValue(configFile, AddressConfiguration.class);
98
99 return config;
100 } catch (FileNotFoundException e) {
101 log.warn("Configuration file not found: {}", configFileName);
102 } catch (IOException e) {
103 log.error("Unable to read config from file:", e);
104 }
105
106 return null;
107 }
108
109 private static String dpidToUri(String dpid) {
110 return "of:" + dpid.replace(":", "");
111 }
112}