anchor.diff:  -export([get_details_by_graph_sync/0, get_details_by_rest/0]).
   
   %% API
  --export([check_oz_availability/1, mark_configured/0,
  +-export([resolve_registration_token/1, check_oz_availability/1, mark_configured/0,
       register/1, unregister/0, is_registered/1, is_registered/0,
       modify_details/1, get_details/0, get_oz_domain/0,
       support_space/1, revoke_space_support/1, get_spaces/0, is_space_supported/1,
  
positive.code:                 error ->
                      throw(?ERROR_MISSING_REQUIRED_VALUE(<<"tokenFile">>))
              end
      end.
  
  
  %% @private
  -spec sanitize_registration_token(binary()) -> tokens:serialized() | no_return().
  
negative.code:         #steps{service = ?SERVICE_OPW, action = status}
      ];
  
  get_steps(register, #{hosts := _Hosts}) ->
      [
          #step{function = resolve_registration_token, hosts = [hosts:self()]},
          #step{function = check_oz_availability, attempts = onepanel_env:get(connect_to_onezone_attempts)},
          #step{function = register, hosts = [hosts:self()]},
          #step{function = connect_and_set_up_in_onezone, args = [no_fallback], selection = any},
          % explicitly fail on connection problems before executing further steps
          #step{function = check_oz_connection, args = [],
              attempts = onepanel_env:get(connect_to_onezone_attempts)},
          #steps{action = set_cluster_ips}
      ];
  get_steps(register, Ctx) ->
      get_steps(register, Ctx#{hosts => hosts:all(?SERVICE_OPW)});
  
  get_steps(unregister, _Ctx) ->
      [#step{function = unregister, selection = any, args = []}];
  