Added Version and CoreService/Manager as an initial outline of a bootstrap coordinator.
Showing
8 changed files
with
253 additions
and
1 deletions
1 | package org.onlab.onos.cli; | 1 | package org.onlab.onos.cli; |
2 | 2 | ||
3 | import org.apache.karaf.shell.commands.Command; | 3 | import org.apache.karaf.shell.commands.Command; |
4 | +import org.onlab.onos.CoreService; | ||
4 | import org.onlab.onos.cluster.ClusterService; | 5 | import org.onlab.onos.cluster.ClusterService; |
5 | import org.onlab.onos.net.device.DeviceService; | 6 | import org.onlab.onos.net.device.DeviceService; |
6 | import org.onlab.onos.net.flow.FlowRuleService; | 7 | import org.onlab.onos.net.flow.FlowRuleService; |
... | @@ -21,7 +22,8 @@ public class SummaryCommand extends AbstractShellCommand { | ... | @@ -21,7 +22,8 @@ public class SummaryCommand extends AbstractShellCommand { |
21 | protected void execute() { | 22 | protected void execute() { |
22 | TopologyService topologyService = get(TopologyService.class); | 23 | TopologyService topologyService = get(TopologyService.class); |
23 | Topology topology = topologyService.currentTopology(); | 24 | Topology topology = topologyService.currentTopology(); |
24 | - print("nodes=%d, devices=%d, links=%d, hosts=%d, clusters=%s, paths=%d, flows=%d, intents=%d", | 25 | + print("version=%s, nodes=%d, devices=%d, links=%d, hosts=%d, clusters=%s, paths=%d, flows=%d, intents=%d", |
26 | + get(CoreService.class).version().toString(), | ||
25 | get(ClusterService.class).getNodes().size(), | 27 | get(ClusterService.class).getNodes().size(), |
26 | get(DeviceService.class).getDeviceCount(), | 28 | get(DeviceService.class).getDeviceCount(), |
27 | get(LinkService.class).getLinkCount(), | 29 | get(LinkService.class).getLinkCount(), | ... | ... |
1 | +package org.onlab.onos; | ||
2 | + | ||
3 | +import java.util.Objects; | ||
4 | + | ||
5 | +import static java.lang.Integer.parseInt; | ||
6 | + | ||
7 | +/** | ||
8 | + * Representation of the product version. | ||
9 | + */ | ||
10 | +public final class Version { | ||
11 | + | ||
12 | + public static final String FORMAT = "%d.%d.%d.%s"; | ||
13 | + | ||
14 | + private final int major; | ||
15 | + private final int minor; | ||
16 | + private final int patch; | ||
17 | + private final String build; | ||
18 | + | ||
19 | + private final String format; | ||
20 | + | ||
21 | + // Creates a new version descriptor | ||
22 | + private Version(int major, int minor, int patch, String build) { | ||
23 | + this.major = major; | ||
24 | + this.minor = minor; | ||
25 | + this.patch = patch; | ||
26 | + this.build = build; | ||
27 | + this.format = String.format(FORMAT, major, minor, patch, build); | ||
28 | + } | ||
29 | + | ||
30 | + | ||
31 | + /** | ||
32 | + * Creates a new version from the specified constituent numbers. | ||
33 | + * | ||
34 | + * @param major major version number | ||
35 | + * @param minor minod version number | ||
36 | + * @param patch version patch number | ||
37 | + * @param build build string | ||
38 | + * @return version descriptor | ||
39 | + */ | ||
40 | + public static Version version(int major, int minor, int patch, String build) { | ||
41 | + return new Version(major, minor, patch, build); | ||
42 | + } | ||
43 | + | ||
44 | + /** | ||
45 | + * Creates a new version by parsing the specified string. | ||
46 | + * | ||
47 | + * @param string version string | ||
48 | + * @return version descriptor | ||
49 | + */ | ||
50 | + public static Version version(String string) { | ||
51 | + String[] fields = string.split("[.-]"); | ||
52 | + return new Version(parseInt(fields[0]), parseInt(fields[1]), | ||
53 | + parseInt(fields[2]), fields[3]); | ||
54 | + } | ||
55 | + | ||
56 | + /** | ||
57 | + * Returns the major version number. | ||
58 | + * | ||
59 | + * @return major version number | ||
60 | + */ | ||
61 | + public int major() { | ||
62 | + return major; | ||
63 | + } | ||
64 | + | ||
65 | + /** | ||
66 | + * Returns the minor version number. | ||
67 | + * | ||
68 | + * @return minor version number | ||
69 | + */ | ||
70 | + public int minor() { | ||
71 | + return minor; | ||
72 | + } | ||
73 | + | ||
74 | + /** | ||
75 | + * Returns the version patch number. | ||
76 | + * | ||
77 | + * @return patch number | ||
78 | + */ | ||
79 | + public int patch() { | ||
80 | + return patch; | ||
81 | + } | ||
82 | + | ||
83 | + /** | ||
84 | + * Returns the version build string. | ||
85 | + * | ||
86 | + * @return build string | ||
87 | + */ | ||
88 | + public String build() { | ||
89 | + return build; | ||
90 | + } | ||
91 | + | ||
92 | + @Override | ||
93 | + public String toString() { | ||
94 | + return format; | ||
95 | + } | ||
96 | + | ||
97 | + @Override | ||
98 | + public int hashCode() { | ||
99 | + return Objects.hash(format); | ||
100 | + } | ||
101 | + | ||
102 | + @Override | ||
103 | + public boolean equals(Object obj) { | ||
104 | + if (this == obj) { | ||
105 | + return true; | ||
106 | + } | ||
107 | + if (obj instanceof Version) { | ||
108 | + final Version other = (Version) obj; | ||
109 | + return Objects.equals(this.format, other.format); | ||
110 | + } | ||
111 | + return false; | ||
112 | + } | ||
113 | +} |
1 | +package org.onlab.onos; | ||
2 | + | ||
3 | +import com.google.common.testing.EqualsTester; | ||
4 | +import org.junit.Test; | ||
5 | + | ||
6 | +import static org.junit.Assert.*; | ||
7 | +import static org.onlab.onos.Version.version; | ||
8 | + | ||
9 | +/** | ||
10 | + * Tests of the version descriptor. | ||
11 | + */ | ||
12 | +public class VersionTest { | ||
13 | + | ||
14 | + @Test | ||
15 | + public void fromParts() { | ||
16 | + Version v = version(1, 2, 3, "4321"); | ||
17 | + assertEquals("wrong major", 1, v.major()); | ||
18 | + assertEquals("wrong minor", 2, v.minor()); | ||
19 | + assertEquals("wrong patch", 3, v.patch()); | ||
20 | + assertEquals("wrong build", "4321", v.build()); | ||
21 | + } | ||
22 | + | ||
23 | + @Test | ||
24 | + public void fromString() { | ||
25 | + Version v = version("1.2.3.4321"); | ||
26 | + assertEquals("wrong major", 1, v.major()); | ||
27 | + assertEquals("wrong minor", 2, v.minor()); | ||
28 | + assertEquals("wrong patch", 3, v.patch()); | ||
29 | + assertEquals("wrong build", "4321", v.build()); | ||
30 | + } | ||
31 | + | ||
32 | + @Test | ||
33 | + public void snapshot() { | ||
34 | + Version v = version("1.2.3-SNAPSHOT"); | ||
35 | + assertEquals("wrong major", 1, v.major()); | ||
36 | + assertEquals("wrong minor", 2, v.minor()); | ||
37 | + assertEquals("wrong patch", 3, v.patch()); | ||
38 | + assertEquals("wrong build", "SNAPSHOT", v.build()); | ||
39 | + } | ||
40 | + | ||
41 | + @Test | ||
42 | + public void testEquals() { | ||
43 | + new EqualsTester() | ||
44 | + .addEqualityGroup(version("1.2.3.4321"), version(1, 2, 3, "4321")) | ||
45 | + .addEqualityGroup(version("1.9.3.4321"), version(1, 9, 3, "4321")) | ||
46 | + .addEqualityGroup(version("1.2.8.4321"), version(1, 2, 8, "4321")) | ||
47 | + .addEqualityGroup(version("1.2.3.x"), version(1, 2, 3, "x")) | ||
48 | + .testEquals(); | ||
49 | + } | ||
50 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +package org.onlab.onos.cluster.impl; | ||
2 | + | ||
3 | +import org.apache.felix.scr.annotations.Activate; | ||
4 | +import org.apache.felix.scr.annotations.Component; | ||
5 | +import org.apache.felix.scr.annotations.Service; | ||
6 | +import org.onlab.onos.CoreService; | ||
7 | +import org.onlab.onos.Version; | ||
8 | +import org.onlab.util.Tools; | ||
9 | + | ||
10 | +import java.io.File; | ||
11 | +import java.util.List; | ||
12 | + | ||
13 | +/** | ||
14 | + * Core service implementation. | ||
15 | + */ | ||
16 | +@Component | ||
17 | +@Service | ||
18 | +public class CoreManager implements CoreService { | ||
19 | + | ||
20 | + private static final File VERSION_FILE = new File("../VERSION"); | ||
21 | + private static Version version = Version.version("1.0.0-SNAPSHOT"); | ||
22 | + | ||
23 | + // TODO: work in progress | ||
24 | + | ||
25 | + @Activate | ||
26 | + public void activate() { | ||
27 | + List<String> versionLines = Tools.slurp(VERSION_FILE); | ||
28 | + if (versionLines != null && !versionLines.isEmpty()) { | ||
29 | + version = Version.version(versionLines.get(0)); | ||
30 | + } | ||
31 | + } | ||
32 | + | ||
33 | + @Override | ||
34 | + public Version version() { | ||
35 | + return version; | ||
36 | + } | ||
37 | + | ||
38 | +} |
... | @@ -60,6 +60,13 @@ perl -pi.old -e "s|^(featuresBoot=.*)|\1,$ONOS_FEATURES|" \ | ... | @@ -60,6 +60,13 @@ perl -pi.old -e "s|^(featuresBoot=.*)|\1,$ONOS_FEATURES|" \ |
60 | cp $M2_REPO/org/onlab/onos/onos-branding/$ONOS_VERSION/onos-branding-*.jar \ | 60 | cp $M2_REPO/org/onlab/onos/onos-branding/$ONOS_VERSION/onos-branding-*.jar \ |
61 | $ONOS_STAGE/$KARAF_DIST/lib | 61 | $ONOS_STAGE/$KARAF_DIST/lib |
62 | 62 | ||
63 | +# Patch in the ONOS version file use the build number or the user name for | ||
64 | +# build postfix in place of the SNAPSHOT post-fix. | ||
65 | +build=${BUILD_NUMBER:-$(id -un)} | ||
66 | +grep '<version>' $ONOS_ROOT/pom.xml | head -n1 | \ | ||
67 | + sed 's:.*<version>::g;s:</version>.*::g' | sed "s/SNAPSHOT/$build/g" \ | ||
68 | + >> $ONOS_STAGE/VERSION | ||
69 | + | ||
63 | # Now package up the ONOS tar file | 70 | # Now package up the ONOS tar file |
64 | cd $ONOS_STAGE_ROOT | 71 | cd $ONOS_STAGE_ROOT |
65 | COPYFILE_DISABLE=1 tar zcf $ONOS_TAR $ONOS_BITS | 72 | COPYFILE_DISABLE=1 tar zcf $ONOS_TAR $ONOS_BITS | ... | ... |
... | @@ -4,6 +4,7 @@ | ... | @@ -4,6 +4,7 @@ |
4 | #------------------------------------------------------------------------------- | 4 | #------------------------------------------------------------------------------- |
5 | 5 | ||
6 | export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/} | 6 | export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/} |
7 | +export JAVA_OPTS="-Xms256M -Xmx2048M" | ||
7 | 8 | ||
8 | cd /opt/onos | 9 | cd /opt/onos |
9 | /opt/onos/apache-karaf-3.0.1/bin/karaf "$@" | 10 | /opt/onos/apache-karaf-3.0.1/bin/karaf "$@" | ... | ... |
... | @@ -4,6 +4,12 @@ import com.google.common.base.Strings; | ... | @@ -4,6 +4,12 @@ import com.google.common.base.Strings; |
4 | import com.google.common.primitives.UnsignedLongs; | 4 | import com.google.common.primitives.UnsignedLongs; |
5 | import com.google.common.util.concurrent.ThreadFactoryBuilder; | 5 | import com.google.common.util.concurrent.ThreadFactoryBuilder; |
6 | 6 | ||
7 | +import java.io.BufferedReader; | ||
8 | +import java.io.File; | ||
9 | +import java.io.FileReader; | ||
10 | +import java.io.IOException; | ||
11 | +import java.util.ArrayList; | ||
12 | +import java.util.List; | ||
7 | import java.util.concurrent.ThreadFactory; | 13 | import java.util.concurrent.ThreadFactory; |
8 | 14 | ||
9 | public abstract class Tools { | 15 | public abstract class Tools { |
... | @@ -66,4 +72,24 @@ public abstract class Tools { | ... | @@ -66,4 +72,24 @@ public abstract class Tools { |
66 | } | 72 | } |
67 | } | 73 | } |
68 | 74 | ||
75 | + /** | ||
76 | + * Slurps the contents of a file into a list of strings, one per line. | ||
77 | + * | ||
78 | + * @param path file path | ||
79 | + * @return file contents | ||
80 | + */ | ||
81 | + public static List<String> slurp(File path) { | ||
82 | + try (BufferedReader br = new BufferedReader(new FileReader(path))) { | ||
83 | + List<String> lines = new ArrayList<>(); | ||
84 | + String line; | ||
85 | + while ((line = br.readLine()) != null) { | ||
86 | + lines.add(line); | ||
87 | + } | ||
88 | + return lines; | ||
89 | + | ||
90 | + } catch (IOException e) { | ||
91 | + return null; | ||
92 | + } | ||
93 | + } | ||
94 | + | ||
69 | } | 95 | } | ... | ... |
-
Please register or login to post a comment