Skip to content

Commit bf8db9f

Browse files
authored
fix: add options for http registry (#29)
1 parent c6394ce commit bf8db9f

File tree

4 files changed

+87
-18
lines changed

4 files changed

+87
-18
lines changed

go/helm_sdkpy/_lib/linux-amd64/libhelm_sdkpy.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* Code generated by cmd/cgo; DO NOT EDIT. */
22

3-
/* package command-line-arguments */
3+
/* package github.com/vantagecompute/helm-sdkpy/shim */
44

55

66
#line 1 "cgo-builtin-export-prolog"
@@ -12,6 +12,8 @@
1212

1313
#ifndef GO_CGO_GOSTRING_TYPEDEF
1414
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
15+
extern size_t _GoStringLen(_GoString_ s);
16+
extern const char *_GoStringPtr(_GoString_ s);
1517
#endif
1618

1719
#endif
@@ -53,10 +55,16 @@ typedef size_t GoUintptr;
5355
typedef float GoFloat32;
5456
typedef double GoFloat64;
5557
#ifdef _MSC_VER
58+
#if !defined(__cplusplus) || _MSVC_LANG <= 201402L
5659
#include <complex.h>
5760
typedef _Fcomplex GoComplex64;
5861
typedef _Dcomplex GoComplex128;
5962
#else
63+
#include <complex>
64+
typedef std::complex<float> GoComplex64;
65+
typedef std::complex<double> GoComplex128;
66+
#endif
67+
#else
6068
typedef float _Complex GoComplex64;
6169
typedef double _Complex GoComplex128;
6270
#endif
@@ -83,11 +91,11 @@ typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
8391
extern "C" {
8492
#endif
8593

86-
extern char* helm_sdkpy_last_error();
94+
extern char* helm_sdkpy_last_error(void);
8795
extern void helm_sdkpy_free(void* ptr);
88-
extern char* helm_sdkpy_version_string();
89-
extern int helm_sdkpy_version_number();
90-
extern int helm_sdkpy_config_create(char* namespace, char* kubeconfig, char* kubecontext, helm_sdkpy_handle* handle_out);
96+
extern char* helm_sdkpy_version_string(void);
97+
extern int helm_sdkpy_version_number(void);
98+
extern int helm_sdkpy_config_create(char* namespace, char* kubeconfig, char* kubecontext, char* options_json, helm_sdkpy_handle* handle_out);
9199
extern void helm_sdkpy_config_destroy(helm_sdkpy_handle handle);
92100
extern int helm_sdkpy_install(helm_sdkpy_handle handle, char* release_name, char* chart_path, char* values_json, char* version, int create_namespace, int wait, int timeout_seconds, char** result_json);
93101
extern int helm_sdkpy_upgrade(helm_sdkpy_handle handle, char* release_name, char* chart_path, char* values_json, char* version, char** result_json);
@@ -97,7 +105,7 @@ extern int helm_sdkpy_status(helm_sdkpy_handle handle, char* release_name, char*
97105
extern int helm_sdkpy_rollback(helm_sdkpy_handle handle, char* release_name, int revision, char** result_json);
98106
extern int helm_sdkpy_get_values(helm_sdkpy_handle handle, char* release_name, int all_values, char** result_json);
99107
extern int helm_sdkpy_history(helm_sdkpy_handle handle, char* release_name, char** result_json);
100-
extern int helm_sdkpy_pull(helm_sdkpy_handle handle, char* chart_ref, char* dest_dir);
108+
extern int helm_sdkpy_pull(helm_sdkpy_handle handle, char* chart_ref, char* dest_dir, char* version);
101109
extern int helm_sdkpy_show_chart(helm_sdkpy_handle handle, char* chart_path, char** result_json);
102110
extern int helm_sdkpy_show_values(helm_sdkpy_handle handle, char* chart_path, char** result_json);
103111
extern int helm_sdkpy_test(helm_sdkpy_handle handle, char* release_name, char** result_json);
@@ -107,6 +115,9 @@ extern int helm_sdkpy_repo_add(helm_sdkpy_handle handle, char* name, char* url,
107115
extern int helm_sdkpy_repo_remove(helm_sdkpy_handle handle, char* name);
108116
extern int helm_sdkpy_repo_list(helm_sdkpy_handle handle, char** result_json);
109117
extern int helm_sdkpy_repo_update(helm_sdkpy_handle handle, char* name);
118+
extern int helm_sdkpy_registry_login(helm_sdkpy_handle handle, char* hostname, char* username, char* password, char* options_json);
119+
extern int helm_sdkpy_registry_logout(helm_sdkpy_handle handle, char* hostname);
120+
extern int helm_sdkpy_push(helm_sdkpy_handle handle, char* chart_ref, char* remote, char* options_json);
110121

111122
#ifdef __cplusplus
112123
}

go/shim/main.go

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,22 @@ func loadChartFromRepo(chartRef string, version string, envs *cli.EnvSettings) (
321321
// Configuration management
322322

323323
//export helm_sdkpy_config_create
324-
func helm_sdkpy_config_create(namespace *C.char, kubeconfig *C.char, kubecontext *C.char, handle_out *C.helm_sdkpy_handle) C.int {
324+
func helm_sdkpy_config_create(namespace *C.char, kubeconfig *C.char, kubecontext *C.char, options_json *C.char, handle_out *C.helm_sdkpy_handle) C.int {
325325
ns := C.GoString(namespace)
326326
kc := C.GoString(kubeconfig)
327327
kctx := C.GoString(kubecontext)
328+
optsJSON := C.GoString(options_json)
329+
330+
// Parse config options
331+
var configOpts struct {
332+
PlainHTTP bool `json:"plain_http"`
333+
InsecureSkipTLSVerify bool `json:"insecure_skip_tls_verify"`
334+
}
335+
if optsJSON != "" {
336+
if err := json.Unmarshal([]byte(optsJSON), &configOpts); err != nil {
337+
return setError(fmt.Errorf("failed to parse config options: %w", err))
338+
}
339+
}
328340

329341
var restClientGetter genericclioptions.RESTClientGetter
330342
var envs *cli.EnvSettings
@@ -383,14 +395,21 @@ if cfg.KubeClient != nil {
383395
}
384396

385397
// Initialize registry client for OCI operations
386-
registryClient, err := registry.NewClient(
387-
registry.ClientOptDebug(false),
388-
registry.ClientOptEnableCache(true),
389-
registry.ClientOptWriter(os.Stdout),
390-
registry.ClientOptCredentialsFile(envs.RegistryConfig),
391-
)
398+
registryOpts := []registry.ClientOption{
399+
registry.ClientOptDebug(false),
400+
registry.ClientOptEnableCache(true),
401+
registry.ClientOptWriter(os.Stdout),
402+
registry.ClientOptCredentialsFile(envs.RegistryConfig),
403+
}
404+
405+
// Add PlainHTTP option for HTTP registries (e.g., local registries without TLS)
406+
if configOpts.PlainHTTP {
407+
registryOpts = append(registryOpts, registry.ClientOptPlainHTTP())
408+
}
409+
410+
registryClient, err := registry.NewClient(registryOpts...)
392411
if err != nil {
393-
return setError(fmt.Errorf("failed to initialize registry client: %w", err))
412+
return setError(fmt.Errorf("failed to initialize registry client: %w", err))
394413
}
395414
cfg.RegistryClient = registryClient
396415

helm_sdkpy/_ffi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
typedef unsigned long long helm_sdkpy_handle;
3131
3232
// Configuration management
33-
int helm_sdkpy_config_create(const char *namespace, const char *kubeconfig, const char *kubecontext, helm_sdkpy_handle *handle_out);
33+
int helm_sdkpy_config_create(const char *namespace, const char *kubeconfig, const char *kubecontext, const char *options_json, helm_sdkpy_handle *handle_out);
3434
void helm_sdkpy_config_destroy(helm_sdkpy_handle handle);
3535
3636
// Install action

helm_sdkpy/actions.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ class Configuration:
4343
- File path: Path to a kubeconfig file (e.g., "/path/to/config.yaml")
4444
- YAML string: Kubeconfig content as a YAML string (auto-detected)
4545
kubecontext: Kubernetes context to use (default: current context)
46+
plain_http: Use HTTP instead of HTTPS for OCI registries (default: False).
47+
Enable this when using local registries without TLS (e.g., MicroK8s registry).
48+
insecure_skip_tls_verify: Skip TLS certificate verification (default: False)
4649
4750
Example:
4851
>>> import asyncio
@@ -64,13 +67,21 @@ class Configuration:
6467
>>>
6568
>>> install = Install(config)
6669
>>> result = asyncio.run(install.run("my-release", "/path/to/chart"))
70+
>>>
71+
>>> # Using a local HTTP registry (no TLS)
72+
>>> config = Configuration(
73+
... namespace="default",
74+
... plain_http=True # For registries without TLS (e.g., local registries)
75+
... )
6776
"""
6877

6978
def __init__(
7079
self,
7180
namespace: str = "default",
7281
kubeconfig: str | None = None,
7382
kubecontext: str | None = None,
83+
plain_http: bool = False,
84+
insecure_skip_tls_verify: bool = False,
7485
):
7586
self._lib = get_library()
7687
self._handle = ffi.new("helm_sdkpy_handle *")
@@ -79,7 +90,16 @@ def __init__(
7990
kc_cstr = ffi.new("char[]", kubeconfig.encode("utf-8")) if kubeconfig else ffi.NULL
8091
kctx_cstr = ffi.new("char[]", kubecontext.encode("utf-8")) if kubecontext else ffi.NULL
8192

82-
result = self._lib.helm_sdkpy_config_create(ns_cstr, kc_cstr, kctx_cstr, self._handle)
93+
# Build options JSON
94+
options = {}
95+
if plain_http:
96+
options["plain_http"] = plain_http
97+
if insecure_skip_tls_verify:
98+
options["insecure_skip_tls_verify"] = insecure_skip_tls_verify
99+
options_json = json.dumps(options)
100+
options_cstr = ffi.new("char[]", options_json.encode("utf-8"))
101+
102+
result = self._lib.helm_sdkpy_config_create(ns_cstr, kc_cstr, kctx_cstr, options_cstr, self._handle)
83103
check_error(result)
84104

85105
self._handle_value = self._handle[0]
@@ -99,7 +119,12 @@ def __exit__(self, exc_type, exc_val, exc_tb):
99119
return False
100120

101121
@classmethod
102-
def from_service_account(cls, namespace: str = "default") -> Configuration:
122+
def from_service_account(
123+
cls,
124+
namespace: str = "default",
125+
plain_http: bool = False,
126+
insecure_skip_tls_verify: bool = False,
127+
) -> Configuration:
103128
"""Create configuration using in-cluster ServiceAccount.
104129
105130
This is for running inside a Kubernetes pod with a ServiceAccount.
@@ -112,6 +137,8 @@ def from_service_account(cls, namespace: str = "default") -> Configuration:
112137
113138
Args:
114139
namespace: Kubernetes namespace to operate in (default: "default")
140+
plain_http: Use HTTP instead of HTTPS for OCI registries (default: False)
141+
insecure_skip_tls_verify: Skip TLS certificate verification (default: False)
115142
116143
Returns:
117144
Configuration instance using ServiceAccount authentication
@@ -121,8 +148,20 @@ def from_service_account(cls, namespace: str = "default") -> Configuration:
121148
>>> config = Configuration.from_service_account(namespace="my-namespace")
122149
>>> install = Install(config)
123150
>>> result = asyncio.run(install.run("my-release", "oci://ghcr.io/org/chart"))
151+
>>>
152+
>>> # Using a local HTTP registry
153+
>>> config = Configuration.from_service_account(
154+
... namespace="my-namespace",
155+
... plain_http=True
156+
... )
124157
"""
125-
return cls(namespace=namespace, kubeconfig=None, kubecontext=None)
158+
return cls(
159+
namespace=namespace,
160+
kubeconfig=None,
161+
kubecontext=None,
162+
plain_http=plain_http,
163+
insecure_skip_tls_verify=insecure_skip_tls_verify,
164+
)
126165

127166

128167
class Install:

0 commit comments

Comments
 (0)