%% ------------------------------------------------------------------- %% %% Copyright (c) 2007-2014 Basho Technologies, Inc. All Rights Reserved. %% %% This file is provided to you under the Apache License, %% Version 2.0 (the "License"); you may not use this file %% except in compliance with the License. You may obtain %% a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, %% software distributed under the License is distributed on an %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY %% KIND, either express or implied. See the License for the %% specific language governing permissions and limitations %% under the License. %% %% ------------------------------------------------------------------- -module(machi_lifecycle_mgr_test). -compile(export_all). -ifdef(TEST). -ifndef(PULSE). -include_lib("eunit/include/eunit.hrl"). -include("machi.hrl"). -include("machi_projection.hrl"). -define(MGR, machi_chain_manager1). smoke_test_() -> {timeout, 120, fun() -> smoke_test2() end}. smoke_test2() -> catch application:stop(machi), {ok, SupPid} = machi_sup:start_link(), error_logger:tty(false), Dir = "./" ++ atom_to_list(?MODULE) ++ ".datadir", machi_flu1_test:clean_up_data_dir(Dir ++ "/*/*"), machi_flu1_test:clean_up_data_dir(Dir), Envs = [{flu_data_dir, Dir ++ "/data/flu"}, {flu_config_dir, Dir ++ "/etc/flu-config"}, {chain_config_dir, Dir ++ "/etc/chain-config"}, {platform_data_dir, Dir ++ "/data"}, {platform_etc_dir, Dir ++ "/etc"}, {not_used_pending, Dir ++ "/etc/pending"} ], EnvKeys = [K || {K, V} <- Envs], undefined = application:get_env(machi, yo), Cleanup = machi_flu1_test:get_env_vars(machi, EnvKeys ++ [yo]), [begin filelib:ensure_dir(V ++ "/unused"), application:set_env(machi, K, V) end || {K, V} <- Envs], try Prefix = <<"pre">>, Chunk1 = <<"yochunk">>, Host = "localhost", PortBase = 60120, Pa = #p_srvr{name=a,address="localhost",port=PortBase+0}, Pb = #p_srvr{name=b,address="localhost",port=PortBase+1}, Pc = #p_srvr{name=c,address="localhost",port=PortBase+2}, %% Pstore_a = machi_flu1:make_projection_server_regname(a), %% Pstore_b = machi_flu1:make_projection_server_regname(b), %% Pstore_c = machi_flu1:make_projection_server_regname(c), Pstores = [Pstore_a, Pstore_b, Pstore_c] = [machi_flu1:make_projection_server_regname(a), machi_flu1:make_projection_server_regname(b), machi_flu1:make_projection_server_regname(c)], ChMgrs = [ChMgr_a, ChMgr_b, ChMgr_c] = [machi_chain_manager1:make_chmgr_regname(a), machi_chain_manager1:make_chmgr_regname(b), machi_chain_manager1:make_chmgr_regname(c)], Fits = [Fit_a, Fit_b, Fit_c] = [machi_flu_psup:make_fitness_regname(a), machi_flu_psup:make_fitness_regname(b), machi_flu_psup:make_fitness_regname(c)], Advance = machi_chain_manager1_test:make_advance_fun( Fits, [a,b,c], ChMgrs, 3), %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% io:format("\nSTEP: Start 3 FLUs, no chain.\n", []), [make_pending_config(P) || P <- [Pa,Pb,Pc] ], {[_,_,_],[]} = machi_lifecycle_mgr:process_pending(), [{ok, #projection_v1{epoch_number=0}} = machi_projection_store:read_latest_projection(PSTORE, private) || PSTORE <- Pstores], %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% io:format("\nSTEP: Start chain = [a,b,c]\n", []), C1 = #chain_def_v1{name=cx, mode=ap_mode, full=[Pa,Pb,Pc], local_run=[a,b,c]}, make_pending_config(C1), {[],[_]} = machi_lifecycle_mgr:process_pending(), Advance(), [{ok, #projection_v1{all_members=[a,b,c]}} = machi_projection_store:read_latest_projection(PSTORE, private) || PSTORE <- Pstores], %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% io:format("\nSTEP: Reset chain = [b,c]\n", []), C2 = #chain_def_v1{name=cx, mode=ap_mode, full=[Pb,Pc], old_all=[a,b,c], old_witnesses=[], local_stop=[a], local_run=[b,c]}, make_pending_config(C2), {[],[_]} = machi_lifecycle_mgr:process_pending(), Advance(), %% a should be down {'EXIT', _} = (catch machi_projection_store:read_latest_projection( hd(Pstores), private)), [{ok, #projection_v1{all_members=[b,c]}} = machi_projection_store:read_latest_projection(PSTORE, private) || PSTORE <- tl(Pstores)], %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% io:format("\nSTEP: Reset chain = []\n", []), C3 = #chain_def_v1{name=cx, mode=ap_mode, full=[], old_all=[b,c], old_witnesses=[], local_stop=[b,c], local_run=[]}, make_pending_config(C3), {[],[_]} = machi_lifecycle_mgr:process_pending(), Advance(), %% a,b,c should be down [{'EXIT', _} = (catch machi_projection_store:read_latest_projection( PSTORE, private)) || PSTORE <- Pstores], ok after exit(SupPid, normal), machi_util:wait_for_death(SupPid, 100), error_logger:tty(true), catch application:stop(machi), %% machi_flu1_test:clean_up_data_dir(Dir ++ "/*/*"), %% machi_flu1_test:clean_up_data_dir(Dir), machi_flu1_test:clean_up_env_vars(Cleanup), undefined = application:get_env(machi, yo) end. make_pending_config(Term) -> Dir = machi_lifecycle_mgr:get_pending_dir(x), Blob = io_lib:format("~w.\n", [Term]), ok = file:write_file(Dir ++ "/" ++ lists:flatten(io_lib:format("~w,~w,~w", tuple_to_list(os:timestamp()))), Blob). ast_tuple_syntax_test() -> T = fun(L) -> machi_lifecycle_mgr:check_ast_tuple_syntax(L) end, {_Good,[]=_Bad} = T([ {host, "localhost", []}, {host, "localhost", [{client_interface, "1.2.3.4"}, {admin_interface, "5.6.7.8"}]}, {flu, "fx", "foohost", 4000, []}, {chain, "cy", ["fx", "fy"], ["fz"], [foo,{bar,baz}]} ]), {[],[_,_,_,_]} = T([ {host, 'localhost', []}, {host, 'localhost', yo}, {host, "localhost", [{client_interface, 77.88293829832}]}, {host, "localhost", [{client_interface, "1.2.3.4"}, {bummer, "5.6.7.8"}]} ]), {[],[_,_,_,_,_,_]} = T([ {flu, 'fx', "foohost", 4000, []}, {flu, "fx", <<"foohost">>, 4000, []}, {flu, "fx", "foohost", -4000, []}, {flu, "fx", "foohost", 40009999, []}, {flu, "fx", "foohost", 4000, gack}, {flu, "fx", "foohost", 4000, [22]} ]), {[],[_,_]} = T([ {chain, 'cy', ["fx", "fy"], ["fz"], [foo,{bar,baz}]}, {chain, "cy", ["fx", 27], ["fz"], oops,arity,way,way,way,too,big,x} ]). -endif. % !PULSE -endif. % TEST