Skip to content

Commit 749701b

Browse files
Copilotintel352
andauthored
feat: add step.s3_upload pipeline step for S3-compatible object storage (#194)
* Initial plan * feat: add step.s3_upload pipeline step for S3-compatible object storage upload Co-authored-by: intel352 <77607+intel352@users.noreply.github.com> * fix: add step.s3_upload to schema coreModuleTypes and module_schema registry Co-authored-by: intel352 <77607+intel352@users.noreply.github.com> * fix: update TestPluginLoads to use dynamic count after merge from main Co-authored-by: intel352 <77607+intel352@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: intel352 <77607+intel352@users.noreply.github.com> Co-authored-by: Jonathan Langevin <codingsloth@pm.me>
1 parent 1cfab0c commit 749701b

38 files changed

Lines changed: 796 additions & 213 deletions

module/app_container.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ type ECSAppManifests struct {
8282

8383
// ECSAppTaskDef represents an ECS task definition for an app container.
8484
type ECSAppTaskDef struct {
85-
Family string `json:"family"`
86-
CPU string `json:"cpu"`
87-
Memory string `json:"memory"`
85+
Family string `json:"family"`
86+
CPU string `json:"cpu"`
87+
Memory string `json:"memory"`
8888
Containers []ECSContainer `json:"containers"`
8989
}
9090

@@ -292,17 +292,17 @@ type K8sDeploymentManifest struct {
292292

293293
// K8sServiceManifest represents a Kubernetes Service resource.
294294
type K8sServiceManifest struct {
295-
APIVersion string `json:"apiVersion"`
296-
Kind string `json:"kind"`
297-
Metadata K8sObjectMeta `json:"metadata"`
295+
APIVersion string `json:"apiVersion"`
296+
Kind string `json:"kind"`
297+
Metadata K8sObjectMeta `json:"metadata"`
298298
Spec K8sServiceSpec `json:"spec"`
299299
}
300300

301301
// K8sIngressManifest represents a Kubernetes Ingress resource.
302302
type K8sIngressManifest struct {
303-
APIVersion string `json:"apiVersion"`
304-
Kind string `json:"kind"`
305-
Metadata K8sObjectMeta `json:"metadata"`
303+
APIVersion string `json:"apiVersion"`
304+
Kind string `json:"kind"`
305+
Metadata K8sObjectMeta `json:"metadata"`
306306
Spec K8sIngressSpec `json:"spec"`
307307
}
308308

@@ -408,8 +408,8 @@ type K8sIngressHTTP struct {
408408

409409
// K8sIngressPath defines an HTTP path in an ingress rule.
410410
type K8sIngressPath struct {
411-
Path string `json:"path"`
412-
PathType string `json:"pathType"`
411+
Path string `json:"path"`
412+
PathType string `json:"pathType"`
413413
Backend K8sIngressBackend `json:"backend"`
414414
}
415415

module/argo_workflows.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ type ArgoWorkflowSpec struct {
3535

3636
// ArgoTemplate is a single template (DAG or step list) within an Argo Workflow.
3737
type ArgoTemplate struct {
38-
Name string `json:"name"`
39-
Kind string `json:"kind"` // dag, steps, container
40-
DAG []ArgoDAGTask `json:"dag,omitempty"`
38+
Name string `json:"name"`
39+
Kind string `json:"kind"` // dag, steps, container
40+
DAG []ArgoDAGTask `json:"dag,omitempty"`
4141
Container *ArgoContainer `json:"container,omitempty"`
4242
}
4343

@@ -408,8 +408,8 @@ func (b *argoMockBackend) listWorkflows(m *ArgoWorkflowsModule, labelSelector st
408408
// argoRealBackend implements argoBackend using the Argo Workflows REST API.
409409
// It targets the Argo Server HTTP API (default port 2746).
410410
type argoRealBackend struct {
411-
endpoint string // e.g. http://argo-server.argo.svc.cluster.local:2746
412-
token string // Bearer token (optional)
411+
endpoint string // e.g. http://argo-server.argo.svc.cluster.local:2746
412+
token string // Bearer token (optional)
413413
httpClient *http.Client
414414
}
415415

module/cloud_account_aws_creds.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func init() {
2121
// awsStaticResolver resolves AWS credentials from static config fields.
2222
type awsStaticResolver struct{}
2323

24-
func (r *awsStaticResolver) Provider() string { return "aws" }
24+
func (r *awsStaticResolver) Provider() string { return "aws" }
2525
func (r *awsStaticResolver) CredentialType() string { return "static" }
2626

2727
func (r *awsStaticResolver) Resolve(m *CloudAccount) error {
@@ -38,7 +38,7 @@ func (r *awsStaticResolver) Resolve(m *CloudAccount) error {
3838
// awsEnvResolver resolves AWS credentials from environment variables.
3939
type awsEnvResolver struct{}
4040

41-
func (r *awsEnvResolver) Provider() string { return "aws" }
41+
func (r *awsEnvResolver) Provider() string { return "aws" }
4242
func (r *awsEnvResolver) CredentialType() string { return "env" }
4343

4444
func (r *awsEnvResolver) Resolve(m *CloudAccount) error {
@@ -59,7 +59,7 @@ func (r *awsEnvResolver) Resolve(m *CloudAccount) error {
5959
// using aws-sdk-go-v2/config.LoadDefaultConfig with WithSharedConfigProfile.
6060
type awsProfileResolver struct{}
6161

62-
func (r *awsProfileResolver) Provider() string { return "aws" }
62+
func (r *awsProfileResolver) Provider() string { return "aws" }
6363
func (r *awsProfileResolver) CredentialType() string { return "profile" }
6464

6565
func (r *awsProfileResolver) Resolve(m *CloudAccount) error {
@@ -102,7 +102,7 @@ func (r *awsProfileResolver) Resolve(m *CloudAccount) error {
102102
// sts:AssumeRole to obtain temporary credentials for the target role.
103103
type awsRoleARNResolver struct{}
104104

105-
func (r *awsRoleARNResolver) Provider() string { return "aws" }
105+
func (r *awsRoleARNResolver) Provider() string { return "aws" }
106106
func (r *awsRoleARNResolver) CredentialType() string { return "role_arn" }
107107

108108
func (r *awsRoleARNResolver) Resolve(m *CloudAccount) error {

module/cloud_account_azure.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func init() {
1616
// azureStaticResolver resolves Azure credentials from static config fields.
1717
type azureStaticResolver struct{}
1818

19-
func (r *azureStaticResolver) Provider() string { return "azure" }
19+
func (r *azureStaticResolver) Provider() string { return "azure" }
2020
func (r *azureStaticResolver) CredentialType() string { return "static" }
2121

2222
func (r *azureStaticResolver) Resolve(m *CloudAccount) error {
@@ -36,7 +36,7 @@ func (r *azureStaticResolver) Resolve(m *CloudAccount) error {
3636
// azureEnvResolver resolves Azure credentials from environment variables.
3737
type azureEnvResolver struct{}
3838

39-
func (r *azureEnvResolver) Provider() string { return "azure" }
39+
func (r *azureEnvResolver) Provider() string { return "azure" }
4040
func (r *azureEnvResolver) CredentialType() string { return "env" }
4141

4242
func (r *azureEnvResolver) Resolve(m *CloudAccount) error {
@@ -52,7 +52,7 @@ func (r *azureEnvResolver) Resolve(m *CloudAccount) error {
5252
// azureClientCredentialsResolver resolves Azure service principal client credentials.
5353
type azureClientCredentialsResolver struct{}
5454

55-
func (r *azureClientCredentialsResolver) Provider() string { return "azure" }
55+
func (r *azureClientCredentialsResolver) Provider() string { return "azure" }
5656
func (r *azureClientCredentialsResolver) CredentialType() string { return "client_credentials" }
5757

5858
func (r *azureClientCredentialsResolver) Resolve(m *CloudAccount) error {
@@ -74,7 +74,7 @@ func (r *azureClientCredentialsResolver) Resolve(m *CloudAccount) error {
7474
// Production: use github.com/Azure/azure-sdk-for-go/sdk/azidentity ManagedIdentityCredential.
7575
type azureManagedIdentityResolver struct{}
7676

77-
func (r *azureManagedIdentityResolver) Provider() string { return "azure" }
77+
func (r *azureManagedIdentityResolver) Provider() string { return "azure" }
7878
func (r *azureManagedIdentityResolver) CredentialType() string { return "managed_identity" }
7979

8080
func (r *azureManagedIdentityResolver) Resolve(m *CloudAccount) error {
@@ -95,7 +95,7 @@ func (r *azureManagedIdentityResolver) Resolve(m *CloudAccount) error {
9595
// Production: use github.com/Azure/azure-sdk-for-go/sdk/azidentity AzureCLICredential.
9696
type azureCLIResolver struct{}
9797

98-
func (r *azureCLIResolver) Provider() string { return "azure" }
98+
func (r *azureCLIResolver) Provider() string { return "azure" }
9999
func (r *azureCLIResolver) CredentialType() string { return "cli" }
100100

101101
func (r *azureCLIResolver) Resolve(m *CloudAccount) error {

module/cloud_account_do.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func init() {
1818
// doStaticResolver resolves DigitalOcean credentials from static config fields.
1919
type doStaticResolver struct{}
2020

21-
func (r *doStaticResolver) Provider() string { return "digitalocean" }
21+
func (r *doStaticResolver) Provider() string { return "digitalocean" }
2222
func (r *doStaticResolver) CredentialType() string { return "static" }
2323

2424
func (r *doStaticResolver) Resolve(m *CloudAccount) error {
@@ -32,7 +32,7 @@ func (r *doStaticResolver) Resolve(m *CloudAccount) error {
3232
// doEnvResolver resolves DigitalOcean credentials from environment variables.
3333
type doEnvResolver struct{}
3434

35-
func (r *doEnvResolver) Provider() string { return "digitalocean" }
35+
func (r *doEnvResolver) Provider() string { return "digitalocean" }
3636
func (r *doEnvResolver) CredentialType() string { return "env" }
3737

3838
func (r *doEnvResolver) Resolve(m *CloudAccount) error {
@@ -46,7 +46,7 @@ func (r *doEnvResolver) Resolve(m *CloudAccount) error {
4646
// doAPITokenResolver resolves a DigitalOcean API token from explicit config.
4747
type doAPITokenResolver struct{}
4848

49-
func (r *doAPITokenResolver) Provider() string { return "digitalocean" }
49+
func (r *doAPITokenResolver) Provider() string { return "digitalocean" }
5050
func (r *doAPITokenResolver) CredentialType() string { return "api_token" }
5151

5252
func (r *doAPITokenResolver) Resolve(m *CloudAccount) error {

module/cloud_account_gcp.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func init() {
1717
// gcpStaticResolver resolves GCP credentials from static config fields.
1818
type gcpStaticResolver struct{}
1919

20-
func (r *gcpStaticResolver) Provider() string { return "gcp" }
20+
func (r *gcpStaticResolver) Provider() string { return "gcp" }
2121
func (r *gcpStaticResolver) CredentialType() string { return "static" }
2222

2323
func (r *gcpStaticResolver) Resolve(m *CloudAccount) error {
@@ -37,7 +37,7 @@ func (r *gcpStaticResolver) Resolve(m *CloudAccount) error {
3737
// gcpEnvResolver resolves GCP credentials from environment variables.
3838
type gcpEnvResolver struct{}
3939

40-
func (r *gcpEnvResolver) Provider() string { return "gcp" }
40+
func (r *gcpEnvResolver) Provider() string { return "gcp" }
4141
func (r *gcpEnvResolver) CredentialType() string { return "env" }
4242

4343
func (r *gcpEnvResolver) Resolve(m *CloudAccount) error {
@@ -59,7 +59,7 @@ func (r *gcpEnvResolver) Resolve(m *CloudAccount) error {
5959
// gcpServiceAccountJSONResolver reads a GCP service account JSON key file from the given path.
6060
type gcpServiceAccountJSONResolver struct{}
6161

62-
func (r *gcpServiceAccountJSONResolver) Provider() string { return "gcp" }
62+
func (r *gcpServiceAccountJSONResolver) Provider() string { return "gcp" }
6363
func (r *gcpServiceAccountJSONResolver) CredentialType() string { return "service_account_json" }
6464

6565
func (r *gcpServiceAccountJSONResolver) Resolve(m *CloudAccount) error {
@@ -82,7 +82,7 @@ func (r *gcpServiceAccountJSONResolver) Resolve(m *CloudAccount) error {
8282
// gcpServiceAccountKeyResolver uses an inline GCP service account JSON key.
8383
type gcpServiceAccountKeyResolver struct{}
8484

85-
func (r *gcpServiceAccountKeyResolver) Provider() string { return "gcp" }
85+
func (r *gcpServiceAccountKeyResolver) Provider() string { return "gcp" }
8686
func (r *gcpServiceAccountKeyResolver) CredentialType() string { return "service_account_key" }
8787

8888
func (r *gcpServiceAccountKeyResolver) Resolve(m *CloudAccount) error {
@@ -102,7 +102,7 @@ func (r *gcpServiceAccountKeyResolver) Resolve(m *CloudAccount) error {
102102
// Production: use golang.org/x/oauth2/google with google.FindDefaultCredentials.
103103
type gcpWorkloadIdentityResolver struct{}
104104

105-
func (r *gcpWorkloadIdentityResolver) Provider() string { return "gcp" }
105+
func (r *gcpWorkloadIdentityResolver) Provider() string { return "gcp" }
106106
func (r *gcpWorkloadIdentityResolver) CredentialType() string { return "workload_identity" }
107107

108108
func (r *gcpWorkloadIdentityResolver) Resolve(m *CloudAccount) error {
@@ -117,7 +117,7 @@ func (r *gcpWorkloadIdentityResolver) Resolve(m *CloudAccount) error {
117117
// Reads GOOGLE_APPLICATION_CREDENTIALS if set; otherwise records the ADC source.
118118
type gcpApplicationDefaultResolver struct{}
119119

120-
func (r *gcpApplicationDefaultResolver) Provider() string { return "gcp" }
120+
func (r *gcpApplicationDefaultResolver) Provider() string { return "gcp" }
121121
func (r *gcpApplicationDefaultResolver) CredentialType() string { return "application_default" }
122122

123123
func (r *gcpApplicationDefaultResolver) Resolve(m *CloudAccount) error {

module/cloud_account_k8s.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func init() {
1414
// k8sStaticResolver resolves Kubernetes credentials from static config fields.
1515
type k8sStaticResolver struct{}
1616

17-
func (r *k8sStaticResolver) Provider() string { return "kubernetes" }
17+
func (r *k8sStaticResolver) Provider() string { return "kubernetes" }
1818
func (r *k8sStaticResolver) CredentialType() string { return "static" }
1919

2020
func (r *k8sStaticResolver) Resolve(m *CloudAccount) error {
@@ -32,7 +32,7 @@ func (r *k8sStaticResolver) Resolve(m *CloudAccount) error {
3232
// k8sEnvResolver resolves Kubernetes credentials from the KUBECONFIG environment variable.
3333
type k8sEnvResolver struct{}
3434

35-
func (r *k8sEnvResolver) Provider() string { return "kubernetes" }
35+
func (r *k8sEnvResolver) Provider() string { return "kubernetes" }
3636
func (r *k8sEnvResolver) CredentialType() string { return "env" }
3737

3838
func (r *k8sEnvResolver) Resolve(m *CloudAccount) error {
@@ -52,7 +52,7 @@ func (r *k8sEnvResolver) Resolve(m *CloudAccount) error {
5252
// k8sKubeconfigResolver resolves Kubernetes credentials from a kubeconfig file or inline content.
5353
type k8sKubeconfigResolver struct{}
5454

55-
func (r *k8sKubeconfigResolver) Provider() string { return "kubernetes" }
55+
func (r *k8sKubeconfigResolver) Provider() string { return "kubernetes" }
5656
func (r *k8sKubeconfigResolver) CredentialType() string { return "kubeconfig" }
5757

5858
func (r *k8sKubeconfigResolver) Resolve(m *CloudAccount) error {

module/gitlab_client_module.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ import (
1313
//
1414
// Config:
1515
//
16-
// - name: gitlab-client
17-
// type: gitlab.client
18-
// config:
19-
// url: "https://gitlab.com" # or self-hosted URL; use "mock://" for testing
20-
// token: "${GITLAB_TOKEN}"
16+
// - name: gitlab-client
17+
// type: gitlab.client
18+
// config:
19+
// url: "https://gitlab.com" # or self-hosted URL; use "mock://" for testing
20+
// token: "${GITLAB_TOKEN}"
2121
type GitLabClientModule struct {
2222
name string
2323
config map[string]any

module/gitlab_webhook.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ type GitEvent struct {
3434
//
3535
// Config:
3636
//
37-
// - name: gitlab-hooks
38-
// type: gitlab.webhook
39-
// config:
40-
// secret: "${GITLAB_WEBHOOK_SECRET}"
41-
// path: /webhooks/gitlab # optional, default: /webhooks/gitlab
42-
// events: [push, merge_request, tag_push, pipeline]
37+
// - name: gitlab-hooks
38+
// type: gitlab.webhook
39+
// config:
40+
// secret: "${GITLAB_WEBHOOK_SECRET}"
41+
// path: /webhooks/gitlab # optional, default: /webhooks/gitlab
42+
// events: [push, merge_request, tag_push, pipeline]
4343
type GitLabWebhookModule struct {
4444
name string
4545
config map[string]any
@@ -255,10 +255,10 @@ func normalizeGitLabEventType(header string) string {
255255
// GitLabWebhookParseStep is a pipeline step that parses a GitLab webhook from
256256
// the HTTP request in the pipeline context.
257257
//
258-
// - name: parse-webhook
259-
// type: step.gitlab_parse_webhook
260-
// config:
261-
// secret: "${GITLAB_WEBHOOK_SECRET}" # optional; skips validation if empty
258+
// - name: parse-webhook
259+
// type: step.gitlab_parse_webhook
260+
// config:
261+
// secret: "${GITLAB_WEBHOOK_SECRET}" # optional; skips validation if empty
262262
type GitLabWebhookParseStep struct {
263263
name string
264264
secret string

module/jwt_auth.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ type User struct {
3030
// When an auth.user-store service is available, it delegates user CRUD to it;
3131
// otherwise it uses its own internal map for backward compatibility.
3232
type JWTAuthModule struct {
33-
name string
34-
secret string
35-
tokenExpiry time.Duration
36-
issuer string
37-
seedFile string
38-
responseFormat string // "standard" (default) or "v1" (access_token/refresh_token)
39-
users map[string]*User // keyed by email (used when no external userStore)
40-
mu sync.RWMutex
41-
nextID int
42-
app modular.Application
43-
logger modular.Logger
44-
persistence *PersistenceStore // optional write-through backend
45-
userStore *UserStore // optional external user store (from auth.user-store module)
46-
allowRegistration bool // when true, any visitor may self-register
33+
name string
34+
secret string
35+
tokenExpiry time.Duration
36+
issuer string
37+
seedFile string
38+
responseFormat string // "standard" (default) or "v1" (access_token/refresh_token)
39+
users map[string]*User // keyed by email (used when no external userStore)
40+
mu sync.RWMutex
41+
nextID int
42+
app modular.Application
43+
logger modular.Logger
44+
persistence *PersistenceStore // optional write-through backend
45+
userStore *UserStore // optional external user store (from auth.user-store module)
46+
allowRegistration bool // when true, any visitor may self-register
4747
}
4848

4949
// NewJWTAuthModule creates a new JWT auth module

0 commit comments

Comments
 (0)