anchor.diff:  is_vip_label(_) ->
     false.
   
  -resource(NumPorts) ->
  +p_resource(NumPorts) ->
     ?LET({CPUs, Ports, Mem, Disk},
  -       {integer(), res_ports(NumPorts), integer(), integer()},
  +       {integer(), p_res_ports(NumPorts), integer(), integer()},
          #{
            cpus => CPUs,
            ports => Ports,
  
positive.code:          disk => Disk
          }).
  
  res_ports(NumPorts) ->
    ?LET(Ports,
         ?SUCHTHAT(L, list(integer(0, 65535)), length(L) >= NumPorts),
         "[" ++ string:join(lists:map(fun (P) ->
                                          integer_to_list(P) ++ "-" ++ integer_to_list(P)
                                      end, Ports), ",") ++ "]").
  
  statuses() ->
    ?LET(S, list(status()), S).
  
  status() ->
    ?LET(NI, list(networkinfo()), #{
      container_status => #{
        network_infos => NI
      }
    }).
  
  networkinfo() ->
    ?LET(IP, ip(), #{ip_address => IP}).
  
  taskstate() ->
    ?LET(S, union([<<"TASK_RUNNING">>]), S).
  
  basic_init_test() ->
  
negative.code:   ok.
  
  prop_vips_parse() ->
    ?FORALL(#{value := VIP}, p_vip_label(0), not_error(normalize_vip(VIP))).
  
  not_error({error, _, _}) ->
    false;
  