anchor.diff:  %% @end
   %%--------------------------------------------------------------------
   cmd(Command) ->
  -  os:cmd(string:join(Command, " ")).+    os:cmd(string:join(Command, " ")).
positive.code: %% @end
  %%--------------------------------------------------------------------
  -spec prepare_test_environment(Config :: list(), DescriptionFile :: string()) ->
    Result :: list().
  prepare_test_environment(Config, DescriptionFile) ->
      DataDir = proplists:get_value(data_dir, Config),
      CtTestRoot = filename:join(DataDir, ".."),
      ProjectRoot = filename:join(CtTestRoot, ".."),
  
      ConfigWithPaths =
        [{ct_test_root, CtTestRoot}, {project_root, ProjectRoot} | Config],
  
      ProviderUpScript =
        filename:join([ProjectRoot, "bamboos", "docker", "provider_up.py"]),
  
      StartLog = cmd([ProviderUpScript, "-b", ProjectRoot, DescriptionFile]),
      EnvDesc = json_parser:parse_json_binary_to_atom_proplist(StartLog),
  
      Dns = ?config(dns, EnvDesc),
      Workers = ?config(op_worker_nodes, EnvDesc),
      Ccms = ?config(op_ccm_nodes, EnvDesc),
  
      erlang:set_cookie(node(), oneprovider_node),
      os:cmd("echo nameserver " ++ atom_to_list(Dns) ++ " > /etc/resolv.conf"),
  
      ping_nodes(lists:append(Ccms, Workers)),
  
      cluster_state_notifier:cast({subscribe_for_init, self(), length(Workers)}),
      receive
          init_finished -> ok
      after
          timer:seconds(50) -> throw(timeout)
      end,
  
      lists:append(ConfigWithPaths, proplists:delete(dns, EnvDesc)).
  
  %%--------------------------------------------------------------------
  %% @doc
  
negative.code: 
      ProjectRoot = ?config(project_root, Config),
      CleanupScript =
          filename:join([ProjectRoot, "bamboos", "docker", "cleanup.py"]),
  
      cmd([CleanupScript, DockersStr]),
      ok.
  
  