Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,5 @@ build
**vm_disk_stdout**
**/.test/.gitconfig
Runbook Log.html
**/debug/**
**/debug/**
**.cb-temp/** */
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
apiVersion: runwhen.com/v1
kind: GenerationRules
spec:
generationRules:
- resourceTypes:
- statefulset
matchRules:
- type: and
matches:
- type: pattern
pattern: "seaweedfs"
properties: [label-values]
mode: substring
- type: pattern
pattern: "seaweedfs-"
properties: [label-values]
mode: substring
- type: pattern
pattern: "master"
properties: [label-values]
mode: substring
slxs:
- baseName: swfs-hlth
shortenedBaseName: swfs-hc
qualifiers: ["namespace", "cluster"]
baseTemplateName: k8s-seaweedfs-healthcheck
levelOfDetail: basic
outputItems:
- type: slx
- type: sli
- type: runbook
templateName: k8s-seaweedfs-healthcheck-taskset.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
apiVersion: runwhen.com/v1
kind: ServiceLevelIndicator
metadata:
name: {{slx_name}}
labels:
{% include "common-labels.yaml" %}
annotations:
{% include "common-annotations.yaml" %}
spec:
displayUnitsLong: OK
displayUnitsShort: ok
locations:
- {{default_location}}
description: Aggregates SeaweedFS workload readiness, master health, volume slot availability, and filer connectivity into a 0-1 score.
codeBundle:
{% if repo_url %}
repoUrl: {{repo_url}}
{% else %}
repoUrl: https://github.com/runwhen-contrib/rw-cli-codecollection.git
{% endif %}
{% if ref %}
ref: {{ref}}
{% else %}
ref: main
{% endif %}
pathToRobot: codebundles/k8s-seaweedfs-healthcheck/sli.robot
intervalStrategy: intermezzo
intervalSeconds: 300
configProvided:
- name: KUBERNETES_DISTRIBUTION_BINARY
value: "{{ custom.kubernetes_distribution_binary | default('kubectl') }}"
- name: CONTEXT
value: "{{ context }}"
- name: NAMESPACE
value: "{{ match_resource.resource.metadata.namespace }}"
- name: SEAWEEDFS_RELEASE_NAME
value: "{{ match_resource.resource.metadata.labels['app.kubernetes.io/instance'] | default(custom.seaweedfs_release_name | default('')) }}"
- name: SEAWEEDFS_CHART
value: "{{ match_resource.resource.metadata.labels['helm.sh/chart'] | default(custom.seaweedfs_chart | default('')) }}"
- name: MIN_FREE_VOLUME_SLOTS
value: "{{ custom.min_free_volume_slots | default('1') }}"
secretsProvided:
{% if wb_version %}
{% include "kubernetes-auth.yaml" ignore missing %}
{% else %}
- name: kubeconfig
workspaceKey: {{ custom.kubeconfig_secret_name | default("kubeconfig") }}
{% endif %}
alertConfig:
tasks:
persona: eager-edgar
sessionTTL: 10m
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
apiVersion: runwhen.com/v1
kind: ServiceLevelX
metadata:
name: {{slx_name}}
labels:
{% include "common-labels.yaml" %}
annotations:
{% include "common-annotations.yaml" %}
spec:
imageURL: https://storage.googleapis.com/runwhen-nonprod-shared-images/icons/seaweed-logo.png
alias: SeaweedFS Health in {{ match_resource.resource.metadata.namespace }}
asMeasuredBy: SeaweedFS master leadership, volume slot availability, filer connectivity, and optional S3 gateway probes.
configProvided:
- name: SEAWEEDFS_RELEASE_NAME
value: "{{ match_resource.resource.metadata.labels['app.kubernetes.io/instance'] | default('') }}"
- name: SEAWEEDFS_CHART
value: "{{ match_resource.resource.metadata.labels['helm.sh/chart'] | default('') }}"
owners:
- {{ workspace.owner_email }}
statement: SeaweedFS storage in namespace {{ match_resource.resource.metadata.namespace }} should have healthy masters, volume capacity, and working filer connectivity.
additionalContext:
{% include "kubernetes-hierarchy.yaml" ignore missing %}
qualified_name: "{{ match_resource.qualified_name }}"
tags:
{% include "kubernetes-tags.yaml" ignore missing %}
- name: access
value: read-only
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
apiVersion: runwhen.com/v1
kind: Runbook
metadata:
name: {{slx_name}}
labels:
{% include "common-labels.yaml" %}
annotations:
{% include "common-annotations.yaml" %}
spec:
location: {{default_location}}
description: Validates SeaweedFS master, volume, filer, and S3 gateway health in the target namespace.
codeBundle:
{% if repo_url %}
repoUrl: {{repo_url}}
{% else %}
repoUrl: https://github.com/runwhen-contrib/rw-cli-codecollection.git
{% endif %}
{% if ref %}
ref: {{ref}}
{% else %}
ref: main
{% endif %}
pathToRobot: codebundles/k8s-seaweedfs-healthcheck/runbook.robot
configProvided:
- name: KUBERNETES_DISTRIBUTION_BINARY
value: "{{ custom.kubernetes_distribution_binary | default('kubectl') }}"
- name: CONTEXT
value: "{{ context }}"
- name: NAMESPACE
value: "{{ match_resource.resource.metadata.namespace }}"
- name: SEAWEEDFS_RELEASE_NAME
value: "{{ match_resource.resource.metadata.labels['app.kubernetes.io/instance'] | default(custom.seaweedfs_release_name | default('')) }}"
- name: SEAWEEDFS_CHART
value: "{{ match_resource.resource.metadata.labels['helm.sh/chart'] | default(custom.seaweedfs_chart | default('')) }}"
- name: SEAWEEDFS_MASTER_SERVICE
value: "{{ custom.seaweedfs_master_service | default('') }}"
- name: SEAWEEDFS_FILER_SERVICE
value: "{{ custom.seaweedfs_filer_service | default('') }}"
- name: SEAWEEDFS_S3_ENDPOINT
value: "{{ custom.seaweedfs_s3_endpoint | default('') }}"
- name: MIN_FREE_VOLUME_SLOTS
value: "{{ custom.min_free_volume_slots | default('1') }}"
- name: MIN_FREE_DISK_PERCENT
value: "{{ custom.min_free_disk_percent | default('10') }}"
- name: S3_PROBE_BUCKET
value: "{{ custom.s3_probe_bucket | default('') }}"
- name: CAPACITY_WARN_PERCENT
value: "{{ custom.capacity_warn_percent | default('80') }}"
- name: MIN_PROJECTION_HOURS
value: "{{ custom.min_projection_hours | default('24') }}"
- name: MAX_PICK_FOR_WRITE_ERRORS
value: "{{ custom.max_pick_for_write_errors | default('100') }}"
- name: MAX_VOLUME_DISK_ERRORS
value: "{{ custom.max_volume_disk_errors | default('50') }}"
secretsProvided:
{% if wb_version %}
{% include "kubernetes-auth.yaml" ignore missing %}
{% else %}
- name: kubeconfig
workspaceKey: {{ custom.kubeconfig_secret_name | default("kubeconfig") }}
- name: seaweedfs_s3_credentials
workspaceKey: {{ custom.seaweedfs_s3_credentials_secret_name | default("seaweedfs_s3_credentials") }}
{% endif %}
8 changes: 8 additions & 0 deletions codebundles/k8s-seaweedfs-healthcheck/.test/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
output/
workspaceInfo.yaml
kubeconfig.secret
.azure-devops/
.kube/
terraform/.terraform/
terraform/terraform.tfstate*
terraform/*.tfvars.secret
65 changes: 65 additions & 0 deletions codebundles/k8s-seaweedfs-healthcheck/.test/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# SeaweedFS Healthcheck — `.test` discovery

Two modes:

| Task | Use when |
|---|---|
| `task` / `task discover-live` | SeaweedFS already exists on a shared cluster (e.g. `runwhen-env-test`) |
| `task discover-ci` | Spin up isolated SeaweedFS via Terraform (Kind / CI) |
| `task validate-generation-rules` | Schema-check generation rules only |

## Live cluster discovery (recommended here)

RunWhen Local reads your kubeconfig, scans **one namespace** for SeaweedFS master StatefulSets, and writes SLX/SLI/runbook YAML under `output/`.

```bash
cd codecollection/codebundles/k8s-seaweedfs-healthcheck/.test

export RW_FROM_FILE='{"kubeconfig":"/home/runwhen/auth/shared-kubeconfig"}'
export TEST_NAMESPACE='runwhen-env-test' # namespace with SeaweedFS master STS
export RW_WORKSPACE='seaweedfs-dev' # output folder name

task discover-live
# or simply: task
```

Review generated SLXs:

```bash
ls output/workspaces/seaweedfs-dev/slxs/
```

### Environment variables

| Variable | Default | Purpose |
|---|---|---|
| `RW_FROM_FILE` | — | JSON with `kubeconfig` path (same as `ro` dev mode) |
| `KUBECONFIG` | — | Alternative kubeconfig path |
| `KUBECONFIG_PATH` | `/home/runwhen/auth/shared-kubeconfig` | Fallback path |
| `TEST_NAMESPACE` | `runwhen-env-test` | Namespace scoped to `detailed` LOD |
| `RW_WORKSPACE` | `seaweedfs-dev` | Workspace name in output tree |

You can also drop a file named `kubeconfig.secret` in this directory and skip `prepare-kubeconfig`.

### Important: discovery uses the remote git branch

RunWhen Local **clones your codecollection repo from GitHub**, not the local working tree. Generation-rule or template changes only appear in discovery after you **commit and push** the branch referenced in `workspaceInfo.yaml`.

For quick script/robot iteration without discovery, use `ro` in the bundle root instead.

## Terraform test infra (CI / isolated cluster)

```bash
cd .test
# edit terraform/terraform.tfvars for your kube context
task build-infra
task discover-ci
task clean # destroys Terraform release + discovery output
```

## Cleanup

```bash
task clean-rwl-discovery # output/, workspaceInfo.yaml, kubeconfig.secret only
task clean # also runs terraform destroy when state exists
```
Loading
Loading