Compare commits

..

29 Commits

Author SHA1 Message Date
dependabot[bot] a3f6886cb3
chore(deps): Bump actions/setup-python from 5.4.0 to 5.6.0 (#122)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.4.0 to 5.6.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.4.0...v5.6.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 5.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 15:39:41 -04:00
dependabot[bot] 599aec9cbc
chore(deps): Bump tokio from 1.36.0 to 1.42.1 (#121)
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.36.0 to 1.42.1.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.36.0...tokio-1.42.1)

---
updated-dependencies:
- dependency-name: tokio
  dependency-version: 1.42.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 15:39:28 -04:00
dependabot[bot] 4b8134a5f8
chore(deps): Bump schemars from 0.8.21 to 0.8.22 (#118)
Bumps [schemars](https://github.com/GREsau/schemars) from 0.8.21 to 0.8.22.
- [Release notes](https://github.com/GREsau/schemars/releases)
- [Changelog](https://github.com/GREsau/schemars/blob/master/CHANGELOG.md)
- [Commits](https://github.com/GREsau/schemars/compare/v0.8.21...v0.8.22)

---
updated-dependencies:
- dependency-name: schemars
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 15:39:05 -04:00
dependabot[bot] 9c3208ee3a
chore(deps): Bump uuid from 1.5.0 to 1.12.1 (#114)
Bumps [uuid](https://github.com/uuid-rs/uuid) from 1.5.0 to 1.12.1.
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](https://github.com/uuid-rs/uuid/compare/1.5.0...1.12.1)

---
updated-dependencies:
- dependency-name: uuid
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 15:38:44 -04:00
Joonas Bergius c6d4e59028
chore: Add Security Policy with link to the main repository (#106)
Signed-off-by: Joonas Bergius <joonas@bergi.us>
2025-06-03 15:38:26 -04:00
dependabot[bot] cb051aac61
chore(deps): Bump serde_yaml from 0.9.25 to 0.9.29 (#83)
Bumps [serde_yaml](https://github.com/dtolnay/serde-yaml) from 0.9.25 to 0.9.29.
- [Release notes](https://github.com/dtolnay/serde-yaml/releases)
- [Commits](https://github.com/dtolnay/serde-yaml/compare/0.9.25...0.9.29)

---
updated-dependencies:
- dependency-name: serde_yaml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 15:37:27 -04:00
dependabot[bot] 52007e2927
chore(deps): Bump handlebars from 5.1.0 to 5.1.2 (#77)
Bumps [handlebars](https://github.com/sunng87/handlebars-rust) from 5.1.0 to 5.1.2.
- [Release notes](https://github.com/sunng87/handlebars-rust/releases)
- [Changelog](https://github.com/sunng87/handlebars-rust/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sunng87/handlebars-rust/compare/v5.1.0...v5.1.2)

---
updated-dependencies:
- dependency-name: handlebars
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 15:37:10 -04:00
Nicolas Lamirault bc2d7bbea2
feat(helm): Kubernetes labels (#119)
Signed-off-by: Nicolas Lamirault <nicolas.lamirault@gmail.com>
2025-03-03 09:48:22 -05:00
Eric Gregory d4758e98f1 fix(examples): change http provider address for hello world app
Signed-off-by: Eric Gregory <egregory04@gmail.com>
2025-02-14 09:15:40 -05:00
dependabot[bot] 9cf6542828
chore(deps): Bump helm/kind-action from 1.10.0 to 1.12.0 (#109)
Bumps [helm/kind-action](https://github.com/helm/kind-action) from 1.10.0 to 1.12.0.
- [Release notes](https://github.com/helm/kind-action/releases)
- [Commits](https://github.com/helm/kind-action/compare/v1.10.0...v1.12.0)

---
updated-dependencies:
- dependency-name: helm/kind-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-14 08:14:56 -06:00
dependabot[bot] 8d495ec202
chore(deps): Bump helm/chart-testing-action from 2.6.1 to 2.7.0 (#115)
Bumps [helm/chart-testing-action](https://github.com/helm/chart-testing-action) from 2.6.1 to 2.7.0.
- [Release notes](https://github.com/helm/chart-testing-action/releases)
- [Commits](https://github.com/helm/chart-testing-action/compare/v2.6.1...v2.7.0)

---
updated-dependencies:
- dependency-name: helm/chart-testing-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-14 08:14:24 -06:00
dependabot[bot] b7e4bf3761
chore(deps): Bump actions/setup-python from 5.3.0 to 5.4.0 (#116)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.3.0 to 5.4.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.3.0...v5.4.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-14 08:13:19 -06:00
Taylor Thomas f9daa35480
chore(yaml): Update version in the kustomize yaml (#112)
We were pinned to an old version so when I deployed as directed in the
README it deployed an old version without the new features I needed

Signed-off-by: Taylor Thomas <taylor@cosmonic.com>
2025-01-10 16:00:50 -06:00
Joonas Bergius d74ad8bff7
feat: Support customizing the container templates for wasmcloud and nats (#110)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2025-01-09 13:01:37 -06:00
Joonas Bergius 4ccfb20b30
chore(wasmcloud-operator-types): Add cargo machete ignore for serde_json with NOTE (#104)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-11-18 12:38:28 -06:00
dependabot[bot] 59552d2277
chore(deps): Bump actions/setup-python from 5.1.1 to 5.3.0 (#102)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.1.1 to 5.3.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.1.1...v5.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-25 09:36:21 -05:00
Joonas Bergius 1b129d69c9
chore: List maintainer affiliations (#99)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-10-12 19:02:47 -05:00
Joonas Bergius fff57db4fb chore: Add CODEOWNERS file
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-10-12 16:05:58 -04:00
Brooks Townsend 1c85b3937c chore: add MAINTAINERS.md
Signed-off-by: Brooks Townsend <brooksmtownsend@gmail.com>
2024-10-12 14:45:36 -04:00
Joonas Bergius 309b492dcd
feat: Add rudimentary version flag (#95)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-09-23 19:29:15 -05:00
Joonas Bergius 0aaa277422
feat: Add wolfi-based image (#94)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-09-23 14:40:13 -05:00
Lucas Fontes 6f63289a11
feat: Configure max component memory (#91)
* feat: Configure max component memory

Signed-off-by: Lucas Fontes <lucas@cosmonic.com>

* chore: Bumping versions

Signed-off-by: Lucas Fontes <lucas@cosmonic.com>

---------

Signed-off-by: Lucas Fontes <lucas@cosmonic.com>
2024-08-20 14:33:52 -05:00
Bailey Hayes 788cbc089d
fix(examples): add daemonscaler to httpserver (#87)
This will allow the k8s operator to automatically
create services. This shouldn't be required in
the future when the operator supports the spreadscaler
for httpserver providers as well.

Signed-off-by: Bailey Hayes <behayes2@gmail.com>
2024-08-12 12:31:42 -05:00
Joonas Bergius 4ab407dc15
chore: Bump wasmcloud-operator chart appVersion (#85)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-08-01 12:52:00 -05:00
Joonas Bergius d90e46055e
feat: Add support for configuring wasmCloud Secrets (#82)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-08-01 12:13:10 -05:00
Joonas Bergius 5988e643e7
chore: Address Clippy lints and nested-ifs (#76)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-07-26 10:39:25 -05:00
Joonas Bergius 69dac08133
fix: Upgrade opentelemetry to 0.21 (#80)
Signed-off-by: Joonas Bergius <joonas@cosmonic.com>
2024-07-26 10:39:11 -05:00
Dan Norris 2906b3f56e
Merge pull request #63 from wasmCloud/dependabot/cargo/serde-1.0.193
chore(deps): Bump serde from 1.0.189 to 1.0.193
2024-07-26 14:28:51 +00:00
dependabot[bot] 0c024e7718
chore(deps): Bump serde from 1.0.189 to 1.0.193
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.189 to 1.0.193.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.189...v1.0.193)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-18 14:32:10 +00:00
20 changed files with 1138 additions and 716 deletions

2
.github/CODEOWNERS vendored Normal file
View File

@ -0,0 +1,2 @@
# wasmCloud operator maintainers
* @wasmCloud/operator-maintainers

View File

@ -86,6 +86,15 @@ jobs:
type=sha,prefix= type=sha,prefix=
type=semver,pattern={{version}} type=semver,pattern={{version}}
- name: Extract metadata (tags, labels) for Docker
id: meta_wolfi
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=sha,prefix=,suffix=-wolfi
type=semver,pattern={{version}},suffix=-wolfi
- name: Load artifacts - name: Load artifacts
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
@ -106,3 +115,14 @@ jobs:
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
build-args: "BIN_PATH=artifacts/wasmcloud-operator" build-args: "BIN_PATH=artifacts/wasmcloud-operator"
- name: Build and push Docker image (wolfi)
uses: docker/build-push-action@v6
with:
push: true
context: .
file: './Dockerfile.wolfi'
tags: ${{ steps.meta_wolfi.outputs.tags }}
labels: ${{ steps.meta_wolfi.outputs.labels }}
platforms: linux/amd64,linux/arm64
build-args: "BIN_PATH=artifacts/wasmcloud-operator"

View File

@ -32,12 +32,12 @@ jobs:
# Used by helm chart-testing below # Used by helm chart-testing below
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v5.1.1 uses: actions/setup-python@v5.6.0
with: with:
python-version: '3.12.2' python-version: '3.12.2'
- name: Set up chart-testing - name: Set up chart-testing
uses: helm/chart-testing-action@v2.6.1 uses: helm/chart-testing-action@v2.7.0
with: with:
version: v3.10.1 version: v3.10.1
yamllint_version: 1.35.1 yamllint_version: 1.35.1
@ -48,7 +48,7 @@ jobs:
ct lint --config charts/wasmcloud-operator/ct.yaml ct lint --config charts/wasmcloud-operator/ct.yaml
- name: Create kind cluster - name: Create kind cluster
uses: helm/kind-action@v1.10.0 uses: helm/kind-action@v1.12.0
with: with:
version: "v0.22.0" version: "v0.22.0"

414
Cargo.lock generated
View File

@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 4
[[package]] [[package]]
name = "addr2line" name = "addr2line"
@ -17,6 +17,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aead"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"
dependencies = [
"crypto-common",
"generic-array",
]
[[package]] [[package]]
name = "ahash" name = "ahash"
version = "0.7.8" version = "0.7.8"
@ -142,7 +152,7 @@ dependencies = [
"futures", "futures",
"http", "http",
"memchr", "memchr",
"nkeys", "nkeys 0.3.2",
"nuid 0.5.0", "nuid 0.5.0",
"once_cell", "once_cell",
"rand", "rand",
@ -401,6 +411,17 @@ dependencies = [
"windows-targets 0.52.0", "windows-targets 0.52.0",
] ]
[[package]]
name = "cipher"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
dependencies = [
"crypto-common",
"inout",
"zeroize",
]
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.4.6" version = "4.4.6"
@ -546,9 +567,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [ dependencies = [
"generic-array", "generic-array",
"rand_core",
"typenum", "typenum",
] ]
[[package]]
name = "crypto_box"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009"
dependencies = [
"aead",
"crypto_secretbox",
"curve25519-dalek",
"salsa20",
"subtle",
"zeroize",
]
[[package]]
name = "crypto_secretbox"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1"
dependencies = [
"aead",
"cipher",
"generic-array",
"poly1305",
"salsa20",
"subtle",
"zeroize",
]
[[package]] [[package]]
name = "ctrlc" name = "ctrlc"
version = "3.4.1" version = "3.4.1"
@ -573,6 +624,7 @@ dependencies = [
"platforms", "platforms",
"rustc_version", "rustc_version",
"subtle", "subtle",
"zeroize",
] ]
[[package]] [[package]]
@ -873,6 +925,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [ dependencies = [
"typenum", "typenum",
"version_check", "version_check",
"zeroize",
] ]
[[package]] [[package]]
@ -894,6 +947,12 @@ version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
[[package]]
name = "glob"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.3.26" version = "0.3.26"
@ -915,9 +974,9 @@ dependencies = [
[[package]] [[package]]
name = "handlebars" name = "handlebars"
version = "5.1.0" version = "5.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab283476b99e66691dee3f1640fea91487a8d81f50fb5ecc75538f8f8879a1e4" checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b"
dependencies = [ dependencies = [
"log", "log",
"pest", "pest",
@ -978,9 +1037,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.3.3" version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]] [[package]]
name = "hex" name = "hex"
@ -1190,6 +1249,15 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "inout"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
dependencies = [
"generic-array",
]
[[package]] [[package]]
name = "instant" name = "instant"
version = "0.1.12" version = "0.1.12"
@ -1512,13 +1580,14 @@ dependencies = [
[[package]] [[package]]
name = "mio" name = "mio"
version = "0.8.11" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
dependencies = [ dependencies = [
"hermit-abi",
"libc", "libc",
"wasi", "wasi",
"windows-sys 0.48.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -1548,6 +1617,22 @@ dependencies = [
"signatory", "signatory",
] ]
[[package]]
name = "nkeys"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2de02c883c178998da8d0c9816a88ef7ef5c58314dd1585c97a4a5679f3ab337"
dependencies = [
"crypto_box",
"data-encoding",
"ed25519",
"ed25519-dalek",
"getrandom",
"log",
"rand",
"signatory",
]
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "7.1.3"
@ -1627,6 +1712,12 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "num-conv"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.45" version = "0.1.45"
@ -1669,16 +1760,6 @@ dependencies = [
"autocfg", "autocfg",
] ]
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
]
[[package]] [[package]]
name = "object" name = "object"
version = "0.32.1" version = "0.32.1"
@ -1730,22 +1811,18 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "opaque-debug"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]] [[package]]
name = "openssl-probe" name = "openssl-probe"
version = "0.1.5" version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "opentelemetry"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54"
dependencies = [
"opentelemetry_api",
"opentelemetry_sdk 0.20.0",
]
[[package]] [[package]]
name = "opentelemetry" name = "opentelemetry"
version = "0.21.0" version = "0.21.0"
@ -1764,17 +1841,17 @@ dependencies = [
[[package]] [[package]]
name = "opentelemetry-otlp" name = "opentelemetry-otlp"
version = "0.13.0" version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" checksum = "f24cda83b20ed2433c68241f918d0f6fdec8b1d43b7a9590ab4420c5095ca930"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures-core", "futures-core",
"http", "http",
"opentelemetry",
"opentelemetry-proto", "opentelemetry-proto",
"opentelemetry-semantic-conventions", "opentelemetry-semantic-conventions",
"opentelemetry_api", "opentelemetry_sdk",
"opentelemetry_sdk 0.20.0",
"prost", "prost",
"thiserror", "thiserror",
"tokio", "tokio",
@ -1783,62 +1860,23 @@ dependencies = [
[[package]] [[package]]
name = "opentelemetry-proto" name = "opentelemetry-proto"
version = "0.3.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb" checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1"
dependencies = [ dependencies = [
"opentelemetry_api", "opentelemetry",
"opentelemetry_sdk 0.20.0", "opentelemetry_sdk",
"prost", "prost",
"tonic", "tonic",
] ]
[[package]] [[package]]
name = "opentelemetry-semantic-conventions" name = "opentelemetry-semantic-conventions"
version = "0.12.0" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269" checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84"
dependencies = [ dependencies = [
"opentelemetry 0.20.0", "opentelemetry",
]
[[package]]
name = "opentelemetry_api"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b"
dependencies = [
"futures-channel",
"futures-util",
"indexmap 1.9.3",
"js-sys",
"once_cell",
"pin-project-lite",
"thiserror",
"urlencoding",
]
[[package]]
name = "opentelemetry_sdk"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026"
dependencies = [
"async-trait",
"crossbeam-channel",
"futures-channel",
"futures-executor",
"futures-util",
"once_cell",
"opentelemetry_api",
"ordered-float 3.9.2",
"percent-encoding",
"rand",
"regex",
"serde_json",
"thiserror",
"tokio",
"tokio-stream",
] ]
[[package]] [[package]]
@ -1852,8 +1890,9 @@ dependencies = [
"futures-channel", "futures-channel",
"futures-executor", "futures-executor",
"futures-util", "futures-util",
"glob",
"once_cell", "once_cell",
"opentelemetry 0.21.0", "opentelemetry",
"ordered-float 4.2.0", "ordered-float 4.2.0",
"percent-encoding", "percent-encoding",
"rand", "rand",
@ -1872,15 +1911,6 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "ordered-float"
version = "3.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc"
dependencies = [
"num-traits",
]
[[package]] [[package]]
name = "ordered-float" name = "ordered-float"
version = "4.2.0" version = "4.2.0"
@ -2043,6 +2073,17 @@ version = "3.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8" checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8"
[[package]]
name = "poly1305"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf"
dependencies = [
"cpufeatures",
"opaque-debug",
"universal-hash",
]
[[package]] [[package]]
name = "powerfmt" name = "powerfmt"
version = "0.2.0" version = "0.2.0"
@ -2398,6 +2439,15 @@ version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
[[package]]
name = "salsa20"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"
dependencies = [
"cipher",
]
[[package]] [[package]]
name = "schannel" name = "schannel"
version = "0.1.22" version = "0.1.22"
@ -2409,9 +2459,9 @@ dependencies = [
[[package]] [[package]]
name = "schemars" name = "schemars"
version = "0.8.15" version = "0.8.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
dependencies = [ dependencies = [
"dyn-clone", "dyn-clone",
"schemars_derive", "schemars_derive",
@ -2421,14 +2471,14 @@ dependencies = [
[[package]] [[package]]
name = "schemars_derive" name = "schemars_derive"
version = "0.8.15" version = "0.8.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"serde_derive_internals", "serde_derive_internals",
"syn 1.0.109", "syn 2.0.38",
] ]
[[package]] [[package]]
@ -2491,9 +2541,9 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.189" version = "1.0.193"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -2519,9 +2569,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.189" version = "1.0.193"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2530,13 +2580,13 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive_internals" name = "serde_derive_internals"
version = "0.26.0" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "syn 2.0.38",
] ]
[[package]] [[package]]
@ -2594,9 +2644,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_yaml" name = "serde_yaml"
version = "0.9.25" version = "0.9.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" checksum = "a15e0ef66bf939a7c890a0bf6d5a733c70202225f9888a89ed5c62298b019129"
dependencies = [ dependencies = [
"indexmap 2.0.2", "indexmap 2.0.2",
"itoa", "itoa",
@ -2843,12 +2893,13 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.30" version = "0.3.36"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
dependencies = [ dependencies = [
"deranged", "deranged",
"itoa", "itoa",
"num-conv",
"powerfmt", "powerfmt",
"serde", "serde",
"time-core", "time-core",
@ -2863,10 +2914,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]] [[package]]
name = "time-macros" name = "time-macros"
version = "0.2.15" version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
dependencies = [ dependencies = [
"num-conv",
"time-core", "time-core",
] ]
@ -2887,21 +2939,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.36.0" version = "1.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" checksum = "2209a14885b74764cce87ffa777ffa1b8ce81a3f3166c6f886b83337fe7e077f"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",
"libc", "libc",
"mio", "mio",
"num_cpus",
"parking_lot", "parking_lot",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry", "signal-hook-registry",
"socket2 0.5.6", "socket2 0.5.6",
"tokio-macros", "tokio-macros",
"windows-sys 0.48.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -2916,9 +2967,9 @@ dependencies = [
[[package]] [[package]]
name = "tokio-macros" name = "tokio-macros"
version = "2.2.0" version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -3122,17 +3173,14 @@ dependencies = [
] ]
[[package]] [[package]]
name = "tracing-opentelemetry" name = "tracing-log"
version = "0.20.0" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc09e402904a5261e42cf27aea09ccb7d5318c6717a9eec3d8e2e65c56b18f19" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [ dependencies = [
"log",
"once_cell", "once_cell",
"opentelemetry 0.20.0",
"tracing",
"tracing-core", "tracing-core",
"tracing-log",
"tracing-subscriber",
] ]
[[package]] [[package]]
@ -3143,10 +3191,12 @@ checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"once_cell", "once_cell",
"opentelemetry 0.21.0", "opentelemetry",
"opentelemetry_sdk 0.21.2", "opentelemetry_sdk",
"smallvec",
"tracing", "tracing",
"tracing-core", "tracing-core",
"tracing-log 0.2.0",
"tracing-subscriber", "tracing-subscriber",
"web-time", "web-time",
] ]
@ -3178,7 +3228,7 @@ dependencies = [
"thread_local", "thread_local",
"tracing", "tracing",
"tracing-core", "tracing-core",
"tracing-log", "tracing-log 0.1.3",
"tracing-serde", "tracing-serde",
] ]
@ -3252,6 +3302,16 @@ version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "universal-hash"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
dependencies = [
"crypto-common",
"subtle",
]
[[package]] [[package]]
name = "unsafe-libyaml" name = "unsafe-libyaml"
version = "0.2.11" version = "0.2.11"
@ -3321,9 +3381,9 @@ dependencies = [
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.5.0" version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b"
dependencies = [ dependencies = [
"getrandom", "getrandom",
"serde", "serde",
@ -3344,9 +3404,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]] [[package]]
name = "wadm" name = "wadm"
version = "0.12.2" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d20c671aabb8fee1d7a688a81be4ebe14cbc4ae3a01db5dd62202ad39538fa5" checksum = "40216dc6034c5e71bf773cea191e13581def996d21acf99fcc9347cc254b0490"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-nats", "async-nats",
@ -3359,7 +3419,7 @@ dependencies = [
"indexmap 2.0.2", "indexmap 2.0.2",
"jsonschema", "jsonschema",
"lazy_static", "lazy_static",
"nkeys", "nkeys 0.3.2",
"rand", "rand",
"regex", "regex",
"semver", "semver",
@ -3375,19 +3435,20 @@ dependencies = [
"uuid", "uuid",
"wadm-types", "wadm-types",
"wasmcloud-control-interface", "wasmcloud-control-interface",
"wasmcloud-secrets-types",
] ]
[[package]] [[package]]
name = "wadm-client" name = "wadm-client"
version = "0.1.2" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "422db00d06cf461d6410396dd5a2653bcf21bccb883659f39173756b91f3f477" checksum = "4aaf51fde61578275a9d7f19b7732219162c279dc76f02e2779a5e11beb33240"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-nats", "async-nats",
"bytes", "bytes",
"nkeys", "futures",
"once_cell", "nkeys 0.3.2",
"serde", "serde",
"serde_json", "serde_json",
"serde_yaml", "serde_yaml",
@ -3400,9 +3461,9 @@ dependencies = [
[[package]] [[package]]
name = "wadm-types" name = "wadm-types"
version = "0.1.0" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af535df65c0387b6a8ef521aca58a239af817f03ebf676f91e982b9b919bc513" checksum = "00e7f30261740ec9da4d038cf719032d4bc00437b3e0252e258d0308d44fb576"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-nats", "async-nats",
@ -3411,13 +3472,13 @@ dependencies = [
"bytes", "bytes",
"chrono", "chrono",
"cloudevents-sdk", "cloudevents-sdk",
"futures",
"indexmap 2.0.2", "indexmap 2.0.2",
"jsonschema", "jsonschema",
"lazy_static", "lazy_static",
"nkeys", "nkeys 0.3.2",
"rand", "rand",
"regex", "regex",
"schemars",
"semver", "semver",
"serde", "serde",
"serde_json", "serde_json",
@ -3428,8 +3489,10 @@ dependencies = [
"tracing", "tracing",
"tracing-futures", "tracing-futures",
"ulid", "ulid",
"utoipa",
"uuid", "uuid",
"wasmcloud-control-interface", "wasmcloud-control-interface",
"wasmcloud-secrets-types",
] ]
[[package]] [[package]]
@ -3450,14 +3513,32 @@ dependencies = [
"data-encoding", "data-encoding",
"humantime", "humantime",
"log", "log",
"nkeys", "nkeys 0.3.2",
"nuid 0.4.1", "nuid 0.4.1",
"ring 0.17.5", "ring 0.17.5",
"serde", "serde",
"serde_json", "serde_json",
"wasm-encoder", "wasm-encoder 0.41.2",
"wasm-gen", "wasm-gen",
"wasmparser", "wasmparser 0.121.2",
]
[[package]]
name = "wascap"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d394c2c59661bff13bea8bd7c8bf30618bafa671ef9f408ae9c3aa71ede5bb0"
dependencies = [
"data-encoding",
"humantime",
"nkeys 0.4.3",
"nuid 0.4.1",
"ring 0.17.5",
"serde",
"serde_json",
"wasm-encoder 0.208.1",
"wasm-gen",
"wasmparser 0.202.0",
] ]
[[package]] [[package]]
@ -3541,6 +3622,15 @@ dependencies = [
"leb128", "leb128",
] ]
[[package]]
name = "wasm-encoder"
version = "0.208.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6425e84e42f7f558478e40ecc2287912cb319f2ca68e5c0bb93c61d4fc63fa17"
dependencies = [
"leb128",
]
[[package]] [[package]]
name = "wasm-gen" name = "wasm-gen"
version = "0.1.4" version = "0.1.4"
@ -3577,13 +3667,13 @@ dependencies = [
"cloudevents-sdk", "cloudevents-sdk",
"futures", "futures",
"oci-distribution", "oci-distribution",
"opentelemetry 0.21.0", "opentelemetry",
"opentelemetry_sdk 0.21.2", "opentelemetry_sdk",
"serde", "serde",
"serde_json", "serde_json",
"tokio", "tokio",
"tracing", "tracing",
"tracing-opentelemetry 0.22.0", "tracing-opentelemetry",
"wasmcloud-core", "wasmcloud-core",
] ]
@ -3599,7 +3689,7 @@ dependencies = [
"bytes", "bytes",
"futures", "futures",
"hex", "hex",
"nkeys", "nkeys 0.3.2",
"once_cell", "once_cell",
"rustls 0.23.4", "rustls 0.23.4",
"serde", "serde",
@ -3610,14 +3700,14 @@ dependencies = [
"tracing", "tracing",
"ulid", "ulid",
"uuid", "uuid",
"wascap", "wascap 0.13.0",
"wrpc-transport", "wrpc-transport",
"wrpc-transport-nats", "wrpc-transport-nats",
] ]
[[package]] [[package]]
name = "wasmcloud-operator" name = "wasmcloud-operator"
version = "0.3.1" version = "0.5.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-nats", "async-nats",
@ -3631,8 +3721,9 @@ dependencies = [
"json-patch", "json-patch",
"k8s-openapi", "k8s-openapi",
"kube", "kube",
"opentelemetry 0.20.0", "opentelemetry",
"opentelemetry-otlp", "opentelemetry-otlp",
"opentelemetry_sdk",
"rcgen", "rcgen",
"schemars", "schemars",
"secrecy", "secrecy",
@ -3644,7 +3735,7 @@ dependencies = [
"tokio", "tokio",
"tokio-util", "tokio-util",
"tracing", "tracing",
"tracing-opentelemetry 0.20.0", "tracing-opentelemetry",
"tracing-subscriber", "tracing-subscriber",
"utoipa", "utoipa",
"uuid", "uuid",
@ -3656,7 +3747,7 @@ dependencies = [
[[package]] [[package]]
name = "wasmcloud-operator-types" name = "wasmcloud-operator-types"
version = "0.1.6" version = "0.1.9"
dependencies = [ dependencies = [
"k8s-openapi", "k8s-openapi",
"kube", "kube",
@ -3665,6 +3756,22 @@ dependencies = [
"serde_json", "serde_json",
] ]
[[package]]
name = "wasmcloud-secrets-types"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e141cc3ac1fd9b71ec0813796e0a40767afea090d6395fa2b82abca9c882426"
dependencies = [
"anyhow",
"async-trait",
"bytes",
"nkeys 0.4.3",
"serde",
"serde_json",
"thiserror",
"wascap 0.15.0",
]
[[package]] [[package]]
name = "wasmparser" name = "wasmparser"
version = "0.121.2" version = "0.121.2"
@ -3676,6 +3783,17 @@ dependencies = [
"semver", "semver",
] ]
[[package]]
name = "wasmparser"
version = "0.202.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6998515d3cf3f8b980ef7c11b29a9b1017d4cf86b99ae93b546992df9931413"
dependencies = [
"bitflags 2.4.1",
"indexmap 2.0.2",
"semver",
]
[[package]] [[package]]
name = "web-sys" name = "web-sys"
version = "0.3.64" version = "0.3.64"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "wasmcloud-operator" name = "wasmcloud-operator"
version = "0.3.1" version = "0.5.0"
edition = "2021" edition = "2021"
[[bin]] [[bin]]
@ -34,6 +34,7 @@ json-patch = { workspace = true }
k8s-openapi = { workspace = true, features = ["v1_28", "schemars"] } k8s-openapi = { workspace = true, features = ["v1_28", "schemars"] }
kube = { workspace = true, features = ["runtime", "derive", "default"] } kube = { workspace = true, features = ["runtime", "derive", "default"] }
opentelemetry = { workspace = true } opentelemetry = { workspace = true }
opentelemetry_sdk = { workspace = true }
opentelemetry-otlp = { workspace = true } opentelemetry-otlp = { workspace = true }
rcgen = { workspace = true } rcgen = { workspace = true }
schemars = { workspace = true } schemars = { workspace = true }
@ -71,12 +72,13 @@ handlebars = "5.1"
json-patch = "1.4.0" json-patch = "1.4.0"
k8s-openapi = { version = "0.20", default-features = false } k8s-openapi = { version = "0.20", default-features = false }
kube = { version = "0.87", default-features = false } kube = { version = "0.87", default-features = false }
opentelemetry = { version = "0.20", features = [ opentelemetry = { version = "0.21", default-features = false }
opentelemetry_sdk = { version = "0.21", features = [
"metrics", "metrics",
"trace", "trace",
"rt-tokio", "rt-tokio",
] } ] }
opentelemetry-otlp = { version = "0.13", features = ["tokio"] } opentelemetry-otlp = { version = "0.14", features = ["tokio"] }
rcgen = "0.11" rcgen = "0.11"
schemars = "0.8" schemars = "0.8"
secrecy = "0.8" secrecy = "0.8"
@ -88,13 +90,13 @@ time = "0.3"
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
tokio-util = { version = "0.7", features = ["rt"] } tokio-util = { version = "0.7", features = ["rt"] }
tracing = "0.1" tracing = "0.1"
tracing-opentelemetry = "0.20" tracing-opentelemetry = "0.22"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
utoipa = { version = "4.1", features = ["axum_extras"] } utoipa = { version = "4.1", features = ["axum_extras"] }
uuid = { version = "1", features = ["v5"] } uuid = { version = "1", features = ["v5"] }
wadm = "0.12.2" wadm = "0.13.0"
wadm-client = "0.1.2" wadm-client = "0.2.0"
wadm-types = "0.1.0" wadm-types = "0.2.0"
wasmcloud-operator-types = { version = "*", path = "./crates/types" } wasmcloud-operator-types = { version = "*", path = "./crates/types" }
[workspace] [workspace]

7
Dockerfile.wolfi Normal file
View File

@ -0,0 +1,7 @@
# syntax=docker/dockerfile:1
FROM chainguard/wolfi-base:latest
ARG BIN_PATH
ARG TARGETARCH
COPY ${BIN_PATH}-${TARGETARCH} /usr/local/bin/wasmcloud-operator
ENTRYPOINT ["/usr/local/bin/wasmcloud-operator"]

22
MAINTAINERS.md Normal file
View File

@ -0,0 +1,22 @@
# MAINTAINERS
The following individuals are responsible for reviewing code, managing issues, and ensuring the overall quality of `wasmcloud-operator`.
## @wasmCloud/operator-maintainers
Name: Joonas Bergius
GitHub: @joonas
Organization: Cosmonic
Name: Dan Norris
GitHub: @protochron
Organization: Cosmonic
Name: Taylor Thomas
GitHub: @thomastaylor312
Organization: Cosmonic
Name: Lucas Fontes
GitHub: @lxfontes
Organization: Cosmonic

3
SECURITY.md Normal file
View File

@ -0,0 +1,3 @@
# Reporting a security issue
Please refer to the [wasmCloud Security Process and Policy](https://github.com/wasmCloud/wasmCloud/blob/main/SECURITY.md) for details on how to report security issues and vulnerabilities.

View File

@ -7,10 +7,10 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.4 version: 0.1.6
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "0.3.2" appVersion: "0.4.0"

View File

@ -43,10 +43,15 @@ Common labels
{{- define "wasmcloud-operator.labels" -}} {{- define "wasmcloud-operator.labels" -}}
helm.sh/chart: {{ include "wasmcloud-operator.chart" . }} helm.sh/chart: {{ include "wasmcloud-operator.chart" . }}
{{ include "wasmcloud-operator.selectorLabels" . }} {{ include "wasmcloud-operator.selectorLabels" . }}
app.kubernetes.io/component: operator
{{- if .Chart.AppVersion }} {{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }} {{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/managed-by: {{ .Release.Service }}
app.kubernetes.io/part-of: wasmcloud-operator
{{- with .Values.additionalLabels }}
{{ . | toYaml }}
{{- end }}
{{- end }} {{- end }}
{{/* {{/*

View File

@ -12,6 +12,9 @@ imagePullSecrets: []
nameOverride: "" nameOverride: ""
fullnameOverride: "" fullnameOverride: ""
additionalLabels: {}
# app: wasmcloud-operator
serviceAccount: serviceAccount:
# Specifies whether a service account should be created # Specifies whether a service account should be created
create: true create: true

View File

@ -1,11 +1,16 @@
[package] [package]
name = "wasmcloud-operator-types" name = "wasmcloud-operator-types"
version = "0.1.6" version = "0.1.9"
edition = "2021" edition = "2021"
[package.metadata.cargo-machete]
# NOTE: This exists because kube-derive needs it, and for reasons I don't
# fully understand, it's not coming through kube-derive's own depedendencies.
ignored = ["serde_json"]
[dependencies] [dependencies]
k8s-openapi = {workspace = true} k8s-openapi = { workspace = true }
kube = {workspace = true, features = ["derive"]} kube = { workspace = true, features = ["derive"] }
schemars = {workspace = true} schemars = { workspace = true }
serde = {workspace = true} serde = { workspace = true }
serde_json = {workspace = true} serde_json = { workspace = true }

View File

@ -1,4 +1,4 @@
use k8s_openapi::api::core::v1::{PodSpec, ResourceRequirements, Volume}; use k8s_openapi::api::core::v1::{Container, PodSpec, ResourceRequirements, Volume};
use kube::CustomResource; use kube::CustomResource;
use schemars::{gen::SchemaGenerator, schema::Schema, JsonSchema}; use schemars::{gen::SchemaGenerator, schema::Schema, JsonSchema};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -80,6 +80,10 @@ pub struct WasmCloudHostConfigSpec {
pub observability: Option<ObservabilityConfiguration>, pub observability: Option<ObservabilityConfiguration>,
/// Certificates: Authorities, client certificates /// Certificates: Authorities, client certificates
pub certificates: Option<WasmCloudHostCertificates>, pub certificates: Option<WasmCloudHostCertificates>,
/// wasmCloud secrets topic prefix, must not be empty if set.
pub secrets_topic_prefix: Option<String>,
/// Maximum memory in bytes that components can use.
pub max_linear_memory_bytes: Option<u32>,
} }
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)]
@ -100,9 +104,23 @@ pub struct KubernetesSchedulingOptions {
/// https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ for valid /// https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ for valid
/// values to use here. /// values to use here.
pub resources: Option<WasmCloudHostConfigResources>, pub resources: Option<WasmCloudHostConfigResources>,
#[schemars(schema_with = "pod_schema")]
/// Any other pod template spec options to set for the underlying wasmCloud host pods. /// Any other pod template spec options to set for the underlying wasmCloud host pods.
#[schemars(schema_with = "pod_schema")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pod_template_additions: Option<PodSpec>, pub pod_template_additions: Option<PodSpec>,
/// Allow for customization of either the wasmcloud or nats leaf container inside of the wasmCloud host pod.
pub container_template_additions: Option<ContainerTemplateAdditions>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ContainerTemplateAdditions {
#[schemars(schema_with = "container_schema")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nats: Option<Container>,
#[schemars(schema_with = "container_schema")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub wasmcloud: Option<Container>,
} }
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)]
@ -161,6 +179,24 @@ fn pod_schema(_gen: &mut SchemaGenerator) -> Schema {
val.schema.into() val.schema.into()
} }
/// This is a workaround for the fact that we can't override the Container schema to make name
/// an optional field. It generates the OpenAPI schema for the Container type the same way that
/// kube.rs does while dropping any required fields.
fn container_schema(_gen: &mut SchemaGenerator) -> Schema {
let gen = schemars::gen::SchemaSettings::openapi3()
.with(|s| {
s.inline_subschemas = true;
s.meta_schema = None;
})
.with_visitor(kube::core::schema::StructuralSchemaRewriter)
.into_generator();
let mut val = gen.into_root_schema_for::<Container>();
// Drop `name` as a required field as it will be filled in from container
// definition coming the controller that this configuration gets merged into.
val.schema.object.as_mut().unwrap().required = BTreeSet::new();
val.schema.into()
}
fn default_host_replicas() -> u32 { fn default_host_replicas() -> u32 {
1 1
} }

View File

@ -15,7 +15,7 @@ spec:
spec: spec:
serviceAccountName: wasmcloud-operator serviceAccountName: wasmcloud-operator
containers: containers:
- image: ghcr.io/wasmcloud/wasmcloud-operator:0.3.2 - image: ghcr.io/wasmcloud/wasmcloud-operator:0.5.0
imagePullPolicy: Always imagePullPolicy: Always
name: wasmcloud-operator name: wasmcloud-operator
ports: ports:

View File

@ -68,6 +68,11 @@ spec:
traces: traces:
enable: false enable: false
endpoint: "traces-specific-otel-collector.svc" endpoint: "traces-specific-otel-collector.svc"
# Optional: Subject prefix that will be used by the host to query for wasmCloud Secrets.
# See https://wasmcloud.com/docs/concepts/secrets for more context
secretsTopicPrefix: "wasmcloud.secrets"
# Optional: The maximum amount of memory bytes that a component can allocate.
maxLinearMemoryBytes: 20000000
# Optional: Additional options to control how the underlying wasmCloud hosts are scheduled in Kubernetes. # Optional: Additional options to control how the underlying wasmCloud hosts are scheduled in Kubernetes.
# This includes setting resource requirements for the nats and wasmCloud host # This includes setting resource requirements for the nats and wasmCloud host
# containers along with any additional pot template settings. # containers along with any additional pot template settings.

View File

@ -19,9 +19,9 @@ spec:
image: ghcr.io/wasmcloud/components/http-hello-world-rust:0.1.0 image: ghcr.io/wasmcloud/components/http-hello-world-rust:0.1.0
traits: traits:
# Govern the spread/scheduling of the component # Govern the spread/scheduling of the component
- type: spreadscaler - type: daemonscaler
properties: properties:
replicas: 1 replicas: 100
# Add a capability provider that enables HTTP access # Add a capability provider that enables HTTP access
- name: httpserver - name: httpserver
@ -30,9 +30,11 @@ spec:
image: ghcr.io/wasmcloud/http-server:0.21.0 image: ghcr.io/wasmcloud/http-server:0.21.0
traits: traits:
# Establish a unidirectional link from this http server provider (the "source") # Establish a unidirectional link from this http server provider (the "source")
# to the `http-component` component (the "target") so the component can handle incoming HTTP requests, # to the `http-component` component (the "target") so the component can handle incoming HTTP requests.
# #
# The source (this provider) is configured such that the HTTP server listens on 127.0.0.1:8080 # The source (this provider) is configured such that the HTTP server listens on 0.0.0.0:8000.
# When running the application on Kubernetes with the wasmCloud operator, you can change the
# port but the address must be 0.0.0.0.
- type: link - type: link
properties: properties:
target: http-component target: http-component
@ -42,4 +44,10 @@ spec:
source_config: source_config:
- name: default-http - name: default-http
properties: properties:
address: 127.0.0.1:8080 address: 0.0.0.0:8000
# When running the application on Kubernetes with the wasmCloud operator,
# the operator automatically creates a Kubernetes service for applications that use
# the httpserver provider with a daemonscaler.
- type: daemonscaler
properties:
replicas: 1

View File

@ -13,6 +13,7 @@ use k8s_openapi::api::core::v1::{
}; };
use k8s_openapi::api::rbac::v1::{PolicyRule, Role, RoleBinding, RoleRef, Subject}; use k8s_openapi::api::rbac::v1::{PolicyRule, Role, RoleBinding, RoleRef, Subject};
use k8s_openapi::apimachinery::pkg::apis::meta::v1::LabelSelector; use k8s_openapi::apimachinery::pkg::apis::meta::v1::LabelSelector;
use k8s_openapi::DeepMerge;
use kube::{ use kube::{
api::{Api, ObjectMeta, Patch, PatchParams}, api::{Api, ObjectMeta, Patch, PatchParams},
client::Client as KubeClient, client::Client as KubeClient,
@ -373,15 +374,34 @@ async fn pod_template(config: &WasmCloudHostConfig, ctx: Arc<Context>) -> Result
} }
} }
if let Some(secrets_prefix) = &config.spec.secrets_topic_prefix {
wasmcloud_env.push(EnvVar {
name: "WASMCLOUD_SECRETS_TOPIC".to_string(),
value: Some(secrets_prefix.clone()),
..Default::default()
})
}
if let Some(max_linear_memory_bytes) = &config.spec.max_linear_memory_bytes {
wasmcloud_env.push(EnvVar {
name: "WASMCLOUD_MAX_LINEAR_MEMORY".to_string(),
value: Some(max_linear_memory_bytes.to_string()),
..Default::default()
})
}
let mut wasmcloud_args = configure_observability(&config.spec); let mut wasmcloud_args = configure_observability(&config.spec);
let mut nats_resources: Option<k8s_openapi::api::core::v1::ResourceRequirements> = None; let mut nats_resources: Option<k8s_openapi::api::core::v1::ResourceRequirements> = None;
let mut wasmcloud_resources: Option<k8s_openapi::api::core::v1::ResourceRequirements> = None; let mut wasmcloud_resources: Option<k8s_openapi::api::core::v1::ResourceRequirements> = None;
if let Some(scheduling_options) = &config.spec.scheduling_options { if let Some(resources) = &config
if let Some(resources) = &scheduling_options.resources { .spec
nats_resources = resources.nats.clone(); .scheduling_options
wasmcloud_resources = resources.wasmcloud.clone(); .as_ref()
} .and_then(|so| so.resources.clone())
{
nats_resources.clone_from(&resources.nats);
wasmcloud_resources.clone_from(&resources.wasmcloud);
} }
let image = match &config.spec.image { let image = match &config.spec.image {
@ -527,7 +547,7 @@ async fn pod_template(config: &WasmCloudHostConfig, ctx: Arc<Context>) -> Result
}); });
} }
let containers = vec![ let mut containers = vec![
Container { Container {
name: "nats-leaf".to_string(), name: "nats-leaf".to_string(),
image: Some(leaf_image), image: Some(leaf_image),
@ -567,6 +587,22 @@ async fn pod_template(config: &WasmCloudHostConfig, ctx: Arc<Context>) -> Result
}, },
]; ];
if let Some(cta) = &config
.spec
.scheduling_options
.as_ref()
.and_then(|so| so.container_template_additions.clone())
{
if let Some(mut nats_container) = cta.nats.clone() {
nats_container.merge_from(containers[0].clone());
containers[0] = nats_container;
}
if let Some(mut wasmcloud_container) = cta.wasmcloud.clone() {
wasmcloud_container.merge_from(containers[1].clone());
containers[1] = wasmcloud_container;
}
}
let service_account = config.name_any(); let service_account = config.name_any();
let mut template = PodTemplateSpec { let mut template = PodTemplateSpec {
metadata: Some(ObjectMeta { metadata: Some(ObjectMeta {
@ -581,17 +617,20 @@ async fn pod_template(config: &WasmCloudHostConfig, ctx: Arc<Context>) -> Result
}), }),
}; };
if let Some(scheduling_options) = &config.spec.scheduling_options { if let Some(pod_overrides) = &config
if let Some(pod_overrides) = &scheduling_options.pod_template_additions { .spec
let mut overrides = pod_overrides.clone(); .scheduling_options
overrides.service_account_name = Some(service_account); .as_ref()
overrides.containers = containers.clone(); .and_then(|so| so.pod_template_additions.clone())
if let Some(vols) = overrides.volumes { {
volumes.extend(vols); let mut overrides = pod_overrides.clone();
} overrides.service_account_name = Some(service_account);
overrides.volumes = Some(volumes); overrides.containers.clone_from(&containers);
template.spec = Some(overrides); if let Some(vols) = overrides.volumes {
volumes.extend(vols);
} }
overrides.volumes = Some(volumes);
template.spec = Some(overrides);
}; };
Ok(template) Ok(template)
} }
@ -808,35 +847,37 @@ async fn configure_hosts(config: &WasmCloudHostConfig, ctx: Arc<Context>) -> Res
]; ];
} }
if let Some(scheduling_options) = &config.spec.scheduling_options { if config
if scheduling_options.daemonset { .spec
let mut spec = daemonset_spec(config, ctx.clone()).await?; .scheduling_options
spec.template.spec.as_mut().unwrap().containers[1] .as_ref()
.env .is_some_and(|so| so.daemonset)
.as_mut() {
.unwrap() let mut spec = daemonset_spec(config, ctx.clone()).await?;
.append(&mut env_vars); spec.template.spec.as_mut().unwrap().containers[1]
let ds = DaemonSet { .env
metadata: ObjectMeta { .as_mut()
name: Some(config.name_any()), .unwrap()
namespace: Some(config.namespace().unwrap()), .append(&mut env_vars);
owner_references: Some(vec![config.controller_owner_ref(&()).unwrap()]), let ds = DaemonSet {
labels: Some(common_labels()), metadata: ObjectMeta {
..Default::default() name: Some(config.name_any()),
}, namespace: Some(config.namespace().unwrap()),
spec: Some(spec), owner_references: Some(vec![config.controller_owner_ref(&()).unwrap()]),
labels: Some(common_labels()),
..Default::default() ..Default::default()
}; },
spec: Some(spec),
..Default::default()
};
let api = let api = Api::<DaemonSet>::namespaced(ctx.client.clone(), &config.namespace().unwrap());
Api::<DaemonSet>::namespaced(ctx.client.clone(), &config.namespace().unwrap()); api.patch(
api.patch( &config.name_any(),
&config.name_any(), &PatchParams::apply(CLUSTER_CONFIG_FINALIZER),
&PatchParams::apply(CLUSTER_CONFIG_FINALIZER), &Patch::Apply(ds),
&Patch::Apply(ds), )
) .await?;
.await?;
}
} else { } else {
let mut spec = deployment_spec(config, ctx.clone()).await?; let mut spec = deployment_spec(config, ctx.clone()).await?;
spec.template.spec.as_mut().unwrap().containers[1] spec.template.spec.as_mut().unwrap().containers[1]

View File

@ -13,9 +13,10 @@ use kube::{
client::Client, client::Client,
CustomResourceExt, CustomResourceExt,
}; };
use opentelemetry::sdk::{ use opentelemetry::KeyValue;
trace::{self, RandomIdGenerator, Sampler}, use opentelemetry_sdk::{
Resource as OTELResource, trace::{RandomIdGenerator, Sampler},
Resource,
}; };
use std::io::IsTerminal; use std::io::IsTerminal;
use std::net::SocketAddr; use std::net::SocketAddr;
@ -27,6 +28,13 @@ use wasmcloud_operator_types::v1alpha1::WasmCloudHostConfig;
#[tokio::main] #[tokio::main]
async fn main() -> Result<()> { async fn main() -> Result<()> {
let args = std::env::args().collect::<Vec<_>>();
if args.iter().any(|arg| arg == "-V" || arg == "--version") {
let version = version();
println!("{} {version}", env!("CARGO_BIN_NAME"));
std::process::exit(0);
}
let tracing_enabled = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT").is_ok(); let tracing_enabled = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT").is_ok();
configure_tracing(tracing_enabled).map_err(|e| { configure_tracing(tracing_enabled).map_err(|e| {
error!("Failed to configure tracing: {}", e); error!("Failed to configure tracing: {}", e);
@ -80,12 +88,12 @@ fn configure_tracing(enabled: bool) -> anyhow::Result<()> {
.tracing() .tracing()
.with_exporter(opentelemetry_otlp::new_exporter().tonic()) .with_exporter(opentelemetry_otlp::new_exporter().tonic())
.with_trace_config( .with_trace_config(
trace::config() opentelemetry_sdk::trace::config()
.with_sampler(Sampler::AlwaysOn) .with_sampler(Sampler::AlwaysOn)
.with_id_generator(RandomIdGenerator::default()) .with_id_generator(RandomIdGenerator::default())
.with_max_attributes_per_span(32) .with_max_attributes_per_span(32)
.with_max_events_per_span(32) .with_max_events_per_span(32)
.with_resource(OTELResource::new(vec![opentelemetry::KeyValue::new( .with_resource(Resource::new(vec![KeyValue::new(
"service.name", "service.name",
"wasmcloud-operator", "wasmcloud-operator",
)])), )])),
@ -191,3 +199,7 @@ async fn install_crd(client: &Client) -> anyhow::Result<()> {
Ok(()) Ok(())
} }
fn version() -> &'static str {
option_env!("CARGO_VERSION_INFO").unwrap_or(env!("CARGO_PKG_VERSION"))
}

File diff suppressed because it is too large Load Diff

View File

@ -618,13 +618,13 @@ fn http_server_component(manifest: &Manifest) -> Option<HttpServerComponent> {
if props.namespace == "wasi" if props.namespace == "wasi"
&& props.package == "http" && props.package == "http"
&& props.interfaces.contains(&"incoming-handler".to_string()) && props.interfaces.contains(&"incoming-handler".to_string())
&& props.source.is_some()
{ {
for p in props.source_config.iter() { let source = props.source.as_ref().unwrap();
if let Some(config_props) = &p.properties { for cp in source.config.iter() {
if let Some(addr) = config_props.get("address") { if let Some(addr) = cp.properties.as_ref().and_then(|p| p.get("address")) {
details.address.clone_from(addr); details.address.clone_from(addr);
should_create_service = true; should_create_service = true;
};
} }
} }
} }