arkitekt-next 0.7.37__tar.gz → 0.7.38__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arkitekt-next might be problematic. Click here for more details.
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/PKG-INFO +1 -1
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/__blok__.py +6 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/arkitekt.py +2 -1
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/fluss.py +2 -2
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/gateway.py +9 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/internal_docker.py +18 -16
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/kabinet.py +2 -2
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/livekit.py +1 -1
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/lok.py +32 -31
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/mikro.py +3 -3
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/minio.py +12 -37
- arkitekt_next-0.7.38/arkitekt_next/bloks/namegen.py +34 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/redis.py +1 -1
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/rekuest.py +4 -2
- arkitekt_next-0.7.38/arkitekt_next/bloks/secret.py +33 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/gateway.py +10 -0
- arkitekt_next-0.7.38/arkitekt_next/bloks/services/name.py +12 -0
- arkitekt_next-0.7.38/arkitekt_next/bloks/services/secret.py +17 -0
- arkitekt_next-0.7.38/arkitekt_next/bloks/tailscale.py +68 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/pyproject.toml +1 -1
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/LICENSE +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/README.md +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/easy.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/next.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/qt.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/service/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/service/fakts.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/service/fakts_next.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/service/fakts_qt.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/service/grant_registry.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/service/herre.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/service/herre_qt.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/apps/types.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/admin.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/config.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/funcs.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/mount.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/postgres.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/admin.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/config.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/db.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/livekit.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/lok.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/mount.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/redis.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/s3.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/services/socket.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/bloks/socket.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/builders.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/call/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/call/local.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/call/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/call/remote.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/gen/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/gen/compile.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/gen/init.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/gen/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/gen/watch.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/init/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/init/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/inspect/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/inspect/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/inspect/requirements.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/inspect/templates.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/inspect/variables.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/build.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/init.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/publish.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/stage.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/utils.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/validate.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/kabinet/wizard.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/manifest/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/manifest/inspect.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/manifest/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/manifest/scopes.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/manifest/version.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/manifest/wizard.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/run/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/run/dev.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/run/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/run/prod.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/run/utils.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/down.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/init.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/inspect.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/open.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/remove.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/stop.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/up.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/commands/server/utils.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/configs/base.yaml +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/constants.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/dockerfiles/vanilla.dockerfile +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/errors.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/inspect.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/io.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/main.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/options.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/fluss.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/gucker.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/kabinet.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/kluster.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/konviktion.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/kuay.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/mikro.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/mikro_next.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/napari.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/omero_ark.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/port.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/rekuest.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/rekuest_next.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/schemas/unlok.schema.graphql +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/templates/filter.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/templates/simple.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/texts.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/types.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/ui.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/utils.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/validators.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/vars.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/cli/versions/v1.yaml +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/constants.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/model.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/__init__.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/dark/gear.png +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/dark/green pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/dark/orange pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/dark/pink pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/dark/red pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/light/gear.png +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/light/green pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/light/orange pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/light/pink pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/assets/light/red pulse.gif +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/builders.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/magic_bar.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/types.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/qt/utils.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/service_registry.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/tqdm.py +0 -0
- {arkitekt_next-0.7.37 → arkitekt_next-0.7.38}/arkitekt_next/utils.py +0 -0
|
@@ -14,6 +14,9 @@ from arkitekt_next.bloks.mount import MountBlok
|
|
|
14
14
|
from arkitekt_next.bloks.internal_docker import InternalDockerBlok
|
|
15
15
|
from arkitekt_next.bloks.socket import DockerSocketBlok
|
|
16
16
|
from arkitekt_next.bloks.rekuest import RekuestBlok
|
|
17
|
+
from arkitekt_next.bloks.tailscale import TailscaleBlok
|
|
18
|
+
from arkitekt_next.bloks.secret import SecretBlok
|
|
19
|
+
from arkitekt_next.bloks.namegen import PreformedNamesBlok
|
|
17
20
|
|
|
18
21
|
|
|
19
22
|
def get_bloks():
|
|
@@ -34,4 +37,7 @@ def get_bloks():
|
|
|
34
37
|
InternalDockerBlok(),
|
|
35
38
|
DockerSocketBlok(),
|
|
36
39
|
RekuestBlok(),
|
|
40
|
+
TailscaleBlok(),
|
|
41
|
+
SecretBlok(),
|
|
42
|
+
PreformedNamesBlok(),
|
|
37
43
|
]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from pydantic import BaseModel
|
|
2
2
|
from typing import Dict, Any
|
|
3
|
+
from arkitekt_next.bloks.tailscale import TailscaleBlok
|
|
3
4
|
from blok import blok, InitContext, Renderer, Panel
|
|
4
5
|
from .livekit import LocalLiveKitBlok
|
|
5
6
|
from .mikro import MikroBlok
|
|
@@ -29,7 +30,7 @@ class ArkitektBlok:
|
|
|
29
30
|
)
|
|
30
31
|
)
|
|
31
32
|
|
|
32
|
-
def preflight(self, lok: LocalLiveKitBlok, mikro: MikroBlok, kabinet: KabinetBlok, rekuest: RekuestBlok, fluss: FlussBlok, gateway: GatewayBlok, internal_engine: InternalDockerBlok):
|
|
33
|
+
def preflight(self, lok: LocalLiveKitBlok, mikro: MikroBlok, kabinet: KabinetBlok, rekuest: RekuestBlok, fluss: FlussBlok, gateway: GatewayBlok, internal_engine: InternalDockerBlok, scale: TailscaleBlok):
|
|
33
34
|
print (lok, mikro, kabinet, rekuest, fluss, gateway, internal_engine)
|
|
34
35
|
|
|
35
36
|
|
|
@@ -58,13 +58,13 @@ class FlussBlok:
|
|
|
58
58
|
mount_repo = Option(
|
|
59
59
|
subcommand="mount_repo",
|
|
60
60
|
help="Should we mount the repo into the container?",
|
|
61
|
-
|
|
61
|
+
type=bool,
|
|
62
62
|
default=self.mount_repo,
|
|
63
63
|
)
|
|
64
64
|
build_repo = Option(
|
|
65
65
|
subcommand="build_repo",
|
|
66
66
|
help="Should we build the container from the repo?",
|
|
67
|
-
|
|
67
|
+
type=bool,
|
|
68
68
|
default=self.build_repo,
|
|
69
69
|
)
|
|
70
70
|
with_host = Option(
|
|
@@ -36,6 +36,15 @@ class GatewayBlok:
|
|
|
36
36
|
self.public_ips = DEFAULT_PUBLIC_URLS
|
|
37
37
|
self.public_hosts = DEFAULT_PUBLIC_HOSTS
|
|
38
38
|
|
|
39
|
+
def get_internal_host(self):
|
|
40
|
+
return "caddy"
|
|
41
|
+
|
|
42
|
+
def get_https_port(self):
|
|
43
|
+
return 443
|
|
44
|
+
|
|
45
|
+
def get_http_port(self):
|
|
46
|
+
return 80
|
|
47
|
+
|
|
39
48
|
def preflight(self, init: InitContext, dns: DnsService):
|
|
40
49
|
for key, value in init.kwargs.items():
|
|
41
50
|
setattr(self, key, value)
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
from typing import Dict, Any
|
|
2
2
|
import secrets
|
|
3
3
|
|
|
4
|
+
from arkitekt_next.bloks.lok import LokBlok
|
|
5
|
+
from arkitekt_next.bloks.services.gateway import GatewayService
|
|
6
|
+
from arkitekt_next.bloks.socket import DockerSocketBlok
|
|
4
7
|
from blok import blok, InitContext, ExecutionContext, Option
|
|
8
|
+
from blok.bloks.services.dns import DnsService
|
|
5
9
|
from blok.tree import YamlFile, Repo
|
|
6
10
|
|
|
7
11
|
|
|
@@ -9,16 +13,12 @@ from blok.tree import YamlFile, Repo
|
|
|
9
13
|
class InternalDockerBlok:
|
|
10
14
|
def __init__(self) -> None:
|
|
11
15
|
self.host = "internal_docker"
|
|
12
|
-
|
|
13
|
-
"arkitekt-next run prod --redeem-token=mylittletoken --url http://caddy:80"
|
|
14
|
-
)
|
|
16
|
+
|
|
15
17
|
self.image = "jhnnsrs/deployer:0.0.1-vanilla"
|
|
16
18
|
self.instance_id = "INTERNAL_DOCKER"
|
|
17
19
|
|
|
18
|
-
def get_dependencies(self):
|
|
19
|
-
return ["live.arkitekt.docker_socket"]
|
|
20
20
|
|
|
21
|
-
def preflight(self, init: InitContext):
|
|
21
|
+
def preflight(self, init: InitContext, gateway: GatewayService, lok: LokBlok, socket: DockerSocketBlok):
|
|
22
22
|
for key, value in init.kwargs.items():
|
|
23
23
|
setattr(self, key, value)
|
|
24
24
|
|
|
@@ -27,7 +27,15 @@ class InternalDockerBlok:
|
|
|
27
27
|
if self.skip:
|
|
28
28
|
return
|
|
29
29
|
|
|
30
|
-
self._socket =
|
|
30
|
+
self._socket = socket.register_socket(self.host)
|
|
31
|
+
self.gateway_host = gateway.get_internal_host()
|
|
32
|
+
self.gateway_port = gateway.get_http_port()
|
|
33
|
+
|
|
34
|
+
self.token = lok.retrieve_token()
|
|
35
|
+
|
|
36
|
+
self.command = (
|
|
37
|
+
f"arkitekt-next run prod --redeem-token={self.token} --url http://{self.gateway_host}:{self.gateway_port}"
|
|
38
|
+
)
|
|
31
39
|
|
|
32
40
|
self.initialized = True
|
|
33
41
|
|
|
@@ -50,27 +58,21 @@ class InternalDockerBlok:
|
|
|
50
58
|
context.docker_compose.set_nested("services", self.host, db_service)
|
|
51
59
|
|
|
52
60
|
def get_options(self):
|
|
53
|
-
with_command = Option(
|
|
54
|
-
subcommand="command",
|
|
55
|
-
help="The fakts url for connection",
|
|
56
|
-
default=self.command,
|
|
57
|
-
)
|
|
58
61
|
with_host = Option(
|
|
59
62
|
subcommand="host",
|
|
60
|
-
help="The
|
|
63
|
+
help="The host of this service",
|
|
61
64
|
default=self.host,
|
|
62
65
|
)
|
|
63
66
|
with_skip = Option(
|
|
64
67
|
subcommand="skip",
|
|
65
|
-
help="
|
|
68
|
+
help="Should we skip creating this service?",
|
|
66
69
|
default=False,
|
|
67
70
|
type=bool,
|
|
68
|
-
|
|
71
|
+
|
|
69
72
|
)
|
|
70
73
|
|
|
71
74
|
return [
|
|
72
75
|
with_host,
|
|
73
|
-
with_command,
|
|
74
76
|
with_skip,
|
|
75
77
|
]
|
|
76
78
|
|
|
@@ -57,13 +57,13 @@ class KabinetBlok:
|
|
|
57
57
|
mount_repo = Option(
|
|
58
58
|
subcommand="mount_repo",
|
|
59
59
|
help="Should we mount the repo into the container?",
|
|
60
|
-
|
|
60
|
+
type=bool,
|
|
61
61
|
default=self.mount_repo,
|
|
62
62
|
)
|
|
63
63
|
build_repo = Option(
|
|
64
64
|
subcommand="build_repo",
|
|
65
65
|
help="Should we build the container from the repo?",
|
|
66
|
-
|
|
66
|
+
type=bool,
|
|
67
67
|
default=self.build_repo,
|
|
68
68
|
)
|
|
69
69
|
with_host = Option(
|
|
@@ -5,6 +5,7 @@ from cryptography.hazmat.primitives import serialization as crypto_serialization
|
|
|
5
5
|
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
6
6
|
from cryptography.hazmat.backends import default_backend as crypto_default_backend
|
|
7
7
|
from typing import Dict
|
|
8
|
+
from arkitekt_next.bloks.secret import SecretBlok
|
|
8
9
|
from arkitekt_next.bloks.services.admin import AdminService
|
|
9
10
|
from arkitekt_next.bloks.services.db import DBService
|
|
10
11
|
from arkitekt_next.bloks.services.gateway import GatewayService
|
|
@@ -145,15 +146,9 @@ class LokBlok:
|
|
|
145
146
|
"accounts",
|
|
146
147
|
]
|
|
147
148
|
self.token_expiry_seconds = 700000
|
|
149
|
+
self.preformed_redeem_tokens = [secrets.token_hex(16) for i in range(80)]
|
|
150
|
+
self.registered_tokens = {}
|
|
148
151
|
|
|
149
|
-
def get_dependencies(self):
|
|
150
|
-
return [
|
|
151
|
-
"io.livekit.livekit",
|
|
152
|
-
"live.arkitekt.postgres",
|
|
153
|
-
"live.arkitekt.redis",
|
|
154
|
-
"live.arkitekt.admin",
|
|
155
|
-
"live.arkitekt.gateway",
|
|
156
|
-
]
|
|
157
152
|
|
|
158
153
|
def retrieve_credentials(self) -> LokCredentials:
|
|
159
154
|
return LokCredentials(
|
|
@@ -165,11 +160,17 @@ class LokBlok:
|
|
|
165
160
|
f"fakts.service={service_name}",
|
|
166
161
|
f"fakts.builder=arkitekt.{service_name}",
|
|
167
162
|
]
|
|
163
|
+
|
|
164
|
+
def retrieve_token(self, user: str = "admin") -> str:
|
|
165
|
+
new_token = self.secret_blok.retrieve_secret()
|
|
166
|
+
self.registered_tokens[user] = new_token
|
|
167
|
+
|
|
168
|
+
return new_token
|
|
168
169
|
|
|
169
170
|
def register_scopes(self, scopes_dict: Dict[str, str]) -> LokCredentials:
|
|
170
171
|
self.scopes = self.scopes | scopes_dict
|
|
171
172
|
|
|
172
|
-
def preflight(self, init: InitContext, gateway: GatewayService, db: DBService, redis: RedisService, admin: AdminService, livekit: LivekitService, scopes: list[Dict[str, str]]):
|
|
173
|
+
def preflight(self, init: InitContext, gateway: GatewayService, db: DBService, redis: RedisService, admin: AdminService, secrets: SecretBlok, livekit: LivekitService, scopes: list[Dict[str, str]]):
|
|
173
174
|
for key, value in init.kwargs.items():
|
|
174
175
|
setattr(self, key, value)
|
|
175
176
|
|
|
@@ -183,6 +184,7 @@ class LokBlok:
|
|
|
183
184
|
i, 80, self.host, strip_prefix=False
|
|
184
185
|
)
|
|
185
186
|
|
|
187
|
+
self.secret_blok = secrets
|
|
186
188
|
self.postgress_access = db.register_db(self.host)
|
|
187
189
|
self.redis_access = redis.register()
|
|
188
190
|
self.admin_access = admin.retrieve()
|
|
@@ -235,7 +237,7 @@ class LokBlok:
|
|
|
235
237
|
"private_key": self.private_key,
|
|
236
238
|
"public_key": self.public_key,
|
|
237
239
|
"scopes": self.scopes,
|
|
238
|
-
"redeem_tokens": [token for token in self.
|
|
240
|
+
"redeem_tokens": [token for token in self.registered_tokens],
|
|
239
241
|
"groups": [group for group in self.groups],
|
|
240
242
|
"deployment": {"name": self.deployment_name},
|
|
241
243
|
"livekit": asdict(self.local_access),
|
|
@@ -270,82 +272,82 @@ class LokBlok:
|
|
|
270
272
|
|
|
271
273
|
with_fakts_url = Option(
|
|
272
274
|
subcommand="db_name",
|
|
273
|
-
help="The
|
|
275
|
+
help="The name of the database",
|
|
274
276
|
default="db_name",
|
|
277
|
+
show_default=True,
|
|
275
278
|
)
|
|
276
279
|
with_users = Option(
|
|
277
280
|
subcommand="users",
|
|
278
|
-
help="
|
|
281
|
+
help="Users that should be greated by default. Format is name:password",
|
|
279
282
|
default=["admin:admin"],
|
|
280
283
|
multiple=True,
|
|
281
284
|
type=USER,
|
|
285
|
+
show_default=True,
|
|
282
286
|
)
|
|
283
287
|
with_groups = Option(
|
|
284
288
|
subcommand="groups",
|
|
285
|
-
help="
|
|
289
|
+
help="Groups that should be greated by default. Format is name:description",
|
|
286
290
|
default=["admin:admin_group"],
|
|
287
291
|
multiple=True,
|
|
288
292
|
type=GROUP,
|
|
289
|
-
|
|
290
|
-
with_redeem_token = Option(
|
|
291
|
-
subcommand="tokens",
|
|
292
|
-
help="The fakts url for connection",
|
|
293
|
-
default=[],
|
|
294
|
-
multiple=True,
|
|
295
|
-
type=TOKEN,
|
|
293
|
+
show_default=True,
|
|
296
294
|
)
|
|
297
295
|
with_scopes = Option(
|
|
298
296
|
subcommand="scopes",
|
|
299
|
-
help="
|
|
297
|
+
help="Additional scopes that should be created (normally handled by the bloks)",
|
|
300
298
|
default=[f"{key}:{value}" for key, value in self.scopes.items()],
|
|
301
299
|
multiple=True,
|
|
302
300
|
type=SCOPE,
|
|
303
301
|
)
|
|
304
302
|
with_repo = Option(
|
|
305
303
|
subcommand="with_repo",
|
|
306
|
-
help="
|
|
304
|
+
help="Which repo should we use when building the service? Only active if build_repo or mount_repo is active",
|
|
307
305
|
default=self.repo,
|
|
306
|
+
show_default=True,
|
|
308
307
|
)
|
|
309
308
|
with_repo = Option(
|
|
310
309
|
subcommand="command",
|
|
311
|
-
help="
|
|
310
|
+
help="Which command should be run when starting the service?",
|
|
312
311
|
default=self.command,
|
|
312
|
+
show_default=True,
|
|
313
313
|
)
|
|
314
314
|
mount_repo = Option(
|
|
315
315
|
subcommand="mount_repo",
|
|
316
316
|
help="The fakts url for connection",
|
|
317
|
-
|
|
317
|
+
type=bool,
|
|
318
318
|
default=False,
|
|
319
319
|
)
|
|
320
320
|
build_repo = Option(
|
|
321
321
|
subcommand="build_repo",
|
|
322
|
-
help="
|
|
323
|
-
|
|
322
|
+
help="Should we build the container from the repo?",
|
|
323
|
+
type=bool,
|
|
324
324
|
default=False,
|
|
325
|
+
show_default=True,
|
|
325
326
|
)
|
|
326
327
|
with_host = Option(
|
|
327
328
|
subcommand="host",
|
|
328
|
-
help="
|
|
329
|
+
help="Which internal hostname should be used",
|
|
329
330
|
default=self.host,
|
|
331
|
+
show_default=True,
|
|
330
332
|
)
|
|
331
333
|
#
|
|
332
334
|
with_public_key = Option(
|
|
333
335
|
subcommand="public_key",
|
|
334
|
-
help="The
|
|
336
|
+
help="The public key for the JWT creation",
|
|
335
337
|
default=public_key,
|
|
336
338
|
required=True,
|
|
337
339
|
callback=validate_public_key,
|
|
338
340
|
)
|
|
339
341
|
with_private_key = Option(
|
|
340
342
|
subcommand="private_key",
|
|
341
|
-
help="The
|
|
343
|
+
help="The corresponding private key for the JWT creation",
|
|
342
344
|
default=private_key,
|
|
343
345
|
callback=validate_private_key,
|
|
344
346
|
required=True,
|
|
345
347
|
)
|
|
346
348
|
with_secret_key = Option(
|
|
347
349
|
subcommand="secret_key",
|
|
348
|
-
help="The
|
|
350
|
+
help="The secret key to use for the django service",
|
|
349
351
|
default=self.secret_key,
|
|
350
352
|
)
|
|
351
353
|
|
|
@@ -357,7 +359,6 @@ class LokBlok:
|
|
|
357
359
|
with_groups,
|
|
358
360
|
build_repo,
|
|
359
361
|
with_host,
|
|
360
|
-
with_redeem_token,
|
|
361
362
|
with_private_key,
|
|
362
363
|
with_public_key,
|
|
363
364
|
with_scopes,
|
|
@@ -23,7 +23,7 @@ class MikroBlok:
|
|
|
23
23
|
def __init__(self) -> None:
|
|
24
24
|
self.host = "mikro"
|
|
25
25
|
self.command = "bash run-debug.sh"
|
|
26
|
-
self.repo = "https://github.com/
|
|
26
|
+
self.repo = "https://github.com/arkitektio/mikro-server-next"
|
|
27
27
|
self.scopes = {"read_image": "Read image from the database"}
|
|
28
28
|
self.image = "jhnnsrs/mikro:next"
|
|
29
29
|
self.mount_repo = False
|
|
@@ -68,13 +68,13 @@ class MikroBlok:
|
|
|
68
68
|
mount_repo = Option(
|
|
69
69
|
subcommand="mount_repo",
|
|
70
70
|
help="The fakts url for connection",
|
|
71
|
-
|
|
71
|
+
type=bool,
|
|
72
72
|
default=self.mount_repo,
|
|
73
73
|
)
|
|
74
74
|
build_repo = Option(
|
|
75
75
|
subcommand="build_repo",
|
|
76
76
|
help="The fakts url for connection",
|
|
77
|
-
|
|
77
|
+
type=bool,
|
|
78
78
|
default=self.build_repo,
|
|
79
79
|
)
|
|
80
80
|
with_host = Option(
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import click
|
|
2
2
|
|
|
3
|
+
from arkitekt_next.bloks.services.config import ConfigService
|
|
4
|
+
from arkitekt_next.bloks.services.gateway import GatewayService
|
|
5
|
+
from arkitekt_next.bloks.services.name import NameService
|
|
6
|
+
from arkitekt_next.bloks.services.secret import SecretService
|
|
3
7
|
from blok import blok, InitContext, ExecutionContext, Option
|
|
4
8
|
from blok.tree import YamlFile, Repo
|
|
5
9
|
from pydantic import BaseModel
|
|
@@ -50,20 +54,16 @@ class MinioBlok:
|
|
|
50
54
|
self.preformed_access_keys = [secrets.token_hex(16) for i in range(100)]
|
|
51
55
|
self.preformed_secret_keys = [secrets.token_hex(16) for i in range(100)]
|
|
52
56
|
|
|
53
|
-
def get_identifier(self):
|
|
54
|
-
return "live.arkitekt.s3"
|
|
55
57
|
|
|
56
|
-
def get_dependencies(self):
|
|
57
|
-
return ["live.arkitekt.config", "live.arkitekt.gateway"]
|
|
58
58
|
|
|
59
59
|
def create_buckets(self, buckets: list[str]) -> S3Credentials:
|
|
60
|
-
new_access_key = self.
|
|
61
|
-
new_secret_key = self.
|
|
60
|
+
new_access_key = self.secret_service.retrieve_secret()
|
|
61
|
+
new_secret_key = self.secret_service.retrieve_secret()
|
|
62
62
|
|
|
63
63
|
bucket_map = {}
|
|
64
64
|
|
|
65
65
|
for bucket in buckets:
|
|
66
|
-
bucket_map[bucket] = self.
|
|
66
|
+
bucket_map[bucket] = self.name_service.retrieve_name()
|
|
67
67
|
|
|
68
68
|
self.buckets.extend(bucket_map.values())
|
|
69
69
|
|
|
@@ -81,19 +81,15 @@ class MinioBlok:
|
|
|
81
81
|
|
|
82
82
|
return creds
|
|
83
83
|
|
|
84
|
-
def preflight(self, init: InitContext):
|
|
84
|
+
def preflight(self, init: InitContext, secret: SecretService, name: NameService, gateway: GatewayService, config: ConfigService):
|
|
85
85
|
for key, value in init.kwargs.items():
|
|
86
86
|
setattr(self, key, value)
|
|
87
87
|
|
|
88
|
-
self.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
self.preformed_access_keys = list(init.kwargs.get("preformed_access_keys", []))
|
|
92
|
-
self.preformed_secret_keys = list(init.kwargs.get("preformed_secret_keys", []))
|
|
93
|
-
|
|
94
|
-
init.dependencies["live.arkitekt.gateway"].expose_default(9000, self.host)
|
|
88
|
+
gateway.expose_default(9000, self.host)
|
|
89
|
+
self.secret_service = secret
|
|
90
|
+
self.name_service = name
|
|
95
91
|
|
|
96
|
-
self.config_path =
|
|
92
|
+
self.config_path = config.get_path(
|
|
97
93
|
self.host + ".yaml"
|
|
98
94
|
)
|
|
99
95
|
|
|
@@ -151,30 +147,9 @@ class MinioBlok:
|
|
|
151
147
|
help="The fakts url for connection",
|
|
152
148
|
default=self.password,
|
|
153
149
|
)
|
|
154
|
-
with_preformed_bucket_names = Option(
|
|
155
|
-
subcommand="preformed_bucket_names",
|
|
156
|
-
help="The fakts url for connection",
|
|
157
|
-
multiple=True,
|
|
158
|
-
default=self.preformed_bucket_names,
|
|
159
|
-
)
|
|
160
|
-
with_preformed_acces_key = Option(
|
|
161
|
-
subcommand="preformed_access_keys",
|
|
162
|
-
help="The fakts url for connection",
|
|
163
|
-
multiple=True,
|
|
164
|
-
default=self.preformed_access_keys,
|
|
165
|
-
)
|
|
166
|
-
with_preformed_secret_keys = Option(
|
|
167
|
-
subcommand="preformed_secret_keys",
|
|
168
|
-
help="The fakts url for connection",
|
|
169
|
-
multiple=True,
|
|
170
|
-
default=self.preformed_secret_keys,
|
|
171
|
-
)
|
|
172
150
|
|
|
173
151
|
return [
|
|
174
152
|
with_host,
|
|
175
153
|
with_password,
|
|
176
154
|
with_username,
|
|
177
|
-
with_preformed_bucket_names,
|
|
178
|
-
with_preformed_acces_key,
|
|
179
|
-
with_preformed_secret_keys,
|
|
180
155
|
]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from pydantic import BaseModel
|
|
2
|
+
from typing import Dict, Any
|
|
3
|
+
from arkitekt_next.bloks.services.name import NameService
|
|
4
|
+
from blok import blok, InitContext, Option, ExecutionContext
|
|
5
|
+
from blok.tree import YamlFile
|
|
6
|
+
from arkitekt_next.bloks.services.secret import SecretService
|
|
7
|
+
import secrets
|
|
8
|
+
import namegenerator
|
|
9
|
+
|
|
10
|
+
@blok(NameService)
|
|
11
|
+
class PreformedNamesBlok:
|
|
12
|
+
def __init__(self) -> None:
|
|
13
|
+
self.preformed_names = [namegenerator.gen() for _ in range(100)]
|
|
14
|
+
self.used_names = []
|
|
15
|
+
|
|
16
|
+
def preflight(self, init: InitContext, preformed_names: list[str]):
|
|
17
|
+
self.preformed_names = list(preformed_names)
|
|
18
|
+
self.used_names = []
|
|
19
|
+
|
|
20
|
+
def retrieve_name(self) -> str:
|
|
21
|
+
name = self.preformed_names.pop()
|
|
22
|
+
self.used_names.append(name)
|
|
23
|
+
return name
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_options(self):
|
|
27
|
+
config_path = Option(
|
|
28
|
+
subcommand="preformed_names",
|
|
29
|
+
help="A list of preformed names",
|
|
30
|
+
default=self.preformed_names,
|
|
31
|
+
multiple=True,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
return [config_path]
|
|
@@ -47,23 +47,25 @@ class RekuestBlok:
|
|
|
47
47
|
with_repo = Option(
|
|
48
48
|
subcommand="with_repo",
|
|
49
49
|
help="Which repo should we use when building the service? Only active if build_repo or mount_repo is active",
|
|
50
|
+
type=str,
|
|
50
51
|
default=self.repo,
|
|
51
52
|
)
|
|
52
53
|
with_command = Option(
|
|
53
54
|
subcommand="command",
|
|
54
55
|
help="Which command should be run when starting the service",
|
|
56
|
+
type=str,
|
|
55
57
|
default=self.command,
|
|
56
58
|
)
|
|
57
59
|
mount_repo = Option(
|
|
58
60
|
subcommand="mount_repo",
|
|
59
61
|
help="Should we mount the repo into the container?",
|
|
60
|
-
|
|
62
|
+
type=bool,
|
|
61
63
|
default=self.mount_repo,
|
|
62
64
|
)
|
|
63
65
|
build_repo = Option(
|
|
64
66
|
subcommand="build_repo",
|
|
65
67
|
help="Should we build the container from the repo?",
|
|
66
|
-
|
|
68
|
+
type=bool,
|
|
67
69
|
default=self.build_repo,
|
|
68
70
|
)
|
|
69
71
|
with_host = Option(
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from pydantic import BaseModel
|
|
2
|
+
from typing import Dict, Any
|
|
3
|
+
from blok import blok, InitContext, Option, ExecutionContext
|
|
4
|
+
from blok.tree import YamlFile
|
|
5
|
+
from arkitekt_next.bloks.services.secret import SecretService
|
|
6
|
+
import secrets
|
|
7
|
+
|
|
8
|
+
@blok(SecretService)
|
|
9
|
+
class SecretBlok:
|
|
10
|
+
def __init__(self) -> None:
|
|
11
|
+
self.preformed_secrets = [secrets.token_urlsafe(32) for _ in range(100)]
|
|
12
|
+
self.registered_secrets = []
|
|
13
|
+
|
|
14
|
+
def preflight(self, init: InitContext, preformed_secrets: list[str]):
|
|
15
|
+
self.preformed_secrets = list(preformed_secrets)
|
|
16
|
+
|
|
17
|
+
def retrieve_secret(self) -> str:
|
|
18
|
+
new_secret = self.preformed_secrets.pop()
|
|
19
|
+
self.registered_secrets.append(new_secret)
|
|
20
|
+
return new_secret
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_options(self):
|
|
25
|
+
config_path = Option(
|
|
26
|
+
subcommand="preformed_secrets",
|
|
27
|
+
help="Which path to use for configs",
|
|
28
|
+
default=self.preformed_secrets,
|
|
29
|
+
multiple=True,
|
|
30
|
+
show_default=False,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
return [config_path]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from typing import Dict, Any, Protocol
|
|
2
|
+
from blok import blok, InitContext, Option
|
|
3
|
+
from blok import service
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@service("live.arkitekt.names")
|
|
9
|
+
class NameService(Protocol):
|
|
10
|
+
|
|
11
|
+
def retrieve_name(self) -> str:
|
|
12
|
+
pass
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from typing import Dict, Any, Protocol
|
|
2
|
+
from blok import blok, InitContext, Option
|
|
3
|
+
from blok import service
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class AdminCredentials:
|
|
8
|
+
password: str
|
|
9
|
+
username: str
|
|
10
|
+
email: str
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@service("live.arkitekt.secrets")
|
|
14
|
+
class SecretService(Protocol):
|
|
15
|
+
|
|
16
|
+
def retrieve_secret() -> str:
|
|
17
|
+
pass
|