From d23124e814e435b60e98a4b6f49433853a97a40f Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Mon, 28 Oct 2013 14:18:11 +0100 Subject: [PATCH] Updated flow capable models and affected code Flow Model modified to support instruction. Match type modified. SAL Compatibility is causing compilation problems. Table features added. Depends on Flow instructions. Signed-off-by: Prasanna Huddar Signed-off-by: Tony Tkacik Change-Id: I9662d877ea5f2bc173e2377177f7e62f55c4904a --- .../frm/compatibility/FlowConfigMapping.xtend | 7 +- .../src/main/yang/flow-types.yang | 127 ++++++++++-- .../src/main/yang/match-types.yang | 164 ++++++++++------ .../src/main/yang/table-types.yang | 181 ++++++++++++++++++ .../src/main/yang/flow-config.yang | 4 +- .../src/main/yang/table-config.yang | 32 ++++ .../src/main/yang/flow-service.yang | 12 -- .../src/main/yang/table-service.yang | 32 ++++ .../compability/FromSalConversionsUtils.java | 58 +++--- .../sal/compability/MDFlowMapping.xtend | 114 +++++------ .../compability/ToSalConversionsUtils.java | 71 ++++--- .../TestFromSalConversionsUtils.java | 34 ++-- .../TestToSalConversionsUtils.java | 62 +++--- 13 files changed, 635 insertions(+), 263 deletions(-) create mode 100644 opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang create mode 100644 opendaylight/md-sal/model/model-flow-management/src/main/yang/table-config.yang create mode 100644 opendaylight/md-sal/model/model-flow-service/src/main/yang/table-service.yang diff --git a/opendaylight/md-sal/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FlowConfigMapping.xtend b/opendaylight/md-sal/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FlowConfigMapping.xtend index 602b626452..c567dc0097 100644 --- a/opendaylight/md-sal/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FlowConfigMapping.xtend +++ b/opendaylight/md-sal/flow-management-compatibility/src/main/java/org/opendaylight/controller/md/frm/compatibility/FlowConfigMapping.xtend @@ -16,16 +16,15 @@ import org.opendaylight.yangtools.yang.binding.Identifiable class FlowConfigMapping { static def toConfigurationFlow(FlowConfig sourceCfg) { - val it = new FlowBuilder(); val source = flowAdded(sourceCfg.flow); - - action = source.action; + val it = new FlowBuilder(); + instructions = source.instructions; cookie = source.cookie; hardTimeout = source.hardTimeout idleTimeout = source.idleTimeout match = source.match node = source.node - key = new FlowKey(sourceCfg.name, node) + key = new FlowKey(sourceCfg.name,node); return it.build(); } diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang index 9688e75c62..5382daf454 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang @@ -7,7 +7,7 @@ module opendaylight-flow-types { import ietf-yang-types {prefix yang;} import opendaylight-l2-types {prefix l2t;} - revision "2013-08-19" { + revision "2013-10-26" { description "Initial revision of flow service"; } @@ -16,6 +16,17 @@ module opendaylight-flow-types { type int32; } + + grouping action-list { + list action { + key "order"; + leaf order { + type int32; + } + uses action; + } + } + grouping address { choice address { case ipv4 { @@ -31,12 +42,66 @@ module opendaylight-flow-types { } } + grouping instruction-list { + list instruction { + key "order"; + leaf order { + type int32; + } + uses instruction; + } + } + + grouping instruction { + choice instruction { + case go-to-table { + leaf table_id { + type uint8; + } + } + + case write-metadata { + leaf metadata { + type uint64; + } + + leaf metadata-mask { + type uint64; + } + } + + case write-actions { + uses action-list; + } + + case apply-actions { + uses action-list; + } + + case clear-actions { + uses action-list; + } + + case meter { + leaf meter { + type string; + } + } + } + } + grouping action { choice action { case output-action { leaf-list output-node-connector { type inet:uri; } + + leaf max-length { + type uint16 { + range "0..65294"; + } + } } case controller-action { @@ -49,13 +114,13 @@ module opendaylight-flow-types { case set-queue-action { leaf queue { - type string; // TODO: define queues + type string; } } case pop-mpls-action { leaf ethernet-type { - type uint16; // TODO: define ethertype type + type uint16; // TODO: define ethertype type } } @@ -72,13 +137,27 @@ module opendaylight-flow-types { } case push-pbb-action { - + leaf ethernet-type { + type uint16; // TODO: define ethertype type + } } + case pop-pbb-action { + + } + case push-mpls-action { - + leaf ethernet-type { + type uint16; // TODO: define ethertype type + } } - + + case dec-mpls-ttl { + } + + case dec-nw-ttl { + } + case drop-action { } @@ -115,6 +194,13 @@ module opendaylight-flow-types { // leaf header { //header = [TPID + TCI] // } } + + case copy-ttl-out { + } + + case copy-ttl-in { + } + case set-dl-dst-action { leaf address { type yang:mac-address; @@ -126,20 +212,30 @@ module opendaylight-flow-types { type yang:mac-address; } } + case group-action { + leaf group { + type string; + } + } + case set-dl-type-action { leaf dl-type { type l2t:ether-type; } } + case set-next-hop-action { uses address; } + case set-nw-dst-action { uses address; } + case set-nw-src-action{ uses address; } + case set-nw-tos-action { leaf tos { type int32; @@ -161,20 +257,21 @@ module opendaylight-flow-types { type vlan-cfi; } } + case set-vlan-id-action { leaf vlan-id { type l2t:vlan-id; } } + case set-vlan-pcp-action { leaf vlan-pcp { type l2t:vlan-pcp; } } - case sw-path-action { - } - + case sw-path-action { + } } } @@ -191,13 +288,11 @@ module opendaylight-flow-types { container match { uses match:match; } - list action { - key "order"; - leaf order { - type int32; - } - uses action; + + container instructions { + uses instruction-list; } + leaf priority { type uint16; } @@ -223,7 +318,7 @@ module opendaylight-flow-types { } leaf table_id { - type uint64; + type uint8; } leaf buffer_id { diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang index 757686c662..bee439ac02 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang @@ -6,8 +6,8 @@ module opendaylight-match-types { import ietf-yang-types {prefix yang;} import opendaylight-l2-types {prefix l2t;} - revision "2013-08-19" { - description "Initial revision of flow service"; + revision "2013-10-26" { + description "Initial revision of macth types"; } grouping "mac-address-filter" { @@ -75,10 +75,16 @@ module opendaylight-match-types { description "IP DSCP (6 bits in ToS field)."; type inet:dscp; } + leaf ip-ecn { description "IP ECN (2 bits in ToS field)."; type uint8; } + + leaf ip-proto { + description "IP Proto (IPv4 or IPv6 Protocol Number)."; + type inet:ip-version; + } } grouping "ipv4-match-fields" { @@ -97,10 +103,35 @@ module opendaylight-match-types { description "IPv6 source address."; type inet:ipv6-prefix; } + leaf ipv6-destination { description "IPv6 destination address."; type inet:ipv6-prefix; } + + leaf ipv6-nd-target { + description "IPv6 target address for neighbour discovery message"; + type inet:ipv6-prefix; + } + + leaf ipv6-flabel { + type inet:ipv6-flow-label; + } + + leaf ipv6-nd-sll { + description "Link layer source address for neighbour discovery message"; + type yang:mac-address; + } + + leaf ipv6-nd-tll { + description "Link layer target address for neighbour discovery message"; + type yang:mac-address; + } + + leaf ipv6-exthdr { + description "IPv6 Extension Header field"; + type uint16; + } } grouping "udp-match-fields" { @@ -114,6 +145,29 @@ module opendaylight-match-types { } } + grouping "protocol-match-fields" { + leaf mpls-label { + description "Label in the first MPLS shim header"; + type uint32; + } + + leaf mpls-tc { + description "TC in the first MPLS shim header"; + type uint8; + } + + leaf mpls-bos { + description "BoS bit in the first MPLS shim header"; + type uint8; + } + + leaf pbb-isid { + description "I-SID in the first PBB service instance tag"; + type uint32; + } + + } + grouping "tcp-match-fields" { leaf tcp-source-port { description "TCP source port."; @@ -146,8 +200,23 @@ module opendaylight-match-types { type uint8; // Define ICMP Code } } + + grouping "icmpv6-match-fields" { + leaf icmpv6-type { + description "ICMP type."; + type uint8; // Define ICMP Type + } + description "ICMP code."; + leaf icmpv6-code { + type uint8; // Define ICMP Code + } + } grouping "arp-match-fields" { + leaf arp-op { + type uint16; + } + leaf arp-source-transport-address { description "ARP source IPv4 address."; type inet:ipv4-prefix; @@ -160,79 +229,41 @@ module opendaylight-match-types { container arp-source-hardware-address { description "ARP source hardware address."; presence "Match field is active and set"; - uses mac-address-filter; + uses mac-address-filter; } container arp-target-hardware-address { description "ARP target hardware address."; presence "Match field is active and set"; - uses mac-address-filter; - } - } - - grouping action { - choice action { - case output-action { - leaf-list output-node-connector { - type string; - } - } - - case controller-action { - leaf max-length { - type uint16 { - range "0..65294"; - } - } - } - - case set-queue-action { - leaf queue { - type string; // TODO: define queues - } - } - - case pop-mpls-action { - container pop-mpls { - leaf ethernet-type { - type uint16; // TODO: define ethertype type - } - } - } - - case set-mpls-ttl-action { - leaf mpls-ttl { - type uint8; - } - } - - case set-nw-ttl-action { - leaf nw-ttl { - type uint8; - } - } - - case push-pbb-action { - - } - - case push-mpls-action { - - } - - case push-vlan-action { - - } + uses mac-address-filter; } } - - + grouping match { + leaf in-port { + type uint32; + } + + leaf in-phy-port { + type uint32; + } + + leaf metadata { + type uint64; + } + + leaf tunnel-id { + description "Metadata associated in the logical port"; + type uint64; + } + container "ethernet-match" { uses "ethernet-match-fields"; } + container "vlan-match" { uses "vlan-match-fields"; } + container "ip-match" { uses "ip-match-fields"; } @@ -260,8 +291,17 @@ module opendaylight-match-types { uses "sctp-match-fields"; } } + container "icmpv4-match" { uses "icmpv4-match-fields"; } + + container "icmpv6-match" { + uses "icmpv6-match-fields"; + } + + container "protocol-match-fields" { + uses "protocol-match-fields"; + } } } \ No newline at end of file diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang new file mode 100644 index 0000000000..0b77d75867 --- /dev/null +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang @@ -0,0 +1,181 @@ +module opendaylight-table-types { + namespace "urn:opendaylight:table:types"; + prefix table; + + import ietf-inet-types {prefix inet;} + import ietf-yang-types {prefix yang;} + import opendaylight-flow-types {prefix flow;} + + + revision "2013-10-26" { + description "Initial revision of table service"; + } + + typedef table-ref { + type instance-identifier; + } + + typedef table-config { + type bits { + bit DEPRECATED-MASK; + } + } + + grouping table-feature-prop-type { + choice table-feature-prop-type { + case instructions { + container instructions { + uses flow:instruction-list; + } + } + + case instructions-miss { + container instructions-miss { + uses flow:instruction-list; + } + } + + case next-table { + container tables { + list table-id { + key "table"; + + leaf table-id { + type table-ref; + } + } + } + } + + case next-table-miss { + container tables { + list table-id { + key "table-id"; + + leaf table-id { + type table-ref; + } + } + } + } + + case write-actions { + container write-actions { + uses flow:action-list; + } + } + + case write-actions-miss { + container write-actions-miss { + uses flow:action-list; + } + } + + case apply-actions { + container apply-actions { + uses flow:action-list; + } + } + + case apply-actions-miss { + container apply-actions-miss { + uses flow:action-list; + } + } + + case match { + container matches { + leaf-list match { + type uint32; + } + } + } + + case wildcards { + container wildcards { + leaf-list wildcard { + type uint32; + } + } + } + + case write-setfield { + container write-setfield { + leaf-list setfield { + type uint32; + } + } + } + + case write-setfield-miss { + container write-setfield-miss { + leaf-list setfield { + type uint32; + } + } + } + + case apply-setfield { + container apply-setfield { + leaf-list setfield { + type uint32; + } + } + } + + case apply-setfield-miss { + container apply-setfield-miss { + leaf-list setfield { + type uint32; + } + } + } + } + } + + grouping table-features { + list table-features { + key "table-id"; + + leaf table-id { + type table-ref; + } + + leaf name { + description "Name of the table"; + type string; + } + + leaf metadata-match { + description "Bits of metadata table can match"; + type uint64; + } + + leaf metadata-write { + description "Bits of metadata table can write"; + type uint64; + } + + leaf max-entries { + description "Max number of entries supported"; + type uint32; + } + + leaf config { + description "Bitmap of OFPTC_ values"; + type table-config; + } + + container table-properties { + list instruction-id { + key "order"; + leaf order { + type int32; + } + + uses table-feature-prop-type; + } + } + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/model/model-flow-management/src/main/yang/flow-config.yang b/opendaylight/md-sal/model/model-flow-management/src/main/yang/flow-config.yang index 5e6b59a018..aa0409551f 100644 --- a/opendaylight/md-sal/model/model-flow-management/src/main/yang/flow-config.yang +++ b/opendaylight/md-sal/model/model-flow-management/src/main/yang/flow-config.yang @@ -20,8 +20,8 @@ module flow-management { container flows { list flow { - key "id node"; - + key "node id"; + leaf id { type string; } diff --git a/opendaylight/md-sal/model/model-flow-management/src/main/yang/table-config.yang b/opendaylight/md-sal/model/model-flow-management/src/main/yang/table-config.yang new file mode 100644 index 0000000000..003f152cbf --- /dev/null +++ b/opendaylight/md-sal/model/model-flow-management/src/main/yang/table-config.yang @@ -0,0 +1,32 @@ +module table-management { + namespace "urn:opendaylight:table:config"; + prefix table-cfg; + + import opendaylight-inventory {prefix inv;} + import opendaylight-table-types {prefix table;} + + revision "2013-10-24" { + description "Initial revision of table service"; + } + + grouping table-entry { + + leaf node { + type inv:node-ref; + } + + uses table:table-features; + } + + container tables { + list table { + key "id node"; + + leaf id { + type string; + } + + uses table-entry; + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang b/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang index 147b64689e..19f56db30e 100644 --- a/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang +++ b/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang @@ -71,16 +71,4 @@ module sal-flow { notification flow-removed { uses node-flow; } - - augment "/inv:nodes/inv:node" { - ext:augment-identifier "flow-capable-node"; - container flow-tables { - list table { - key "id"; - leaf "id" { - type inet:uri; - } - } - } - } } \ No newline at end of file diff --git a/opendaylight/md-sal/model/model-flow-service/src/main/yang/table-service.yang b/opendaylight/md-sal/model/model-flow-service/src/main/yang/table-service.yang new file mode 100644 index 0000000000..1e46b3f71e --- /dev/null +++ b/opendaylight/md-sal/model/model-flow-service/src/main/yang/table-service.yang @@ -0,0 +1,32 @@ +module sal-table { + namespace "urn:opendaylight:table:service"; + prefix table; + + import yang-ext {prefix ext;} + import opendaylight-inventory {prefix inv;} + import opendaylight-table-types {prefix table-type;} + + revision "2013-10-26" { + description "Initial revision of table service"; + } + + /** Base configuration structure **/ + grouping table-update { + container original-table { + uses table-type:table-features; + } + container updated-table { + uses table-type:table-features; + } + } + + rpc update-table { + input { + leaf node { + ext:context-reference "inv:node-context"; + type inv:node-ref; + } + uses table-update; + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java index 0bbe15dce9..6503a3031e 100644 --- a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java +++ b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java @@ -12,58 +12,50 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.opendaylight.controller.sal.action.*; import org.opendaylight.controller.sal.core.NodeConnector; -import org.opendaylight.controller.sal.core.Node; -import org.opendaylight.controller.sal.flowprogrammer.Flow; + import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchField; import org.opendaylight.controller.sal.match.MatchType; import org.opendaylight.controller.sal.utils.NetUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.*; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder; + import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpSourceHardwareAddressBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpTargetHardwareAddressBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetDestinationBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetSourceBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetTypeBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.ArpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv4MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv6MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.SctpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.TcpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.UdpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.vlan.match.fields.VlanIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder; import com.google.common.net.InetAddresses; + + + + import static org.opendaylight.controller.sal.compability.ProtocolConstants.*; import static org.opendaylight.controller.sal.compability.NodeMapping.*; @@ -100,10 +92,10 @@ public class FromSalConversionsUtils { return null; } - public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Match toMatch( + public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match toMatch( Match sourceMatch) { if (sourceMatch != null) { - org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.MatchBuilder targetBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.MatchBuilder(); + MatchBuilder targetBuilder = new MatchBuilder(); targetBuilder.setEthernetMatch(ethernetMatch(sourceMatch)); targetBuilder.setIpMatch(ipMatch(sourceMatch)); diff --git a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/MDFlowMapping.xtend b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/MDFlowMapping.xtend index ac4d99f10f..be9ec83f37 100644 --- a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/MDFlowMapping.xtend +++ b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/MDFlowMapping.xtend @@ -41,34 +41,34 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.Flow import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsInputBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.ControllerActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.DropActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.FloodActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.FloodAllActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.HwPathActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.LoopbackActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.OutputActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PopVlanActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PushVlanActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlDstActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlSrcActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlTypeActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNextHopActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwDstActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwSrcActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwTosActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetTpDstActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetTpSrcActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanCfiActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanIdActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanPcpActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SwPathActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.VlanCfi +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.ControllerActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.DropActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodAllActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.HwPathActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.LoopbackActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.OutputActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PopVlanActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushVlanActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlDstActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlSrcActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlTypeActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNextHopActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwDstActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwSrcActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwTosActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpDstActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpSrcActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanCfiActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanIdActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanPcpActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SwPathActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.ActionBuilder import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp @@ -77,6 +77,12 @@ import static extension org.opendaylight.controller.sal.compability.FromSalConve import static extension org.opendaylight.controller.sal.compability.NodeMapping.* import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder +import java.util.Collections +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder public class MDFlowMapping { @@ -99,70 +105,46 @@ public class MDFlowMapping { for (sourceAction : sourceActions) { targetActions.add(sourceAction.toAction()); } - action = targetActions; + instructions = targetActions.toApplyInstruction(); match = sourceFlow.match.toMatch(); return it.build(); } + + public static def Instructions toApplyInstruction(ArrayList actions) { + val it = new InstructionsBuilder; + val applyActions = new InstructionBuilder; + applyActions.instruction = new ApplyActionsBuilder().setAction(actions).build() + instruction = Collections.singletonList(applyActions.build) + return it.build; + } public static def flowStatisticsInput(Node sourceNode, Flow sourceFlow) { - val it = new GetFlowStatisticsInputBuilder(); val source = flowAdded(sourceFlow); - action = (source.getAction()); - cookie = (source.getCookie()); - hardTimeout = (source.getHardTimeout()); - match = (source.getMatch()); - priority = (source.getPriority()); + val it = new GetFlowStatisticsInputBuilder(source); node = sourceNode.toNodeRef(); return it.build(); } public static def removeFlowInput(Node sourceNode, Flow sourceFlow) { - val it = new RemoveFlowInputBuilder(); val source = flowAdded(sourceFlow); - action = (source.getAction()); - cookie = (source.getCookie()); - hardTimeout = (source.getHardTimeout()); - match = (source.getMatch()); - priority = (source.getPriority()); - node = sourceNode.toNodeRef(); + val it = new RemoveFlowInputBuilder(source); return it.build(); } public static def addFlowInput(Node sourceNode, Flow sourceFlow) { - val it = new AddFlowInputBuilder(); val source = flowAdded(sourceFlow); - action = (source.getAction()); - cookie = (source.getCookie()); - hardTimeout = (source.getHardTimeout()); - match = (source.getMatch()); - priority = (source.getPriority()); - node = sourceNode.toNodeRef() + val it = new AddFlowInputBuilder(source); return it.build(); } public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) { val it = new UpdateFlowInputBuilder(); - - val original = new OriginalFlowBuilder(); - val sourceOld = flowAdded(newFlow); - original.action = (sourceOld.getAction()); - original.cookie = (sourceOld.getCookie()); - original.hardTimeout = (sourceOld.getHardTimeout()); - original.match = (sourceOld.getMatch()); - original.priority = (sourceOld.getPriority()); - - val updated = new UpdatedFlowBuilder(); + val original = new OriginalFlowBuilder(sourceOld); val sourceNew = flowAdded(newFlow); - - updated.action = (sourceNew.getAction()); - updated.cookie = (sourceNew.getCookie()); - updated.hardTimeout = (sourceNew.getHardTimeout()); - updated.match = (sourceNew.getMatch()); - updated.priority = (sourceNew.getPriority()); - + val updated = new UpdatedFlowBuilder(sourceNew); originalFlow = original.build() updatedFlow = updated.build(); node = sourceNode.toNodeRef() diff --git a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java index 45884bb10f..702bd31aeb 100644 --- a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java +++ b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java @@ -18,6 +18,7 @@ import static org.opendaylight.controller.sal.match.MatchType.TP_SRC; import java.net.InetAddress; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.opendaylight.controller.sal.action.*; @@ -26,27 +27,28 @@ import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.match.Match; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.*; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.ActionList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.VlanCfi; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.MacAddressFilter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpSourceHardwareAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpTargetHardwareAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.ArpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv6Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.SctpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.TcpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.UdpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.vlan.match.fields.VlanId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.MacAddressFilter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId; import com.google.common.net.InetAddresses; @@ -56,7 +58,7 @@ public class ToSalConversionsUtils { } - public static Flow toFlow(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.Flow source) { + public static Flow toFlow(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow source) { final Flow target = new Flow(); Integer hardTimeout = source.getHardTimeout(); @@ -76,7 +78,7 @@ public class ToSalConversionsUtils { target.setMatch(toMatch(source.getMatch())); - List actions = source.getAction(); + List actions = getAction(source); if (actions != null) { target.setActions(actionFrom(actions)); } @@ -85,10 +87,23 @@ public class ToSalConversionsUtils { return target; } + public static List getAction( + org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow source) { + if (source.getInstructions() != null) { + for (Instruction instruction : source.getInstructions().getInstruction()) { + if (instruction.getInstruction() instanceof ActionList) { + return (((ActionList) instruction.getInstruction()).getAction()); + } + } + } + // TODO Auto-generated method stub + return Collections.emptyList(); + } + public static List actionFrom(List actions) { List targetAction = new ArrayList<>(); for (Action action : actions) { - org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.Action sourceAction = action + org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.Action sourceAction = action .getAction(); if (sourceAction instanceof ControllerAction) { @@ -136,13 +151,13 @@ public class ToSalConversionsUtils { } else if (sourceAction instanceof SetDlDstAction) { MacAddress addressL2Dest = ((SetDlDstAction) sourceAction).getAddress(); if (addressL2Dest != null) { - targetAction.add(new SetDlDst(bytesFrom(addressL2Dest))); + targetAction.add(new SetDlDst(bytesFrom(addressL2Dest))); } } else if (sourceAction instanceof SetDlSrcAction) { MacAddress addressL2Src = ((SetDlSrcAction) sourceAction).getAddress(); if (addressL2Src != null) { - targetAction.add(new SetDlSrc(bytesFrom(addressL2Src))); - + targetAction.add(new SetDlSrc(bytesFrom(addressL2Src))); + } } else if (sourceAction instanceof SetDlTypeAction) { EtherType dlType = ((SetDlTypeAction) sourceAction).getDlType(); @@ -271,7 +286,7 @@ public class ToSalConversionsUtils { return null; } - public static Match toMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Match source) { + public static Match toMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match source) { Match target = new Match(); if (source != null) { fillFrom(target, source.getVlanMatch()); @@ -494,8 +509,8 @@ public class ToSalConversionsUtils { private static byte[] bytesFrom(MacAddress address) { String[] mac = address.getValue().split(":"); - byte[] macAddress = new byte[6]; // mac.length == 6 bytes - for(int i = 0; i < mac.length; i++) { + byte[] macAddress = new byte[6]; // mac.length == 6 bytes + for (int i = 0; i < mac.length; i++) { macAddress[i] = Integer.decode("0x" + mac[i]).byteValue(); } return macAddress; diff --git a/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestFromSalConversionsUtils.java b/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestFromSalConversionsUtils.java index 53f0f7e4fd..3baa1bd074 100644 --- a/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestFromSalConversionsUtils.java +++ b/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestFromSalConversionsUtils.java @@ -17,17 +17,17 @@ import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchType; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.Layer3Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.Layer4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.ArpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv6Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.SctpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.TcpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.UdpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch; import com.google.common.net.InetAddresses; @@ -66,7 +66,7 @@ public class TestFromSalConversionsUtils { checkOdMatch(odNodeFlow.getMatch(), MtchType.udp); } - private void checkOdMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Match match, + private void checkOdMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match match, MtchType mt) { switch (mt) { case arp: @@ -172,11 +172,11 @@ public class TestFromSalConversionsUtils { assertEquals("Iddle timeout is incorrect.", 32766, odNodeFlow.getIdleTimeout().shortValue()); assertEquals("Priority is incorrect.", 32767, odNodeFlow.getPriority().shortValue()); - checkOdActions(odNodeFlow.getAction()); + checkOdActions(ToSalConversionsUtils.getAction(odNodeFlow)); } private void checkOdActions( - List actions) { + List actions) { checkOdAction(actions, FloodAction.class, false); checkOdAction(actions, FloodAllAction.class, false); checkOdAction(actions, HwPathAction.class, false); @@ -199,11 +199,11 @@ public class TestFromSalConversionsUtils { } private void checkOdAction( - List actions, Class cl, + List actions, Class cl, boolean b) { int numOfFoundActions = 0; - for (org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action action : actions) { - org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.Action innerAction = action + for (org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action action : actions) { + org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.Action innerAction = action .getAction(); if (cl.isInstance(innerAction)) { numOfFoundActions++; diff --git a/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestToSalConversionsUtils.java b/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestToSalConversionsUtils.java index f47f96ab9f..229fcc8806 100644 --- a/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestToSalConversionsUtils.java +++ b/opendaylight/md-sal/sal-compability/src/test/java/org/opendaylight/controller/sal/compability/TestToSalConversionsUtils.java @@ -8,6 +8,7 @@ import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.junit.Test; @@ -18,31 +19,38 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.VlanCfi; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpSourceHardwareAddressBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpTargetHardwareAddressBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.ArpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv4MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv6MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.SctpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.TcpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.UdpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.vlan.match.fields.VlanIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActions; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsBuilder; import com.google.common.net.InetAddresses; + import static org.opendaylight.controller.sal.compability.ProtocolConstants.ETHERNET_ARP; import static org.opendaylight.controller.sal.compability.ProtocolConstants.SCTP; import static org.opendaylight.controller.sal.compability.ProtocolConstants.TCP; @@ -254,7 +262,7 @@ public class TestToSalConversionsUtils { odNodeFlowBuilder.setHardTimeout(32767); odNodeFlowBuilder.setIdleTimeout(32767); odNodeFlowBuilder.setPriority(32767); - odNodeFlowBuilder.setAction(prepareOdActions()); + odNodeFlowBuilder.setInstructions(prepareOdActions()); return odNodeFlowBuilder; } @@ -263,7 +271,7 @@ public class TestToSalConversionsUtils { return odNodeFlowBuilder.build(); } - private List prepareOdActions() { + private Instructions prepareOdActions() { List odActions = new ArrayList<>(); ControllerActionBuilder controllerActionBuilder = new ControllerActionBuilder(); @@ -333,7 +341,15 @@ public class TestToSalConversionsUtils { odActions.add(new ActionBuilder().setAction(setVlanPcpActionBuilder.build()).build()); odActions.add(new ActionBuilder().setAction(swPathActionBuilder.build()).build()); - return odActions; + + ApplyActions innerInst = new ApplyActionsBuilder().setAction(odActions).build(); + Instruction applyActions = new InstructionBuilder().setInstruction(innerInst).build(); + List instructions = Collections.singletonList(applyActions ); + InstructionsBuilder instBuilder = new InstructionsBuilder(); + + instBuilder.setInstruction(instructions); + + return instBuilder.build(); } private void prepareActionSetVlanPcp(SetVlanPcpActionBuilder setVlanPcpActionBuilder) { -- 2.36.6