Flower

 view release on metacpan or  search on metacpan

lib/Flower/Nodes.pm  view on Meta::CPAN


  return $self;
}

sub self {
  my $self = shift;
  return $self->{nodes}->[0];
}

sub add {
  my $self = shift;
  my $node = shift;
  push @{ $self->{nodes} }, $node;
  return $self;
}

sub add_if_necessary {
  my $self = shift;
  my $args = shift;
  my $uuid = $args->{uuid};
  my $port = $args->{port};
  my $ip   = $args->{ip};

  foreach ( @{ $self->{nodes} } ) {
    return
      if ( $_->uuid && $uuid && ( $_->uuid eq $uuid ) );    # we know this one
    return
      if ( ( $_->ip eq $ip ) && ( $_->port eq $port ) )
      ;    # this looks like us, do not add
  }
  my $node = Flower::Node->new(
    { uuid => $uuid, port => $port, ip => $ip, parent => $self } );
  push @{ $self->{nodes} }, $node;
  say "$node added";
  return 1;
}

sub remove {
  my $self = shift;
  my $node = shift;
  $self->{nodes} = [
    map {
      if   ( refaddr($_) ne refaddr($node) ) {$_}
      else                                   { () }
      } @{ $self->{nodes} }
  ];
  return $self;
}

sub list {
  my $self = shift;
  return @{ $self->{nodes} };
}

sub nodes_as_hashref {
  my $self = shift;
  return [ map { { uuid => $_->uuid, ip => $_->ip, port => $_->port } }
      @{ $self->{nodes} } ];
}

sub update {
  my $self = shift;

  foreach my $node ( @{ $self->{nodes} } ) {

    # if node has timed out, remove it
    if ( $node->has_timed_out ) {
      print "$node - removing after timeout\n";
      $self->remove($node);
    }

    # ping it if we need to, to keep it alive
    else {

      # tell the node what the 'us' node is, so it can pass that
      # information on
      $node->ping_if_necessary( $self->nodes_as_hashref );
    }
  }

  say "current nodes:";
  foreach my $node ( @{ $self->{nodes} } ) {
    if ( $node->has_files_object ) {
      say " * $node (" . $node->files->count . " files)";
    }
    else {
      say " * $node (no files yet)";
    }

  }

}

1;



( run in 2.099 seconds using v1.01-cache-2.11-cpan-437f7b0c052 )