#include "../include/net_deck.h"
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static const char* event_kind_str(int kind) {
switch (kind) {
case NET_DECK_EVENT_KIND_DRAIN: return "drain";
case NET_DECK_EVENT_KIND_ENTER_MAINTENANCE: return "enter_maintenance";
case NET_DECK_EVENT_KIND_EXIT_MAINTENANCE: return "exit_maintenance";
case NET_DECK_EVENT_KIND_CORDON: return "cordon";
case NET_DECK_EVENT_KIND_UNCORDON: return "uncordon";
case NET_DECK_EVENT_KIND_DROP_REPLICAS: return "drop_replicas";
case NET_DECK_EVENT_KIND_INVALIDATE_PLACEMENT: return "invalidate_placement";
case NET_DECK_EVENT_KIND_RESTART_ALL_DAEMONS: return "restart_all_daemons";
case NET_DECK_EVENT_KIND_CLEAR_AVOID_LIST: return "clear_avoid_list";
default: return "unknown";
}
}
static void print_last_error(const char* context) {
const char* kind = net_deck_last_error_kind();
const char* msg = net_deck_last_error_message();
fprintf(stderr, "[%s] kind=%s message=%s\n",
context,
kind ? kind : "(none)",
msg ? msg : "(none)");
net_deck_clear_last_error();
}
int main(void) {
uint8_t seed[32];
memset(seed, 0x42, sizeof(seed));
NetDeckClient* client = NULL;
int rc = net_deck_client_new(
0,
0,
0,
0,
0,
0,
seed,
&client
);
if (rc != NET_DECK_OK || client == NULL) {
print_last_error("client_new");
return 1;
}
uint64_t op_id = net_deck_client_operator_id(client);
printf("constructed deck client operator_id=%#" PRIx64 "\n", op_id);
char* snap_json = net_deck_status(client);
if (snap_json == NULL) {
print_last_error("status");
} else {
size_t prefix = strlen(snap_json);
if (prefix > 64) prefix = 64;
printf("snapshot (first %zu chars): %.*s\n", prefix, (int)prefix, snap_json);
net_deck_free_string(snap_json);
}
NetDeckStatusSummary summary;
memset(&summary, 0, sizeof(summary));
rc = net_deck_status_summary(client, &summary);
if (rc != NET_DECK_OK) {
print_last_error("status_summary");
} else {
printf("status_summary: peers.healthy=%u daemons.running=%u replica_chains=%u local_maintenance=%d\n",
summary.peers.healthy,
summary.daemons.running,
summary.replica_chains,
summary.local_maintenance_active);
}
NetDeckChainCommit commit;
memset(&commit, 0, sizeof(commit));
rc = net_deck_admin_enter_maintenance(
client,
0xABCD,
600000,
1,
&commit
);
if (rc != NET_DECK_OK) {
print_last_error("admin_enter_maintenance");
} else {
printf("enter_maintenance commit_id=%#" PRIx64 " operator_id=%#" PRIx64 " event_kind=%s committed_at_ms=%" PRIu64 "\n",
commit.commit_id,
commit.operator_id,
event_kind_str(commit.event_kind),
commit.committed_at_ms);
}
NetDeckSnapshotStream* stream = NULL;
rc = net_deck_subscribe_snapshots(client, &stream);
if (rc != NET_DECK_OK || stream == NULL) {
print_last_error("subscribe_snapshots");
} else {
char* live_snap = NULL;
rc = net_deck_snapshot_stream_next(stream, 500, &live_snap);
if (rc != NET_DECK_OK) {
print_last_error("snapshot_stream_next");
} else if (live_snap == NULL) {
printf("snapshot_stream_next: timeout (no snapshot in 500ms)\n");
} else {
printf("got live snapshot (%zu bytes)\n", strlen(live_snap));
net_deck_free_string(live_snap);
}
net_deck_snapshot_stream_free(stream);
}
net_deck_client_free(client);
printf("deck client freed\n");
return 0;
}