diff options
author | Micael Karlberg <bmk@erlang.org> | 2021-07-15 17:41:37 +0200 |
---|---|---|
committer | Micael Karlberg <bmk@erlang.org> | 2021-08-30 17:56:42 +0200 |
commit | 711ebaaab326ce262f7604f8f0766bf571f2351e (patch) | |
tree | 2610552482fc19c8a450a023a6f09a50131b609c | |
parent | cc73e5065cbc230505135e241d38a070db8922af (diff) | |
download | erlang-711ebaaab326ce262f7604f8f0766bf571f2351e.tar.gz |
[snmp|agent] Use of inet-backend for gen_udp
Make it possible to configure agent transport (net-if) to
use the inet_backend gen_udp option.
OTP-17526
OTP-17410
-rw-r--r-- | lib/kernel/src/gen_udp_socket.erl | 35 | ||||
-rw-r--r-- | lib/snmp/src/agent/snmpa_net_if.erl | 205 | ||||
-rw-r--r-- | lib/snmp/src/misc/snmp_misc.erl | 2 | ||||
-rw-r--r-- | lib/snmp/test/snmp_agent_SUITE.erl | 459 | ||||
-rw-r--r-- | lib/snmp/test/snmp_agent_test_lib.erl | 55 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_global_sys_monitor.erl | 6 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_lib.erl | 67 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_lib.hrl | 3 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_mgr.erl | 2 |
9 files changed, 526 insertions, 308 deletions
diff --git a/lib/kernel/src/gen_udp_socket.erl b/lib/kernel/src/gen_udp_socket.erl index 43b11b456b..998ec8e194 100644 --- a/lib/kernel/src/gen_udp_socket.erl +++ b/lib/kernel/src/gen_udp_socket.erl @@ -1142,7 +1142,7 @@ init(Arg) -> error_logger:error_report([{badarg, {?MODULE, init, [Arg]}}]), error(badarg, [Arg]). - + socket_open(Domain, Proto, #{fd := FD} = ExtraOpts, Extra) -> Opts = (maps:merge(Extra, maps:remove(fd, ExtraOpts))) @@ -1170,6 +1170,8 @@ socket_open(Domain, Proto, #{fd := FD} = ExtraOpts, Extra) -> ERROR end; socket_open(Domain, Proto, ExtraOpts, Extra) -> + %% ?DBG([{domain, Domain}, {proto, Proto}, + %% {extra_opts, ExtraOpts}, {extra, Extra}]), Opts = maps:merge(Extra, ExtraOpts), socket:open(Domain, dgram, Proto, Opts). @@ -1444,7 +1446,18 @@ handle_event({call, From}, {bind, BindAddr} = _BIND, _State, {P, _D}) -> %% ?DBG(['try bind', %% {handle_event, call}, {bind_addr, BindAddr}, {state, _State}]), Result = socket:bind(P#params.socket, BindAddr), - %% ?DBG([{bind_result, Result}]), + %% ?DBG([{bind_result, Result}] ++ + %% case Result of + %% ok -> + %% case socket:sockname(P#params.socket) of + %% {ok, SockAddr} -> + %% [{sockaddr, SockAddr}]; + %% {error, SAReason} -> + %% [{sockaddr_reason, SAReason}] + %% end; + %% {error, BReason} -> + %% [{bind_reason, BReason}] + %% end), {keep_state_and_data, [{reply, From, Result}]}; @@ -1478,7 +1491,7 @@ handle_event( info, ?socket_select(Socket, SelectRef), #recv{info = ?select_info(SelectRef)}, {#params{socket = Socket} = P, D}) -> - %% ?DBG([info, {socket, Socket}, {ref, SelectRef}]), + %% ?DBG(['info socket select', {socket, Socket}, {ref, SelectRef}, {p, P}, {d, D}]), handle_recv(P, D, []); %% @@ -1486,7 +1499,7 @@ handle_event( info, ?socket_abort(Socket, SelectRef, Reason), #recv{info = ?select_info(SelectRef)}, {#params{socket = Socket} = P, D}) -> - %% ?DBG({abort, Reason}), + %% ?DBG(['socket abort', {reason, Reason}, {p, P}, {d, D}]), handle_reading(P, cleanup_recv_reply(P, D, [], Reason)); %% @@ -1622,6 +1635,8 @@ handle_recv(#params{socket = Socket, recv_method = []} = P, %% ?DBG(['try recvfrom', {socket, Socket}, {length, Length}]), case socket_recvfrom(Socket, Length) of {ok, {Source, <<Data/binary>>}} -> + %% ?DBG(['recvfrom ok', {source, Source}, + %% {'data sz', byte_size(Data)}]), handle_recv_deliver(P, D, ActionsR, {Source, Data}); {select, ?select_info(_) = SelectInfo} -> %% ?DBG(['recvfrom select', {socket_info, SelectInfo}]), @@ -1635,16 +1650,18 @@ handle_recv(#params{socket = Socket, recv_method = []} = P, end; handle_recv(#params{socket = Socket} = P, #{recv_length := Length} = D, ActionsR) -> + %% ?DBG(['try recvmsg', {socket, Socket}, {length, Length}]), case socket_recvmsg(Socket, Length) of {ok, MsgHdr} -> handle_recv_deliver(P, D, ActionsR, MsgHdr); {select, ?select_info(_) = SelectInfo} -> + %% ?DBG(['recvmsg select', {socket_info, SelectInfo}]), {next_state, #recv{info = SelectInfo}, {P, D}, reverse(ActionsR)}; {error, Reason} -> - %% ?DBG({'recv error wo rest-data', Reason}), + %% ?DBG(['recvmsg error', {reason, Reason}]), handle_recv_error(P, D, ActionsR, Reason) end. @@ -1731,10 +1748,9 @@ recv_data_deliver( #params{owner = Owner} = P, #{mode := Mode, deliver := Deliver} = D, ActionsR, Data) -> - %% - %% ?DBG([{owner, Owner}, - %% {mode, Mode}, - %% {header, Header}, {deliver, Deliver}, {packet, Packet}]), + + %% ?DBG([{owner, Owner}, {mode, Mode}, {deliver, Deliver}]), + {IP, Port, AncData, DeliverData} = deliver_data(Data, Mode), case D of #{recv_from := From} -> @@ -1769,6 +1785,7 @@ mk_recv_reply(IP, Port, AncData, Data) -> {IP, Port, AncData, Data}. deliver_recv_msg(Pid, Active, Deliver, Socket, IP, Port, AncData, Data) -> + %% ?DBG(['deliver packet', {pid, Pid}]), Pid ! mk_recv_msg(Active, Deliver, Socket, IP, Port, AncData, Data). mk_recv_msg(true = _Active, port = _Deliver, diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl index b6b115bd75..cdb68afef4 100644 --- a/lib/snmp/src/agent/snmpa_net_if.erl +++ b/lib/snmp/src/agent/snmpa_net_if.erl @@ -128,17 +128,19 @@ -record(transport, {socket, - kind = all :: all | transport_kind(), - domain = snmpUDPDomain, + mref, + kind = all :: all | transport_kind(), + domain = snmpUDPDomain, address :: inet:ip_address(), port_no :: pos_integer(), port_info :: port_info(), %% <EPHEMERAL-FOR-FUTUR-USE> - ephm = none, %% :: ephemeral(), - ephm_info = undefined, % Only used if ephm =/= none and once + ephm = none, %% :: ephemeral(), + ephm_info = undefined, % Only used if ephm =/= none and once %% </EPHEMERAL-FOR-FUTUR-USE> - opts = [], - req_refs = [] % Not used for trap/notification transports + inet_backend = [], + opts = [], + req_refs = [] % Not used for trap/notification transports }). -ifndef(default_verbosity). @@ -274,34 +276,45 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) -> %% will be taken from the "global" socket options (which serve as %% default values). %% Also, note that Ephm are not actually used at this time. - {Ephm, IpAddr, PortInfo, SocketOpts} = socket_opts(Domain, Address, - RawSocketOpts, Opts), + {Ephm, IpAddr, PortInfo, InetBackend, SocketOpts} = + socket_opts(Domain, Address, RawSocketOpts, Opts), ?vtrace("socket opts processed:" - "~n Ephm: ~p" - "~n Port Info: ~p" - "~n Socket Opts: ~p", [Ephm, PortInfo, SocketOpts]), + "~n Ephm: ~p" + "~n Port Info: ~p" + "~n Inet Backend: ~p" + "~n Socket Opts: ~p", + [Ephm, PortInfo, InetBackend, SocketOpts]), {Socket, IpPort} = socket_open(Domain, PortInfo, + InetBackend, SocketOpts), + SockMRef = inet:monitor(Socket), ?vtrace("socket opened:" - "~n Socket: ~p" - "~n Port No: ~p", [Socket, IpPort]), + "~n Socket: ~p" + "~n Port No: ~p" + "~n Info: ~p", + [Socket, IpPort, inet:info(Socket)]), + %% Should we really do this here? %% If Kind =:= trap_sender, we only need to receive after %% we have sent an inform! active_once(Socket), + ?vtrace("socket activated:" + "~n Info: ~p", [inet:info(Socket)]), #transport{ - socket = Socket, - kind = Kind, - domain = Domain, + socket = Socket, + mref = SockMRef, + kind = Kind, + domain = Domain, %% We may not have explicitly specified the port ('system' %% or a range), so it could have been "generated". %% Also, shall we push this into the transport (handled by the %% FRAMEWORK MIB)? Would not work for ephemeral sockets. - address = IpAddr, - port_no = IpPort, - port_info = PortInfo, - ephm = Ephm, - opts = SocketOpts} + address = IpAddr, + port_no = IpPort, + port_info = PortInfo, + ephm = Ephm, + inet_backend = InetBackend, + opts = SocketOpts} %% We need to fix this also end || {Domain, Address, Kind, RawSocketOpts} <- RawTransports] of @@ -401,7 +414,7 @@ format_address(Address) -> iolist_to_binary(snmp_conf:mk_addr_string(Address)). -socket_open(snmpUDPDomain = Domain, IpPort, Opts) -> +socket_open(snmpUDPDomain = Domain, IpPort, InetBackend, Opts) -> ?vdebug("socket_open(~p) -> entry with" "~n Port: ~p" "~n Opts: ~p", [Domain, IpPort, Opts]), @@ -413,7 +426,7 @@ socket_open(snmpUDPDomain = Domain, IpPort, Opts) -> "~n FD: ~p" "~n Port: ~p" "~n Opts: ~p", [Domain, FD, IpPort, Opts]), - gen_udp_open(0, [{fd, FD} | Opts]); + gen_udp_open(0, InetBackend ++ [{fd, FD} | Opts]); error -> case init:get_argument(snmpa_fd) of {ok, [[FdStr]]} -> @@ -423,26 +436,28 @@ socket_open(snmpUDPDomain = Domain, IpPort, Opts) -> "~n FD: ~p" "~n Port: ~p" "~n Opts: ~p", [Domain, FD, IpPort, Opts]), - gen_udp_open(0, [{fd, FD} | Opts]); + gen_udp_open(0, InetBackend ++ [{fd, FD} | Opts]); error -> ?vdebug("socket_open(~p) -> plain open" "~n Port: ~p" "~n Opts: ~p", [Domain, IpPort, Opts]), - gen_udp_open(IpPort, Opts) + gen_udp_open(IpPort, InetBackend ++ Opts) end end; -socket_open(Domain, PortInfo, Opts) +socket_open(Domain, PortInfo, InetBackend, Opts) when (Domain =:= transportDomainUdpIpv4) orelse (Domain =:= transportDomainUdpIpv6) -> ?vdebug("socket_open(~p) -> entry with" - "~n PortInfo: ~p" - "~n Opts: ~p", [Domain, PortInfo, Opts]), - gen_udp_open(PortInfo, Opts); -socket_open(Domain, PortInfo, Opts) -> + "~n PortInfo: ~p" + "~n InetBackend: ~p" + "~n Opts: ~p", [Domain, PortInfo, InetBackend, Opts]), + gen_udp_open(PortInfo, InetBackend ++ Opts); +socket_open(Domain, PortInfo, InetBackend, Opts) -> ?vinfo("socket_open(~p) -> entry when invalid with" - "~n PortInfo: ~p" - "~n Opts: ~p", [Domain, PortInfo, Opts]), - throw({socket_open, Domain, Opts}). + "~n PortInfo: ~p" + "~n InetBackend: ~p" + "~n Opts: ~p", [Domain, PortInfo, InetBackend, Opts]), + throw({socket_open, Domain, InetBackend, Opts}). %% Make the system choose! @@ -464,7 +479,8 @@ gen_udp_open(system, Opts) -> end; %% This is for "future compat" since we cannot actually config '0'... gen_udp_open(IpPort, Opts) when (IpPort =:= 0) -> - ?vtrace("gen_udp_open(0) -> entry"), + ?vtrace("gen_udp_open(0) -> entry with" + "~n Opts: ~p", [Opts]), case gen_udp:open(IpPort, Opts) of {ok, Socket} -> case inet:port(Socket) of @@ -480,7 +496,8 @@ gen_udp_open(IpPort, Opts) when (IpPort =:= 0) -> throw({udp_open, {open, IpPort, Reason}}) end; gen_udp_open(IpPort, Opts) when is_integer(IpPort) -> - ?vtrace("gen_udp_open(~w) -> entry", [IpPort]), + ?vtrace("gen_udp_open(~w) -> entry with" + "~n Opts: ~p", [IpPort, Opts]), case gen_udp:open(IpPort, Opts) of {ok, Socket} -> ?vtrace("gen_udp_open(~w) -> created: " @@ -555,7 +572,7 @@ loop(#state{transports = Transports, parent = Parent} = S) -> ?vdebug("loop(~p)", [S]), receive - {udp, Socket, IpAddr, IpPort, Packet} = Msg when is_port(Socket) -> + {udp, Socket, IpAddr, IpPort, Packet} = Msg -> ?vlog("got paket from ~w:~w on ~w", [IpAddr, IpPort, Socket]), case lists:keyfind(Socket, #transport.socket, Transports) of #transport{socket = Socket, domain = Domain} = Transport -> @@ -568,7 +585,8 @@ loop(#state{transports = Transports, end, loop(maybe_handle_recv(S, Transport, From, Packet)); false -> - error_msg("Packet on unknown port: ~p", [Msg]), + error_msg("Packet on unknown socket: " + "~n ~p", [Msg]), loop(S) end; @@ -750,17 +768,16 @@ loop(#state{transports = Transports, "~n ~p", [Parent, Reason]), exit(Reason); - %% We should not do this. - %% Future versions of sockets will/may not be linkable (port) - {'EXIT', Socket, Reason} when is_port(Socket) -> + {'DOWN', _SockMRef, socket, Socket, Reason} -> case lists:keyfind(Socket, #transport.socket, Transports) of #transport{ - socket = Socket, - domain = Domain, - port_info = PortInfo, - opts = SocketOpts, - req_refs = ReqRefs} = Transport -> - try socket_open(Domain, PortInfo, SocketOpts) of + socket = Socket, + domain = Domain, + port_info = PortInfo, + inet_backend = InetBackend, + opts = SocketOpts, + req_refs = ReqRefs} = Transport -> + try socket_open(Domain, PortInfo, InetBackend, SocketOpts) of {NewSocket, PortNo} -> error_msg( "Socket ~p exited for reason" @@ -769,11 +786,13 @@ loop(#state{transports = Transports, [Socket, Reason, NewSocket, PortNo]), (length(ReqRefs) < Limit) andalso active_once(NewSocket), + NewSockMRef = inet:monitor(NewSocket), S#state{ transports = lists:keyreplace( Socket, #transport.socket, Transports, Transport#transport{socket = NewSocket, + mref = NewSockMRef, port_no = PortNo})} catch ReopenReason -> @@ -787,7 +806,7 @@ loop(#state{transports = Transports, end; false -> error_msg( - "Exit message from port ~p for reason ~p~n", + "Exit message from socket ~p for reason ~p~n", [Socket, Reason]), loop(S) end; @@ -806,7 +825,6 @@ loop(#state{transports = Transports, loop(S) end. - handle_udp_error(S, #transport{socket = Socket, kind = Kind}, Error) -> try inet:sockname(Socket) of @@ -1702,7 +1720,7 @@ toname(Else) -> active_once(Sock) -> ?vtrace("activate once", []), - inet:setopts(Sock, [{active, once}]). + ok = inet:setopts(Sock, [{active, once}]). select_transport(_, []) -> @@ -1988,7 +2006,7 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) -> "~n Domain: ~p" "~n IpAddr: ~p" "~n PortInfo: ~p" - "~n SpocketOpts: ~p" + "~n SocketOpts: ~p" "~n DefaultOpts: ~p", [Domain, IpAddr, PortInfo, SocketOpts, DefaultOpts]), Opts = @@ -2017,12 +2035,12 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) -> Sz -> [{recbuf, Sz}] end ++ - case get_sndbuf(SocketOpts, DefaultOpts) of - use_default -> - []; - Sz -> - [{sndbuf, Sz}] - end + case get_sndbuf(SocketOpts, DefaultOpts) of + use_default -> + []; + Sz -> + [{sndbuf, Sz}] + end ] ++ case get_extra_sock_opts(SocketOpts, DefaultOpts) of ESO when is_list(ESO) -> @@ -2032,11 +2050,18 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) -> "~n ~p", [BadESO]), [] end, + InetBackend = + case get_inet_backend(SocketOpts, DefaultOpts) of + use_default -> + []; + Backend when (Backend =:= inet) orelse (Backend =:= socket) -> + [{inet_backend, Backend}] + end, %% <EPHEMERAL-FOR-FUTUR-USE> %% Ephm = get_ephemeral(SocketOpts), %% {Ephm, PortInfo, Opts}. %% </EPHEMERAL-FOR-FUTUR-USE> - {none, IpAddr, PortInfo, Opts}. + {none, IpAddr, PortInfo, InetBackend, Opts}. %% ---------------------------------------------------------------- @@ -2093,6 +2118,9 @@ get_no_reuse_address(Opts, DefaultOpts) -> get_extra_sock_opts(Opts, DefaultOpts) -> get_socket_opt(extra_sock_opts, Opts, DefaultOpts, []). +get_inet_backend(Opts, DefaultOpts) -> + get_socket_opt(inet_backend, Opts, DefaultOpts, use_default). + %% <EPHEMERAL-FOR-FUTUR-USE> %% This is not realy a socket option, but rather socket 'meta' %% information. Its still put together with the actual socket @@ -2157,7 +2185,7 @@ get_info(#state{transports = Transports, reqs = Reqs}) -> transport_kind => Kind, port_info => PortInfo, opts => Opts, - socket_info => get_port_info(Socket), + socket_info => get_socket_info(Socket), num_reqs => length(Refs)} || #transport{socket = Socket, domain = Domain, @@ -2178,35 +2206,8 @@ proc_mem(P) when is_pid(P) -> %% proc_mem(_) -> %% undefined. -get_port_info(Id) -> - PortInfo = - case (catch erlang:port_info(Id)) of - PI when is_list(PI) -> - [{port_info, PI}]; - _ -> - [] - end, - PortStatus = - case (catch prim_inet:getstatus(Id)) of - {ok, PS} -> - [{port_status, PS}]; - _ -> - [] - end, - PortAct = - case (catch inet:getopts(Id, [active])) of - {ok, PA} -> - [{port_act, PA}]; - _ -> - [] - end, - PortStats = - case (catch inet:getstat(Id)) of - {ok, Stat} -> - [{port_stats, Stat}]; - _ -> - [] - end, +get_socket_info(Id) when is_port(Id) -> + Info = inet:info(Id), IfList = case (catch inet:getif(Id)) of {ok, IFs} -> @@ -2221,13 +2222,29 @@ get_port_info(Id) -> _ -> [] end, - [{socket, Id}] ++ - IfList ++ - PortStats ++ - PortInfo ++ - PortStatus ++ - PortAct ++ - BufSz. + [{socket, Id}, {info, Info}] ++ IfList ++ BufSz; +get_socket_info(Id) -> + Info = inet:info(Id), + + %% Does not exist for 'socket' + IfList = [], + %% case (catch inet:getif(Id)) of + %% {ok, IFs} -> + %% [{interfaces, IFs}]; + %% _ -> + %% [] + %% end, + + BufSz = + case (catch inet:getopts(Id, [recbuf, sndbuf])) of + {ok, Sz} -> + [{buffer_size, Sz}]; + _ -> + [] + end, + + [{socket, Id}, {info, Info}] ++ IfList ++ BufSz. + %% --------------------------------------------------------------- diff --git a/lib/snmp/src/misc/snmp_misc.erl b/lib/snmp/src/misc/snmp_misc.erl index 39254503ac..63abb1ac90 100644 --- a/lib/snmp/src/misc/snmp_misc.erl +++ b/lib/snmp/src/misc/snmp_misc.erl @@ -455,7 +455,7 @@ bits_to_int([],_Kibbles,Res) -> Res; bits_to_int([Kibble|Ks],Kibbles,Res) -> case snmp_misc:assq(Kibble,Kibbles) of {value,V} -> - bits_to_int(Ks,Kibbles,Res + round(math:pow(2,V))); + bits_to_int(Ks, Kibbles, Res + round(math:pow(2,V))); _ -> error end. diff --git a/lib/snmp/test/snmp_agent_SUITE.erl b/lib/snmp/test/snmp_agent_SUITE.erl index fc4de668ab..6564c48d70 100644 --- a/lib/snmp/test/snmp_agent_SUITE.erl +++ b/lib/snmp/test/snmp_agent_SUITE.erl @@ -26,12 +26,12 @@ init_per_group/2, end_per_group/2, init_per_testcase/2, end_per_testcase/2, - %% all_tcs - misc + %% major_tcs - misc app_info/1, info_test/1, create_local_db_dir/1, - %% all_tcs - test_v1 + %% major_tcs - test_v1 simple/1, db_notify_client/1, v1_processing/1, @@ -51,7 +51,7 @@ opaque/1, change_target_addr_config/1, - %% all_tcs - test_v1 - multiple_reqs + %% major_tcs - test_v1 - multiple_reqs mul_get/1, mul_get_err/1, mul_next/1, @@ -59,7 +59,7 @@ mul_set/1, mul_set_err/1, - %% all_tcs - test_v1 - reported_bugs + %% major_tcs - test_v1 - reported_bugs otp_1128/1, otp_1129/1, otp_1131/1, @@ -75,7 +75,7 @@ otp_3187/1, otp_3725/1, - %% all_tcs - test_v1 - standard_mibs + %% major_tcs - test_v1 - standard_mibs snmp_standard_mib/1, snmp_community_mib/1, snmp_framework_mib/1, @@ -83,7 +83,7 @@ snmp_notification_mib/1, snmp_view_based_acm_mib/1, - %% all_tcs - test_v2 + %% major_tcs - test_v2 simple_2/1, v2_processing/1, big_2/1, @@ -104,7 +104,7 @@ opaque_2/1, v2_caps/1, - %% all_tcs - test_v2 - multiple_reqs_2 + %% major_tcs - test_v2 - multiple_reqs_2 mul_get_2/1, mul_get_err_2/1, mul_next_2/1, @@ -112,10 +112,10 @@ mul_set_2/1, mul_set_err_2/1, - %% all_tcs - test_v2 - v2_inform + %% major_tcs - test_v2 - v2_inform v2_inform_i/1, - %% all_tcs - test_v2 - reported_bugs_2 + %% major_tcs - test_v2 - reported_bugs_2 otp_1128_2/1, otp_1129_2/1, otp_1131_2/1, @@ -130,7 +130,7 @@ otp_2979_2/1, otp_3187_2/1, - %% all_tcs - test_v2 - standard_mibs_2 + %% major_tcs - test_v2 - standard_mibs_2 snmpv2_mib_2/1, snmp_community_mib_2/1, snmp_framework_mib_2/1, @@ -138,10 +138,10 @@ snmp_notification_mib_2/1, snmp_view_based_acm_mib_2/1, - %% all_tcs - test_v1_v2 + %% major_tcs - test_v1_v2 simple_bi/1, - %% all_tcs - test_v3 + %% major_tcs - test_v3 simple_3/1, v3_processing/1, big_3/1, @@ -162,7 +162,7 @@ opaque_3/1, v2_caps_3/1, - %% all_tcs - test_v3 - multiple_reqs_3 + %% major_tcs - test_v3 - multiple_reqs_3 mul_get_3/1, mul_get_err_3/1, mul_next_3/1, @@ -170,10 +170,10 @@ mul_set_3/1, mul_set_err_3/1, - %% all_tcs - test_v3 - v3_inform + %% major_tcs - test_v3 - v3_inform v3_inform_i/1, - %% all_tcs - test_v3 - reported_bugs_3 + %% major_tcs - test_v3 - reported_bugs_3 otp_1128_3/1, otp_1129_3/1, otp_1131_3/1, @@ -189,7 +189,7 @@ otp_3187_3/1, otp_3542/1, - %% all_tcs - test_v3 - standard_mibs_3 + %% major_tcs - test_v3 - standard_mibs_3 snmpv2_mib_3/1, snmp_framework_mib_3/1, snmp_mpd_mib_3/1, @@ -198,17 +198,17 @@ snmp_view_based_acm_mib_3/1, snmp_user_based_sm_mib_3/1, - %% all_tcs - test_v3 - v3_security + %% major_tcs - test_v3 - v3_security v3_crypto_basic/1, v3_md5_auth/1, v3_sha_auth/1, v3_des_priv/1, - %% all_tcs - test_multi_threaded, test_multi_threaded_ext + %% major_tcs - test_multi_threaded, test_multi_threaded_ext multi_threaded/1, mt_trap/1, - %% all_tcs - mib_storage - mib_storage_ets + %% major_tcs - mib_storage - mib_storage_ets mse_simple/1, mse_v1_processing/1, mse_big/1, @@ -230,7 +230,7 @@ mse_me_of/1, mse_mib_of/1, - %% all_tcs - mib_storage - mib_storage_dets + %% major_tcs - mib_storage - mib_storage_dets msd_simple/1, msd_v1_processing/1, msd_big/1, @@ -252,7 +252,7 @@ msd_me_of/1, msd_mib_of/1, - %% all_tcs - mib_storage - mib_storage_mnesia + %% major_tcs - mib_storage - mib_storage_mnesia msm_simple/1, msm_v1_processing/1, msm_big/1, @@ -274,28 +274,28 @@ msm_me_of/1, msm_mib_of/1, - %% all_tcs - mib_storage - mse_size_check + %% major_tcs - mib_storage - mse_size_check mse_size_check/1, - %% all_tcs - mib_storage - msd_size_check + %% major_tcs - mib_storage - msd_size_check msd_size_check/1, - %% all_tcs - mib_storage - msm_size_check + %% major_tcs - mib_storage - msm_size_check msm_size_check/1, - %% all_tcs - mib_storage - varm_mib_storage_dets + %% major_tcs - mib_storage - varm_mib_storage_dets msd_varm_mib_start/1, - %% all_tcs - mib_storage - varm_mib_storage_mnesia + %% major_tcs - mib_storage - varm_mib_storage_mnesia msm_varm_mib_start/1, - %% all_tcs - tickets1 - otp4394 + %% major_tcs - tickets1 - otp4394 otp_4394/1, - %% all_tcs - tickets1 - otp7157 + %% major_tcs - tickets1 - otp7157 otp_7157/1, - %% all_tcs - tickets1 - otp16092 + %% major_tcs - tickets1 - otp16092 otp_16092_simple_start_and_stop1/1, otp_16092_simple_start_and_stop2/1, otp_16092_simple_start_and_stop3/1, @@ -526,14 +526,31 @@ suite() -> [{ct_hooks, [ts_install_cth]}]. all() -> - %% Reqs = [mnesia, distribution, {local_slave_nodes, 2}, {time, 360}], - Conf1 = [{group, all_tcs}], - Conf2 = [{group, tickets2}], - Conf1 ++ Conf2. + %% This is a temporary messure to ensure that we can + %% test the socket backend without effecting *all* + %% applications on *all* machines. + %% This flag is set only for *one* host. + case ?TEST_INET_BACKENDS() of + true -> + [ + {group, inet_backend_default}, + {group, inet_backend_inet}, + {group, inet_backend_socket} + ]; + _ -> + [ + {group, inet_backend_default} + ] + end. groups() -> [ - {all_tcs, [], all_cases()}, + {inet_backend_default, [], inet_backend_default_cases()}, + {inet_backend_inet, [], inet_backend_inet_cases()}, + {inet_backend_socket, [], inet_backend_socket_cases()}, + + {all, [], all_cases()}, + {major_tcs, [], major_cases()}, {mib_storage, [], mib_storage_cases()}, {mib_storage_ets, [], mib_storage_ets_cases()}, {mib_storage_dets, [], mib_storage_dets_cases()}, @@ -568,17 +585,32 @@ groups() -> {reported_bugs_2, [], reported_bugs2_cases()}, {reported_bugs_3, [], reported_bugs3_cases()}, {tickets1, [], tickets1_cases()}, - {tickets2, [], tickets2_cases()}, {otp4394, [], [otp_4394]}, {otp7157, [], [otp_7157]}, {otp16092, [], otp16092_cases()}, + + %% These all belong to group 'tickets2' + {tickets2, [], tickets2_cases()}, {otp16649, [], otp16649_cases()}, {otp16649_ipv4, [], otp16649_gen_cases()}, {otp16649_ipv6, [], otp16649_gen_cases()} ]. -all_cases() -> +inet_backend_default_cases() -> + [{all, [], all_cases()}]. + +inet_backend_inet_cases() -> + [{all, [], all_cases()}]. + +inet_backend_socket_cases() -> + [{all, [], all_cases()}]. + + +%% The agent and the nodes of the agent and manager +%% is started at group init and then lives until +%% group end! +major_cases() -> [ {group, misc}, {group, test_v1}, @@ -594,6 +626,53 @@ all_cases() -> {group, mib_storage}, {group, tickets1} ]. + +all_cases() -> + [ + %% The agent and the nodes of the agent and manager + %% is started at group init and then lives until + %% group end! + {group, major_tcs}, + + %% The test cases in the 'tickets2' group + %% require control of start and stop of agents and inodes! + {group, tickets2} + ]. + + +tickets1_cases() -> + [ + {group, otp4394}, + {group, otp7157}, + {group, otp16092} + ]. + + +tickets2_cases() -> + [ + otp8395, + otp9884, + {group, otp16649} + ]. + +otp16649_cases() -> + [ + {group, otp16649_ipv4}, + {group, otp16649_ipv6} + ]. + +otp16649_gen_cases() -> + [ + otp16649_1, + otp16649_2, + otp16649_3, + otp16649_4, + otp16649_5, + otp16649_6, + otp16649_7 + ]. + + %% %% ----- @@ -603,7 +682,12 @@ init_per_suite(Config0) when is_list(Config0) -> ?IPRINT("init_per_suite -> entry with" "~n Config: ~p" - "~n Nodes: ~p", [Config0, erlang:nodes()]), + "~n Nodes: ~p" + "~n explicit inet backend: ~p" + "~n test inet backends: ~p", + [Config0, erlang:nodes(), + ?EXPLICIT_INET_BACKEND(), + ?TEST_INET_BACKENDS()]), case ?LIB:init_per_suite(Config0) of {skip, _} = SKIP -> @@ -660,125 +744,133 @@ end_per_suite(Config0) when is_list(Config0) -> %% ----- %% -init_per_group(all_tcs = GroupName, Config) -> +init_per_group(GroupName, Config0) -> + ?IPRINT("init_per_group -> entry with" + "~n GroupName: ~p" + "~n Config: ~p" + "~n when" + "~n Nodes: ~p", + [GroupName, Config0, nodes()]), + + Config1 = init_per_group2(GroupName, Config0), + + ?IPRINT("init_per_group -> done when" + "~n GroupName: ~p" + "~n Config: ~p" + "~n Nodes: ~p", + [GroupName, Config1, nodes()]), + + Config1. + + +init_per_group2(inet_backend_default = _GroupName, Config) -> + snmp_test_lib:init_group_top_dir(default, [{socket_create_opts, []} | Config]); +init_per_group2(inet_backend_inet = _GroupName, Config) -> + case ?EXPLICIT_INET_BACKEND() of + true -> + %% The environment trumps us, + %% so only the default group should be run! + {skip, "explicit inet backend"}; + false -> + snmp_test_lib:init_group_top_dir(inet, [{socket_create_opts, [{inet_backend, inet}]} | Config]) + end; +init_per_group2(inet_backend_socket = _GroupName, Config) -> + case ?EXPLICIT_INET_BACKEND() of + true -> + %% The environment trumps us, + %% so only the default group should be run! + {skip, "explicit inet backend"}; + false -> + snmp_test_lib:init_group_top_dir(socket, [{socket_create_opts, [{inet_backend, socket}]} | Config]) + end; +init_per_group2(major_tcs = GroupName, Config) -> init_all(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(otp7157 = GroupName, Config) -> +init_per_group2(otp7157 = GroupName, Config) -> otp_7157_init(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(otp4394 = GroupName, Config) -> +init_per_group2(otp4394 = GroupName, Config) -> otp_4394_init(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(v2_inform = GroupName, Config) -> +init_per_group2(v2_inform = GroupName, Config) -> init_v2_inform(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(v3_inform = GroupName, Config) -> +init_per_group2(v3_inform = GroupName, Config) -> init_v3_inform(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(multiple_reqs = GroupName, Config) -> +init_per_group2(multiple_reqs = GroupName, Config) -> init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(multiple_reqs_2 = GroupName, Config) -> +init_per_group2(multiple_reqs_2 = GroupName, Config) -> init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(multiple_reqs_3 = GroupName, Config) -> +init_per_group2(multiple_reqs_3 = GroupName, Config) -> init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(test_multi_threaded = GroupName, Config) -> +init_per_group2(test_multi_threaded = GroupName, Config) -> init_mt(snmp_test_lib:init_group_top_dir(GroupName, Config), true); -init_per_group(test_multi_threaded_ext = GroupName, Config) -> +init_per_group2(test_multi_threaded_ext = GroupName, Config) -> init_mt(snmp_test_lib:init_group_top_dir(GroupName, Config), extended); -init_per_group(test_v3 = GroupName, Config) -> +init_per_group2(test_v3 = GroupName, Config) -> case snmp_test_lib:crypto_start() of ok -> init_v3(snmp_test_lib:init_group_top_dir(GroupName, Config)); _ -> {skip, "Crypto did not start"} end; -init_per_group(test_v1_v2 = GroupName, Config) -> +init_per_group2(test_v1_v2 = GroupName, Config) -> init_v1_v2(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(test_v2 = GroupName, Config) -> +init_per_group2(test_v2 = GroupName, Config) -> init_v2(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(test_v1 = GroupName, Config) -> +init_per_group2(test_v1 = GroupName, Config) -> init_v1(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(test_v1_ipv6 = GroupName, Config) -> +init_per_group2(test_v1_ipv6 = GroupName, Config) -> init_per_group_ipv6(GroupName, Config, fun init_v1/1); -init_per_group(test_v2_ipv6 = GroupName, Config) -> +init_per_group2(test_v2_ipv6 = GroupName, Config) -> init_per_group_ipv6(GroupName, Config, fun init_v2/1); -init_per_group(test_v1_v2_ipv6 = GroupName, Config) -> +init_per_group2(test_v1_v2_ipv6 = GroupName, Config) -> init_per_group_ipv6(GroupName, Config, fun init_v1_v2/1); -init_per_group(test_v3_ipv6 = GroupName, Config) -> +init_per_group2(test_v3_ipv6 = GroupName, Config) -> init_per_group_ipv6(GroupName, Config, fun init_v3/1); -init_per_group(misc = GroupName, Config) -> +init_per_group2(misc = GroupName, Config) -> init_misc(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(mib_storage_varm_mnesia = GroupName, Config) -> +init_per_group2(mib_storage_varm_mnesia = GroupName, Config) -> init_varm_mib_storage_mnesia(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(mib_storage_varm_dets = GroupName, Config) -> - ?DBG("init_per_group(mib_storage_varm_dets) -> entry with" - "~n Config: ~p", [Config]), +init_per_group2(mib_storage_varm_dets = GroupName, Config) -> init_varm_mib_storage_dets( snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(mib_storage_size_check_mnesia = GroupName, Config) -> +init_per_group2(mib_storage_size_check_mnesia = GroupName, Config) -> case snmp_test_lib:crypto_start() of ok -> init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config)); _ -> {skip, "Crypto did not start"} end; -init_per_group(mib_storage_size_check_dets = GroupName, Config) -> +init_per_group2(mib_storage_size_check_dets = GroupName, Config) -> case snmp_test_lib:crypto_start() of ok -> init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config)); _ -> {skip, "Crypto did not start"} end; -init_per_group(mib_storage_size_check_ets = GroupName, Config) -> - case snmp_test_lib:crypto_start() of - ok -> - init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config)); - _ -> - {skip, "Crypto did not start"} - end; -init_per_group(mib_storage_mnesia = GroupName, Config) -> +init_per_group2(mib_storage_size_check_ets = GroupName, Config) -> + case snmp_test_lib:crypto_start() of + ok -> + init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config)); + _ -> + {skip, "Crypto did not start"} + end; +init_per_group2(mib_storage_mnesia = GroupName, Config) -> init_mib_storage_mnesia(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(mib_storage_dets = GroupName, Config) -> +init_per_group2(mib_storage_dets = GroupName, Config) -> init_mib_storage_dets(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(mib_storage_ets = GroupName, Config) -> +init_per_group2(mib_storage_ets = GroupName, Config) -> init_mib_storage_ets(snmp_test_lib:init_group_top_dir(GroupName, Config)); -init_per_group(otp16649_ipv4 = GroupName, Config) -> +init_per_group2(otp16649_ipv4 = GroupName, Config) -> Config2 = [{ip, ?LOCALHOST(inet)}, {ipfamily, inet}, {tdomain, transportDomainUdpIpv4} | lists:keydelete(ip, 1, Config)], snmp_test_lib:init_group_top_dir(GroupName, Config2); -init_per_group(otp16649_ipv6 = GroupName, Config) -> +init_per_group2(otp16649_ipv6 = GroupName, Config) -> init_per_group_ipv6(GroupName, [{tdomain, transportDomainUdpIpv6} | Config], fun(C) -> C end); - %% SupportsIPv6 = - %% case ?HAS_SUPPORT_IPV6() of - %% true -> - %% case os:type() of - %% {unix, netbsd} -> - %% {false, "Host *may* not *properly* support IPV6"}; - %% {unix, darwin} -> - %% case os:version() of - %% V > {9, 8, 0} -> - %% true; - %% _ -> - %% {false, "Host *may* not *properly* support IPV6"}; - %% end; - %% _ -> - %% true - %% end; - %% false -> - %% {false, "Host does not support IPv6"} - %% end, - %% case SupportsIPv6 of - %% true -> - %% Config2 = [{ip, ?LOCALHOST(inet6)}, - %% {ipfamily, inet6}, - %% {tdomain, transportDomainUdpIpv6} | - %% lists:keydelete(ip, 1, Config)], - %% snmp_test_lib:init_group_top_dir(GroupName, Config2); - %% {false, SkipReason} -> - %% {skip, SkipReason} - %% end; -init_per_group(GroupName, Config) -> +init_per_group2(GroupName, Config) -> snmp_test_lib:init_group_top_dir(GroupName, Config). init_per_group_ipv6(GroupName, Config, Init) -> @@ -820,61 +912,78 @@ init_per_group_ipv6(GroupName, Config, Init) -> end end. -end_per_group(all_tcs, Config) -> + +end_per_group(GroupName, Config) -> + ?IPRINT("end_per_group -> entry with" + "~n GroupName: ~p" + "~n Config: ~p" + "~n when" + "~n Nodes: ~p", + [GroupName, Config, nodes()]), + + Config1 = end_per_group2(GroupName, Config), + + ?IPRINT("end_per_group -> done when" + "~n Nodes: ~p", + [nodes()]), + + Config1. + +end_per_group2(major_tcs, Config) -> finish_all(Config); -end_per_group(otp7157, Config) -> +end_per_group2(otp7157, Config) -> otp_7157_finish(Config); -end_per_group(otp4394, Config) -> +end_per_group2(otp4394, Config) -> otp_4394_finish(Config); -end_per_group(v2_inform, Config) -> +end_per_group2(v2_inform, Config) -> finish_v2_inform(Config); -end_per_group(v3_inform, Config) -> +end_per_group2(v3_inform, Config) -> finish_v3_inform(Config); -end_per_group(multiple_reqs, Config) -> +end_per_group2(multiple_reqs, Config) -> finish_mul(Config); -end_per_group(multiple_reqs_2, Config) -> +end_per_group2(multiple_reqs_2, Config) -> finish_mul(Config); -end_per_group(multiple_reqs_3, Config) -> +end_per_group2(multiple_reqs_3, Config) -> finish_mul(Config); -end_per_group(test_multi_threaded, Config) -> +end_per_group2(test_multi_threaded, Config) -> finish_mt(Config); -end_per_group(test_multi_threaded_ext, Config) -> +end_per_group2(test_multi_threaded_ext, Config) -> finish_mt(Config); -end_per_group(test_v3_ipv6, Config) -> +end_per_group2(test_v3_ipv6, Config) -> finish_v3(Config); -end_per_group(test_v1_v2_ipv6, Config) -> +end_per_group2(test_v1_v2_ipv6, Config) -> finish_v1_v2(Config); -end_per_group(test_v2_ipv6, Config) -> +end_per_group2(test_v2_ipv6, Config) -> finish_v2(Config); -end_per_group(test_v1_ipv6, Config) -> +end_per_group2(test_v1_ipv6, Config) -> finish_v1(Config); -end_per_group(test_v3, Config) -> +end_per_group2(test_v3, Config) -> finish_v3(Config); -end_per_group(test_v1_v2, Config) -> +end_per_group2(test_v1_v2, Config) -> finish_v1_v2(Config); -end_per_group(test_v2, Config) -> +end_per_group2(test_v2, Config) -> finish_v2(Config); -end_per_group(test_v1, Config) -> +end_per_group2(test_v1, Config) -> finish_v1(Config); -end_per_group(misc, Config) -> +end_per_group2(misc, Config) -> finish_misc(Config); -end_per_group(mib_storage_varm_mnesia, Config) -> +end_per_group2(mib_storage_varm_mnesia, Config) -> finish_varm_mib_storage_mnesia(Config); -end_per_group(mib_storage_varm_dets, Config) -> +end_per_group2(mib_storage_varm_dets, Config) -> finish_varm_mib_storage_dets(Config); -end_per_group(mib_storage_size_check_mnesia, Config) -> +end_per_group2(mib_storage_size_check_mnesia, Config) -> finish_size_check_msm(Config); -end_per_group(mib_storage_size_check_dets, Config) -> +end_per_group2(mib_storage_size_check_dets, Config) -> finish_size_check_msd(Config); -end_per_group(mib_storage_size_check_ets, Config) -> +end_per_group2(mib_storage_size_check_ets, Config) -> finish_size_check_mse(Config); -end_per_group(mib_storage_mnesia, Config) -> +end_per_group2(mib_storage_mnesia, Config) -> finish_mib_storage_mnesia(Config); -end_per_group(mib_storage_dets, Config) -> +end_per_group2(mib_storage_dets, Config) -> finish_mib_storage_dets(Config); -end_per_group(mib_storage_ets, Config) -> +end_per_group2(mib_storage_ets, Config) -> finish_mib_storage_ets(Config); -end_per_group(_GroupName, Config) -> +end_per_group2(_GroupName, Config) -> Config. @@ -7025,14 +7134,6 @@ otp_3725_test(MaNode) -> %% Slogan: Target mib tag list check invalid %%----------------------------------------------------------------- -tickets1_cases() -> - [ - {group, otp4394}, - {group, otp7157}, - {group, otp16092} - ]. - - otp_4394_init(Config) when is_list(Config) -> ?DBG("otp_4394_init -> entry with" "~n Config: ~p", [Config]), @@ -7398,31 +7499,6 @@ otp16092_try_start_and_stop_agent(Node, Opts, Expected) -> %% These cases are started in the new way %%----------------------------------------------------------------- -tickets2_cases() -> - [ - otp8395, - otp9884, - {group, otp16649} - ]. - -otp16649_cases() -> - [ - {group, otp16649_ipv4}, - {group, otp16649_ipv6} - ]. - -otp16649_gen_cases() -> - [ - otp16649_1, - otp16649_2, - otp16649_3, - otp16649_4, - otp16649_5, - otp16649_6, - otp16649_7 - ]. - - otp8395({init, Config}) when is_list(Config) -> ?DBG("otp8395(init) -> entry with" "~n Config: ~p", [Config]), @@ -7430,9 +7506,9 @@ otp8395({init, Config}) when is_list(Config) -> %% -- %% Start nodes %% - - {ok, AgentNode} = start_node(agent), - {ok, ManagerNode} = start_node(manager), + FName = ?FUNCTION_NAME, + {ok, AgentNode} = start_node(mk_node_name(FName, agent)), + {ok, ManagerNode} = start_node(mk_node_name(FName, manager)), %% -- %% Mnesia init @@ -7580,7 +7656,7 @@ otp8395(Config) when is_list(Config) -> otp9884({init, Config}) when is_list(Config) -> ?DBG("otp9884(init) -> entry with" "~n Config: ~p", [Config]), - init_v1_agent([{ipfamily, inet} | Config]); + init_v1_agent([{fname, otp9884}, {ipfamily, inet} | Config]); otp9884({fin, Config}) when is_list(Config) -> ?DBG("otp9884(fin) -> entry with" @@ -8024,8 +8100,12 @@ otp16649_init(N, AgentPreTransports, Config) -> "~n Config2: ~p", [Config3]), [{agent_raw_transports, AgentPreTransports} | Config3]. +mk_node_name(FName, Post) when is_atom(FName) andalso is_atom(Post) -> + list_to_atom(?F("~w_~w", [FName, Post])). + otp16649_mk_name(N, Post) when is_integer(N) andalso is_atom(Post) -> - list_to_atom(?F("otp16649_~w_~w", [N, Post])). + mk_node_name(otp16649, list_to_atom(?F("~w_~w", [N, Post]))). +%% list_to_atom(?F("otp16649_~w_~w", [N, Post])). otp16649_fin(N, Config) when is_integer(N) -> @@ -8241,13 +8321,15 @@ start_agent(Config) -> start_agent(Config, Opts) -> %% Directories - ConfDir = ?config(agent_conf_dir, Config), - DbDir = ?config(agent_db_dir, Config), - LogDir = ?config(agent_log_dir, Config), + ConfDir = ?config(agent_conf_dir, Config), + DbDir = ?config(agent_db_dir, Config), + LogDir = ?config(agent_log_dir, Config), + InetBackend = ?config(socket_create_opts, Config), Vsns = [v1], - AgentConfig = process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts), + AgentConfig = process_agent_options(ConfDir, DbDir, LogDir, Vsns, + InetBackend, Opts), %% Nodes AgentNode = ?config(agent_node, Config), @@ -8259,7 +8341,15 @@ start_agent(Config, Opts) -> [{agent_sup, AgentTopSup} | Config]. -process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts) -> +process_agent_options(ConfDir, DbDir, LogDir, Vsns, InetBackend, Opts) -> + ?IPRINT("process_agent_options ->" + "~n ConfDir: ~p" + "~n DbDir: ~p" + "~n LogDir: ~p" + "~n Vsns: ~p" + "~n InetBackend: ~p" + "~n Opts: ~p", + [ConfDir, DbDir, LogDir, Vsns, InetBackend, Opts]), Defaults = [{agent_type, master}, {agent_verbosity, trace}, @@ -8283,9 +8373,9 @@ process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts) -> {note_store, [{timeout,30000}, {verbosity,log}]}, {net_if, [{module, snmpa_net_if}, {verbosity, trace}, - {options, [{bind_to, false}, - {no_reuse, false}, - {req_limit, infinity}]}]}, + {options, InetBackend ++ [{bind_to, false}, + {no_reuse, false}, + {req_limit, infinity}]}]}, {audit_trail_log, [{type, read_write}, {dir, LogDir}, {size, {10240,20}}, @@ -8699,11 +8789,12 @@ init_v1_agent(Config) -> %% Start nodes %% - {ok, AgentNode} = start_node(agent), + FName = ?config(fname, Config), + {ok, AgentNode} = start_node(mk_node_name(FName, agent)), %% We don't use a manager in this test but the (common) config %% function takes an argument that is derived from this - {ok, ManagerNode} = start_node(manager), + {ok, ManagerNode} = start_node(mk_node_name(FName, manager)), %% -- %% Mnesia init @@ -8758,7 +8849,11 @@ init_v1_agent(Config) -> {agent_node, AgentNode}, {agent_host, AgentHost}, {agent_ip, AgentIP}, - {agent_backup_dirs, AgentBkpDirs}|Config]), + {agent_backup_dirs, AgentBkpDirs}, + + %% We need this here since without it + %% fin_v1_agent will not be able to stop! + {manager_node, ManagerNode}|Config]), %% -- %% Create watchdog @@ -8786,7 +8881,7 @@ fin_v1_agent(Config) -> %% - %% Stop the agent node - %% + %% stop_node(AgentNode), diff --git a/lib/snmp/test/snmp_agent_test_lib.erl b/lib/snmp/test/snmp_agent_test_lib.erl index c99c0359f2..236015cfe0 100644 --- a/lib/snmp/test/snmp_agent_test_lib.erl +++ b/lib/snmp/test/snmp_agent_test_lib.erl @@ -123,7 +123,8 @@ init_all(Config) when is_list(Config) -> ?IPRINT("init_all -> entry with" - "~n Config: ~p", [Config]), + "~n Config: ~p" + "~n Nodes: ~p", [Config, nodes()]), %% -- %% Start nodes @@ -140,12 +141,12 @@ init_all(Config) when is_list(Config) -> %% Create necessary files ( and dirs ) %% - ?IPRINT("init_all -> create suite top dir"), - SuiteTopDir = ?config(snmp_suite_top_dir, Config), - ?DBG("init_all -> SuiteTopDir ~p", [SuiteTopDir]), + ?IPRINT("init_all -> lookup group top dir"), + GroupTopDir = ?config(snmp_group_top_dir, Config), + ?DBG("init_all -> GroupTopDir ~p", [GroupTopDir]), ?IPRINT("init_all -> create agent dir"), - AgentDir = join(SuiteTopDir, "agent/"), + AgentDir = join(GroupTopDir, "agent/"), ?line ok = file:make_dir(AgentDir), ?DBG("init_all -> AgentDir ~p", [AgentDir]), @@ -165,12 +166,12 @@ init_all(Config) when is_list(Config) -> ?DBG("init_all -> AgentConfDir ~p", [AgentConfDir]), ?IPRINT("init_all -> create manager dir"), - MgrDir = join(SuiteTopDir, "mgr/"), + MgrDir = join(GroupTopDir, "mgr/"), ?line ok = file:make_dir(MgrDir), ?DBG("init_all -> MgrDir ~p", [MgrDir]), ?IPRINT("init_all -> create sub-agent dir"), - SaDir = join(SuiteTopDir, "sa/"), + SaDir = join(GroupTopDir, "sa/"), ?line ok = file:make_dir(SaDir), ?DBG("init_all -> SaDir ~p", [SaDir]), @@ -213,7 +214,8 @@ init_all(Config) when is_list(Config) -> ?IPRINT("init_all -> get localhost"), Ip = ?LOCALHOST(), - ?IPRINT("init_all -> done"), + ?IPRINT("init_all -> done when" + "~n Nodes: ~p", [nodes()]), [{snmp_sa, SaNode}, {snmp_mgr, MgrNode}, {snmp_master, node()}, @@ -232,7 +234,8 @@ init_all(Config) when is_list(Config) -> finish_all(Config) when is_list(Config) -> ?IPRINT("finish_all -> entry with" - "~n Config: ~p", [Config]), + "~n Config: ~p" + "~n Nodes: ~p", [Config, nodes()]), SaNode = ?config(snmp_sa, Config), MgrNode = ?config(snmp_mgr, Config), @@ -246,7 +249,11 @@ finish_all(Config) when is_list(Config) -> ?IPRINT("finish_all -> stop mnesia application"), application:stop(mnesia), - ?IPRINT("finish_all -> stop"), + ?IPRINT("finish_all -> unload mnesia application"), + application:unload(mnesia), + + ?IPRINT("finish_all -> stop when" + "~n Nodes: ~p", [nodes()]), ok. @@ -266,9 +273,18 @@ init_case(Config) when is_list(Config) -> SaHost = ?HOSTNAME(SaNode), MgrHost = ?HOSTNAME(MgrNode), MasterHost = ?HOSTNAME(MasterNode), - {ok, MasterIP} = snmp_misc:ip(MasterHost, IpFamily), - {ok, MIP} = snmp_misc:ip(MgrHost, IpFamily), - {ok, SIP} = snmp_misc:ip(SaHost, IpFamily), + {ok, MasterIP} = ?LIB:which_host_ip(MasterHost, IpFamily), + {ok, MIP} = ?LIB:which_host_ip(MgrHost, IpFamily), + {ok, SIP} = ?LIB:which_host_ip(SaHost, IpFamily), + + ?IPRINT("init_case -> " + "~n SaHost: ~p" + "~n MgrHost: ~p" + "~n MasterHost: ~p" + "~n MasterIP: ~p" + "~n MIP: ~p" + "~n SIP: ~p", + [SaHost, MgrHost, MasterHost, MasterIP, MIP, SIP]), put(mgr_node, MgrNode), put(sa_node, SaNode), @@ -296,6 +312,7 @@ init_case(Config) when is_list(Config) -> "~n SaNode: ~p" "~n MgrNode: ~p" "~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]), + {SaNode, MgrNode, MibDir}. @@ -646,10 +663,11 @@ start_agent(Config, Vsns, Opts) -> "~n Vsns: ~p" "~n Opts: ~p", [node(), Config, Vsns, Opts]), - ?line AgentLogDir = ?config(agent_log_dir, Config), - ?line AgentConfDir = ?config(agent_conf_dir, Config), - ?line AgentDbDir = ?config(agent_db_dir, Config), - ?line SaNode = ?config(snmp_sa, Config), + ?line AgentLogDir = ?config(agent_log_dir, Config), + ?line AgentConfDir = ?config(agent_conf_dir, Config), + ?line AgentDbDir = ?config(agent_db_dir, Config), + ?line SaNode = ?config(snmp_sa, Config), + ?line InetBackend = ?config(socket_create_opts, Config), Env = app_agent_env_init( [{versions, Vsns}, @@ -668,7 +686,8 @@ start_agent(Config, Vsns, Opts) -> {mib_server, [{verbosity, log}]}, {symbolic_store, [{verbosity, log}]}, {note_store, [{verbosity, log}]}, - {net_if, [{verbosity, trace}]}], + {net_if, [{verbosity, trace}, + {options, InetBackend}]}], Opts), diff --git a/lib/snmp/test/snmp_test_global_sys_monitor.erl b/lib/snmp/test/snmp_test_global_sys_monitor.erl index c3f2e24096..c77b118d18 100644 --- a/lib/snmp/test/snmp_test_global_sys_monitor.erl +++ b/lib/snmp/test/snmp_test_global_sys_monitor.erl @@ -240,13 +240,13 @@ call(Req, Timeout1, Timeout2) -> NamePid when is_pid(NamePid) -> receive {?MODULE, Ref, Rep} -> - Rep + exit(Rep) after Timeout2 -> - {error, timeout} + exit({error, timeout}) end catch C:E:_ -> - {error, {catched, C, E}} + exit({error, {catched, C, E}}) end end, {Pid, Mon} = spawn_monitor(F), diff --git a/lib/snmp/test/snmp_test_lib.erl b/lib/snmp/test/snmp_test_lib.erl index c2c720fdb4..10a1bc9202 100644 --- a/lib/snmp/test/snmp_test_lib.erl +++ b/lib/snmp/test/snmp_test_lib.erl @@ -51,6 +51,8 @@ -export([f/2, formated_timestamp/0]). -export([p/2, print1/2, print2/2, print/5]). -export([eprint/2, wprint/2, nprint/2, iprint/2]). +-export([explicit_inet_backend/0, test_inet_backends/0]). +-export([which_host_ip/2]). -define(SKIP(R), skip(R, ?MODULE, ?LINE)). @@ -258,6 +260,45 @@ tc_which_name() -> %% Misc functions %% +explicit_inet_backend() -> + %% This is intentional! + %% This is a kernel flag, which if set disables + %% our own special handling of the inet_backend + %% in our test suites. + case application:get_all_env(kernel) of + Env when is_list(Env) -> + case lists:keysearch(inet_backend, 1, Env) of + {value, {inet_backend, _}} -> + true; + _ -> + false + end; + _ -> + false + end. + +test_inet_backends() -> + case init:get_argument(snmp) of + {ok, SnmpArgs} when is_list(SnmpArgs) -> + test_inet_backends(SnmpArgs, atom_to_list(?FUNCTION_NAME)); + error -> + false + end. + +test_inet_backends([], _) -> + false; +test_inet_backends([[Key, Val] | _], Key) -> + case list_to_atom(string:to_lower(Val)) of + Bool when is_boolean(Bool) -> + Bool; + _ -> + false + end; +test_inet_backends([_|Args], Key) -> + test_inet_backends(Args, Key). + + + proxy_call(F, Timeout, Default) when is_function(F, 0) andalso is_integer(Timeout) andalso (Timeout > 0) -> {P, M} = erlang:spawn_monitor(fun() -> exit(F()) end), @@ -282,6 +323,29 @@ hostname(Node) -> [] end. + +which_host_ip(Hostname, Family) -> + case snmp_misc:ip(Hostname, Family) of + {ok, {A, _, _, _}} = OK + when (A =/= 127) -> + OK; + {ok, {A, _, _, _, _, _, _, _}} = OK + when (A =/= 0) andalso + (A =/= 16#fe80) -> + OK; + {ok, _} -> + try localhost(Family) of + Addr -> + {ok, Addr} + catch + C:E:S -> + {error, {C, E, S}} + end; + {error, _} = ERROR -> + ERROR + end. + + localhost() -> localhost(inet). @@ -315,6 +379,8 @@ which_addr(_Family, []) -> fail(no_valid_addr, ?MODULE, ?LINE); which_addr(Family, [{"lo", _} | IfList]) -> which_addr(Family, IfList); +which_addr(Family, [{"tun" ++ _, _} | IfList]) -> + which_addr(Family, IfList); which_addr(Family, [{"docker" ++ _, _} | IfList]) -> which_addr(Family, IfList); which_addr(Family, [{"br-" ++ _, _} | IfList]) -> @@ -781,6 +847,7 @@ init_group_top_dir(GroupName, Config) -> [{snmp_group_top_dir, GroupTopDir} | Config]; _ -> + %% This is a "top level" group, that is, there is only the suite case lists:keysearch(snmp_suite_top_dir, 1, Config) of {value, {_Key, Dir}} -> GroupTopDir = filename:join(Dir, GroupName), diff --git a/lib/snmp/test/snmp_test_lib.hrl b/lib/snmp/test/snmp_test_lib.hrl index 78d1453c12..a6b1be76ea 100644 --- a/lib/snmp/test/snmp_test_lib.hrl +++ b/lib/snmp/test/snmp_test_lib.hrl @@ -41,6 +41,9 @@ -define(OSTYPE(), ?LIB:os_type()). -define(DISPLAY_SUITE_INFO(), ?LIB:display_suite_info(?MODULE)). +-define(EXPLICIT_INET_BACKEND(), ?LIB:explicit_inet_backend()). +-define(TEST_INET_BACKENDS(), ?LIB:test_inet_backends()). + %% - Test case macros - diff --git a/lib/snmp/test/snmp_test_mgr.erl b/lib/snmp/test/snmp_test_mgr.erl index fe2852c573..7fab69c043 100644 --- a/lib/snmp/test/snmp_test_mgr.erl +++ b/lib/snmp/test/snmp_test_mgr.erl @@ -262,7 +262,7 @@ init({Options, CallerPid}) -> Addr; {value, Host} when is_list(Host) -> ?IPRINT("init -> Host: ~p", [Host]), - {ok, Ip} = snmp_misc:ip(Host, IpFamily), + {ok, Ip} = ?LIB:which_host_ip(Host, IpFamily), Ip end, ?IPRINT("init -> AgIp: ~p", [AgIp]), |