blob: 3c090cf55659aafc888d533cc3a83555857c5121 [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;
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070016import org.onlab.onos.net.ConnectPoint;
17import org.onlab.onos.net.DeviceId;
18import org.onlab.onos.net.PortNumber;
19import org.onlab.onos.net.host.HostAdminService;
20import org.onlab.onos.net.host.PortAddresses;
Jonathan Hart70da5122014-10-01 16:37:42 -070021import org.onlab.packet.IpPrefix;
22import org.onlab.packet.MacAddress;
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070023import org.slf4j.Logger;
24
Jonathan Hartd7bd9822014-10-20 18:18:02 -070025import com.fasterxml.jackson.databind.ObjectMapper;
26
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070027/**
28 * Simple configuration module to read in supplementary network configuration
29 * from a file.
30 */
31@Component(immediate = true)
32public class NetworkConfigReader {
33
34 private final Logger log = getLogger(getClass());
35
36 private static final String DEFAULT_CONFIG_FILE = "config/addresses.json";
37 private String configFileName = DEFAULT_CONFIG_FILE;
38
39 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
40 protected HostAdminService hostAdminService;
41
42 @Activate
43 protected void activate() {
44 log.info("Started network config reader");
45
46 log.info("Config file set to {}", configFileName);
47
48 AddressConfiguration config = readNetworkConfig();
49
50 if (config != null) {
51 for (AddressEntry entry : config.getAddresses()) {
52
53 ConnectPoint cp = new ConnectPoint(
54 DeviceId.deviceId(dpidToUri(entry.getDpid())),
55 PortNumber.portNumber(entry.getPortNumber()));
56
Jonathan Hart70da5122014-10-01 16:37:42 -070057 Set<IpPrefix> ipAddresses = new HashSet<IpPrefix>();
58
59 for (String strIp : entry.getIpAddresses()) {
60 try {
61 IpPrefix address = IpPrefix.valueOf(strIp);
62 ipAddresses.add(address);
63 } catch (IllegalArgumentException e) {
64 log.warn("Bad format for IP address in config: {}", strIp);
65 }
66 }
67
68 MacAddress macAddress = null;
69 if (entry.getMacAddress() != null) {
70 try {
71 macAddress = MacAddress.valueOf(entry.getMacAddress());
72 } catch (IllegalArgumentException e) {
73 log.warn("Bad format for MAC address in config: {}",
74 entry.getMacAddress());
75 }
76 }
77
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070078 PortAddresses addresses = new PortAddresses(cp,
Jonathan Hart70da5122014-10-01 16:37:42 -070079 ipAddresses, macAddress);
Jonathan Hart74f9c3b2014-09-29 20:03:50 -070080
81 hostAdminService.bindAddressesToPort(addresses);
82 }
83 }
84 }
85
86 @Deactivate
87 protected void deactivate() {
88 log.info("Stopped");
89 }
90
91 private AddressConfiguration readNetworkConfig() {
92 File configFile = new File(configFileName);
93
94 ObjectMapper mapper = new ObjectMapper();
95
96 try {
97 AddressConfiguration config =
98 mapper.readValue(configFile, AddressConfiguration.class);
99
100 return config;
101 } catch (FileNotFoundException e) {
102 log.warn("Configuration file not found: {}", configFileName);
103 } catch (IOException e) {
104 log.error("Unable to read config from file:", e);
105 }
106
107 return null;
108 }
109
110 private static String dpidToUri(String dpid) {
111 return "of:" + dpid.replace(":", "");
112 }
113}