mirror of
https://git.deuxfleurs.fr/Deuxfleurs/garage.git
synced 2026-11-10 16:19:15 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fc771827e |
||
|
|
a70a2f3d47 |
||
|
|
de248fb9b2 |
||
|
|
b55bcd660e |
501 changed files with 20000 additions and 87804 deletions
288
.drone.yml
Normal file
288
.drone.yml
Normal file
|
|
@ -0,0 +1,288 @@
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
name: default
|
||||||
|
|
||||||
|
node:
|
||||||
|
nix-daemon: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: check formatting
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-shell --attr rust --run "cargo fmt -- --check"
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
|
||||||
|
- name: unit + func tests
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
GARAGE_TEST_INTEGRATION_EXE: result-bin/bin/garage
|
||||||
|
commands:
|
||||||
|
- nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-build --no-build-output --attr test.amd64
|
||||||
|
- ./result/bin/garage_db-*
|
||||||
|
- ./result/bin/garage_api-*
|
||||||
|
- ./result/bin/garage_model-*
|
||||||
|
- ./result/bin/garage_rpc-*
|
||||||
|
- ./result/bin/garage_table-*
|
||||||
|
- ./result/bin/garage_util-*
|
||||||
|
- ./result/bin/garage_web-*
|
||||||
|
- ./result/bin/garage-*
|
||||||
|
- ./result/bin/integration-*
|
||||||
|
- rm result
|
||||||
|
|
||||||
|
- name: integration tests
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- custom
|
||||||
|
- push
|
||||||
|
- pull_request
|
||||||
|
- tag
|
||||||
|
- cron
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: release-linux-amd64
|
||||||
|
|
||||||
|
node:
|
||||||
|
nix-daemon: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-build --no-build-output --attr pkgs.amd64.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
|
||||||
|
|
||||||
|
- name: integration
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
|
||||||
|
|
||||||
|
- name: push static binary
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
AWS_ACCESS_KEY_ID:
|
||||||
|
from_secret: garagehq_aws_access_key_id
|
||||||
|
AWS_SECRET_ACCESS_KEY:
|
||||||
|
from_secret: garagehq_aws_secret_access_key
|
||||||
|
TARGET: "x86_64-unknown-linux-musl"
|
||||||
|
commands:
|
||||||
|
- nix-shell --attr release --run "to_s3"
|
||||||
|
|
||||||
|
- name: docker build and publish
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
DOCKER_AUTH:
|
||||||
|
from_secret: docker_auth
|
||||||
|
DOCKER_PLATFORM: "linux/amd64"
|
||||||
|
CONTAINER_NAME: "dxflrs/amd64_garage"
|
||||||
|
HOME: "/kaniko"
|
||||||
|
commands:
|
||||||
|
- mkdir -p /kaniko/.docker
|
||||||
|
- echo $DOCKER_AUTH > /kaniko/.docker/config.json
|
||||||
|
- export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr release --run "to_docker"
|
||||||
|
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- promote
|
||||||
|
- cron
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: release-linux-i386
|
||||||
|
|
||||||
|
node:
|
||||||
|
nix-daemon: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-build --no-build-output --attr pkgs.i386.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
|
||||||
|
|
||||||
|
- name: integration
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
|
||||||
|
|
||||||
|
- name: push static binary
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
AWS_ACCESS_KEY_ID:
|
||||||
|
from_secret: garagehq_aws_access_key_id
|
||||||
|
AWS_SECRET_ACCESS_KEY:
|
||||||
|
from_secret: garagehq_aws_secret_access_key
|
||||||
|
TARGET: "i686-unknown-linux-musl"
|
||||||
|
commands:
|
||||||
|
- nix-shell --attr release --run "to_s3"
|
||||||
|
|
||||||
|
- name: docker build and publish
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
DOCKER_AUTH:
|
||||||
|
from_secret: docker_auth
|
||||||
|
DOCKER_PLATFORM: "linux/386"
|
||||||
|
CONTAINER_NAME: "dxflrs/386_garage"
|
||||||
|
HOME: "/kaniko"
|
||||||
|
commands:
|
||||||
|
- mkdir -p /kaniko/.docker
|
||||||
|
- echo $DOCKER_AUTH > /kaniko/.docker/config.json
|
||||||
|
- export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr release --run "to_docker"
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- promote
|
||||||
|
- cron
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: release-linux-arm64
|
||||||
|
|
||||||
|
node:
|
||||||
|
nix-daemon: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-build --no-build-output --attr pkgs.arm64.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
|
||||||
|
|
||||||
|
- name: push static binary
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
AWS_ACCESS_KEY_ID:
|
||||||
|
from_secret: garagehq_aws_access_key_id
|
||||||
|
AWS_SECRET_ACCESS_KEY:
|
||||||
|
from_secret: garagehq_aws_secret_access_key
|
||||||
|
TARGET: "aarch64-unknown-linux-musl"
|
||||||
|
commands:
|
||||||
|
- nix-shell --attr release --run "to_s3"
|
||||||
|
|
||||||
|
- name: docker build and publish
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
DOCKER_AUTH:
|
||||||
|
from_secret: docker_auth
|
||||||
|
DOCKER_PLATFORM: "linux/arm64"
|
||||||
|
CONTAINER_NAME: "dxflrs/arm64_garage"
|
||||||
|
HOME: "/kaniko"
|
||||||
|
commands:
|
||||||
|
- mkdir -p /kaniko/.docker
|
||||||
|
- echo $DOCKER_AUTH > /kaniko/.docker/config.json
|
||||||
|
- export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr release --run "to_docker"
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- promote
|
||||||
|
- cron
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: release-linux-arm
|
||||||
|
|
||||||
|
node:
|
||||||
|
nix-daemon: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
commands:
|
||||||
|
- nix-build --no-build-output --attr pkgs.arm.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
|
||||||
|
|
||||||
|
- name: push static binary
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
AWS_ACCESS_KEY_ID:
|
||||||
|
from_secret: garagehq_aws_access_key_id
|
||||||
|
AWS_SECRET_ACCESS_KEY:
|
||||||
|
from_secret: garagehq_aws_secret_access_key
|
||||||
|
TARGET: "armv6l-unknown-linux-musleabihf"
|
||||||
|
commands:
|
||||||
|
- nix-shell --attr release --run "to_s3"
|
||||||
|
|
||||||
|
- name: docker build and publish
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
DOCKER_AUTH:
|
||||||
|
from_secret: docker_auth
|
||||||
|
DOCKER_PLATFORM: "linux/arm"
|
||||||
|
CONTAINER_NAME: "dxflrs/arm_garage"
|
||||||
|
HOME: "/kaniko"
|
||||||
|
commands:
|
||||||
|
- mkdir -p /kaniko/.docker
|
||||||
|
- echo $DOCKER_AUTH > /kaniko/.docker/config.json
|
||||||
|
- export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr release --run "to_docker"
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- promote
|
||||||
|
- cron
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: refresh-release-page
|
||||||
|
|
||||||
|
node:
|
||||||
|
nix-daemon: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: multiarch-docker
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
DOCKER_AUTH:
|
||||||
|
from_secret: docker_auth
|
||||||
|
HOME: "/root"
|
||||||
|
commands:
|
||||||
|
- mkdir -p /root/.docker
|
||||||
|
- echo $DOCKER_AUTH > /root/.docker/config.json
|
||||||
|
- export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
|
||||||
|
- nix-shell --attr release --run "multiarch_docker"
|
||||||
|
- name: refresh-index
|
||||||
|
image: nixpkgs/nix:nixos-22.05
|
||||||
|
environment:
|
||||||
|
AWS_ACCESS_KEY_ID:
|
||||||
|
from_secret: garagehq_aws_access_key_id
|
||||||
|
AWS_SECRET_ACCESS_KEY:
|
||||||
|
from_secret: garagehq_aws_secret_access_key
|
||||||
|
commands:
|
||||||
|
- mkdir -p /etc/nix && cp nix/nix.conf /etc/nix/nix.conf
|
||||||
|
- nix-shell --attr release --run "refresh_index"
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- release-linux-amd64
|
||||||
|
- release-linux-i386
|
||||||
|
- release-linux-arm64
|
||||||
|
- release-linux-arm
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- promote
|
||||||
|
- cron
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: signature
|
||||||
|
hmac: ac09a5a8c82502f67271f93afa1e1e21ce66383b8e24a6deb26b285cc1c378ba
|
||||||
|
|
||||||
|
...
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
labels:
|
|
||||||
nix: "enabled"
|
|
||||||
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- tag
|
|
||||||
- pull_request
|
|
||||||
- deployment
|
|
||||||
- cron
|
|
||||||
- manual
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: check formatting
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-build -j4 --attr flakePackages.fmt
|
|
||||||
|
|
||||||
- name: build
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-build -j4 --attr flakePackages.dev
|
|
||||||
|
|
||||||
- name: unit + func tests (lmdb)
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-build -j4 --attr flakePackages.tests-lmdb
|
|
||||||
|
|
||||||
- name: unit + func tests (sqlite)
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-build -j4 --attr flakePackages.tests-sqlite
|
|
||||||
|
|
||||||
- name: unit + func tests (fjall)
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-build -j4 --attr flakePackages.tests-fjall
|
|
||||||
|
|
||||||
- name: integration tests
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-build -j4 --attr flakePackages.dev
|
|
||||||
- nix-shell --attr ci --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
|
|
||||||
depends_on: [ build ]
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
labels:
|
|
||||||
nix: "enabled"
|
|
||||||
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- deployment
|
|
||||||
- cron
|
|
||||||
|
|
||||||
depends_on:
|
|
||||||
- release
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: refresh-index
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
environment:
|
|
||||||
AWS_ACCESS_KEY_ID:
|
|
||||||
from_secret: garagehq_aws_access_key_id
|
|
||||||
AWS_SECRET_ACCESS_KEY:
|
|
||||||
from_secret: garagehq_aws_secret_access_key
|
|
||||||
commands:
|
|
||||||
- mkdir -p /etc/nix && cp nix/nix.conf /etc/nix/nix.conf
|
|
||||||
- nix-shell --attr ci --run "refresh_index"
|
|
||||||
|
|
||||||
- name: multiarch-docker
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
environment:
|
|
||||||
DOCKER_AUTH:
|
|
||||||
from_secret: docker_auth
|
|
||||||
commands:
|
|
||||||
- mkdir -p /root/.docker
|
|
||||||
- echo $DOCKER_AUTH > /root/.docker/config.json
|
|
||||||
- export CONTAINER_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
|
|
||||||
- nix-shell --attr ci --run "multiarch_docker"
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
labels:
|
|
||||||
nix: "enabled"
|
|
||||||
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- deployment
|
|
||||||
- cron
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- ARCH: amd64
|
|
||||||
TARGET: x86_64-unknown-linux-musl
|
|
||||||
- ARCH: i386
|
|
||||||
TARGET: i686-unknown-linux-musl
|
|
||||||
- ARCH: arm64
|
|
||||||
TARGET: aarch64-unknown-linux-musl
|
|
||||||
- ARCH: arm
|
|
||||||
TARGET: armv6l-unknown-linux-musleabihf
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: build
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-build --attr releasePackages.${ARCH} --argstr git_version ${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
|
|
||||||
|
|
||||||
- name: check is static binary
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-shell --attr ci --run "./script/not-dynamic.sh result/bin/garage"
|
|
||||||
|
|
||||||
- name: integration tests
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-shell --attr ci --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
|
|
||||||
when:
|
|
||||||
- matrix:
|
|
||||||
ARCH: amd64
|
|
||||||
- matrix:
|
|
||||||
ARCH: i386
|
|
||||||
|
|
||||||
- name: upgrade tests
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
commands:
|
|
||||||
- nix-shell --attr ci --run "./script/test-upgrade.sh v0.8.4 x86_64-unknown-linux-musl" || (cat /tmp/garage.log; false)
|
|
||||||
when:
|
|
||||||
- matrix:
|
|
||||||
ARCH: amd64
|
|
||||||
|
|
||||||
- name: push static binary
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
environment:
|
|
||||||
TARGET: "${TARGET}"
|
|
||||||
AWS_ACCESS_KEY_ID:
|
|
||||||
from_secret: garagehq_aws_access_key_id
|
|
||||||
AWS_SECRET_ACCESS_KEY:
|
|
||||||
from_secret: garagehq_aws_secret_access_key
|
|
||||||
commands:
|
|
||||||
- nix-shell --attr ci --run "to_s3"
|
|
||||||
|
|
||||||
- name: docker build and publish
|
|
||||||
image: nixpkgs/nix:nixos-24.05
|
|
||||||
environment:
|
|
||||||
DOCKER_PLATFORM: "linux/${ARCH}"
|
|
||||||
CONTAINER_NAME: "dxflrs/${ARCH}_garage"
|
|
||||||
DOCKER_AUTH:
|
|
||||||
from_secret: docker_auth
|
|
||||||
commands:
|
|
||||||
- mkdir -p /root/.docker
|
|
||||||
- echo $DOCKER_AUTH > /root/.docker/config.json
|
|
||||||
- export CONTAINER_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
|
|
||||||
- nix-shell --attr ci --run "to_docker"
|
|
||||||
4219
Cargo.lock
generated
4219
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
140
Cargo.toml
140
Cargo.toml
|
|
@ -3,152 +3,20 @@ resolver = "2"
|
||||||
members = [
|
members = [
|
||||||
"src/db",
|
"src/db",
|
||||||
"src/util",
|
"src/util",
|
||||||
"src/net",
|
|
||||||
"src/rpc",
|
"src/rpc",
|
||||||
"src/table",
|
"src/table",
|
||||||
"src/block",
|
"src/block",
|
||||||
"src/model",
|
"src/model",
|
||||||
"src/api/common",
|
"src/api",
|
||||||
"src/api/s3",
|
|
||||||
"src/api/k2v",
|
|
||||||
"src/api/admin",
|
|
||||||
"src/web",
|
"src/web",
|
||||||
"src/garage",
|
"src/garage",
|
||||||
"src/k2v-client",
|
"src/k2v-client",
|
||||||
"src/format-table",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
default-members = ["src/garage"]
|
default-members = ["src/garage"]
|
||||||
|
|
||||||
[workspace.dependencies]
|
[profile.dev]
|
||||||
|
lto = "off"
|
||||||
# Internal Garage crates
|
|
||||||
format_table = { version = "0.1.1", path = "src/format-table" }
|
|
||||||
garage_api_common = { version = "1.3.1", path = "src/api/common" }
|
|
||||||
garage_api_admin = { version = "1.3.1", path = "src/api/admin" }
|
|
||||||
garage_api_s3 = { version = "1.3.1", path = "src/api/s3" }
|
|
||||||
garage_api_k2v = { version = "1.3.1", path = "src/api/k2v" }
|
|
||||||
garage_block = { version = "1.3.1", path = "src/block" }
|
|
||||||
garage_db = { version = "1.3.1", path = "src/db", default-features = false }
|
|
||||||
garage_model = { version = "1.3.1", path = "src/model", default-features = false }
|
|
||||||
garage_net = { version = "1.3.1", path = "src/net" }
|
|
||||||
garage_rpc = { version = "1.3.1", path = "src/rpc" }
|
|
||||||
garage_table = { version = "1.3.1", path = "src/table" }
|
|
||||||
garage_util = { version = "1.3.1", path = "src/util" }
|
|
||||||
garage_web = { version = "1.3.1", path = "src/web" }
|
|
||||||
k2v-client = { version = "0.0.4", path = "src/k2v-client" }
|
|
||||||
|
|
||||||
# External crates from crates.io
|
|
||||||
arc-swap = "1.0"
|
|
||||||
argon2 = "0.5"
|
|
||||||
async-trait = "0.1.7"
|
|
||||||
backtrace = "0.3"
|
|
||||||
base64 = "0.21"
|
|
||||||
blake2 = "0.10"
|
|
||||||
bytes = "1.0"
|
|
||||||
bytesize = "1.1"
|
|
||||||
cfg-if = "1.0"
|
|
||||||
chrono = "0.4"
|
|
||||||
crc32fast = "1.4"
|
|
||||||
crc32c = "0.6"
|
|
||||||
crypto-common = "0.1"
|
|
||||||
gethostname = "0.4"
|
|
||||||
git-version = "0.3.4"
|
|
||||||
hex = "0.4"
|
|
||||||
hexdump = "0.1"
|
|
||||||
html-escape = "0.2.13"
|
|
||||||
hmac = "0.12"
|
|
||||||
itertools = "0.12"
|
|
||||||
ipnet = "2.9.0"
|
|
||||||
lazy_static = "1.4"
|
|
||||||
md-5 = "0.10"
|
|
||||||
mktemp = "0.5"
|
|
||||||
nix = { version = "0.29", default-features = false, features = ["fs"] }
|
|
||||||
nom = "7.1"
|
|
||||||
parking_lot = "0.12"
|
|
||||||
parse_duration = "2.1"
|
|
||||||
pin-project = "1.0.12"
|
|
||||||
pnet_datalink = "0.34"
|
|
||||||
rand = "0.8"
|
|
||||||
sha1 = "0.10"
|
|
||||||
sha2 = "0.10"
|
|
||||||
timeago = { version = "0.4", default-features = false }
|
|
||||||
xxhash-rust = { version = "0.8", default-features = false, features = ["xxh3"] }
|
|
||||||
|
|
||||||
aes-gcm = { version = "0.10", features = ["aes", "stream"] }
|
|
||||||
sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" }
|
|
||||||
kuska-handshake = { version = "0.2.0", features = ["default", "async_std"] }
|
|
||||||
|
|
||||||
clap = { version = "4.1", features = ["derive", "env"] }
|
|
||||||
pretty_env_logger = "0.5"
|
|
||||||
structopt = { version = "0.3", default-features = false }
|
|
||||||
syslog-tracing = "0.3"
|
|
||||||
tracing = "0.1"
|
|
||||||
tracing-journald = "0.3.1"
|
|
||||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
||||||
|
|
||||||
heed = { version = "0.11", default-features = false, features = ["lmdb"] }
|
|
||||||
rusqlite = "0.37"
|
|
||||||
r2d2 = "0.8"
|
|
||||||
r2d2_sqlite = "0.31"
|
|
||||||
fjall = "2.4"
|
|
||||||
|
|
||||||
async-compression = { version = "0.4", features = ["tokio", "zstd"] }
|
|
||||||
zstd = { version = "0.13", default-features = false }
|
|
||||||
|
|
||||||
quick-xml = { version = "0.26", features = [ "serialize" ] }
|
|
||||||
rmp-serde = "1.1.2"
|
|
||||||
serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
|
|
||||||
serde_bytes = "0.11"
|
|
||||||
serde_json = "1.0"
|
|
||||||
toml = { version = "0.8", default-features = false, features = ["parse"] }
|
|
||||||
|
|
||||||
# newer version requires rust edition 2021
|
|
||||||
k8s-openapi = { version = "0.21", features = ["v1_24"] }
|
|
||||||
kube = { version = "0.88", default-features = false, features = ["runtime", "derive", "client", "rustls-tls"] }
|
|
||||||
schemars = "0.8"
|
|
||||||
reqwest = { version = "0.11", default-features = false, features = ["rustls-tls-manual-roots", "json"] }
|
|
||||||
|
|
||||||
form_urlencoded = "1.0.0"
|
|
||||||
http = "1.0"
|
|
||||||
httpdate = "1.0"
|
|
||||||
http-range = "0.1"
|
|
||||||
http-body-util = "0.1"
|
|
||||||
hyper = { version = "1.0", default-features = false }
|
|
||||||
hyper-util = { version = "0.1", features = [ "full" ] }
|
|
||||||
multer = "3.0"
|
|
||||||
percent-encoding = "2.2"
|
|
||||||
roxmltree = "0.19"
|
|
||||||
url = "2.3"
|
|
||||||
|
|
||||||
futures = "0.3"
|
|
||||||
futures-util = "0.3"
|
|
||||||
tokio = { version = "1.0", default-features = false, features = ["net", "rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
|
|
||||||
tokio-util = { version = "0.7", features = ["compat", "io"] }
|
|
||||||
tokio-stream = { version = "0.1", features = ["net"] }
|
|
||||||
|
|
||||||
opentelemetry = { version = "0.17", features = [ "rt-tokio", "metrics", "trace" ] }
|
|
||||||
opentelemetry-prometheus = "0.10"
|
|
||||||
opentelemetry-otlp = "0.10"
|
|
||||||
opentelemetry-contrib = "0.9"
|
|
||||||
prometheus = "0.13"
|
|
||||||
|
|
||||||
# used by the k2v-client crate only
|
|
||||||
aws-sigv4 = { version = "1.1", default-features = false }
|
|
||||||
hyper-rustls = { version = "0.26", default-features = false, features = ["http1", "http2", "ring", "rustls-native-certs"] }
|
|
||||||
log = "0.4"
|
|
||||||
thiserror = "2.0"
|
|
||||||
|
|
||||||
# ---- used only as build / dev dependencies ----
|
|
||||||
assert-json-diff = "2.0"
|
|
||||||
rustc_version = "0.4.0"
|
|
||||||
static_init = "1.0"
|
|
||||||
aws-smithy-runtime = { version = "1.8", default-features = false, features = ["tls-rustls"] }
|
|
||||||
aws-sdk-config = { version = "1.62", default-features = false }
|
|
||||||
aws-sdk-s3 = { version = "1.79", default-features = false, features = ["rt-tokio"] }
|
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = "thin"
|
debug = true
|
||||||
codegen-units = 16
|
|
||||||
opt-level = 3
|
|
||||||
strip = "debuginfo"
|
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,5 @@ FROM scratch
|
||||||
ENV RUST_BACKTRACE=1
|
ENV RUST_BACKTRACE=1
|
||||||
ENV RUST_LOG=garage=info
|
ENV RUST_LOG=garage=info
|
||||||
|
|
||||||
COPY result/bin/garage /
|
COPY result-bin/bin/garage /
|
||||||
CMD [ "/garage", "server"]
|
CMD [ "/garage", "server"]
|
||||||
|
|
|
||||||
11
Makefile
11
Makefile
|
|
@ -1,8 +1,13 @@
|
||||||
.PHONY: doc all run1 run2 run3
|
.PHONY: doc all release shell run1 run2 run3
|
||||||
|
|
||||||
all:
|
all:
|
||||||
clear
|
clear; cargo build
|
||||||
cargo build
|
|
||||||
|
release:
|
||||||
|
nix-build --attr pkgs.amd64.release --no-build-output
|
||||||
|
|
||||||
|
shell:
|
||||||
|
nix-shell
|
||||||
|
|
||||||
# ----
|
# ----
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
Garage [](https://woodpecker.deuxfleurs.fr/repos/1)
|
Garage [](https://drone.deuxfleurs.fr/Deuxfleurs/garage)
|
||||||
===
|
===
|
||||||
|
|
||||||
<p align="center" style="text-align:center;">
|
<p align="center" style="text-align:center;">
|
||||||
|
|
|
||||||
28
build.sh
Executable file
28
build.sh
Executable file
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
echo "-- check --"
|
||||||
|
nix-shell --attr rust --run "cargo fmt -- --check"
|
||||||
|
|
||||||
|
echo "-- build --"
|
||||||
|
nix-build --no-build-output --attr clippy.amd64 --argstr git_version $COMMIT
|
||||||
|
|
||||||
|
echo "-- unit tests --"
|
||||||
|
export GARAGE_TEST_INTEGRATION_EXE=result-bin/bin/garage
|
||||||
|
nix-build --no-build-output --attr test.amd64
|
||||||
|
./result/bin/garage_db-*
|
||||||
|
./result/bin/garage_api-*
|
||||||
|
./result/bin/garage_model-*
|
||||||
|
./result/bin/garage_rpc-*
|
||||||
|
./result/bin/garage_table-*
|
||||||
|
./result/bin/garage_util-*
|
||||||
|
./result/bin/garage_web-*
|
||||||
|
./result/bin/garage-*
|
||||||
|
|
||||||
|
echo "-- integration tests --"
|
||||||
|
./result/bin/integration-*
|
||||||
|
|
||||||
|
echo "-- smoke tests --"
|
||||||
|
rm result
|
||||||
|
nix-build --no-build-output --attr clippy.amd64 --argstr git_version $COMMIT
|
||||||
|
nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
|
||||||
56
default.nix
56
default.nix
|
|
@ -3,22 +3,54 @@
|
||||||
with import ./nix/common.nix;
|
with import ./nix/common.nix;
|
||||||
|
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs { };
|
pkgs = import pkgsSrc { };
|
||||||
compile = import ./nix/compile.nix;
|
compile = import ./nix/compile.nix;
|
||||||
|
|
||||||
build_release = target: (compile {
|
build_debug_and_release = (target: {
|
||||||
inherit target system git_version nixpkgs;
|
debug = (compile {
|
||||||
crane = flake.inputs.crane;
|
inherit system target git_version pkgsSrc cargo2nixOverlay;
|
||||||
rust-overlay = flake.inputs.rust-overlay;
|
release = false;
|
||||||
|
}).workspace.garage { compileMode = "build"; };
|
||||||
|
|
||||||
|
release = (compile {
|
||||||
|
inherit system target git_version pkgsSrc cargo2nixOverlay;
|
||||||
release = true;
|
release = true;
|
||||||
}).garage;
|
}).workspace.garage { compileMode = "build"; };
|
||||||
|
});
|
||||||
|
|
||||||
|
test = (rustPkgs:
|
||||||
|
pkgs.symlinkJoin {
|
||||||
|
name = "garage-tests";
|
||||||
|
paths =
|
||||||
|
builtins.map (key: rustPkgs.workspace.${key} { compileMode = "test"; })
|
||||||
|
(builtins.attrNames rustPkgs.workspace);
|
||||||
|
});
|
||||||
|
|
||||||
in {
|
in {
|
||||||
releasePackages = {
|
pkgs = {
|
||||||
amd64 = build_release "x86_64-unknown-linux-musl";
|
amd64 = build_debug_and_release "x86_64-unknown-linux-musl";
|
||||||
i386 = build_release "i686-unknown-linux-musl";
|
i386 = build_debug_and_release "i686-unknown-linux-musl";
|
||||||
arm64 = build_release "aarch64-unknown-linux-musl";
|
arm64 = build_debug_and_release "aarch64-unknown-linux-musl";
|
||||||
arm = build_release "armv6l-unknown-linux-musleabihf";
|
arm = build_debug_and_release "armv6l-unknown-linux-musleabihf";
|
||||||
|
};
|
||||||
|
test = {
|
||||||
|
amd64 = test (compile {
|
||||||
|
inherit system git_version pkgsSrc cargo2nixOverlay;
|
||||||
|
target = "x86_64-unknown-linux-musl";
|
||||||
|
features = [
|
||||||
|
"garage/bundled-libs"
|
||||||
|
"garage/k2v"
|
||||||
|
"garage/sled"
|
||||||
|
"garage/lmdb"
|
||||||
|
"garage/sqlite"
|
||||||
|
];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
clippy = {
|
||||||
|
amd64 = (compile {
|
||||||
|
inherit system git_version pkgsSrc cargo2nixOverlay;
|
||||||
|
target = "x86_64-unknown-linux-musl";
|
||||||
|
compiler = "clippy";
|
||||||
|
}).workspace.garage { compileMode = "build"; };
|
||||||
};
|
};
|
||||||
flakePackages = flake.packages.${system};
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -632,7 +632,7 @@ paths:
|
||||||
operationId: "UpdateBucket"
|
operationId: "UpdateBucket"
|
||||||
summary: "Update a bucket"
|
summary: "Update a bucket"
|
||||||
description: |
|
description: |
|
||||||
All fields (`websiteAccess` and `quotas`) are optional.
|
All fields (`websiteAccess` and `quotas`) are optionnal.
|
||||||
If they are present, the corresponding modifications are applied to the bucket, otherwise nothing is changed.
|
If they are present, the corresponding modifications are applied to the bucket, otherwise nothing is changed.
|
||||||
|
|
||||||
In `websiteAccess`: if `enabled` is `true`, `indexDocument` must be specified.
|
In `websiteAccess`: if `enabled` is `true`, `indexDocument` must be specified.
|
||||||
|
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Garage Adminstration API v0</title>
|
|
||||||
<!-- needed for adaptive design -->
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<link href="./css/redoc.css" rel="stylesheet">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Redoc doesn't change outer page styles
|
|
||||||
-->
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<redoc spec-url='./garage-admin-v1.yml'></redoc>
|
|
||||||
<script src="./redoc.standalone.js"> </script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,6 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title = "Build your own app"
|
title = "Build your own app"
|
||||||
weight = 40
|
weight = 4
|
||||||
sort_by = "weight"
|
sort_by = "weight"
|
||||||
template = "documentation.html"
|
template = "documentation.html"
|
||||||
+++
|
+++
|
||||||
|
|
|
||||||
|
|
@ -37,84 +37,30 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
garage "git.deuxfleurs.fr/garage-sdk/garage-admin-sdk-golang"
|
garage "git.deuxfleurs.fr/garage-sdk/garage-admin-sdk-golang"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Initialization
|
// Set Host and other parameters
|
||||||
configuration := garage.NewConfiguration()
|
configuration := garage.NewConfiguration()
|
||||||
configuration.Host = "127.0.0.1:3903"
|
configuration.Host = "127.0.0.1:3903"
|
||||||
|
|
||||||
|
|
||||||
|
// We can now generate a client
|
||||||
client := garage.NewAPIClient(configuration)
|
client := garage.NewAPIClient(configuration)
|
||||||
|
|
||||||
|
// Authentication is handled through the context pattern
|
||||||
ctx := context.WithValue(context.Background(), garage.ContextAccessToken, "s3cr3t")
|
ctx := context.WithValue(context.Background(), garage.ContextAccessToken, "s3cr3t")
|
||||||
|
|
||||||
// Nodes
|
// Send a request
|
||||||
fmt.Println("--- nodes ---")
|
resp, r, err := client.NodesApi.GetNodes(ctx).Execute()
|
||||||
nodes, _, _ := client.NodesApi.GetNodes(ctx).Execute()
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stdout, "First hostname: %v\n", nodes.KnownNodes[0].Hostname)
|
fmt.Fprintf(os.Stderr, "Error when calling `NodesApi.GetNodes``: %v\n", err)
|
||||||
capa := int64(1000000000)
|
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
|
||||||
change := []garage.NodeRoleChange{
|
|
||||||
garage.NodeRoleChange{NodeRoleUpdate: &garage.NodeRoleUpdate {
|
|
||||||
Id: *nodes.KnownNodes[0].Id,
|
|
||||||
Zone: "dc1",
|
|
||||||
Capacity: *garage.NewNullableInt64(&capa),
|
|
||||||
Tags: []string{ "fast", "amd64" },
|
|
||||||
}},
|
|
||||||
}
|
}
|
||||||
staged, _, _ := client.LayoutApi.AddLayout(ctx).NodeRoleChange(change).Execute()
|
|
||||||
msg, _, _ := client.LayoutApi.ApplyLayout(ctx).LayoutVersion(*garage.NewLayoutVersion(staged.Version + 1)).Execute()
|
|
||||||
fmt.Printf(strings.Join(msg.Message, "\n")) // Layout configured
|
|
||||||
|
|
||||||
health, _, _ := client.NodesApi.GetHealth(ctx).Execute()
|
// Process the response
|
||||||
fmt.Printf("Status: %s, nodes: %v/%v, storage: %v/%v, partitions: %v/%v\n", health.Status, health.ConnectedNodes, health.KnownNodes, health.StorageNodesOk, health.StorageNodes, health.PartitionsAllOk, health.Partitions)
|
fmt.Fprintf(os.Stdout, "Target hostname: %v\n", resp.KnownNodes[resp.Node].Hostname)
|
||||||
|
|
||||||
// Key
|
|
||||||
fmt.Println("\n--- key ---")
|
|
||||||
key := "openapi-key"
|
|
||||||
keyInfo, _, _ := client.KeyApi.AddKey(ctx).AddKeyRequest(garage.AddKeyRequest{Name: *garage.NewNullableString(&key) }).Execute()
|
|
||||||
defer client.KeyApi.DeleteKey(ctx).Id(*keyInfo.AccessKeyId).Execute()
|
|
||||||
fmt.Printf("AWS_ACCESS_KEY_ID=%s\nAWS_SECRET_ACCESS_KEY=%s\n", *keyInfo.AccessKeyId, *keyInfo.SecretAccessKey.Get())
|
|
||||||
|
|
||||||
id := *keyInfo.AccessKeyId
|
|
||||||
canCreateBucket := true
|
|
||||||
updateKeyRequest := *garage.NewUpdateKeyRequest()
|
|
||||||
updateKeyRequest.SetName("openapi-key-updated")
|
|
||||||
updateKeyRequest.SetAllow(garage.UpdateKeyRequestAllow { CreateBucket: &canCreateBucket })
|
|
||||||
update, _, _ := client.KeyApi.UpdateKey(ctx).Id(id).UpdateKeyRequest(updateKeyRequest).Execute()
|
|
||||||
fmt.Printf("Updated %v with key name %v\n", *update.AccessKeyId, *update.Name)
|
|
||||||
|
|
||||||
keyList, _, _ := client.KeyApi.ListKeys(ctx).Execute()
|
|
||||||
fmt.Printf("Keys count: %v\n", len(keyList))
|
|
||||||
|
|
||||||
// Bucket
|
|
||||||
fmt.Println("\n--- bucket ---")
|
|
||||||
global_name := "global-ns-openapi-bucket"
|
|
||||||
local_name := "local-ns-openapi-bucket"
|
|
||||||
bucketInfo, _, _ := client.BucketApi.CreateBucket(ctx).CreateBucketRequest(garage.CreateBucketRequest{
|
|
||||||
GlobalAlias: &global_name,
|
|
||||||
LocalAlias: &garage.CreateBucketRequestLocalAlias {
|
|
||||||
AccessKeyId: keyInfo.AccessKeyId,
|
|
||||||
Alias: &local_name,
|
|
||||||
},
|
|
||||||
}).Execute()
|
|
||||||
defer client.BucketApi.DeleteBucket(ctx).Id(*bucketInfo.Id).Execute()
|
|
||||||
fmt.Printf("Bucket id: %s\n", *bucketInfo.Id)
|
|
||||||
|
|
||||||
updateBucketRequest := *garage.NewUpdateBucketRequest()
|
|
||||||
website := garage.NewUpdateBucketRequestWebsiteAccess()
|
|
||||||
website.SetEnabled(true)
|
|
||||||
website.SetIndexDocument("index.html")
|
|
||||||
website.SetErrorDocument("errors/4xx.html")
|
|
||||||
updateBucketRequest.SetWebsiteAccess(*website)
|
|
||||||
quotas := garage.NewUpdateBucketRequestQuotas()
|
|
||||||
quotas.SetMaxSize(1000000000)
|
|
||||||
quotas.SetMaxObjects(999999999)
|
|
||||||
updateBucketRequest.SetQuotas(*quotas)
|
|
||||||
updatedBucket, _, _ := client.BucketApi.UpdateBucket(ctx).Id(*bucketInfo.Id).UpdateBucketRequest(updateBucketRequest).Execute()
|
|
||||||
fmt.Printf("Bucket %v website activation: %v\n", *updatedBucket.Id, *updatedBucket.WebsiteAccess)
|
|
||||||
|
|
||||||
bucketList, _, _ := client.BucketApi.ListBuckets(ctx).Execute()
|
|
||||||
fmt.Printf("Bucket count: %v\n", len(bucketList))
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,9 @@ npm install --save git+https://git.deuxfleurs.fr/garage-sdk/garage-admin-sdk-js.
|
||||||
A short example:
|
A short example:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const garage = require('garage_administration_api_v1garage_v0_9_0');
|
const garage = require('garage_administration_api_v0garage_v0_8_0');
|
||||||
|
|
||||||
const api = new garage.ApiClient("http://127.0.0.1:3903/v1");
|
const api = new garage.ApiClient("http://127.0.0.1:3903/v0");
|
||||||
api.authentications['bearerAuth'].accessToken = "s3cr3t";
|
api.authentications['bearerAuth'].accessToken = "s3cr3t";
|
||||||
|
|
||||||
const [node, layout, key, bucket] = [
|
const [node, layout, key, bucket] = [
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ client = minio.Minio(
|
||||||
"GKyourapikey",
|
"GKyourapikey",
|
||||||
"abcd[...]1234",
|
"abcd[...]1234",
|
||||||
# Force the region, this is specific to garage
|
# Force the region, this is specific to garage
|
||||||
region="garage",
|
region="region",
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -80,7 +80,7 @@ from garage_admin_sdk.apis import *
|
||||||
from garage_admin_sdk.models import *
|
from garage_admin_sdk.models import *
|
||||||
|
|
||||||
configuration = garage_admin_sdk.Configuration(
|
configuration = garage_admin_sdk.Configuration(
|
||||||
host = "http://localhost:3903/v1",
|
host = "http://localhost:3903/v0",
|
||||||
access_token = "s3cr3t"
|
access_token = "s3cr3t"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -94,14 +94,13 @@ print(f"running garage {status.garage_version}, node_id {status.node}")
|
||||||
|
|
||||||
# Change layout of this node
|
# Change layout of this node
|
||||||
current = layout.get_layout()
|
current = layout.get_layout()
|
||||||
layout.add_layout([
|
layout.add_layout({
|
||||||
NodeRoleChange(
|
status.node: NodeClusterInfo(
|
||||||
id = status.node,
|
|
||||||
zone = "dc1",
|
zone = "dc1",
|
||||||
capacity = 1000000000,
|
capacity = 1,
|
||||||
tags = [ "dev" ],
|
tags = [ "dev" ],
|
||||||
)
|
)
|
||||||
])
|
})
|
||||||
layout.apply_layout(LayoutVersion(
|
layout.apply_layout(LayoutVersion(
|
||||||
version = current.version + 1
|
version = current.version + 1
|
||||||
))
|
))
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title = "Existing integrations"
|
title = "Existing integrations"
|
||||||
weight = 30
|
weight = 3
|
||||||
sort_by = "weight"
|
sort_by = "weight"
|
||||||
template = "documentation.html"
|
template = "documentation.html"
|
||||||
+++
|
+++
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue