Net-Async-Kubernetes
view release on metacpan or search on metacpan
labels => { app => 'demo-app', type => 'batch' },
},
spec => {
backoffLimit => 2,
ttlSecondsAfterFinished => 300,
template => {
spec => {
restartPolicy => 'Never',
containers => [{
name => 'worker',
image => 'busybox:latest',
command => ['sh', '-c',
'echo "Job started at $(date)"; '
. 'echo "Processing items..."; '
. 'for i in 1 2 3 4 5; do echo " Item $i done"; sleep 1; done; '
. 'echo "Job completed at $(date)"'
],
resources => {
requests => { cpu => '25m', memory => '16Mi' },
limits => { cpu => '50m', memory => '32Mi' },
},
schedule => '*/1 * * * *',
successfulJobsHistoryLimit => 2,
failedJobsHistoryLimit => 1,
jobTemplate => {
spec => {
template => {
spec => {
restartPolicy => 'OnFailure',
containers => [{
name => 'cron-worker',
image => 'busybox:latest',
command => ['sh', '-c', 'echo "Cron tick at $(date)"'],
resources => {
requests => { cpu => '10m', memory => '8Mi' },
limits => { cpu => '25m', memory => '16Mi' },
},
}],
},
},
},
},
labels => { app => 'demo-app', component => 'utility' },
annotations => {
'purpose' => 'Demonstrates ConfigMap + Secret access from a pod',
},
},
spec => {
serviceAccountName => 'demo-sa',
restartPolicy => 'Never',
containers => [{
name => 'util',
image => 'busybox:latest',
command => ['sh', '-c', join('; ',
'echo "=== Environment ==="',
'echo "APP_ENV=$APP_ENV"',
'echo "LOG_LEVEL=$LOG_LEVEL"',
'echo "DB_HOST=$DB_HOST"',
'echo ""',
'echo "=== Config Files ==="',
'echo "nginx.conf:"',
'cat /config/nginx.conf',
'echo ""',
t/10-dual-crud.t view on Meta::CPAN
subtest 'create Job' => sub {
unless (is_live()) {
MockTransport::mock_response('POST',
"/apis/batch/v1/namespaces/$NS/jobs", {
kind => 'Job', apiVersion => 'batch/v1',
metadata => { name => 'demo-job', namespace => $NS,
uid => 'job-uid-001', creationTimestamp => '2025-01-01T00:00:00Z' },
spec => { backoffLimit => 2,
template => { spec => { restartPolicy => 'Never',
containers => [{ name => 'worker', image => 'busybox:latest' }] } } },
status => {},
});
}
my $job = $kube->_rest->new_object(Job =>
metadata => { name => 'demo-job', namespace => $NS },
spec => { backoffLimit => 2,
template => { spec => { restartPolicy => 'Never',
containers => [{ name => 'worker', image => 'busybox:latest',
command => ['echo', 'hello'] }] } } },
);
my $created = $kube->create($job)->get;
ok($created, 'Job created');
is($created->metadata->name, 'demo-job', 'name matches');
};
subtest 'create CronJob' => sub {
unless (is_live()) {
MockTransport::mock_response('POST',
"/apis/batch/v1/namespaces/$NS/cronjobs", {
kind => 'CronJob', apiVersion => 'batch/v1',
metadata => { name => 'demo-cronjob', namespace => $NS,
uid => 'cj-uid-001', creationTimestamp => '2025-01-01T00:00:00Z' },
spec => { schedule => '*/5 * * * *',
jobTemplate => { spec => { template => { spec => {
restartPolicy => 'OnFailure',
containers => [{ name => 'cron', image => 'busybox:latest' }] } } } } },
});
}
my $cj = $kube->_rest->new_object(CronJob =>
metadata => { name => 'demo-cronjob', namespace => $NS },
spec => { schedule => '*/5 * * * *',
jobTemplate => { spec => { template => { spec => {
restartPolicy => 'OnFailure',
containers => [{ name => 'cron', image => 'busybox:latest',
command => ['echo', 'tick'] }] } } } } },
);
my $created = $kube->create($cj)->get;
ok($created, 'CronJob created');
is($created->metadata->name, 'demo-cronjob', 'name matches');
};
# ============================================================================
# List resources
# ============================================================================
( run in 0.607 second using v1.01-cache-2.11-cpan-39bf76dae61 )