anchor.diff:  
   
   %% @private
  --spec zone_rest(URN :: string(), Auth :: oz_plugin:auth()) ->
  -    {ok, #{atom() => term()}} | #error{}.
  -zone_rest(URN, Auth) ->
  +-spec zone_rest(Auth :: oz_plugin:auth(), URNFormat :: string(),
  +    FormatArgs :: [term()]) -> {ok, #{atom() => term()}} | #error{}.
  +zone_rest(Auth, URNFormat, FormatArgs) ->
  +    URN = str_utils:format(URNFormat, FormatArgs),
       case oz_endpoint:request(Auth, URN, get) of
           {ok, 200, _, BodyJson} ->
               Parsed = onepanel_utils:convert(json_utils:decode(BodyJson), {keys, atom}),
  
positive.code:     end;
  
  get_details({rest, Auth}, ClusterId) ->
      URN = str_utils:format("/clusters/~s", [ClusterId]),
      case zone_rest(URN, Auth) of
          {ok, Map} ->
              Map2 = maps:without([cluster_id], Map),
              {ok, Map2#{id => ClusterId}};
  
negative.code:     zone_rpc(user_logic, get_clusters, [Auth]);
  
  list_user_clusters({rest, Auth}) ->
      case zone_rest(Auth, "/user/clusters/", []) of
          {ok, #{clusters := Ids}} -> {ok, Ids};
          #error{} = Error -> Error
      end.
  