Showing
10 changed files
with
271 additions
and
0 deletions
apps/config/pom.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
| 3 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
| 4 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ||
| 5 | + <modelVersion>4.0.0</modelVersion> | ||
| 6 | + | ||
| 7 | + <parent> | ||
| 8 | + <groupId>org.onlab.onos</groupId> | ||
| 9 | + <artifactId>onos-apps</artifactId> | ||
| 10 | + <version>1.0.0-SNAPSHOT</version> | ||
| 11 | + <relativePath>../pom.xml</relativePath> | ||
| 12 | + </parent> | ||
| 13 | + | ||
| 14 | + <artifactId>onos-app-config</artifactId> | ||
| 15 | + <packaging>bundle</packaging> | ||
| 16 | + | ||
| 17 | + <description>ONOS simple network configuration reader</description> | ||
| 18 | + | ||
| 19 | + <dependencies> | ||
| 20 | + <dependency> | ||
| 21 | + <groupId>org.codehaus.jackson</groupId> | ||
| 22 | + <artifactId>jackson-core-asl</artifactId> | ||
| 23 | + </dependency> | ||
| 24 | + <dependency> | ||
| 25 | + <groupId>org.codehaus.jackson</groupId> | ||
| 26 | + <artifactId>jackson-mapper-asl</artifactId> | ||
| 27 | + </dependency> | ||
| 28 | + <dependency> | ||
| 29 | + <groupId>com.fasterxml.jackson.core</groupId> | ||
| 30 | + <artifactId>jackson-annotations</artifactId> | ||
| 31 | + <version>2.4.2</version> | ||
| 32 | + <scope>provided</scope> | ||
| 33 | + </dependency> | ||
| 34 | + </dependencies> | ||
| 35 | + | ||
| 36 | +</project> |
| 1 | +package org.onlab.onos.config; | ||
| 2 | + | ||
| 3 | +import java.util.Collections; | ||
| 4 | +import java.util.List; | ||
| 5 | + | ||
| 6 | +import org.codehaus.jackson.annotate.JsonProperty; | ||
| 7 | + | ||
| 8 | +/** | ||
| 9 | + * Object to store address configuration read from a JSON file. | ||
| 10 | + */ | ||
| 11 | +public class AddressConfiguration { | ||
| 12 | + | ||
| 13 | + private List<AddressEntry> addresses; | ||
| 14 | + | ||
| 15 | + /** | ||
| 16 | + * Gets a list of addresses in the system. | ||
| 17 | + * | ||
| 18 | + * @return the list of addresses | ||
| 19 | + */ | ||
| 20 | + public List<AddressEntry> getAddresses() { | ||
| 21 | + return Collections.unmodifiableList(addresses); | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * Sets a list of addresses in the system. | ||
| 26 | + * | ||
| 27 | + * @param addresses the list of addresses | ||
| 28 | + */ | ||
| 29 | + @JsonProperty("addresses") | ||
| 30 | + public void setAddresses(List<AddressEntry> addresses) { | ||
| 31 | + this.addresses = addresses; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | +} |
| 1 | +package org.onlab.onos.config; | ||
| 2 | + | ||
| 3 | +import java.util.List; | ||
| 4 | + | ||
| 5 | +import org.codehaus.jackson.annotate.JsonProperty; | ||
| 6 | +import org.onlab.packet.IpPrefix; | ||
| 7 | +import org.onlab.packet.MacAddress; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * Represents a set of addresses bound to a port. | ||
| 11 | + */ | ||
| 12 | +public class AddressEntry { | ||
| 13 | + private String dpid; | ||
| 14 | + private short portNumber; | ||
| 15 | + private List<IpPrefix> ipAddresses; | ||
| 16 | + private MacAddress macAddress; | ||
| 17 | + | ||
| 18 | + public String getDpid() { | ||
| 19 | + return dpid; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + @JsonProperty("dpid") | ||
| 23 | + public void setDpid(String strDpid) { | ||
| 24 | + this.dpid = strDpid; | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + public short getPortNumber() { | ||
| 28 | + return portNumber; | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + @JsonProperty("port") | ||
| 32 | + public void setPortNumber(short portNumber) { | ||
| 33 | + this.portNumber = portNumber; | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + public List<IpPrefix> getIpAddresses() { | ||
| 37 | + return ipAddresses; | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + @JsonProperty("ips") | ||
| 41 | + public void setIpAddresses(List<IpPrefix> ipAddresses) { | ||
| 42 | + this.ipAddresses = ipAddresses; | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + public MacAddress getMacAddress() { | ||
| 46 | + return macAddress; | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + @JsonProperty("mac") | ||
| 50 | + public void setMacAddress(MacAddress macAddress) { | ||
| 51 | + this.macAddress = macAddress; | ||
| 52 | + } | ||
| 53 | +} |
| 1 | +package org.onlab.onos.config; | ||
| 2 | + | ||
| 3 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 4 | + | ||
| 5 | +import java.io.File; | ||
| 6 | +import java.io.FileNotFoundException; | ||
| 7 | +import java.io.IOException; | ||
| 8 | + | ||
| 9 | +import org.apache.felix.scr.annotations.Activate; | ||
| 10 | +import org.apache.felix.scr.annotations.Component; | ||
| 11 | +import org.apache.felix.scr.annotations.Deactivate; | ||
| 12 | +import org.apache.felix.scr.annotations.Reference; | ||
| 13 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
| 14 | +import org.codehaus.jackson.map.ObjectMapper; | ||
| 15 | +import org.onlab.onos.net.ConnectPoint; | ||
| 16 | +import org.onlab.onos.net.DeviceId; | ||
| 17 | +import org.onlab.onos.net.PortNumber; | ||
| 18 | +import org.onlab.onos.net.host.HostAdminService; | ||
| 19 | +import org.onlab.onos.net.host.PortAddresses; | ||
| 20 | +import org.slf4j.Logger; | ||
| 21 | + | ||
| 22 | +import com.google.common.collect.Sets; | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + * Simple configuration module to read in supplementary network configuration | ||
| 26 | + * from a file. | ||
| 27 | + */ | ||
| 28 | +@Component(immediate = true) | ||
| 29 | +public class NetworkConfigReader { | ||
| 30 | + | ||
| 31 | + private final Logger log = getLogger(getClass()); | ||
| 32 | + | ||
| 33 | + private static final String DEFAULT_CONFIG_FILE = "config/addresses.json"; | ||
| 34 | + private String configFileName = DEFAULT_CONFIG_FILE; | ||
| 35 | + | ||
| 36 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 37 | + protected HostAdminService hostAdminService; | ||
| 38 | + | ||
| 39 | + @Activate | ||
| 40 | + protected void activate() { | ||
| 41 | + log.info("Started network config reader"); | ||
| 42 | + | ||
| 43 | + log.info("Config file set to {}", configFileName); | ||
| 44 | + | ||
| 45 | + AddressConfiguration config = readNetworkConfig(); | ||
| 46 | + | ||
| 47 | + if (config != null) { | ||
| 48 | + for (AddressEntry entry : config.getAddresses()) { | ||
| 49 | + | ||
| 50 | + ConnectPoint cp = new ConnectPoint( | ||
| 51 | + DeviceId.deviceId(dpidToUri(entry.getDpid())), | ||
| 52 | + PortNumber.portNumber(entry.getPortNumber())); | ||
| 53 | + | ||
| 54 | + PortAddresses addresses = new PortAddresses(cp, | ||
| 55 | + Sets.newHashSet(entry.getIpAddresses()), | ||
| 56 | + entry.getMacAddress()); | ||
| 57 | + | ||
| 58 | + hostAdminService.bindAddressesToPort(addresses); | ||
| 59 | + } | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + @Deactivate | ||
| 64 | + protected void deactivate() { | ||
| 65 | + log.info("Stopped"); | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + private AddressConfiguration readNetworkConfig() { | ||
| 69 | + File configFile = new File(configFileName); | ||
| 70 | + | ||
| 71 | + ObjectMapper mapper = new ObjectMapper(); | ||
| 72 | + | ||
| 73 | + try { | ||
| 74 | + AddressConfiguration config = | ||
| 75 | + mapper.readValue(configFile, AddressConfiguration.class); | ||
| 76 | + | ||
| 77 | + return config; | ||
| 78 | + } catch (FileNotFoundException e) { | ||
| 79 | + log.warn("Configuration file not found: {}", configFileName); | ||
| 80 | + } catch (IOException e) { | ||
| 81 | + log.error("Unable to read config from file:", e); | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + return null; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + private static String dpidToUri(String dpid) { | ||
| 88 | + return "of:" + dpid.replace(":", ""); | ||
| 89 | + } | ||
| 90 | +} |
apps/config/src/main/resources/config.json
0 → 100644
| 1 | +{ | ||
| 2 | + "interfaces" : [ | ||
| 3 | + { | ||
| 4 | + "dpid" : "00:00:00:00:00:00:01", | ||
| 5 | + "port" : "1", | ||
| 6 | + "ips" : ["192.168.10.101/24"], | ||
| 7 | + "mac" : "00:00:00:11:22:33" | ||
| 8 | + }, | ||
| 9 | + { | ||
| 10 | + "dpid" : "00:00:00:00:00:00:02", | ||
| 11 | + "port" : "1", | ||
| 12 | + "ips" : ["192.168.20.101/24", "192.168.30.101/24"] | ||
| 13 | + }, | ||
| 14 | + { | ||
| 15 | + "dpid" : "00:00:00:00:00:00:03", | ||
| 16 | + "port" : "1", | ||
| 17 | + "ips" : ["10.1.0.1/16"], | ||
| 18 | + "mac" : "00:00:00:00:00:01" | ||
| 19 | + } | ||
| 20 | + ] | ||
| 21 | +} |
| ... | @@ -9,6 +9,8 @@ import org.onlab.onos.net.ConnectPoint; | ... | @@ -9,6 +9,8 @@ import org.onlab.onos.net.ConnectPoint; |
| 9 | import org.onlab.packet.IpPrefix; | 9 | import org.onlab.packet.IpPrefix; |
| 10 | import org.onlab.packet.MacAddress; | 10 | import org.onlab.packet.MacAddress; |
| 11 | 11 | ||
| 12 | +import com.google.common.base.MoreObjects; | ||
| 13 | + | ||
| 12 | /** | 14 | /** |
| 13 | * Represents address information bound to a port. | 15 | * Represents address information bound to a port. |
| 14 | */ | 16 | */ |
| ... | @@ -83,4 +85,13 @@ public class PortAddresses { | ... | @@ -83,4 +85,13 @@ public class PortAddresses { |
| 83 | public int hashCode() { | 85 | public int hashCode() { |
| 84 | return Objects.hash(connectPoint, ipAddresses, macAddress); | 86 | return Objects.hash(connectPoint, ipAddresses, macAddress); |
| 85 | } | 87 | } |
| 88 | + | ||
| 89 | + @Override | ||
| 90 | + public String toString() { | ||
| 91 | + return MoreObjects.toStringHelper(getClass()) | ||
| 92 | + .add("connect-point", connectPoint) | ||
| 93 | + .add("ip-addresses", ipAddresses) | ||
| 94 | + .add("mac-address", macAddress) | ||
| 95 | + .toString(); | ||
| 96 | + } | ||
| 86 | } | 97 | } | ... | ... |
| ... | @@ -19,6 +19,9 @@ | ... | @@ -19,6 +19,9 @@ |
| 19 | <bundle>mvn:de.javakaffee/kryo-serializers/0.27</bundle> | 19 | <bundle>mvn:de.javakaffee/kryo-serializers/0.27</bundle> |
| 20 | 20 | ||
| 21 | <bundle>mvn:org.onlab.onos/onlab-nio/1.0.0-SNAPSHOT</bundle> | 21 | <bundle>mvn:org.onlab.onos/onlab-nio/1.0.0-SNAPSHOT</bundle> |
| 22 | + | ||
| 23 | + <bundle>mvn:org.codehaus.jackson/jackson-core-asl/1.9.13</bundle> | ||
| 24 | + <bundle>mvn:org.codehaus.jackson/jackson-mapper-asl/1.9.13</bundle> | ||
| 22 | </feature> | 25 | </feature> |
| 23 | 26 | ||
| 24 | <feature name="onos-thirdparty-web" version="1.0.0" | 27 | <feature name="onos-thirdparty-web" version="1.0.0" |
| ... | @@ -122,4 +125,10 @@ | ... | @@ -122,4 +125,10 @@ |
| 122 | <bundle>mvn:org.onlab.onos/onos-app-foo/1.0.0-SNAPSHOT</bundle> | 125 | <bundle>mvn:org.onlab.onos/onos-app-foo/1.0.0-SNAPSHOT</bundle> |
| 123 | </feature> | 126 | </feature> |
| 124 | 127 | ||
| 128 | + <feature name="onos-app-config" version="1.0.0" | ||
| 129 | + description="ONOS network config reader"> | ||
| 130 | + <feature>onos-api</feature> | ||
| 131 | + <bundle>mvn:org.onlab.onos/onos-app-config/1.0.0-SNAPSHOT</bundle> | ||
| 132 | + </feature> | ||
| 133 | + | ||
| 125 | </features> | 134 | </features> | ... | ... |
| ... | @@ -92,6 +92,17 @@ | ... | @@ -92,6 +92,17 @@ |
| 92 | <version>3.3.2</version> | 92 | <version>3.3.2</version> |
| 93 | </dependency> | 93 | </dependency> |
| 94 | 94 | ||
| 95 | + <dependency> | ||
| 96 | + <groupId>org.codehaus.jackson</groupId> | ||
| 97 | + <artifactId>jackson-core-asl</artifactId> | ||
| 98 | + <version>1.9.13</version> | ||
| 99 | + </dependency> | ||
| 100 | + <dependency> | ||
| 101 | + <groupId>org.codehaus.jackson</groupId> | ||
| 102 | + <artifactId>jackson-mapper-asl</artifactId> | ||
| 103 | + <version>1.9.13</version> | ||
| 104 | + </dependency> | ||
| 105 | + | ||
| 95 | 106 | ||
| 96 | <!-- Web related --> | 107 | <!-- Web related --> |
| 97 | <dependency> | 108 | <dependency> | ... | ... |
-
Please register or login to post a comment