Committed by
Gerrit Code Review
NETCONF Flow Rule Provider Check-in after modification.
Change-Id: I7b1b9953cfd44dc43fc932ca57cd5accd11bdb1b
Showing
6 changed files
with
864 additions
and
15 deletions
... | @@ -37,6 +37,11 @@ | ... | @@ -37,6 +37,11 @@ |
37 | <artifactId>onos-netconf-provider-device</artifactId> | 37 | <artifactId>onos-netconf-provider-device</artifactId> |
38 | <version>${project.version}</version> | 38 | <version>${project.version}</version> |
39 | </dependency> | 39 | </dependency> |
40 | + <dependency> | ||
41 | + <groupId>org.onosproject</groupId> | ||
42 | + <artifactId>onos-netconf-provider-flow</artifactId> | ||
43 | + <version>${project.version}</version> | ||
44 | + </dependency> | ||
40 | <!-- TODO: add other dependencies here as more bundles are added to the app --> | 45 | <!-- TODO: add other dependencies here as more bundles are added to the app --> |
41 | </dependencies> | 46 | </dependencies> |
42 | 47 | ... | ... |
... | @@ -22,13 +22,238 @@ | ... | @@ -22,13 +22,238 @@ |
22 | <parent> | 22 | <parent> |
23 | <groupId>org.onosproject</groupId> | 23 | <groupId>org.onosproject</groupId> |
24 | <artifactId>onos-netconf-providers</artifactId> | 24 | <artifactId>onos-netconf-providers</artifactId> |
25 | - <version>1.2.0-SNAPSHOT</version> | 25 | + <version>1.3.0-SNAPSHOT</version> |
26 | <relativePath>../pom.xml</relativePath> | 26 | <relativePath>../pom.xml</relativePath> |
27 | </parent> | 27 | </parent> |
28 | 28 | ||
29 | <artifactId>onos-netconf-provider-flow</artifactId> | 29 | <artifactId>onos-netconf-provider-flow</artifactId> |
30 | <packaging>bundle</packaging> | 30 | <packaging>bundle</packaging> |
31 | 31 | ||
32 | - <description>ONOS Netconf protocol flow provider</description> | 32 | + <dependencies> |
33 | + <dependency> | ||
34 | + <groupId>org.osgi</groupId> | ||
35 | + <artifactId>org.osgi.compendium</artifactId> | ||
36 | + </dependency> | ||
37 | + <dependency> | ||
38 | + <groupId>ch.ethz.ganymed</groupId> | ||
39 | + <artifactId>ganymed-ssh2</artifactId> | ||
40 | + <version>262</version> | ||
41 | + </dependency> | ||
42 | + <dependency> | ||
43 | + <!-- TODO: change this appropriately when the official TailF JNC is available --> | ||
44 | + <groupId>org.onosproject</groupId> | ||
45 | + <artifactId>jnc</artifactId> | ||
46 | + <version>1.0</version> | ||
47 | + </dependency> | ||
48 | + <dependency> | ||
49 | + <groupId>org.jdom</groupId> | ||
50 | + <artifactId>jdom2</artifactId> | ||
51 | + <version>2.0.5</version> | ||
52 | + </dependency> | ||
53 | + <dependency> | ||
54 | + <groupId>jaxen</groupId> | ||
55 | + <artifactId>jaxen</artifactId> | ||
56 | + <version>1.1.4</version> | ||
57 | + <optional>true</optional> | ||
58 | + </dependency> | ||
59 | + <dependency> | ||
60 | + <groupId>org.osgi</groupId> | ||
61 | + <artifactId>org.osgi.core</artifactId> | ||
62 | + </dependency> | ||
63 | + <dependency> | ||
64 | + <groupId>org.onosproject</groupId> | ||
65 | + <artifactId>onlab-junit</artifactId> | ||
66 | + <scope>test</scope> | ||
67 | + </dependency> | ||
68 | + <dependency> | ||
69 | + <groupId>org.easymock</groupId> | ||
70 | + <artifactId>easymock</artifactId> | ||
71 | + <scope>test</scope> | ||
72 | + </dependency> | ||
73 | + <dependency> | ||
74 | + <groupId>org.onosproject</groupId> | ||
75 | + <artifactId>onos-yang-tool</artifactId> | ||
76 | + <version>1.2.0-SNAPSHOT</version> | ||
77 | + </dependency> | ||
78 | + </dependencies> | ||
79 | + | ||
80 | + <build> | ||
81 | + <plugins> | ||
82 | + <plugin> | ||
83 | + <groupId>org.apache.maven.plugins</groupId> | ||
84 | + <artifactId>maven-shade-plugin</artifactId> | ||
85 | + <version>2.3</version> | ||
86 | + <configuration> | ||
87 | + <filters> | ||
88 | + <filter> | ||
89 | + <artifact>com.tailf:JNC</artifact> | ||
90 | + <includes> | ||
91 | + <include>com/tailf/jnc/**</include> | ||
92 | + </includes> | ||
93 | + </filter> | ||
94 | + <filter> | ||
95 | + <artifact>ch.ethz.ganymed:ganymed-ssh2</artifact> | ||
96 | + <includes> | ||
97 | + <include>ch/ethz/ssh2/**</include> | ||
98 | + </includes> | ||
99 | + </filter> | ||
100 | + <filter> | ||
101 | + <artifact>org.jdom:jdom2</artifact> | ||
102 | + <includes> | ||
103 | + <include>org/jdom2/**</include> | ||
104 | + </includes> | ||
105 | + </filter> | ||
106 | + <filter> | ||
107 | + <artifact>org.onosproject:onos-yang-tool</artifact> | ||
108 | + <includes> | ||
109 | + <include>org/opendaylight/yang/gen/**</include> | ||
110 | + </includes> | ||
111 | + </filter> | ||
112 | + </filters> | ||
113 | + </configuration> | ||
114 | + <executions> | ||
115 | + <execution> | ||
116 | + <phase>package</phase> | ||
117 | + <goals> | ||
118 | + <goal>shade</goal> | ||
119 | + </goals> | ||
120 | + </execution> | ||
121 | + </executions> | ||
122 | + </plugin> | ||
123 | + <plugin> | ||
124 | + <groupId>org.apache.felix</groupId> | ||
125 | + <artifactId>maven-scr-plugin</artifactId> | ||
126 | + </plugin> | ||
127 | + <plugin> | ||
128 | + <groupId>org.apache.felix</groupId> | ||
129 | + <artifactId>maven-bundle-plugin</artifactId> | ||
130 | + <configuration> | ||
131 | + <instructions> | ||
132 | + <Export-Package> | ||
133 | + com.tailf.jnc, | ||
134 | + ch.ethz.ssh2, | ||
135 | + ch.ethz.ssh2.auth, | ||
136 | + ch.ethz.ssh2.channel, | ||
137 | + ch.ethz.ssh2.crypto, | ||
138 | + ch.ethz.ssh2.crypto.cipher, | ||
139 | + ch.ethz.ssh2.crypto.dh, | ||
140 | + ch.ethz.ssh2.crypto.digest, | ||
141 | + ch.ethz.ssh2.log, | ||
142 | + ch.ethz.ssh2.packets, | ||
143 | + ch.ethz.ssh2.server, | ||
144 | + ch.ethz.ssh2.sftp, | ||
145 | + ch.ethz.ssh2.signature, | ||
146 | + ch.ethz.ssh2.transport, | ||
147 | + ch.ethz.ssh2.util, | ||
148 | + org.jdom2, | ||
149 | + org.jdom2.input, | ||
150 | + org.jdom2.output, | ||
151 | + org.jdom2.adapters, | ||
152 | + org.jdom2.filter, | ||
153 | + org.jdom2.internal, | ||
154 | + org.jdom2.located, | ||
155 | + org.jdom2.transform, | ||
156 | + org.jdom2.util, | ||
157 | + org.jdom2.xpath, | ||
158 | + org.jdom2.input.sax, | ||
159 | + org.jdom2.input.stax, | ||
160 | + org.jdom2.output.support, | ||
161 | + org.jdom2.xpath.jaxen, | ||
162 | + org.jdom2.xpath.util, | ||
163 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520, | ||
164 | + org.opendaylight.yangtools.yang.data.impl.schema.tree, | ||
165 | + org.opendaylight.yangtools.yang.data.impl.codec, | ||
166 | + org.opendaylight.yangtools.yang.model.parser.api, | ||
167 | + org.opendaylight.yangtools.yang.data.impl.schema.nodes, | ||
168 | + org.opendaylight.yangtools.yang.binding.util, | ||
169 | + org.opendaylight.yangtools.yang.data.impl, | ||
170 | + org.opendaylight.yangtools.sal.binding.generator.impl, | ||
171 | + org.opendaylight.yangtools.yang.parser.impl.util, | ||
172 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625, | ||
173 | + org.opendaylight.yangtools.yang.data.api, | ||
174 | + org.opendaylight.yangtools.objcache.spi, | ||
175 | + org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser, | ||
176 | + org.opendaylight.yangtools.maven.sal.api.gen.plugin, | ||
177 | + org.opendaylight.yangtools.yang.data.impl.schema.builder.impl, | ||
178 | + org.opendaylight.yangtools.yang.data.api.schema.tree, | ||
179 | + org.opendaylight.yangtools.binding.generator.util, | ||
180 | + org.opendaylight.yangtools.sal.binding.generator.spi, | ||
181 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715, | ||
182 | + org.opendaylight.yangtools.yang2sources.spi, | ||
183 | + org.opendaylight.yangtools.yang.model.repo.api, | ||
184 | + org.opendaylight.yangtools.util, | ||
185 | + org.opendaylight.yangtools.yang.parser.util, | ||
186 | + org.opendaylight.yangtools.yang.data.api.schema.stream, | ||
187 | + org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer, | ||
188 | + org.opendaylight.yangtools.concepts, | ||
189 | + org.opendaylight.yangtools.yang.binding, | ||
190 | + org.opendaylight.yangtools.yang.model.util.repo, | ||
191 | + org.opendaylight.yangtools.yang.wadl.generator.maven, | ||
192 | + org.opendaylight.yangtools.yang.data.api.schema, | ||
193 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type, | ||
194 | + org.opendaylight.yangtools.concepts.util, | ||
195 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries, | ||
196 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.ace.ip.version, | ||
197 | + org.opendaylight.yangtools.sal.binding.model.api, | ||
198 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip, | ||
199 | + org.opendaylight.yangtools.yang.data.impl.schema.builder.api, | ||
200 | + org.opendaylight.yangtools.util.concurrent, | ||
201 | + org.opendaylight.yangtools.yang.parser.builder.impl, | ||
202 | + org.opendaylight.yangtools.yang.data.impl.schema.transform.base, | ||
203 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.actions.packet.handling, | ||
204 | + org.opendaylight.yangtools.sal.binding.model.api.type.builder, | ||
205 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields, | ||
206 | + org.opendaylight.yangtools.yang2sources.plugin, | ||
207 | + org.opendaylight.yangtools.yang.data.impl.codec.xml, | ||
208 | + org.opendaylight.yangtools.antlrv4.code.gen, | ||
209 | + org.opendaylight.yangtools.yang.parser.builder.util, | ||
210 | + org.opendaylight.yangtools.yang.data.impl.schema.transform, | ||
211 | + org.opendaylight.yangtools.yang.model.api.type, | ||
212 | + org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.serializer, | ||
213 | + org.opendaylight.yangtools.yang.data.api.schema.tree.spi, | ||
214 | + org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.parser, | ||
215 | + org.opendaylight.yangtools.sal.binding.yang.types, | ||
216 | + org.opendaylight.yangtools.yang.data.impl.schema.transform.dom, | ||
217 | + org.opendaylight.yangtools.yang.data.impl.util, | ||
218 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.timerange, | ||
219 | + org.opendaylight.yangtools.sal.binding.generator.api, | ||
220 | + org.opendaylight.yangtools.sal.java.api.generator, | ||
221 | + org.opendaylight.yangtools.yang.binding.annotations, | ||
222 | + org.opendaylight.yangtools.sal.binding.generator.util, | ||
223 | + org.opendaylight.yangtools.yang.model.repo.util, | ||
224 | + org.opendaylight.yangtools.yang.model.api, | ||
225 | + org.opendaylight.yangtools.yang.common, | ||
226 | + org.opendaylight.yangtools.yang.wadl.generator, | ||
227 | + org.opendaylight.yangtools.yang.parser.builder.api, | ||
228 | + org.opendaylight.yangtools.yang.model.util, | ||
229 | + org.opendaylight.yangtools.yang.parser.impl, | ||
230 | + org.opendaylight.yangtools.yang.data.impl.schema, | ||
231 | + org.opendaylight.yangtools.yang.data.api.codec, | ||
232 | + org.opendaylight.yangtools.yang.unified.doc.generator, | ||
233 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list, | ||
234 | + org.opendaylight.yangtools.objcache, | ||
235 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.actions, | ||
236 | + org.opendaylight.yangtools.yang.data.util, | ||
237 | + org.opendaylight.yangtools.yang.unified.doc.generator.maven, | ||
238 | + org.opendaylight.yangtools.binding.generator.util.generated.type.builder, | ||
239 | + org.opendaylight.yangtools.yang.model.repo.spi, | ||
240 | + org.opendaylight.yangtools.yang.parser.repo, | ||
241 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715, | ||
242 | + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches, | ||
243 | + org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid, | ||
244 | + com.romix.scala, | ||
245 | + com.romix.scala.collection, | ||
246 | + com.romix.scala.collection.concurrent, | ||
247 | + org.opendaylight.yangtools.objcache.impl | ||
248 | + </Export-Package> | ||
249 | + </instructions> | ||
250 | + </configuration> | ||
251 | + </plugin> | ||
252 | + <plugin> | ||
253 | + <groupId>org.onosproject</groupId> | ||
254 | + <artifactId>onos-maven-plugin</artifactId> | ||
255 | + </plugin> | ||
256 | + </plugins> | ||
257 | + </build> | ||
33 | 258 | ||
34 | </project> | 259 | </project> | ... | ... |
... | @@ -15,9 +15,19 @@ | ... | @@ -15,9 +15,19 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.provider.netconf.flow.impl; | 16 | package org.onosproject.provider.netconf.flow.impl; |
17 | 17 | ||
18 | +import static com.google.common.base.Strings.isNullOrEmpty; | ||
19 | +import static org.onlab.util.Tools.get; | ||
18 | import static org.slf4j.LoggerFactory.getLogger; | 20 | import static org.slf4j.LoggerFactory.getLogger; |
19 | 21 | ||
22 | +import java.net.URI; | ||
23 | +import java.net.URISyntaxException; | ||
24 | +import java.util.ArrayList; | ||
20 | import java.util.Collections; | 25 | import java.util.Collections; |
26 | +import java.util.Dictionary; | ||
27 | +import java.util.Enumeration; | ||
28 | +import java.util.HashMap; | ||
29 | +import java.util.List; | ||
30 | +import java.util.Map; | ||
21 | import java.util.Set; | 31 | import java.util.Set; |
22 | import java.util.concurrent.ConcurrentHashMap; | 32 | import java.util.concurrent.ConcurrentHashMap; |
23 | import java.util.concurrent.ConcurrentMap; | 33 | import java.util.concurrent.ConcurrentMap; |
... | @@ -43,14 +53,34 @@ import org.onosproject.net.flow.FlowRuleProviderRegistry; | ... | @@ -43,14 +53,34 @@ import org.onosproject.net.flow.FlowRuleProviderRegistry; |
43 | import org.onosproject.net.flow.FlowRuleProviderService; | 53 | import org.onosproject.net.flow.FlowRuleProviderService; |
44 | import org.onosproject.net.provider.AbstractProvider; | 54 | import org.onosproject.net.provider.AbstractProvider; |
45 | import org.onosproject.net.provider.ProviderId; | 55 | import org.onosproject.net.provider.ProviderId; |
56 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.AccessList; | ||
57 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.AccessListBuilder; | ||
58 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.AccessListEntries; | ||
59 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.AccessListEntriesBuilder; | ||
60 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.ActionsBuilder; | ||
61 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.Matches; | ||
62 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.MatchesBuilder; | ||
63 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.actions.packet.handling.DenyBuilder; | ||
64 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.actions.packet.handling.PermitBuilder; | ||
65 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.AceIp; | ||
66 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.AceIpBuilder; | ||
67 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.ace.ip.version.AceIpv4; | ||
68 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.ace.ip.version.AceIpv4Builder; | ||
69 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; | ||
70 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; | ||
71 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.DestinationPortRange; | ||
72 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.DestinationPortRangeBuilder; | ||
73 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.SourcePortRange; | ||
74 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.SourcePortRangeBuilder; | ||
75 | +import org.osgi.service.component.ComponentContext; | ||
46 | import org.slf4j.Logger; | 76 | import org.slf4j.Logger; |
77 | + | ||
47 | /** | 78 | /** |
48 | * Netconf provider to accept any flow and report them. | 79 | * Netconf provider to accept any flow and report them. |
49 | */ | 80 | */ |
50 | @Component(immediate = true) | 81 | @Component(immediate = true) |
51 | public class NetconfFlowRuleProvider extends AbstractProvider | 82 | public class NetconfFlowRuleProvider extends AbstractProvider |
52 | implements FlowRuleProvider { | 83 | implements FlowRuleProvider { |
53 | - | ||
54 | private final Logger log = getLogger(getClass()); | 84 | private final Logger log = getLogger(getClass()); |
55 | 85 | ||
56 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 86 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
... | @@ -60,19 +90,34 @@ public class NetconfFlowRuleProvider extends AbstractProvider | ... | @@ -60,19 +90,34 @@ public class NetconfFlowRuleProvider extends AbstractProvider |
60 | 90 | ||
61 | private FlowRuleProviderService providerService; | 91 | private FlowRuleProviderService providerService; |
62 | 92 | ||
93 | + private XmlBuilder xmlBuilder; | ||
94 | + | ||
95 | + private AceIp aceIp; | ||
96 | + private SourcePortRange srcPortRange; | ||
97 | + private DestinationPortRange destPortRange; | ||
98 | + private Matches matches; | ||
63 | private HashedWheelTimer timer = Timer.getTimer(); | 99 | private HashedWheelTimer timer = Timer.getTimer(); |
64 | private Timeout timeout; | 100 | private Timeout timeout; |
101 | + private static final String ACL_NAME_KEY = "acl-name"; | ||
102 | + private static final String ACL_LIST_ENTRIES_RULE_NAME_KEY = "access-list-entries.rule-name"; | ||
103 | + private static final String ACL_LIST_SP_LOWER_KEY = "source-port-range.lower-port"; | ||
104 | + private static final String ACL_LIST_SP_UPPER_KEY = "source-port-range.upper-port"; | ||
105 | + private static final String ACL_LIST_DP_LOWER_KEY = "destination-port-range.lower-port"; | ||
106 | + private static final String ACL_LIST_DP_UPPER_KEY = "destination-port-range.upper-port"; | ||
107 | + private static final String ACL_LIST_DEST_IPV4_KEY = "matches.destination-ipv4-address"; | ||
108 | + private static final String ACL_LIST_SRC_IPV4_KEY = "matches.source-ipv4-address"; | ||
109 | + private static final String ACL_LIST_ACTIONS_KEY = "actions"; | ||
65 | 110 | ||
66 | public NetconfFlowRuleProvider() { | 111 | public NetconfFlowRuleProvider() { |
67 | - super(new ProviderId("null", "org.onosproject.provider.nil")); | 112 | + super(new ProviderId("netconf", "org.onosproject.provider.netconf")); |
68 | } | 113 | } |
69 | 114 | ||
70 | @Activate | 115 | @Activate |
71 | - public void activate() { | 116 | + public void activate(ComponentContext context) { |
72 | providerService = providerRegistry.register(this); | 117 | providerService = providerRegistry.register(this); |
73 | timeout = timer.newTimeout(new StatisticTask(), 5, TimeUnit.SECONDS); | 118 | timeout = timer.newTimeout(new StatisticTask(), 5, TimeUnit.SECONDS); |
74 | applyRule(); | 119 | applyRule(); |
75 | - | 120 | + modified(context); |
76 | log.info("Started"); | 121 | log.info("Started"); |
77 | } | 122 | } |
78 | 123 | ||
... | @@ -81,28 +126,252 @@ public class NetconfFlowRuleProvider extends AbstractProvider | ... | @@ -81,28 +126,252 @@ public class NetconfFlowRuleProvider extends AbstractProvider |
81 | providerRegistry.unregister(this); | 126 | providerRegistry.unregister(this); |
82 | providerService = null; | 127 | providerService = null; |
83 | timeout.cancel(); | 128 | timeout.cancel(); |
84 | - | ||
85 | log.info("Stopped"); | 129 | log.info("Stopped"); |
86 | } | 130 | } |
87 | 131 | ||
88 | @Modified | 132 | @Modified |
89 | - public void modified() { | 133 | + public void modified(ComponentContext context) { |
90 | - applyRule(); | 134 | + if (xmlBuilder == null) { |
135 | + xmlBuilder = new XmlBuilder(); | ||
136 | + } | ||
137 | + if (context == null) { | ||
138 | + log.info("No configuration file"); | ||
139 | + return; | ||
140 | + } | ||
141 | + Dictionary<?, ?> properties = context.getProperties(); | ||
142 | + String deviceEntry = get(properties, "devConfigs"); | ||
143 | + log.info("Settings: devConfigs={}", deviceEntry); | ||
144 | + Enumeration<?> elements = properties.keys(); | ||
145 | + Object nextElement = elements.nextElement(); | ||
146 | + while (elements.hasMoreElements()) { | ||
147 | + if (nextElement instanceof String) { | ||
148 | + log.info("key::" + nextElement + ", value::" | ||
149 | + + get(properties, (String) nextElement)); | ||
150 | + } | ||
151 | + nextElement = elements.nextElement(); | ||
152 | + } | ||
153 | + if (!isNullOrEmpty(deviceEntry)) { | ||
154 | + Map<String, String> deviceMap = processDeviceEntry(deviceEntry); | ||
155 | + AccessList accessList = buildAccessList(properties); | ||
156 | + String xmlMsg = xmlBuilder.buildAclRequestXml(accessList); | ||
157 | + log.info("The resultant xml from the builder\n" + xmlMsg); | ||
158 | + NetconfOperation netconfOperation = new NetconfOperation(); | ||
159 | + netconfOperation.sendXmlMessage(xmlMsg, deviceMap.get("username"), | ||
160 | + deviceMap.get("password"), | ||
161 | + deviceMap.get("hostIp"), Integer | ||
162 | + .parseInt(deviceMap | ||
163 | + .get("hostPort"))); | ||
164 | + } | ||
165 | + } | ||
166 | + | ||
167 | + /** | ||
168 | + * @param properties | ||
169 | + * @return accessList | ||
170 | + */ | ||
171 | + private AccessList buildAccessList(Dictionary<?, ?> properties) { | ||
172 | + /** | ||
173 | + * Populating Access List. | ||
174 | + */ | ||
175 | + AccessListBuilder abuilder = new AccessListBuilder(); | ||
176 | + String aclName = get(properties, ACL_NAME_KEY); | ||
177 | + if (aclName != null) { | ||
178 | + abuilder.setAclName(aclName); | ||
179 | + } | ||
180 | + AccessList accessList = abuilder.build(); | ||
181 | + abuilder.setAccessListEntries(getAccessListEntries(properties, matches)); | ||
182 | + srcPortRange = getSourcePortRange(properties); | ||
183 | + destPortRange = getDestinationPortRange(properties); | ||
184 | + aceIp = getAceIp(properties, srcPortRange, destPortRange); | ||
185 | + matches = getMatches(properties); | ||
186 | + return accessList; | ||
187 | + } | ||
188 | + | ||
189 | + /** | ||
190 | + * @param properties | ||
191 | + * @return matches | ||
192 | + */ | ||
193 | + private Matches getMatches(Dictionary<?, ?> properties) { | ||
194 | + /** | ||
195 | + * Building Matches for given ACL model. | ||
196 | + */ | ||
197 | + MatchesBuilder matchesBuilder = new MatchesBuilder(); | ||
198 | + if (aceIp != null) { | ||
199 | + matchesBuilder.setAceType(aceIp); | ||
200 | + } | ||
201 | + matches = matchesBuilder.build(); | ||
202 | + return matches; | ||
203 | + } | ||
204 | + | ||
205 | + /** | ||
206 | + * @param properties | ||
207 | + * @return srcPortRange | ||
208 | + */ | ||
209 | + private SourcePortRange getSourcePortRange(Dictionary<?, ?> properties) { | ||
210 | + /** | ||
211 | + * Building Source Port Range for given ACL model. | ||
212 | + */ | ||
213 | + String spRangeLowerStr = get(properties, ACL_LIST_SP_LOWER_KEY); | ||
214 | + String spRangeUpperStr = get(properties, ACL_LIST_SP_UPPER_KEY); | ||
215 | + SourcePortRangeBuilder srcPortRangeBuilder = new SourcePortRangeBuilder(); | ||
216 | + if (spRangeLowerStr != null) { | ||
217 | + int spRangeLower = Integer.parseInt(spRangeLowerStr); | ||
218 | + srcPortRangeBuilder.setLowerPort(new PortNumber(spRangeLower)); | ||
219 | + } | ||
220 | + if (spRangeUpperStr != null) { | ||
221 | + int spRangeUpper = Integer.parseInt(spRangeUpperStr); | ||
222 | + srcPortRangeBuilder.setUpperPort(new PortNumber(spRangeUpper)); | ||
223 | + } | ||
224 | + srcPortRange = srcPortRangeBuilder.build(); | ||
225 | + return srcPortRange; | ||
226 | + } | ||
227 | + | ||
228 | + /** | ||
229 | + * @param properties | ||
230 | + * @return destPortRange | ||
231 | + */ | ||
232 | + private DestinationPortRange getDestinationPortRange(Dictionary<?, ?> properties) { | ||
233 | + /** | ||
234 | + * Building Destination Port Range for given ACL model. | ||
235 | + */ | ||
236 | + String dpRangeLowerStr = get(properties, ACL_LIST_DP_LOWER_KEY); | ||
237 | + String dpRangeUpperStr = get(properties, ACL_LIST_DP_UPPER_KEY); | ||
238 | + DestinationPortRangeBuilder destPortRangeBuilder = new DestinationPortRangeBuilder(); | ||
239 | + if (dpRangeLowerStr != null) { | ||
240 | + int dpRangeLower = Integer.parseInt(dpRangeLowerStr); | ||
241 | + destPortRangeBuilder.setLowerPort(new PortNumber(dpRangeLower)); | ||
242 | + } | ||
243 | + if (dpRangeUpperStr != null) { | ||
244 | + int dpRangeUpper = Integer.parseInt(dpRangeUpperStr); | ||
245 | + destPortRangeBuilder.setUpperPort(new PortNumber(dpRangeUpper)); | ||
246 | + } | ||
247 | + destPortRange = destPortRangeBuilder.build(); | ||
248 | + return destPortRange; | ||
249 | + } | ||
250 | + | ||
251 | + /** | ||
252 | + * @param properties | ||
253 | + * @return accessListEntries | ||
254 | + */ | ||
255 | + private List<AccessListEntries> getAccessListEntries(Dictionary<?, ?> properties, | ||
256 | + Matches matches) { | ||
257 | + /** | ||
258 | + * Build and Populate Access List Entries. | ||
259 | + */ | ||
260 | + AccessListEntriesBuilder acLListEntriesBuilder = new AccessListEntriesBuilder(); | ||
261 | + String aclListEntriesRuleName = get(properties, | ||
262 | + ACL_LIST_ENTRIES_RULE_NAME_KEY); | ||
263 | + if (aclListEntriesRuleName != null) { | ||
264 | + acLListEntriesBuilder.setRuleName(aclListEntriesRuleName); | ||
265 | + } | ||
266 | + acLListEntriesBuilder.setMatches(matches); | ||
267 | + String aclActions = get(properties, ACL_LIST_ACTIONS_KEY); | ||
268 | + if (aclActions != null) { | ||
269 | + ActionsBuilder actionBuilder = new ActionsBuilder(); | ||
270 | + if (aclActions.equalsIgnoreCase("deny")) { | ||
271 | + DenyBuilder denyBuilder = new DenyBuilder(); | ||
272 | + actionBuilder.setPacketHandling(denyBuilder.build()); | ||
273 | + } else if (aclActions.equalsIgnoreCase("permit")) { | ||
274 | + PermitBuilder permitBuilder = new PermitBuilder(); | ||
275 | + actionBuilder.setPacketHandling(permitBuilder.build()); | ||
276 | + } | ||
277 | + acLListEntriesBuilder.setActions(actionBuilder.build()); | ||
278 | + } | ||
279 | + AccessListEntries aclListEntries = acLListEntriesBuilder.build(); | ||
280 | + List<AccessListEntries> accessListEntries = new ArrayList<AccessListEntries>(); | ||
281 | + accessListEntries.add(aclListEntries); | ||
282 | + return accessListEntries; | ||
283 | + } | ||
284 | + | ||
285 | + /** | ||
286 | + * @param properties | ||
287 | + * @return aceIp | ||
288 | + */ | ||
289 | + private AceIp getAceIp(Dictionary<?, ?> properties, | ||
290 | + SourcePortRange srcPortRange, | ||
291 | + DestinationPortRange destPortRange) { | ||
292 | + /** | ||
293 | + * Building Ace IPV4 Type | ||
294 | + */ | ||
295 | + String destIpv4 = get(properties, ACL_LIST_DEST_IPV4_KEY); | ||
296 | + String srcIpv4 = get(properties, ACL_LIST_SRC_IPV4_KEY); | ||
297 | + AceIpv4Builder aceIpv4Builder = new AceIpv4Builder(); | ||
298 | + aceIp = null; | ||
299 | + if (destIpv4 != null) { | ||
300 | + Ipv4Prefix destinationIp = new Ipv4Prefix(destIpv4); | ||
301 | + aceIpv4Builder.setDestinationIpv4Address(destinationIp); | ||
302 | + } | ||
303 | + if (srcIpv4 != null) { | ||
304 | + Ipv4Prefix sourceIp = new Ipv4Prefix(srcIpv4); | ||
305 | + aceIpv4Builder.setSourceIpv4Address(sourceIp); | ||
306 | + } | ||
307 | + if (destIpv4 != null || srcIpv4 != null) { | ||
308 | + AceIpv4 aceIpv4 = aceIpv4Builder.build(); | ||
309 | + AceIpBuilder aceIpBuilder = new AceIpBuilder(); | ||
310 | + aceIpBuilder.setAceIpVersion(aceIpv4); | ||
311 | + aceIpBuilder.setSourcePortRange(srcPortRange); | ||
312 | + aceIpBuilder.setDestinationPortRange(destPortRange); | ||
313 | + aceIp = aceIpBuilder.build(); | ||
314 | + } | ||
315 | + return aceIp; | ||
316 | + } | ||
317 | + | ||
318 | + /** | ||
319 | + * @param deviceEntry | ||
320 | + * @return deviceMap | ||
321 | + */ | ||
322 | + private Map<String, String> processDeviceEntry(String deviceEntry) { | ||
323 | + if (deviceEntry == null) { | ||
324 | + log.info("No content for Device Entry, so cannot proceed further."); | ||
325 | + return null; | ||
326 | + } | ||
91 | 327 | ||
328 | + Map<String, String> deviceMap = new HashMap<String, String>(); | ||
329 | + log.info("Trying to convert Device Entry String: " + deviceEntry | ||
330 | + + " to a Netconf Device Object"); | ||
331 | + try { | ||
332 | + URI uri = new URI(deviceEntry); | ||
333 | + String path = uri.getPath(); | ||
334 | + String userInfo = path.substring(path.lastIndexOf('@')); | ||
335 | + String hostInfo = path.substring(path.lastIndexOf('@') + 1); | ||
336 | + String[] infoSplit = userInfo.split(":"); | ||
337 | + String username = infoSplit[0]; | ||
338 | + String password = infoSplit[1]; | ||
339 | + infoSplit = hostInfo.split(":"); | ||
340 | + String hostIp = infoSplit[0]; | ||
341 | + String hostPort = infoSplit[1]; | ||
342 | + if (isNullOrEmpty(username) || isNullOrEmpty(password) | ||
343 | + || isNullOrEmpty(hostIp) || isNullOrEmpty(hostPort)) { | ||
344 | + log.warn("Bad Configuration Data: both user and device" | ||
345 | + + " information parts of Configuration " + deviceEntry | ||
346 | + + " should be non-nullable"); | ||
347 | + } else { | ||
348 | + deviceMap.put("hostIp", hostIp); | ||
349 | + deviceMap.put("hostPort", hostPort); | ||
350 | + deviceMap.put("username", username); | ||
351 | + deviceMap.put("password", password); | ||
352 | + } | ||
353 | + } catch (ArrayIndexOutOfBoundsException aie) { | ||
354 | + log.error("Error while reading config infromation from the config file: " | ||
355 | + + "The user, host and device state infomation should be " | ||
356 | + + "in the order 'userInfo@hostInfo:deviceState'" | ||
357 | + + deviceEntry, aie); | ||
358 | + } catch (URISyntaxException urie) { | ||
359 | + log.error("Error while parsing config information for the device entry: " | ||
360 | + + "Illegal character in path " + deviceEntry, | ||
361 | + urie); | ||
362 | + } catch (Exception e) { | ||
363 | + log.error("Error while parsing config information for the device entry: " | ||
364 | + + deviceEntry, e); | ||
365 | + } | ||
366 | + return deviceMap; | ||
92 | } | 367 | } |
93 | 368 | ||
94 | @Override | 369 | @Override |
95 | public void applyFlowRule(FlowRule... flowRules) { | 370 | public void applyFlowRule(FlowRule... flowRules) { |
96 | - // String editXml=parser will take schema and flowrule object to build | ||
97 | - // xml | ||
98 | - // execute xml command using JNC client | ||
99 | } | 371 | } |
100 | 372 | ||
101 | @Override | 373 | @Override |
102 | public void removeFlowRule(FlowRule... flowRules) { | 374 | public void removeFlowRule(FlowRule... flowRules) { |
103 | - // String editXml=parser will take schema and flowrule object to build | ||
104 | - // xml | ||
105 | - // execute xml command using JNC client | ||
106 | } | 375 | } |
107 | 376 | ||
108 | private void applyRule() { | 377 | private void applyRule() { | ... | ... |
1 | +/* | ||
2 | + * Copyright 2015 Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.onosproject.provider.netconf.flow.impl; | ||
17 | + | ||
18 | +import static org.onlab.util.Tools.delay; | ||
19 | +import static org.slf4j.LoggerFactory.getLogger; | ||
20 | + | ||
21 | +import java.io.IOException; | ||
22 | + | ||
23 | +import org.slf4j.Logger; | ||
24 | + | ||
25 | +import com.tailf.jnc.Capabilities; | ||
26 | +import com.tailf.jnc.JNCException; | ||
27 | +import com.tailf.jnc.SSHConnection; | ||
28 | +import com.tailf.jnc.SSHSession; | ||
29 | + | ||
30 | +/** | ||
31 | + * This is to carry necessary information to connect and execute NETCONF | ||
32 | + * operations. | ||
33 | + */ | ||
34 | +public class NetconfOperation { | ||
35 | + private final Logger log = getLogger(NetconfOperation.class); | ||
36 | + private static final int EVENTINTERVAL = 2000; | ||
37 | + private static final int CONNECTION_CHECK_INTERVAL = 3; | ||
38 | + private static final String INPUT_HELLO_XML_MSG = new StringBuilder( | ||
39 | + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>") | ||
40 | + .append("<hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">") | ||
41 | + .append("<capabilities><capability>urn:ietf:params:netconf:base:1.0</capability>") | ||
42 | + .append("</capabilities></hello>").toString(); | ||
43 | + | ||
44 | + /** | ||
45 | + * This will send a Xml message to the device. | ||
46 | + */ | ||
47 | + protected void sendXmlMessage(String xmlMsg, String username, | ||
48 | + String password, String deviceIp, | ||
49 | + Integer devicePort) { | ||
50 | + SSHSession ssh = null; | ||
51 | + try { | ||
52 | + SSHConnection sshConnection = getConnection(username, password, | ||
53 | + deviceIp, devicePort); | ||
54 | + ssh = new SSHSession(sshConnection); | ||
55 | + executeMessage(ssh, INPUT_HELLO_XML_MSG); | ||
56 | + /* | ||
57 | + * execute acl message | ||
58 | + */ | ||
59 | + executeMessage(ssh, xmlMsg); | ||
60 | + | ||
61 | + } catch (IOException e) { | ||
62 | + log.error("Unable to send Hello Message to the device: ", e); | ||
63 | + } catch (JNCException e) { | ||
64 | + log.error("Authentication fail while sending Hello Message to the device: ", | ||
65 | + e); | ||
66 | + } catch (Exception e) { | ||
67 | + log.error("Unable to send Hello Message to the device: ", e); | ||
68 | + } finally { | ||
69 | + log.debug("Closing the session after successful execution"); | ||
70 | + ssh.close(); | ||
71 | + } | ||
72 | + } | ||
73 | + | ||
74 | + private void executeMessage(SSHSession ssh, String xmlMsg) | ||
75 | + throws IOException, JNCException { | ||
76 | + String helloRequestXML = xmlMsg.trim(); | ||
77 | + | ||
78 | + log.debug("Sending Hello"); | ||
79 | + ssh.print(helloRequestXML); | ||
80 | + ssh.flush(); | ||
81 | + String xmlResponse = null; | ||
82 | + int i = CONNECTION_CHECK_INTERVAL; | ||
83 | + while (!ssh.ready() && i > 0) { | ||
84 | + delay(EVENTINTERVAL); | ||
85 | + i--; | ||
86 | + } | ||
87 | + | ||
88 | + if (ssh.ready()) { | ||
89 | + StringBuffer readOne = ssh.readOne(); | ||
90 | + if (readOne == null) { | ||
91 | + log.error("The Hello Contains No Capabilites"); | ||
92 | + throw new JNCException( | ||
93 | + JNCException.SESSION_ERROR, | ||
94 | + "server does not support NETCONF base capability: " | ||
95 | + + Capabilities.NETCONF_BASE_CAPABILITY); | ||
96 | + } else { | ||
97 | + xmlResponse = readOne.toString().trim(); | ||
98 | + | ||
99 | + log.debug("Reading Capabilities: " | ||
100 | + + ssh.getSSHConnection().getGanymedConnection() | ||
101 | + .getHostname()); | ||
102 | + } | ||
103 | + } | ||
104 | + } | ||
105 | + | ||
106 | + /** | ||
107 | + * To establish SSH Connection. | ||
108 | + */ | ||
109 | + public SSHConnection getConnection(String username, String password, | ||
110 | + String sshHost, Integer sshPort) | ||
111 | + throws Exception { | ||
112 | + SSHConnection sshConnection; | ||
113 | + try { | ||
114 | + sshConnection = new SSHConnection(sshHost, sshPort); | ||
115 | + sshConnection.authenticateWithPassword(username, password); | ||
116 | + } catch (IOException e) { | ||
117 | + log.error("Unable to create a connection to the device: "); | ||
118 | + throw e; | ||
119 | + } catch (JNCException e) { | ||
120 | + log.error("Failed to connect to the device: "); | ||
121 | + throw e; | ||
122 | + } | ||
123 | + return sshConnection; | ||
124 | + } | ||
125 | + | ||
126 | +} |
providers/netconf/flow/src/main/java/org/onosproject/provider/netconf/flow/impl/XmlBuilder.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 2015 Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.onosproject.provider.netconf.flow.impl; | ||
17 | + | ||
18 | +import static org.slf4j.LoggerFactory.getLogger; | ||
19 | + | ||
20 | +import org.jdom2.Document; | ||
21 | +import org.jdom2.Element; | ||
22 | +import org.jdom2.Namespace; | ||
23 | +import org.jdom2.output.Format; | ||
24 | +import org.jdom2.output.XMLOutputter; | ||
25 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.AccessList; | ||
26 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.AceType; | ||
27 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.AceEth; | ||
28 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.AceIp; | ||
29 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.AceIpVersion; | ||
30 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.ace.ip.version.AceIpv4; | ||
31 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.acl.rev140520.access.list.access.list.entries.matches.ace.type.ace.ip.ace.ip.version.AceIpv6; | ||
32 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; | ||
33 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.DestinationPortRange; | ||
34 | +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.packet.fields.rev140625.acl.transport.header.fields.SourcePortRange; | ||
35 | +import org.slf4j.Logger; | ||
36 | + | ||
37 | +/** | ||
38 | + * Xml Builder to generate the xml according to given ACL model. | ||
39 | + */ | ||
40 | +public class XmlBuilder { | ||
41 | + private final Logger log = getLogger(XmlBuilder.class); | ||
42 | + | ||
43 | + public String buildAclRequestXml(AccessList accessList) { | ||
44 | + Document doc = new Document(); | ||
45 | + Namespace namespaceRpc = Namespace | ||
46 | + .getNamespace("urn:ietf:params:xml:ns:netconf:base:1.0"); | ||
47 | + Namespace accessNamespaceRpc = Namespace | ||
48 | + .getNamespace("urn:ietf:params:xml:ns:yang:ietf-acl"); | ||
49 | + doc.setRootElement(new Element("rpc", namespaceRpc) | ||
50 | + .setAttribute("message-id", "101")); | ||
51 | + | ||
52 | + /** | ||
53 | + * Access list elements of given ACL model. | ||
54 | + */ | ||
55 | + Element access = new Element("access-list", accessNamespaceRpc); | ||
56 | + access.addContent(new Element("acl-name", accessNamespaceRpc) | ||
57 | + .setText(accessList.getAclName())); | ||
58 | + // access.addContent(accessEntries); | ||
59 | + | ||
60 | + if (!accessList.getAccessListEntries().isEmpty() | ||
61 | + && accessList.getAccessListEntries() != null) { | ||
62 | + for (int accessEntryIntVlu = 0; accessEntryIntVlu < accessList | ||
63 | + .getAccessListEntries().size(); accessEntryIntVlu++) { | ||
64 | + access.addContent(getAccessEntries(accessEntryIntVlu, | ||
65 | + accessList, | ||
66 | + accessNamespaceRpc)); | ||
67 | + } | ||
68 | + } | ||
69 | + | ||
70 | + /** | ||
71 | + * edit-config operation for given ACL model. | ||
72 | + */ | ||
73 | + Element editConfig = new Element("edit-config", namespaceRpc); | ||
74 | + editConfig.addContent(new Element("target", namespaceRpc) | ||
75 | + .addContent(new Element("running", namespaceRpc))); | ||
76 | + editConfig.addContent(new Element("config", Namespace | ||
77 | + .getNamespace("urn:ietf:params:xml:ns:netconf:base:1.0")) | ||
78 | + .addContent(access)); | ||
79 | + | ||
80 | + doc.getRootElement().addContent(editConfig); | ||
81 | + XMLOutputter xmlOutputter = new XMLOutputter(Format.getPrettyFormat()); | ||
82 | + String outputString = xmlOutputter.outputString(doc); | ||
83 | + | ||
84 | + return outputString; | ||
85 | + } | ||
86 | + | ||
87 | + /** | ||
88 | + * access entries operation for given ACL model. | ||
89 | + */ | ||
90 | + private Element getAccessEntries(int accessEntryIntVlu, | ||
91 | + AccessList accessList, | ||
92 | + Namespace accessNamespaceRpc) { | ||
93 | + | ||
94 | + /** | ||
95 | + * Port Number | ||
96 | + */ | ||
97 | + | ||
98 | + int srcPortRangeLower = 0; | ||
99 | + int srcPortRangeUpper = 0; | ||
100 | + int destPortRangeLower = 0; | ||
101 | + int destPortRangeUpper = 0; | ||
102 | + | ||
103 | + String sourceIpAdd = ""; | ||
104 | + String destinationIpAdd = ""; | ||
105 | + | ||
106 | + /* | ||
107 | + * checking accessList is null or not | ||
108 | + */ | ||
109 | + if (accessList != null) { | ||
110 | + /* | ||
111 | + * checking list entries are empty or null | ||
112 | + */ | ||
113 | + if (!accessList.getAccessListEntries().isEmpty() | ||
114 | + && accessList.getAccessListEntries() != null) { | ||
115 | + AceType aceType = accessList.getAccessListEntries() | ||
116 | + .get(accessEntryIntVlu).getMatches().getAceType(); | ||
117 | + | ||
118 | + if (aceType instanceof AceIp) { | ||
119 | + AceIp aceIp = (AceIp) aceType; | ||
120 | + SourcePortRange sourcePortRange = aceIp | ||
121 | + .getSourcePortRange(); | ||
122 | + if (sourcePortRange != null) { | ||
123 | + PortNumber lowerPort = sourcePortRange.getLowerPort(); | ||
124 | + PortNumber upperPort = sourcePortRange.getUpperPort(); | ||
125 | + | ||
126 | + if (lowerPort != null) { | ||
127 | + srcPortRangeLower = lowerPort.getValue(); | ||
128 | + } | ||
129 | + if (upperPort != null) { | ||
130 | + srcPortRangeUpper = upperPort.getValue(); | ||
131 | + } | ||
132 | + } | ||
133 | + DestinationPortRange destinationPortRange = aceIp | ||
134 | + .getDestinationPortRange(); | ||
135 | + | ||
136 | + if (destinationPortRange != null) { | ||
137 | + PortNumber lowerPort = destinationPortRange | ||
138 | + .getLowerPort(); | ||
139 | + if (lowerPort != null) { | ||
140 | + destPortRangeLower = lowerPort.getValue(); | ||
141 | + } | ||
142 | + | ||
143 | + PortNumber upperPort = destinationPortRange | ||
144 | + .getUpperPort(); | ||
145 | + if (upperPort != null) { | ||
146 | + destPortRangeUpper = upperPort.getValue(); | ||
147 | + } | ||
148 | + | ||
149 | + } | ||
150 | + | ||
151 | + AceIpVersion aceIpVersion = aceIp.getAceIpVersion(); | ||
152 | + if (aceIpVersion instanceof AceIpv4) { | ||
153 | + AceIpv4 obj = (AceIpv4) aceIpVersion; | ||
154 | + destinationIpAdd = obj.getDestinationIpv4Address() | ||
155 | + .getValue(); | ||
156 | + sourceIpAdd = obj.getSourceIpv4Address().getValue(); | ||
157 | + } else if (aceIpVersion instanceof AceIpv6) { | ||
158 | + AceIpv6 obj = (AceIpv6) aceIpVersion; | ||
159 | + destinationIpAdd = obj.getDestinationIpv6Address() | ||
160 | + .getValue(); | ||
161 | + sourceIpAdd = obj.getSourceIpv6Address().getValue(); | ||
162 | + } | ||
163 | + } else if (aceType instanceof AceEth) { | ||
164 | + log.debug("Need to add execution loging for Ace Type Ethernet"); | ||
165 | + } | ||
166 | + } | ||
167 | + } | ||
168 | + | ||
169 | + /** | ||
170 | + * Matches elements to define IP address & Port range for given ACL | ||
171 | + * model. | ||
172 | + */ | ||
173 | + Element matchesElement = new Element("matches", accessNamespaceRpc); | ||
174 | + if (String.valueOf(srcPortRangeLower) != null | ||
175 | + && !String.valueOf(srcPortRangeLower).isEmpty()) { | ||
176 | + | ||
177 | + matchesElement.addContent(new Element("source-port-range", | ||
178 | + accessNamespaceRpc) | ||
179 | + .addContent(new Element("lower-port", accessNamespaceRpc) | ||
180 | + .setText(String.valueOf(srcPortRangeLower)))); | ||
181 | + | ||
182 | + matchesElement.addContent(new Element("source-port-range", | ||
183 | + accessNamespaceRpc) | ||
184 | + .addContent(new Element("upper-port", accessNamespaceRpc) | ||
185 | + .setText(String.valueOf(srcPortRangeUpper)))); | ||
186 | + | ||
187 | + matchesElement.addContent(new Element("destination-port-range", | ||
188 | + accessNamespaceRpc) | ||
189 | + .addContent(new Element("lower-port", accessNamespaceRpc) | ||
190 | + .setText(String.valueOf(destPortRangeLower)))); | ||
191 | + | ||
192 | + matchesElement.addContent(new Element("destination-port-range", | ||
193 | + accessNamespaceRpc) | ||
194 | + .addContent(new Element("upper-port", accessNamespaceRpc) | ||
195 | + .setText(String.valueOf(destPortRangeUpper)))); | ||
196 | + } | ||
197 | + | ||
198 | + if (destinationIpAdd != null && !destinationIpAdd.isEmpty()) { | ||
199 | + matchesElement.addContent(new Element("destination-ipv4-address", | ||
200 | + accessNamespaceRpc) | ||
201 | + .setText(destinationIpAdd)); | ||
202 | + } | ||
203 | + if (sourceIpAdd != null && !sourceIpAdd.isEmpty()) { | ||
204 | + matchesElement.addContent(new Element("source-ipv4-address", | ||
205 | + accessNamespaceRpc) | ||
206 | + .setText(sourceIpAdd)); | ||
207 | + } | ||
208 | + | ||
209 | + /** | ||
210 | + * Access entries elements for given ACL model. | ||
211 | + */ | ||
212 | + Element accessEntries = new Element("access-list-entries", | ||
213 | + accessNamespaceRpc); | ||
214 | + accessEntries.addContent(new Element("rule-name", accessNamespaceRpc) | ||
215 | + .setText(accessList.getAccessListEntries() | ||
216 | + .get(accessEntryIntVlu).getRuleName())); | ||
217 | + accessEntries.addContent(matchesElement); | ||
218 | + accessEntries.addContent(new Element("actions", accessNamespaceRpc) | ||
219 | + .addContent(new Element("deny", accessNamespaceRpc))); | ||
220 | + | ||
221 | + return accessEntries; | ||
222 | + } | ||
223 | +} |
-
Please register or login to post a comment