arkitekt-next 0.12.1__tar.gz → 0.12.2__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.12.1 → arkitekt_next-0.12.2}/PKG-INFO +5 -5
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/__blok__.py +0 -2
- arkitekt_next-0.12.2/arkitekt_next/bloks/alpaka.py +104 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/arkitekt.py +4 -7
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/base.py +1 -8
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/gateway.py +0 -12
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/lok.py +2 -18
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/protocols.py +1 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/pyproject.toml +5 -5
- arkitekt_next-0.12.1/arkitekt_next/bloks/alpaka.py +0 -45
- arkitekt_next-0.12.1/arkitekt_next/bloks/local_sign.py +0 -261
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/.gitignore +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/LICENSE +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/README.md +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/protocols.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/service/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/service/fakts_next.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/service/fakts_qt.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/service/grant_registry.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/service/herre.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/service/herre_qt.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/apps/service/local_fakts.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/base_models.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/admin.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/channel.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/config.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/elektro.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/fluss.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/internal_docker.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/kabinet.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/kraph.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/livekit.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/mikro.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/minio.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/mount.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/namegen.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/ollama.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/orkestrator.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/postgres.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/redis.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/rekuest.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/secret.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/self_signed.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/admin.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/certer.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/channel.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/config.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/db.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/gateway.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/livekit.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/lok.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/mount.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/name.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/ollama.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/redis.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/s3.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/secret.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/services/socket.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/socket.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/bloks/tailscale.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/builders.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/call/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/call/local.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/call/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/call/remote.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/gen/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/gen/compile.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/gen/init.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/gen/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/gen/watch.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/init/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/init/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/inspect/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/inspect/implementations.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/inspect/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/inspect/requirements.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/inspect/variables.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/build.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/init.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/io.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/publish.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/stage.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/types.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/utils.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/kabinet/validate.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/manifest/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/manifest/inspect.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/manifest/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/manifest/scopes.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/manifest/version.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/run/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/run/dev.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/run/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/run/prod.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/commands/run/utils.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/constants.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/dockerfiles/vanilla.dockerfile +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/errors.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/inspect.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/io.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/main.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/options.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/fluss.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/gucker.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/kabinet.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/kluster.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/konviktion.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/kuay.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/mikro.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/mikro_next.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/napari.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/omero_ark.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/port.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/rekuest.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/rekuest_next.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/schemas/unlok.schema.graphql +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/templates/filter.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/templates/simple.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/texts.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/types.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/ui.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/utils.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/validators.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/vars.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/cli/versions/v1.yaml +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/constants.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/init_registry.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/__init__.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/dark/gear.png +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/dark/green pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/dark/orange pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/dark/pink pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/dark/red pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/light/gear.png +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/light/green pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/light/orange pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/light/pink pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/assets/light/red pulse.gif +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/builders.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/magic_bar.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/types.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/qt/utils.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/service_registry.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/tqdm.py +0 -0
- {arkitekt_next-0.12.1 → arkitekt_next-0.12.2}/arkitekt_next/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arkitekt-next
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.2
|
|
4
4
|
Summary: client for the arkitekt_next platform
|
|
5
5
|
Author-email: jhnnsrs <jhnnsrs@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -20,12 +20,12 @@ Requires-Dist: watchfiles>=1.0.5
|
|
|
20
20
|
Provides-Extra: all
|
|
21
21
|
Requires-Dist: fluss-next>=0.2.0; extra == 'all'
|
|
22
22
|
Requires-Dist: kabinet>=0.2.0; extra == 'all'
|
|
23
|
-
Requires-Dist: mikro-next>=0.
|
|
23
|
+
Requires-Dist: mikro-next>=0.4; extra == 'all'
|
|
24
24
|
Requires-Dist: reaktion-next>=0.2.0; extra == 'all'
|
|
25
25
|
Requires-Dist: rekuest-next>=0.7; extra == 'all'
|
|
26
26
|
Requires-Dist: rich-click>=1.6.1; extra == 'all'
|
|
27
27
|
Requires-Dist: semver>=3.0.1; extra == 'all'
|
|
28
|
-
Requires-Dist: turms>=0.
|
|
28
|
+
Requires-Dist: turms>=0.9; extra == 'all'
|
|
29
29
|
Requires-Dist: unlok-next>=0.2.0; extra == 'all'
|
|
30
30
|
Requires-Dist: watchfiles>=0.18.1; extra == 'all'
|
|
31
31
|
Provides-Extra: alpaka
|
|
@@ -33,7 +33,7 @@ Requires-Dist: alpaka>=0.2.0; extra == 'alpaka'
|
|
|
33
33
|
Provides-Extra: blok
|
|
34
34
|
Requires-Dist: blok>=0.1.0; extra == 'blok'
|
|
35
35
|
Provides-Extra: cli
|
|
36
|
-
Requires-Dist: turms>=0.
|
|
36
|
+
Requires-Dist: turms>=0.9.0; extra == 'cli'
|
|
37
37
|
Provides-Extra: elektro
|
|
38
38
|
Requires-Dist: elektro>=0.5.0; extra == 'elektro'
|
|
39
39
|
Provides-Extra: extended
|
|
@@ -48,7 +48,7 @@ Requires-Dist: kraph>=0.2.0; extra == 'kraph'
|
|
|
48
48
|
Provides-Extra: lovekit
|
|
49
49
|
Requires-Dist: lovekit>=0.2.0; extra == 'lovekit'
|
|
50
50
|
Provides-Extra: mikro
|
|
51
|
-
Requires-Dist: mikro-next>=0.
|
|
51
|
+
Requires-Dist: mikro-next>=0.4.0; extra == 'mikro'
|
|
52
52
|
Provides-Extra: reaktion
|
|
53
53
|
Requires-Dist: reaktion-next>=0.2.0; extra == 'reaktion'
|
|
54
54
|
Provides-Extra: unlok
|
|
@@ -21,7 +21,6 @@ from arkitekt_next.bloks.namegen import PreformedNamesBlok
|
|
|
21
21
|
from arkitekt_next.bloks.ollama import OllamaBlok
|
|
22
22
|
from arkitekt_next.bloks.self_signed import SelfSignedBlok
|
|
23
23
|
from arkitekt_next.bloks.kraph import KraphBlok
|
|
24
|
-
from arkitekt_next.bloks.local_sign import LocalSignBlok
|
|
25
24
|
from arkitekt_next.bloks.elektro import ElektroBlok
|
|
26
25
|
from blok.blok import Blok
|
|
27
26
|
|
|
@@ -51,6 +50,5 @@ def get_bloks() -> list[Blok]:
|
|
|
51
50
|
SecretBlok(),
|
|
52
51
|
PreformedNamesBlok(),
|
|
53
52
|
OrkestratorBlok(),
|
|
54
|
-
LocalSignBlok(),
|
|
55
53
|
ElektroBlok(),
|
|
56
54
|
]
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from typing import Dict, Any
|
|
2
|
+
import secrets
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
from arkitekt_next.bloks.services.admin import AdminService
|
|
6
|
+
from arkitekt_next.bloks.services.channel import ChannelService
|
|
7
|
+
from arkitekt_next.bloks.services.config import ConfigService
|
|
8
|
+
from arkitekt_next.bloks.services.db import DBService
|
|
9
|
+
from arkitekt_next.bloks.services.gateway import GatewayService
|
|
10
|
+
from arkitekt_next.bloks.services.lok import LokService
|
|
11
|
+
from arkitekt_next.bloks.services.mount import MountService
|
|
12
|
+
from arkitekt_next.bloks.services.redis import RedisService
|
|
13
|
+
from arkitekt_next.bloks.services.s3 import S3Service
|
|
14
|
+
from arkitekt_next.bloks.services.secret import SecretService
|
|
15
|
+
from blok import blok, InitContext, ExecutionContext, Option
|
|
16
|
+
from blok.bloks.services.dns import DnsService
|
|
17
|
+
from blok.tree import Repo, YamlFile
|
|
18
|
+
from arkitekt_next.bloks.base import BaseArkitektService
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@blok("live.arkitekt.alpaka", description="a container and app management service")
|
|
22
|
+
class AlpakaBlok(BaseArkitektService):
|
|
23
|
+
def __init__(self) -> None:
|
|
24
|
+
self.dev = False
|
|
25
|
+
self.host = "alpaka"
|
|
26
|
+
self.command = "bash run-debug.sh"
|
|
27
|
+
self.repo = "https://github.com/arkitektio/alpaka-server"
|
|
28
|
+
self.scopes = {
|
|
29
|
+
"alpaka_pull": "Pull new Models",
|
|
30
|
+
"alpaka_chat": "Add repositories to the database",
|
|
31
|
+
}
|
|
32
|
+
self.mount_repo = False
|
|
33
|
+
self.build_repo = False
|
|
34
|
+
self.buckets = ["media"]
|
|
35
|
+
self.secret_key = secrets.token_hex(16)
|
|
36
|
+
self.image = "jhnnsrs/alpaka:nightly"
|
|
37
|
+
|
|
38
|
+
def get_additional_config(self):
|
|
39
|
+
return {"ensured_repos": self.ensured_repos}
|
|
40
|
+
|
|
41
|
+
def preflight(
|
|
42
|
+
self,
|
|
43
|
+
init: InitContext,
|
|
44
|
+
lok: LokService,
|
|
45
|
+
db: DBService,
|
|
46
|
+
redis: RedisService,
|
|
47
|
+
s3: S3Service,
|
|
48
|
+
config: ConfigService,
|
|
49
|
+
channel: ChannelService,
|
|
50
|
+
mount: MountService,
|
|
51
|
+
admin: AdminService,
|
|
52
|
+
secret: SecretService,
|
|
53
|
+
gateway: GatewayService | None = None,
|
|
54
|
+
dns: DnsService = None,
|
|
55
|
+
mount_repo: bool = False,
|
|
56
|
+
host: str = "",
|
|
57
|
+
image: str = "",
|
|
58
|
+
secret_key: str = "",
|
|
59
|
+
build_repo: bool = False,
|
|
60
|
+
command: str = "",
|
|
61
|
+
repo: str = "",
|
|
62
|
+
disable: bool = False,
|
|
63
|
+
dev: bool = False,
|
|
64
|
+
):
|
|
65
|
+
return super().preflight(
|
|
66
|
+
init,
|
|
67
|
+
lok,
|
|
68
|
+
db,
|
|
69
|
+
redis,
|
|
70
|
+
s3,
|
|
71
|
+
config,
|
|
72
|
+
channel,
|
|
73
|
+
mount,
|
|
74
|
+
admin,
|
|
75
|
+
secret,
|
|
76
|
+
gateway,
|
|
77
|
+
dns,
|
|
78
|
+
mount_repo,
|
|
79
|
+
host,
|
|
80
|
+
image,
|
|
81
|
+
secret_key,
|
|
82
|
+
build_repo,
|
|
83
|
+
command,
|
|
84
|
+
repo,
|
|
85
|
+
disable,
|
|
86
|
+
dev,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def get_builder(self):
|
|
90
|
+
return "arkitekt.generic"
|
|
91
|
+
|
|
92
|
+
def build(self, context: ExecutionContext):
|
|
93
|
+
context.docker_compose.set_nested("services", self.host, self.service)
|
|
94
|
+
|
|
95
|
+
def get_additional_options(self):
|
|
96
|
+
with_repos = Option(
|
|
97
|
+
subcommand="repos",
|
|
98
|
+
help="The default repos to enable for the service",
|
|
99
|
+
default=self.secret_key,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
return [
|
|
103
|
+
with_repos,
|
|
104
|
+
]
|
|
@@ -3,6 +3,7 @@ from typing import Any, Dict, Optional
|
|
|
3
3
|
from pydantic import BaseModel
|
|
4
4
|
|
|
5
5
|
from arkitekt_next.bloks.kraph import KraphBlok
|
|
6
|
+
from arkitekt_next.bloks.lok import LokBlok
|
|
6
7
|
from arkitekt_next.bloks.tailscale import TailscaleBlok
|
|
7
8
|
from blok import InitContext, Panel, Renderer, blok
|
|
8
9
|
|
|
@@ -26,21 +27,17 @@ class AdminCredentials(BaseModel):
|
|
|
26
27
|
@blok(
|
|
27
28
|
"live.arkitekt",
|
|
28
29
|
dependencies=[
|
|
30
|
+
LokBlok.as_dependency(True, True),
|
|
29
31
|
MikroBlok.as_dependency(True, True),
|
|
30
32
|
KabinetBlok.as_dependency(True, True),
|
|
31
33
|
RekuestBlok.as_dependency(True, True),
|
|
32
34
|
FlussBlok.as_dependency(True, True),
|
|
33
35
|
InternalDockerBlok.as_dependency(True, True),
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
KraphBlok.as_dependency(True, False),
|
|
37
|
-
TailscaleBlok.as_dependency(True, False),
|
|
38
|
-
OllamaBlok.as_dependency(True, False),
|
|
39
|
-
ElektroBlok.as_dependency(True, False),
|
|
36
|
+
KraphBlok.as_dependency(True, True),
|
|
37
|
+
ElektroBlok.as_dependency(True, True),
|
|
40
38
|
],
|
|
41
39
|
)
|
|
42
40
|
class ArkitektBlok:
|
|
43
|
-
|
|
44
41
|
def entry(self, renderer: Renderer):
|
|
45
42
|
renderer.render(
|
|
46
43
|
Panel(
|
|
@@ -63,12 +63,10 @@ class BaseArkitektService:
|
|
|
63
63
|
redis: RedisService,
|
|
64
64
|
s3: S3Service,
|
|
65
65
|
config: ConfigService,
|
|
66
|
-
channel: ChannelService,
|
|
67
66
|
mount: MountService,
|
|
68
67
|
admin: AdminService,
|
|
69
68
|
secret: SecretService,
|
|
70
|
-
gateway:
|
|
71
|
-
dns: DnsService = None,
|
|
69
|
+
gateway: GatewayService,
|
|
72
70
|
mount_repo: bool = False,
|
|
73
71
|
host: str = "",
|
|
74
72
|
image: str = "",
|
|
@@ -100,12 +98,7 @@ class BaseArkitektService:
|
|
|
100
98
|
|
|
101
99
|
django_secret = secret.retrieve_secret()
|
|
102
100
|
|
|
103
|
-
dns_result = dns.get_dns_result()
|
|
104
|
-
|
|
105
101
|
csrf_trusted_origins = []
|
|
106
|
-
for hostname in dns_result.hostnames:
|
|
107
|
-
csrf_trusted_origins.append(f"http://{hostname}")
|
|
108
|
-
csrf_trusted_origins.append(f"https://{hostname}")
|
|
109
102
|
|
|
110
103
|
configuration = YamlFile(
|
|
111
104
|
**{
|
|
@@ -67,20 +67,13 @@ class CaddyBlok:
|
|
|
67
67
|
def preflight(
|
|
68
68
|
self,
|
|
69
69
|
init: InitContext,
|
|
70
|
-
dns: DnsService,
|
|
71
70
|
name: NameService,
|
|
72
|
-
certer: CerterService,
|
|
73
71
|
):
|
|
74
72
|
for key, value in init.kwargs.items():
|
|
75
73
|
setattr(self, key, value)
|
|
76
74
|
|
|
77
|
-
self.public_ips = dns.get_dns_result().ip_addresses
|
|
78
|
-
self.public_hosts = dns.get_dns_result().hostnames
|
|
79
75
|
self.gateway_network = name.retrieve_name().replace("-", "_")
|
|
80
76
|
|
|
81
|
-
self.cert_mount = certer.retrieve_certs_mount()
|
|
82
|
-
self.depends_on = certer.retrieve_depends_on()
|
|
83
|
-
|
|
84
77
|
def build(
|
|
85
78
|
self,
|
|
86
79
|
context: ExecutionContext,
|
|
@@ -95,7 +88,6 @@ class CaddyBlok:
|
|
|
95
88
|
if port.tls:
|
|
96
89
|
caddyfile += f"""
|
|
97
90
|
:{port.port} {{
|
|
98
|
-
tls /certs/caddy.crt /certs/caddy.key
|
|
99
91
|
reverse_proxy {port.host}:{port.to}
|
|
100
92
|
}}
|
|
101
93
|
"""
|
|
@@ -112,7 +104,6 @@ class CaddyBlok:
|
|
|
112
104
|
"""
|
|
113
105
|
caddyfile += (
|
|
114
106
|
"""
|
|
115
|
-
tls /certs/caddy.crt /certs/caddy.key
|
|
116
107
|
"""
|
|
117
108
|
if protocol == "https" and self.cert_mount
|
|
118
109
|
else ""
|
|
@@ -173,8 +164,6 @@ class CaddyBlok:
|
|
|
173
164
|
]
|
|
174
165
|
|
|
175
166
|
volumes = ["./configs/Caddyfile:/etc/caddy/Caddyfile"]
|
|
176
|
-
if self.cert_mount:
|
|
177
|
-
volumes.append(f"{self.cert_mount}:/certs")
|
|
178
167
|
|
|
179
168
|
caddy_container = {
|
|
180
169
|
"image": "caddy:latest",
|
|
@@ -184,7 +173,6 @@ class CaddyBlok:
|
|
|
184
173
|
]
|
|
185
174
|
+ exposed_ports_strings,
|
|
186
175
|
"volumes": volumes,
|
|
187
|
-
"depends_on": caddy_depends_on,
|
|
188
176
|
"networks": [self.gateway_network, "default"],
|
|
189
177
|
}
|
|
190
178
|
|
|
@@ -35,7 +35,7 @@ class UserParamType(click.ParamType):
|
|
|
35
35
|
return value
|
|
36
36
|
try:
|
|
37
37
|
name, password = value.split(":")
|
|
38
|
-
return {"
|
|
38
|
+
return {"username": name, "password": password}
|
|
39
39
|
except ValueError:
|
|
40
40
|
self.fail(
|
|
41
41
|
f"User '{value}' is not in the correct format. It should be 'name:password'.",
|
|
@@ -176,8 +176,6 @@ class LokBlok:
|
|
|
176
176
|
admin: AdminService,
|
|
177
177
|
secrets: SecretBlok,
|
|
178
178
|
s3: S3Service,
|
|
179
|
-
dns: DnsService,
|
|
180
|
-
livekit: Optional[LivekitService] = None,
|
|
181
179
|
):
|
|
182
180
|
for key, value in init.kwargs.items():
|
|
183
181
|
setattr(self, key, value)
|
|
@@ -193,9 +191,6 @@ class LokBlok:
|
|
|
193
191
|
self.redis_access = redis.register()
|
|
194
192
|
self.admin_access = admin.retrieve()
|
|
195
193
|
self.s3_access = s3.create_buckets(self.buckets)
|
|
196
|
-
if livekit:
|
|
197
|
-
self.local_access = livekit.retrieve_access()
|
|
198
|
-
self.dns_result = dns.get_dns_result()
|
|
199
194
|
self.initialized = True
|
|
200
195
|
|
|
201
196
|
def build(self, context: ExecutionContext):
|
|
@@ -206,7 +201,7 @@ class LokBlok:
|
|
|
206
201
|
|
|
207
202
|
if self.postgress_access.dependency:
|
|
208
203
|
depends_on.append(self.postgress_access.dependency)
|
|
209
|
-
|
|
204
|
+
|
|
210
205
|
if self.s3_access.dependency:
|
|
211
206
|
depends_on.append(self.s3_access.dependency)
|
|
212
207
|
|
|
@@ -219,7 +214,6 @@ class LokBlok:
|
|
|
219
214
|
"volumes": [
|
|
220
215
|
"/var/run/docker.sock:/var/run/docker.sock",
|
|
221
216
|
"./configs/lok.yaml:/workspace/config.yaml",
|
|
222
|
-
"./certs:/certs",
|
|
223
217
|
],
|
|
224
218
|
}
|
|
225
219
|
|
|
@@ -237,10 +231,6 @@ class LokBlok:
|
|
|
237
231
|
|
|
238
232
|
trusted_origins = []
|
|
239
233
|
|
|
240
|
-
for i in self.dns_result.hostnames:
|
|
241
|
-
trusted_origins.append(f"http://{i}")
|
|
242
|
-
trusted_origins.append(f"https://{i}")
|
|
243
|
-
|
|
244
234
|
configuration = YamlFile(
|
|
245
235
|
**{
|
|
246
236
|
"db": asdict(self.postgress_access),
|
|
@@ -262,14 +252,8 @@ class LokBlok:
|
|
|
262
252
|
],
|
|
263
253
|
"groups": [group for group in self.groups],
|
|
264
254
|
"deployment": {"name": self.deployment_name},
|
|
265
|
-
"livekit": (
|
|
266
|
-
asdict(self.local_access)
|
|
267
|
-
if self.local_access
|
|
268
|
-
else {"api_key": "dev", "api_secret": "secret", "api_url": None}
|
|
269
|
-
),
|
|
270
255
|
"s3": asdict(self.s3_access),
|
|
271
256
|
"token_expire_seconds": self.token_expiry_seconds,
|
|
272
|
-
"apps": [],
|
|
273
257
|
"force_script_name": "lok",
|
|
274
258
|
"csrf_trusted_origins": trusted_origins,
|
|
275
259
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "arkitekt-next"
|
|
3
|
-
version = "0.12.
|
|
3
|
+
version = "0.12.2"
|
|
4
4
|
description = "client for the arkitekt_next platform"
|
|
5
5
|
authors = [{ name = "jhnnsrs", email = "jhnnsrs@gmail.com" }]
|
|
6
6
|
requires-python = ">=3.11,<4"
|
|
@@ -22,11 +22,11 @@ dependencies = [
|
|
|
22
22
|
|
|
23
23
|
[project.optional-dependencies]
|
|
24
24
|
cli = [
|
|
25
|
-
"turms>=0.
|
|
25
|
+
"turms>=0.9.0",
|
|
26
26
|
]
|
|
27
27
|
alpaka = ["alpaka>=0.2.0"]
|
|
28
28
|
kraph = ["kraph>=0.2.0"]
|
|
29
|
-
mikro = ["mikro-next>=0.
|
|
29
|
+
mikro = ["mikro-next>=0.4.0"]
|
|
30
30
|
kabinet = ["kabinet>=0.4.0"]
|
|
31
31
|
elektro = ["elektro>=0.5.0"]
|
|
32
32
|
fluss = ["fluss-next>=0.2.0"]
|
|
@@ -36,11 +36,11 @@ unlok = ["unlok-next>=0.2.0"]
|
|
|
36
36
|
all = [
|
|
37
37
|
"rich-click>=1.6.1",
|
|
38
38
|
"watchfiles>=0.18.1",
|
|
39
|
-
"turms>=0.
|
|
39
|
+
"turms>=0.9",
|
|
40
40
|
"semver>=3.0.1",
|
|
41
41
|
"reaktion-next>=0.2.0",
|
|
42
42
|
"rekuest-next>=0.7",
|
|
43
|
-
"mikro-next>=0.
|
|
43
|
+
"mikro-next>=0.4",
|
|
44
44
|
"kabinet>=0.2.0",
|
|
45
45
|
"fluss-next>=0.2.0",
|
|
46
46
|
"unlok-next>=0.2.0",
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
from typing import Dict, Any
|
|
2
|
-
import secrets
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
from blok import blok, InitContext, ExecutionContext, Option
|
|
6
|
-
from blok.tree import Repo, YamlFile
|
|
7
|
-
from arkitekt_next.bloks.base import BaseArkitektService
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@blok("live.arkitekt.alpaka", description="a container and app management service")
|
|
11
|
-
class AlpakaBlok(BaseArkitektService):
|
|
12
|
-
def __init__(self) -> None:
|
|
13
|
-
self.dev = False
|
|
14
|
-
self.host = "alpaka"
|
|
15
|
-
self.command = "bash run-debug.sh"
|
|
16
|
-
self.repo = "https://github.com/jhnnsrs/alpaka-server"
|
|
17
|
-
self.scopes = {
|
|
18
|
-
"alpaka_pull": "Pull new Models",
|
|
19
|
-
"alpaka_chat": "Add repositories to the database",
|
|
20
|
-
}
|
|
21
|
-
self.mount_repo = False
|
|
22
|
-
self.build_repo = False
|
|
23
|
-
self.buckets = ["media"]
|
|
24
|
-
self.secret_key = secrets.token_hex(16)
|
|
25
|
-
self.image = "jhnnsrs/alpaka:next"
|
|
26
|
-
|
|
27
|
-
def get_additional_config(self):
|
|
28
|
-
return {"ensured_repos": self.ensured_repos}
|
|
29
|
-
|
|
30
|
-
def get_builder(self):
|
|
31
|
-
return "arkitekt.generic"
|
|
32
|
-
|
|
33
|
-
def build(self, context: ExecutionContext):
|
|
34
|
-
context.docker_compose.set_nested("services", self.host, self.service)
|
|
35
|
-
|
|
36
|
-
def get_additional_options(self):
|
|
37
|
-
with_repos = Option(
|
|
38
|
-
subcommand="repos",
|
|
39
|
-
help="The default repos to enable for the service",
|
|
40
|
-
default=self.secret_key,
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
return [
|
|
44
|
-
with_repos,
|
|
45
|
-
]
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import click
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel
|
|
4
|
-
from cryptography.hazmat.primitives import serialization as crypto_serialization
|
|
5
|
-
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
6
|
-
from cryptography.hazmat.backends import default_backend as crypto_default_backend
|
|
7
|
-
from typing import Dict, Optional
|
|
8
|
-
from arkitekt_next.bloks.secret import SecretBlok
|
|
9
|
-
from arkitekt_next.bloks.services.admin import AdminService
|
|
10
|
-
from arkitekt_next.bloks.services.db import DBService
|
|
11
|
-
from arkitekt_next.bloks.services.gateway import GatewayService
|
|
12
|
-
from arkitekt_next.bloks.services.livekit import LivekitService
|
|
13
|
-
from arkitekt_next.bloks.services.lok import LokCredentials, LokService
|
|
14
|
-
import yaml
|
|
15
|
-
import secrets
|
|
16
|
-
from dataclasses import asdict
|
|
17
|
-
|
|
18
|
-
from arkitekt_next.bloks.services.redis import RedisService
|
|
19
|
-
from blok import blok, InitContext, ExecutionContext, Option
|
|
20
|
-
from blok.bloks.services.dns import DnsService
|
|
21
|
-
from blok.tree import YamlFile, Repo
|
|
22
|
-
from blok import blok, InitContext
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
DEFAULT_ARKITEKT_URL = "http://localhost:8000"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
# Define a custom user type that will parse and validate the user input
|
|
29
|
-
class UserParamType(click.ParamType):
|
|
30
|
-
name = "user"
|
|
31
|
-
|
|
32
|
-
def convert(self, value, param, ctx):
|
|
33
|
-
if isinstance(value, dict):
|
|
34
|
-
return value
|
|
35
|
-
try:
|
|
36
|
-
name, password = value.split(":")
|
|
37
|
-
return {"name": name, "password": password}
|
|
38
|
-
except ValueError:
|
|
39
|
-
self.fail(
|
|
40
|
-
f"User '{value}' is not in the correct format. It should be 'name:password'.",
|
|
41
|
-
param,
|
|
42
|
-
ctx,
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
USER = UserParamType()
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
# Define a custom user type that will parse and validate the user input
|
|
50
|
-
class GroupParamType(click.ParamType):
|
|
51
|
-
name = "group"
|
|
52
|
-
|
|
53
|
-
def convert(self, value, param, ctx):
|
|
54
|
-
if isinstance(value, dict):
|
|
55
|
-
return value
|
|
56
|
-
try:
|
|
57
|
-
name, description = value.split(":")
|
|
58
|
-
return {"name": name, "description": description}
|
|
59
|
-
except ValueError:
|
|
60
|
-
self.fail(
|
|
61
|
-
f"User '{value}' is not in the correct format. It should be 'name:password'.",
|
|
62
|
-
param,
|
|
63
|
-
ctx,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
GROUP = GroupParamType()
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class RedeemTokenParamType(click.ParamType):
|
|
71
|
-
name = "redeem_token"
|
|
72
|
-
|
|
73
|
-
def convert(self, value, param, ctx):
|
|
74
|
-
if isinstance(value, dict):
|
|
75
|
-
assert "user" in value, f"scope is required {value}"
|
|
76
|
-
assert "token" in value, f"description is required {value}"
|
|
77
|
-
return value
|
|
78
|
-
|
|
79
|
-
try:
|
|
80
|
-
user, token = value.split(":")
|
|
81
|
-
return {"user": user, "token": token}
|
|
82
|
-
except ValueError:
|
|
83
|
-
self.fail(
|
|
84
|
-
f"RedeemToken '{value}' is not in the correct format. It should be 'username:token'.",
|
|
85
|
-
param,
|
|
86
|
-
ctx,
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
TOKEN = RedeemTokenParamType()
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class ScopeParamType(click.ParamType):
|
|
94
|
-
name = "scope"
|
|
95
|
-
|
|
96
|
-
def convert(self, value, param, ctx):
|
|
97
|
-
if isinstance(value, dict):
|
|
98
|
-
assert "scope" in value, f"scope is required {value}"
|
|
99
|
-
assert "description" in value, f"description is required {value}"
|
|
100
|
-
return value
|
|
101
|
-
|
|
102
|
-
try:
|
|
103
|
-
name, description = value.split(":")
|
|
104
|
-
return {"scope": name, "description": description}
|
|
105
|
-
except ValueError:
|
|
106
|
-
self.fail(
|
|
107
|
-
f"Scopes '{value}' is not in the correct format. It should be 'scope:description'.",
|
|
108
|
-
param,
|
|
109
|
-
ctx,
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
SCOPE = ScopeParamType()
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
@blok(LokService, description="A local sign service")
|
|
117
|
-
class LocalSignBlok:
|
|
118
|
-
db_name: str
|
|
119
|
-
|
|
120
|
-
def __init__(self) -> None:
|
|
121
|
-
self.db_name = "lok_db"
|
|
122
|
-
self.mount_repo = False
|
|
123
|
-
self.build_repo = False
|
|
124
|
-
self.private_key = None
|
|
125
|
-
self.public_key = None
|
|
126
|
-
self.host = "lok"
|
|
127
|
-
self.dev = False
|
|
128
|
-
self.with_repo = False
|
|
129
|
-
self.users = []
|
|
130
|
-
self.tokens = []
|
|
131
|
-
self.groups = []
|
|
132
|
-
self.scopes = {}
|
|
133
|
-
self.key = None
|
|
134
|
-
self.deployment_name = "default"
|
|
135
|
-
self.token_expiry_seconds = 700000
|
|
136
|
-
self.preformed_redeem_tokens = [secrets.token_hex(16) for i in range(80)]
|
|
137
|
-
self.registered_tokens = {}
|
|
138
|
-
self.local_access = None
|
|
139
|
-
|
|
140
|
-
def retrieve_credentials(self) -> LokCredentials:
|
|
141
|
-
return LokCredentials(
|
|
142
|
-
public_key=self.public_key, key_type="RS256", issuer="lok"
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
def retrieve_labels(self, service_name: str, builder_name: str) -> list[str]:
|
|
146
|
-
return [
|
|
147
|
-
f"fakts.service={service_name}",
|
|
148
|
-
f"fakts.builder={builder_name}",
|
|
149
|
-
]
|
|
150
|
-
|
|
151
|
-
def retrieve_token(self, user: str = "admin") -> str:
|
|
152
|
-
pass
|
|
153
|
-
return "fake-token"
|
|
154
|
-
|
|
155
|
-
def register_scopes(self, scopes_dict: Dict[str, str]) -> LokCredentials:
|
|
156
|
-
self.scopes = self.scopes | scopes_dict
|
|
157
|
-
|
|
158
|
-
def preflight(
|
|
159
|
-
self,
|
|
160
|
-
init: InitContext
|
|
161
|
-
):
|
|
162
|
-
for key, value in init.kwargs.items():
|
|
163
|
-
setattr(self, key, value)
|
|
164
|
-
|
|
165
|
-
assert self.public_key, "Public key is required"
|
|
166
|
-
assert self.private_key, "Private key is required"
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
def build(self, context: ExecutionContext):
|
|
170
|
-
context.file_tree.set_nested("secrets", "public_key.pem", self.public_key)
|
|
171
|
-
context.file_tree.set_nested("secrets", "private_key.pem", self.private_key)
|
|
172
|
-
|
|
173
|
-
def get_options(self):
|
|
174
|
-
key = rsa.generate_private_key(
|
|
175
|
-
public_exponent=65537, key_size=2048, backend=crypto_default_backend()
|
|
176
|
-
)
|
|
177
|
-
|
|
178
|
-
private_key = key.private_bytes(
|
|
179
|
-
crypto_serialization.Encoding.PEM,
|
|
180
|
-
crypto_serialization.PrivateFormat.PKCS8,
|
|
181
|
-
crypto_serialization.NoEncryption(),
|
|
182
|
-
).decode()
|
|
183
|
-
|
|
184
|
-
public_key = (
|
|
185
|
-
key.public_key()
|
|
186
|
-
.public_bytes(
|
|
187
|
-
crypto_serialization.Encoding.OpenSSH,
|
|
188
|
-
crypto_serialization.PublicFormat.OpenSSH,
|
|
189
|
-
)
|
|
190
|
-
.decode()
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
with_dev = Option(
|
|
194
|
-
subcommand="dev",
|
|
195
|
-
help="Run the service in development mode",
|
|
196
|
-
type=bool,
|
|
197
|
-
default=self.dev,
|
|
198
|
-
show_default=True,
|
|
199
|
-
)
|
|
200
|
-
|
|
201
|
-
with_fakts_url = Option(
|
|
202
|
-
subcommand="db_name",
|
|
203
|
-
help="The name of the database",
|
|
204
|
-
default="db_name",
|
|
205
|
-
show_default=True,
|
|
206
|
-
)
|
|
207
|
-
with_users = Option(
|
|
208
|
-
subcommand="users",
|
|
209
|
-
help="Users that should be greated by default. Format is name:password",
|
|
210
|
-
default=["admin:admin"],
|
|
211
|
-
multiple=True,
|
|
212
|
-
type=USER,
|
|
213
|
-
show_default=True,
|
|
214
|
-
)
|
|
215
|
-
with_groups = Option(
|
|
216
|
-
subcommand="groups",
|
|
217
|
-
help="Groups that should be greated by default. Format is name:description",
|
|
218
|
-
default=["admin:admin_group"],
|
|
219
|
-
multiple=True,
|
|
220
|
-
type=GROUP,
|
|
221
|
-
show_default=True,
|
|
222
|
-
)
|
|
223
|
-
with_public_key = Option(
|
|
224
|
-
subcommand="public_key",
|
|
225
|
-
help="The public key for the JWT creation",
|
|
226
|
-
default=public_key,
|
|
227
|
-
required=True,
|
|
228
|
-
callback=validate_public_key,
|
|
229
|
-
)
|
|
230
|
-
with_private_key = Option(
|
|
231
|
-
subcommand="private_key",
|
|
232
|
-
help="The corresponding private key for the JWT creation",
|
|
233
|
-
default=private_key,
|
|
234
|
-
callback=validate_private_key,
|
|
235
|
-
required=True,
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
return [
|
|
239
|
-
with_dev,
|
|
240
|
-
with_fakts_url,
|
|
241
|
-
with_users,
|
|
242
|
-
with_groups,
|
|
243
|
-
with_private_key,
|
|
244
|
-
with_public_key,
|
|
245
|
-
]
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
def validate_public_key(ctx, param, value):
|
|
249
|
-
if not value.startswith("ssh-rsa"):
|
|
250
|
-
raise click.BadParameter(
|
|
251
|
-
f"Public key must be in ssh-rsa format. Started with {value}"
|
|
252
|
-
)
|
|
253
|
-
return value
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
def validate_private_key(ctx, param, value):
|
|
257
|
-
if not value.startswith("-----BEGIN PRIVATE KEY-----"):
|
|
258
|
-
raise click.BadParameter(
|
|
259
|
-
f"Private key must be in PEM format. Started with {value}"
|
|
260
|
-
)
|
|
261
|
-
return value
|