1414
1515-define (SRC_EP , <<" Src" >>).
1616-define (DST_EP , <<" Dst" >>).
17+ -define (PUBLISHER_ID , <<" Publisher" >>).
1718
1819% %%=============================================================================
1920% %% Callbacks
@@ -35,7 +36,7 @@ end_per_suite(_Config) ->
3536
3637all () ->
3738 [should_publish_net_flow ,
38- should_publish_flow_path ].
39+ should_publish_flow_path ].
3940
4041% %%=============================================================================
4142% %% Testcases
@@ -46,65 +47,77 @@ should_publish_net_flow(_Config) ->
4647 FlowPath = dofl_test_utils :flow_path (),
4748
4849 % % WHEN
49- {ok , NetFlowId } = dobby_oflib :publish_new_flow (? SRC_EP , ? DST_EP , FlowPath ),
50+ {ok , NetFlowId } = dobby_oflib :publish_new_flow (? PUBLISHER_ID ,
51+ ? SRC_EP ,
52+ ? DST_EP ,
53+ FlowPath ),
5054
5155 % % THEN
52- assert_net_flow_published (? SRC_EP , ? DST_EP , NetFlowId ).
56+ assert_net_flow_published (? PUBLISHER_ID , ? SRC_EP , ? DST_EP , NetFlowId ).
5357
5458should_publish_flow_path (_Config ) ->
5559 % % GIVEN
5660 FlowPath0 = dofl_test_utils :flow_path (),
5761 FlowPath1 = reconstruct_flow_path (FlowPath0 ),
5862
5963 % % WHEN
60- {ok , NetFlowId } = dobby_oflib :publish_new_flow (? SRC_EP , ? DST_EP , FlowPath0 ),
64+ {ok , NetFlowId } = dobby_oflib :publish_new_flow (? PUBLISHER_ID ,
65+ ? SRC_EP ,
66+ ? DST_EP ,
67+ FlowPath0 ),
6168
6269 % % THEN
63- assert_flow_path_published (NetFlowId , FlowPath1 ).
70+ assert_flow_path_published (? PUBLISHER_ID , NetFlowId , FlowPath1 ).
6471
6572% %%=============================================================================
6673% %% Assertions
6774% %%=============================================================================
6875
69- assert_net_flow_published (SrcEP , DstEP , NetFlowId ) ->
70- ? assert (meck :called (dby , publish , [SrcEP , {NetFlowId , #{type => of_net_flow }},
71- #{type => ep_to_nf , src => SrcEP },
72- [persistent ]])),
73- ? assert (meck :called (dby , publish , [NetFlowId ,
74- DstEP ,
75- #{type => ep_to_nf , src => NetFlowId },
76- [persistent ]])).
77-
78-
79- assert_flow_path_published (NetFlowId , FlowPath ) ->
80- assert_flow_path_published (NetFlowId , FlowPath , _PrevId = NetFlowId ).
81-
82- assert_flow_path_published (NetFlowId , [FlowMod | T ], NetFlowId ) ->
83- LinkMd = link_metadata (of_path_starts_at , {NetFlowId , NetFlowId }),
84- LinkMd2 = link_metadata (of_resource , bidirectional ),
85- FmNode = {FmId ,_FmMD } = flow_mod_identifier (FlowMod ),
86- FtId = flow_table_identifier (FlowMod ),
87- ? assert (meck :called (dby , publish , [NetFlowId , FmNode , LinkMd , [persistent ]])),
88- ? assert (meck :called (dby , publish , [FmId , FtId , LinkMd2 , [persistent ]])),
89- assert_flow_path_published (NetFlowId , T , FmId );
90- assert_flow_path_published (NetFlowId , [FlowMod | T ], LastId ) ->
91- LinkMd = link_metadata (of_path_forwards_to , {NetFlowId , LastId }),
92- LinkMd2 = link_metadata (of_resource , bidirectional ),
93- FmNode = {FmId ,_FmMD } = flow_mod_identifier (FlowMod ),
94- FtId = flow_table_identifier (FlowMod ),
95- ? assert (meck :called (dby , publish , [LastId , FmNode , LinkMd , [persistent ]])),
96- ? assert (meck :called (dby , publish , [FmId , FtId , LinkMd2 , [persistent ]])),
97- assert_flow_path_published (NetFlowId , T , FmId );
98- assert_flow_path_published (NetFlowId , [], LastId ) ->
99- LinkMd = link_metadata (of_path_ends_at , {NetFlowId , LastId }),
100- ? assert (meck :called (dby , publish , [LastId , NetFlowId , LinkMd , [persistent ]])).
76+ assert_net_flow_published (PublisherId , SrcEP , DstEP , NetFlowId ) ->
77+ [assert_dby_publish_called ([PublisherId , Src , Dst ,
78+ link_metadata ({ep_to_nf , Src })])
79+ || {Src , Dst } <- [{SrcEP , net_flow_identifier (NetFlowId )},
80+ {NetFlowId , DstEP }]].
81+
82+ assert_dby_publish_called (Args ) ->
83+ ? assert (meck :called (dby , publish , Args ++ [[persistent ]])).
84+
85+ assert_flow_path_published (PublisherId , NetFlowId , FlowPath ) ->
86+ assert_flow_path_published (PublisherId , NetFlowId , FlowPath ,
87+ _PrevId = NetFlowId ).
88+
89+ assert_flow_path_published (PublisherId , NetFlowId , [FlowMod | T ], NetFlowId ) ->
90+ OFPathArgs = [NetFlowId ,
91+ {FmId , _FmMd } = flow_mod_identifier (FlowMod ),
92+ link_metadata ({of_path_starts_at , NetFlowId , NetFlowId })],
93+ OFResourceArgs = [FmId ,
94+ flow_table_identifier (FlowMod ),
95+ link_metadata (of_resource )],
96+ [assert_dby_publish_called ([PublisherId | Args ])
97+ || Args <- [OFPathArgs , OFResourceArgs ]],
98+ assert_flow_path_published (PublisherId , NetFlowId , T , FmId );
99+ assert_flow_path_published (PublisherId , NetFlowId , [FlowMod | T ], LastId ) ->
100+ OFPathArgs = [LastId ,
101+ {FmId ,_FmMd } = flow_mod_identifier (FlowMod ),
102+ link_metadata ({of_path_forwards_to , LastId , NetFlowId })],
103+ OFResourceArgs = [FmId ,
104+ flow_table_identifier (FlowMod ),
105+ link_metadata (of_resource )],
106+ [assert_dby_publish_called ([PublisherId | Args ])
107+ || Args <- [OFPathArgs , OFResourceArgs ]],
108+ assert_flow_path_published (PublisherId , NetFlowId , T , FmId );
109+ assert_flow_path_published (PublisherId , NetFlowId , [], LastId ) ->
110+ OFPathArgs = [LastId ,
111+ NetFlowId ,
112+ link_metadata ({of_path_ends_at , LastId , NetFlowId })],
113+ assert_dby_publish_called ([PublisherId | OFPathArgs ]).
101114
102115% %%=============================================================================
103116% %% Internal functions
104117% %%=============================================================================
105118
106119mock_dobby () ->
107- ok = meck :expect (dby , publish , 4 , _Ret = ok ).
120+ ok = meck :expect (dby , publish , 5 , _Ret = ok ).
108121
109122unmock_dobby () ->
110123 ok = meck :unload (dby ).
@@ -123,16 +136,26 @@ unmock_flow_table_identifiers() ->
123136flow_mod_identifier ({Dpid , OFVersion , _FlowTableId , FlowMod }) ->
124137 {_Matches , _Instructions , Opts } = FlowMod ,
125138 Cookie = proplists :get_value (cookie , Opts ),
126- {Cookie , #{type => of_flow_mod , dpid => Dpid , of_version => OFVersion }}.
139+ {Cookie , [{<<" type" >>, <<" of_flow_mod" >>},
140+ {<<" dpid" >>, Dpid },
141+ {<<" of_version" >>, OFVersion }]}.
127142
128143flow_table_identifier ({Dpid , _OFVersion , TableNo , _FlowMod }) ->
129144 TableNoBin = integer_to_binary (TableNo ),
130145 <<Dpid /binary , " :" , TableNoBin /binary >>.
131146
132- link_metadata (Type , {NetFlowId , Src }) ->
133- #{type => Type , src => Src , net_flow_ids => [NetFlowId ]};
134- link_metadata (Type , bidirectional ) ->
135- #{type => Type }.
147+ net_flow_identifier (NetFlowId ) ->
148+ {NetFlowId , [{<<" type" >>, <<" of_net_flow" >>}]}.
149+
150+ link_metadata ({Type , Src }) ->
151+ [{<<" type" >>, atom_to_binary (Type , utf8 )},
152+ {<<" src" >>, Src }];
153+ link_metadata ({Type , Src , NetFlowId }) ->
154+ [{<<" type" >>, atom_to_binary (Type , utf8 )},
155+ {<<" src" >>, Src },
156+ {<<" net_flow_ids" >>, [NetFlowId ]}];
157+ link_metadata (Type ) ->
158+ [{<<" type" >>, atom_to_binary (Type , utf8 )}].
136159
137160reconstruct_flow_path (FlowPath0 ) ->
138161 Fun = fun ({Dpid , {OFVersion , FlowMods }}) ->
0 commit comments