#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use JSON;

sub list_labels {
    my $nodeJSON = `kubectl get nodes -o json`;
    die "'get nodes' failed\n" if not $nodeJSON or $?;
    $nodeJSON = eval { decode_json $nodeJSON };
    die "Invalid data returned: $@\n" if $@;

    my %nodes;
    foreach my $node (@{$nodeJSON->{items}}) {
        next if  $node->{kind} ne 'Node';
        my $nodeName = $node->{metadata}{name};
        my @labels = map {substr($_,9)} grep {/^overcast/} keys %{ $node->{metadata}{labels} };
        $nodes{$nodeName} = \@labels
    }

    print Dumper(\%nodes);
}

sub set_labels {
    my ($node, @labels) = @_;
    
    my $labels = '';
    $labels .= "overcast.$_=true " foreach @labels;
    `kubectl label --overwrite node $node $labels`;
}

sub main {
    if (not @ARGV) {
        list_labels;
    } else {
        foreach (@ARGV) {
            my ($node, $labels) = split /=/;
            next if not defined $node or not defined $labels;
            my @labels = split /,/, $labels;
            set_labels $node, @labels;
        }
    }
}

main;
