DBIO-MySQL

 view release on metacpan or  search on metacpan

xbin/dbio-mysql-k8s  view on Meta::CPAN

  ));
}

sub _create_pod {
  my ($k8s, $io, $ns, $name, $image, $user, $pass, $root_pass, $db) = @_;
  if (eval { $k8s->get('Pod', name => $name, namespace => $ns); 1 }) {
    $k8s->delete($k8s->get('Pod', name => $name, namespace => $ns));
    print STDERR "Waiting for old pod to terminate";
    my $deadline = time + 60;
    while (time < $deadline) {
      last unless eval { $k8s->get('Pod', name => $name, namespace => $ns); 1 };
      print STDERR '.';
      Time::HiRes::sleep(2);
    }
    print STDERR "\n";
  }
  $k8s->create($io->new_object('Pod',
    metadata => { name => $name, namespace => $ns, labels => { app => $name } },
    spec     => {
      containers => [{
        name  => $name,
        image => $image,
        env   => [
          { name => 'MYSQL_USER',          value => $user      },
          { name => 'MYSQL_PASSWORD',      value => $pass      },
          { name => 'MYSQL_ROOT_PASSWORD', value => $root_pass },
          { name => 'MYSQL_DATABASE',      value => $db        },
        ],
        ports          => [{ containerPort => 3306 }],
        readinessProbe => {
          tcpSocket           => { port => 3306 },
          initialDelaySeconds => 15,
          periodSeconds       => 3,
        },
      }],
    },
  ));
}

sub _create_service {
  my ($k8s, $io, $ns, $name, $port) = @_;
  eval { $k8s->delete($k8s->get('Service', name => $name, namespace => $ns)) };
  $k8s->create($io->new_object('Service',
    metadata => { name => $name, namespace => $ns },
    spec     => {
      type     => 'NodePort',
      selector => { app => $name },
      ports    => [{ port => $port, targetPort => $port }],
    },
  ));
}

sub _wait_for_ready {
  my ($k8s, $ns, $name, $user) = @_;
  print STDERR "Waiting for pod $name to be ready";
  my $deadline = time + 300;
  my $last_phase = '';
  while (time < $deadline) {
    my $pod = eval { $k8s->get('Pod', name => $name, namespace => $ns) };
    if ($pod) {
      return _get_service_endpoint($k8s, $ns, $name) if _pod_ready($pod);
      my $phase = eval { $pod->status->phase } // '?';
      # Show phase changes and any waiting reason (e.g. ErrImagePull)
      my $reason = eval {
        my $cs = $pod->status->containerStatuses // [];
        @$cs ? ($cs->[0]->state->waiting // {})->{reason} // '' : ''
      } // '';
      my $status = $reason ? "$phase/$reason" : $phase;
      if ($status ne $last_phase) {
        print STDERR " [$status]";
        $last_phase = $status;
      }
    }
    print STDERR '.';
    Time::HiRes::sleep(3);
  }
  print STDERR "\n";
  die "Timed out waiting for pod $name\n";
}

sub _pod_ready {
  my ($pod) = @_;
  my $conditions = $pod->status->conditions // [];
  return grep { $_->type eq 'Ready' && $_->status eq 'True' } @$conditions;
}

sub _get_service_endpoint {
  my ($k8s, $ns, $name) = @_;
  my $svc       = $k8s->get('Service', name => $name, namespace => $ns);
  my $node_port = $svc->spec->ports->[0]->nodePort
    or die "No nodePort assigned to service $name\n";

  my $nodes  = $k8s->list('Node');
  my ($node) = grep { _node_ready($_) } @{ $nodes->items };
  die "No ready nodes found\n" unless $node;

  my ($addr) = grep { $_->type eq 'InternalIP' } @{ $node->status->addresses };
  return ($addr->address, $node_port);
}

sub _node_ready {
  my ($node) = @_;
  my $conditions = $node->status->conditions // [];
  return grep { $_->type eq 'Ready' && $_->status eq 'True' } @$conditions;
}



( run in 1.580 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )