Kubernetes-REST

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

   When no kubeconfig file is found, automatically falls back to using the
   mounted service account token at
   /var/run/secrets/kubernetes.io/serviceaccount/token. This enables seamless
   use inside Kubernetes pods without needing a kubeconfig file.

1.002     2026-02-23 02:41:32Z
 - Fix client-certificate (mTLS) auth: skip empty Authorization header when
   no bearer token is configured (was sending "Bearer " causing 401)

1.001     2026-02-20 05:03:44Z
 - Fix inline kubeconfig certificates (use IO::Socket::SSL::Utils for in-memory PEM)
 - Kubeconfig: respect KUBECONFIG environment variable

1.000     2026-02-13 05:38:17Z
 - Updated original author email and copyright holder
 - Complete rewrite for v1 API
 - Now uses IO::K8s for Kubernetes resource classes
 - Simplified API: list(), get(), create(), update(), patch(), delete(), watch()
 - Default HTTP backend switched from HTTP::Tiny to LWP::UserAgent
   (enables LWP::ConsoleLogger for HTTP traffic debugging)
 - New Kubernetes::REST::LWPIO backend (HTTPTinyIO still available as alternative)

META.json  view on Meta::CPAN

            "Test::Pod" : "1.41"
         }
      },
      "runtime" : {
         "recommends" : {
            "HTTP::Tiny" : "0",
            "LWP::ConsoleLogger" : "0"
         },
         "requires" : {
            "IO::K8s" : "1.008",
            "IO::Socket::SSL" : "0",
            "JSON::MaybeXS" : "0",
            "LWP::UserAgent" : "0",
            "Module::Runtime" : "0",
            "Moo" : "0",
            "MooX::Cmd" : "0",
            "MooX::Options" : "0",
            "Path::Tiny" : "0",
            "Throwable" : "0",
            "Types::Standard" : "0",
            "YAML::XS" : "0",

META.yml  view on Meta::CPAN

license: apache
meta-spec:
  url: http://module-build.sourceforge.net/META-spec-v1.4.html
  version: '1.4'
name: Kubernetes-REST
recommends:
  HTTP::Tiny: '0'
  LWP::ConsoleLogger: '0'
requires:
  IO::K8s: '1.008'
  IO::Socket::SSL: '0'
  JSON::MaybeXS: '0'
  LWP::UserAgent: '0'
  Module::Runtime: '0'
  Moo: '0'
  MooX::Cmd: '0'
  MooX::Options: '0'
  Path::Tiny: '0'
  Throwable: '0'
  Types::Standard: '0'
  YAML::XS: '0'

Makefile.PL  view on Meta::CPAN

  },
  "DISTNAME" => "Kubernetes-REST",
  "EXE_FILES" => [
    "bin/kube_client",
    "bin/kube_watch"
  ],
  "LICENSE" => "apache",
  "NAME" => "Kubernetes::REST",
  "PREREQ_PM" => {
    "IO::K8s" => "1.008",
    "IO::Socket::SSL" => 0,
    "JSON::MaybeXS" => 0,
    "LWP::UserAgent" => 0,
    "Module::Runtime" => 0,
    "Moo" => 0,
    "MooX::Cmd" => 0,
    "MooX::Options" => 0,
    "Path::Tiny" => 0,
    "Throwable" => 0,
    "Types::Standard" => 0,
    "YAML::XS" => 0,

Makefile.PL  view on Meta::CPAN

  },
  "VERSION" => "1.104",
  "test" => {
    "TESTS" => "t/*.t"
  }
);


my %FallbackPrereqs = (
  "IO::K8s" => "1.008",
  "IO::Socket::SSL" => 0,
  "JSON::MaybeXS" => 0,
  "LWP::UserAgent" => 0,
  "Module::Runtime" => 0,
  "Moo" => 0,
  "MooX::Cmd" => 0,
  "MooX::Options" => 0,
  "Path::Tiny" => 0,
  "Test::Exception" => 0,
  "Test::More" => 0,
  "Throwable" => 0,

cpanfile  view on Meta::CPAN

requires 'LWP::UserAgent';
recommends 'LWP::ConsoleLogger';
recommends 'HTTP::Tiny';
requires 'IO::Socket::SSL';
requires 'IO::K8s', '1.008';
requires 'Moo';
requires 'MooX::Cmd';
requires 'MooX::Options';
requires 'Types::Standard';
requires 'JSON::MaybeXS';
requires 'YAML::XS';
requires 'Path::Tiny';
requires 'Module::Runtime';
requires 'namespace::clean';

lib/Kubernetes/REST/HTTPTinyIO.pm  view on Meta::CPAN

package Kubernetes::REST::HTTPTinyIO;
our $VERSION = '1.104';
# ABSTRACT: HTTP client using HTTP::Tiny
use Moo;
use HTTP::Tiny;
use IO::Socket::SSL;
use Kubernetes::REST::HTTPResponse;
use Types::Standard qw/Bool/;

with 'Kubernetes::REST::Role::IO';


has ssl_verify_server => (is => 'ro', isa => Bool, default => 1);


has ssl_cert_file => (is => 'ro');

lib/Kubernetes/REST/HTTPTinyIO.pm  view on Meta::CPAN

has ssl_key_file  => (is => 'ro');
has ssl_key_pem   => (is => 'ro');
has ssl_ca_file   => (is => 'ro');
has ssl_ca_pem    => (is => 'ro');

has timeout => (is => 'ro', default => sub { 310 });


has ua => (is => 'ro', lazy => 1, default => sub {
    my $self = shift;
    require IO::Socket::SSL::Utils;

    my %options;
    $options{ SSL_verify_mode } = SSL_VERIFY_PEER if ($self->ssl_verify_server);

    if (defined $self->ssl_cert_pem) {
        $options{ SSL_cert } = [ IO::Socket::SSL::Utils::PEM_string2cert($self->ssl_cert_pem) ];
    } elsif (defined $self->ssl_cert_file) {
        $options{ SSL_cert_file } = $self->ssl_cert_file;
    }

    if (defined $self->ssl_key_pem) {
        $options{ SSL_key } = IO::Socket::SSL::Utils::PEM_string2key($self->ssl_key_pem);
    } elsif (defined $self->ssl_key_file) {
        $options{ SSL_key_file } = $self->ssl_key_file;
    }

    if (defined $self->ssl_ca_pem) {
        $options{ SSL_ca } = [ IO::Socket::SSL::Utils::PEM_string2cert($self->ssl_ca_pem) ];
    } elsif (defined $self->ssl_ca_file) {
        $options{ SSL_ca_file } = $self->ssl_ca_file;
    }

    return HTTP::Tiny->new(
      agent => 'Kubernetes::REST Perl Client ' . ($Kubernetes::REST::VERSION // 'dev'),
      timeout => $self->timeout,
      SSL_options => \%options,
    );
});

lib/Kubernetes/REST/LWPIO.pm  view on Meta::CPAN

has ssl_key_file  => (is => 'ro');
has ssl_key_pem   => (is => 'ro');
has ssl_ca_file   => (is => 'ro');
has ssl_ca_pem    => (is => 'ro');

has timeout => (is => 'ro', default => sub { 310 });


has ua => (is => 'ro', lazy => 1, default => sub {
    my $self = shift;
    require IO::Socket::SSL::Utils;

    my %ssl_opts;
    $ssl_opts{ verify_hostname } = $self->ssl_verify_server;
    $ssl_opts{ SSL_verify_mode } = $self->ssl_verify_server ? 1 : 0;

    # PEM data: convert to X509/EVP_PKEY objects via SSL_cert/SSL_key
    # PEM file paths: use SSL_cert_file/SSL_key_file as normal
    if (defined $self->ssl_cert_pem) {
        $ssl_opts{ SSL_cert } = [ IO::Socket::SSL::Utils::PEM_string2cert($self->ssl_cert_pem) ];
    } elsif (defined $self->ssl_cert_file) {
        $ssl_opts{ SSL_cert_file } = $self->ssl_cert_file;
    }

    if (defined $self->ssl_key_pem) {
        $ssl_opts{ SSL_key } = IO::Socket::SSL::Utils::PEM_string2key($self->ssl_key_pem);
    } elsif (defined $self->ssl_key_file) {
        $ssl_opts{ SSL_key_file } = $self->ssl_key_file;
    }

    if (defined $self->ssl_ca_pem) {
        $ssl_opts{ SSL_ca } = [ IO::Socket::SSL::Utils::PEM_string2cert($self->ssl_ca_pem) ];
    } elsif (defined $self->ssl_ca_file) {
        $ssl_opts{ SSL_ca_file } = $self->ssl_ca_file;
    }

    return LWP::UserAgent->new(
      agent => 'Kubernetes::REST Perl Client ' . ($Kubernetes::REST::VERSION // 'dev'),
      timeout => $self->timeout,
      ssl_opts => \%ssl_opts,
    );
});



( run in 1.988 second using v1.01-cache-2.11-cpan-39bf76dae61 )