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 )