Bugfix.  When decomposing downstream flows consider existence of metadata at all before parsing
Allows non-metadata flows (specifically for the onu device) to be created

Change-Id: I2f94353fc64c0b27d473a4d21ad5ec6b348712e9
diff --git a/voltha/core/flow_decomposer.py b/voltha/core/flow_decomposer.py
index d5bb69f..d98c1a2 100644
--- a/voltha/core/flow_decomposer.py
+++ b/voltha/core/flow_decomposer.py
@@ -726,47 +726,69 @@
                 if has_next_table(flow):
                     assert out_port_no is None
 
-                    # For downstream flows with dual-tags, recalculate route.
-                    port_number = get_port_number_from_metadata(flow)
+                    if get_metadata(flow) is not None:
+                        log.debug('creating-metadata-flow', flow=flow)
+                        # For downstream flows with dual-tags, recalculate route.
+                        port_number = get_port_number_from_metadata(flow)
 
-                    if port_number is not None:
-                        route = self.get_route(in_port_no, port_number)
-                        if route is None:
-                            log.error('no-route-double-tag', in_port_no=in_port_no,
+                        if port_number is not None:
+                            route = self.get_route(in_port_no, port_number)
+                            if route is None:
+                                log.error('no-route-double-tag', in_port_no=in_port_no,
+                                          out_port_no=port_number, comment='deleting flow',
+                                          metadata=get_metadata_64_bit(flow))
+                                self.flow_delete(flow)
+                                return device_rules
+                            assert len(route) == 2
+                            ingress_hop, egress_hop = route
+
+                        inner_tag = get_inner_tag_from_metadata(flow)
+
+                        if inner_tag is None:
+                            log.error('no-inner-tag-double-tag', in_port_no=in_port_no,
                                       out_port_no=port_number, comment='deleting flow',
                                       metadata=get_metadata_64_bit(flow))
                             self.flow_delete(flow)
                             return device_rules
-                        assert len(route) == 2
-                        ingress_hop, egress_hop = route
 
-                    inner_tag = get_inner_tag_from_metadata(flow)
+                        fl_lst, _ = device_rules.setdefault(
+                            ingress_hop.device.id, ([], []))
+                        fl_lst.append(mk_flow_stat(
+                            priority=flow.priority,
+                            cookie=flow.cookie,
+                            match_fields=[
+                                in_port(ingress_hop.ingress_port.port_no),
+                                metadata(inner_tag)
+                            ] + [
+                                field for field in get_ofb_fields(flow)
+                                if field.type not in (IN_PORT, METADATA)
+                            ],
+                            actions=[
+                                action for action in get_actions(flow)
+                            ] + [
+                                output(ingress_hop.egress_port.port_no)
+                            ]
+                        ))
+                    else:
+                        log.debug('creating-standard-flow', flow=flow)
+                        fl_lst, _ = device_rules.setdefault(
+                            ingress_hop.device.id, ([], []))
+                        fl_lst.append(mk_flow_stat(
+                            priority=flow.priority,
+                            cookie=flow.cookie,
+                            match_fields=[
+                                in_port(ingress_hop.ingress_port.port_no)
+                            ] + [
+                                field for field in get_ofb_fields(flow)
+                                if field.type not in (IN_PORT,)
+                            ],
+                            actions=[
+                                action for action in get_actions(flow)
+                            ] + [
+                                output(ingress_hop.egress_port.port_no)
+                            ]
+                        ))
 
-                    if inner_tag is None:
-                        log.error('no-inner-tag-double-tag', in_port_no=in_port_no,
-                                  out_port_no=port_number, comment='deleting flow',
-                                  metadata=get_metadata_64_bit(flow))
-                        self.flow_delete(flow)
-                        return device_rules
-
-                    fl_lst, _ = device_rules.setdefault(
-                        ingress_hop.device.id, ([], []))
-                    fl_lst.append(mk_flow_stat(
-                        priority=flow.priority,
-                        cookie=flow.cookie,
-                        match_fields=[
-                            in_port(ingress_hop.ingress_port.port_no),
-                            metadata(inner_tag)
-                        ] + [
-                            field for field in get_ofb_fields(flow)
-                            if field.type not in (IN_PORT, METADATA)
-                        ],
-                        actions=[
-                            action for action in get_actions(flow)
-                        ] + [
-                            output(ingress_hop.egress_port.port_no)
-                        ]
-                    ))
                 elif out_port_no is not None:  # unicast case
                     fl_lst, _ = device_rules.setdefault(
                         egress_hop.device.id, ([], []))