spaceforge 0.0.6__tar.gz → 0.0.8__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.
- {spaceforge-0.0.6 → spaceforge-0.0.8}/PKG-INFO +1 -1
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/enviroment_manager/plugin.py +5 -2
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/enviroment_manager/plugin.yaml +12 -9
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/infracost/plugin.py +1 -1
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/infracost/plugin.yaml +2 -2
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/sops/plugin.py +1 -1
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/sops/plugin.yaml +3 -3
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/wiz/plugin.py +1 -1
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/wiz/plugin.yaml +2 -2
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/_version_scm.py +3 -3
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/generator.py +2 -1
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/plugin.py +34 -19
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/PKG-INFO +1 -1
- {spaceforge-0.0.6 → spaceforge-0.0.8}/.github/workflows/ci.yml +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/.github/workflows/release.yml +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/.gitignore +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/LICENSE +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/MANIFEST.in +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/README.md +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/go.mod +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/enviroment_manager/requirements.txt +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/plugins/sops/requirements.txt +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/pyproject.toml +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/setup.cfg +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/setup.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/README.md +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/__init__.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/__main__.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/_version.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/cls.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/conftest.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/runner.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/schema.json +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/templates/binary_install.sh.j2 +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/templates/ensure_spaceforge_and_run.sh.j2 +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_cls.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_binaries.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_core.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_hooks.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_generator_parameters.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin_file_operations.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin_hooks.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_plugin_inheritance.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner_cli.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner_core.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge/test_runner_execution.py +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/SOURCES.txt +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/dependency_links.txt +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/entry_points.txt +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/not-zip-safe +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/requires.txt +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/spaceforge.egg-info/top_level.txt +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/templates.go +0 -0
- {spaceforge-0.0.6 → spaceforge-0.0.8}/test.sh +0 -0
|
@@ -149,6 +149,9 @@ resource "spacelift_environment_variable" "__this" {
|
|
|
149
149
|
)
|
|
150
150
|
]
|
|
151
151
|
|
|
152
|
+
def __init__(self):
|
|
153
|
+
super().__init__()
|
|
154
|
+
|
|
152
155
|
def load_yaml_file(self, file_path):
|
|
153
156
|
"""Load YAML file and return parsed content"""
|
|
154
157
|
try:
|
|
@@ -190,13 +193,13 @@ resource "spacelift_environment_variable" "__this" {
|
|
|
190
193
|
query = "{ stack(id: \"" + stack_id + "\") { trackedCommit { hash } } }"
|
|
191
194
|
response = self.query_api(query)
|
|
192
195
|
if "errors" in response:
|
|
193
|
-
self.logger.error("Error fetching stack tracked commit:
|
|
196
|
+
self.logger.error(f"Error fetching stack tracked commit: {response['errors']}")
|
|
194
197
|
continue
|
|
195
198
|
|
|
196
199
|
# Ensure we have a tracked commit
|
|
197
200
|
try:
|
|
198
201
|
tracked_commit = response["data"]["stack"]["trackedCommit"]["hash"]
|
|
199
|
-
except TypeError:
|
|
202
|
+
except (TypeError, KeyError):
|
|
200
203
|
tracked_commit = None
|
|
201
204
|
if tracked_commit is None:
|
|
202
205
|
self.logger.error(f"Stack {stack_id} has no tracked commit. Skipping.")
|
|
@@ -130,10 +130,10 @@ contexts:
|
|
|
130
130
|
write_only = each.value.write_only
|
|
131
131
|
}
|
|
132
132
|
sensitive: false
|
|
133
|
-
- path: /mnt/workspace/plugins/
|
|
133
|
+
- path: /mnt/workspace/plugins/environment_manager/requirements.txt
|
|
134
134
|
content: pyyaml==6.0.2
|
|
135
135
|
sensitive: false
|
|
136
|
-
- path: /mnt/workspace/plugins/
|
|
136
|
+
- path: /mnt/workspace/plugins/environment_manager/plugin.py
|
|
137
137
|
content: |-
|
|
138
138
|
from spaceforge import SpaceforgePlugin, MountedFile, Context
|
|
139
139
|
|
|
@@ -286,6 +286,9 @@ contexts:
|
|
|
286
286
|
)
|
|
287
287
|
]
|
|
288
288
|
|
|
289
|
+
def __init__(self):
|
|
290
|
+
super().__init__()
|
|
291
|
+
|
|
289
292
|
def load_yaml_file(self, file_path):
|
|
290
293
|
"""Load YAML file and return parsed content"""
|
|
291
294
|
try:
|
|
@@ -327,13 +330,13 @@ contexts:
|
|
|
327
330
|
query = "{ stack(id: \"" + stack_id + "\") { trackedCommit { hash } } }"
|
|
328
331
|
response = self.query_api(query)
|
|
329
332
|
if "errors" in response:
|
|
330
|
-
self.logger.error("Error fetching stack tracked commit:
|
|
333
|
+
self.logger.error(f"Error fetching stack tracked commit: {response['errors']}")
|
|
331
334
|
continue
|
|
332
335
|
|
|
333
336
|
# Ensure we have a tracked commit
|
|
334
337
|
try:
|
|
335
338
|
tracked_commit = response["data"]["stack"]["trackedCommit"]["hash"]
|
|
336
|
-
except TypeError:
|
|
339
|
+
except (TypeError, KeyError):
|
|
337
340
|
tracked_commit = None
|
|
338
341
|
if tracked_commit is None:
|
|
339
342
|
self.logger.error(f"Stack {stack_id} has no tracked commit. Skipping.")
|
|
@@ -384,13 +387,13 @@ contexts:
|
|
|
384
387
|
# Trigger stack previews
|
|
385
388
|
self.trigger_stack_previews(runtime_config)
|
|
386
389
|
sensitive: false
|
|
387
|
-
- path: /mnt/workspace/plugins/
|
|
390
|
+
- path: /mnt/workspace/plugins/environment_manager/before_init.sh
|
|
388
391
|
content: |-
|
|
389
392
|
#!/bin/sh
|
|
390
393
|
|
|
391
394
|
set -e
|
|
392
395
|
|
|
393
|
-
cd /mnt/workspace/plugins/
|
|
396
|
+
cd /mnt/workspace/plugins/environment_manager
|
|
394
397
|
|
|
395
398
|
if [ ! -d "./venv" ]; then
|
|
396
399
|
python -m venv ./venv
|
|
@@ -407,10 +410,10 @@ contexts:
|
|
|
407
410
|
fi
|
|
408
411
|
|
|
409
412
|
cd /mnt/workspace/source/$TF_VAR_spacelift_project_root
|
|
410
|
-
spaceforge runner --plugin-file /mnt/workspace/plugins/
|
|
413
|
+
spaceforge runner --plugin-file /mnt/workspace/plugins/environment_manager/plugin.py before_init
|
|
411
414
|
sensitive: false
|
|
412
415
|
hooks:
|
|
413
416
|
before_init:
|
|
414
417
|
- mv /mnt/workspace/__environment_manager.tf /mnt/workspace/source/$TF_VAR_spacelift_project_root/__environment_manager.tf
|
|
415
|
-
- mkdir -p /mnt/workspace/plugins/
|
|
416
|
-
- chmod +x /mnt/workspace/plugins/
|
|
418
|
+
- mkdir -p /mnt/workspace/plugins/environment_manager
|
|
419
|
+
- chmod +x /mnt/workspace/plugins/environment_manager/before_init.sh && /mnt/workspace/plugins/environment_manager/before_init.sh
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name:
|
|
1
|
+
name: Infracost
|
|
2
2
|
version: 1.0.0
|
|
3
3
|
description: A plugin for integrating with Infracost to estimate costs of infrastructure changes.
|
|
4
4
|
author: Spacelift Team
|
|
@@ -29,7 +29,7 @@ contexts:
|
|
|
29
29
|
"""
|
|
30
30
|
|
|
31
31
|
# Plugin metadata
|
|
32
|
-
__plugin_name__ = "
|
|
32
|
+
__plugin_name__ = "Infracost"
|
|
33
33
|
__labels__ = ["cost estimation", "infrastructure"]
|
|
34
34
|
__version__ = "1.0.0"
|
|
35
35
|
__author__ = "Spacelift Team"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name:
|
|
1
|
+
name: Sops
|
|
2
2
|
version: 1.0.0
|
|
3
3
|
description: |-
|
|
4
4
|
# Plugin Sops
|
|
@@ -35,7 +35,7 @@ labels:
|
|
|
35
35
|
- encryption
|
|
36
36
|
contexts:
|
|
37
37
|
- name_prefix: sops
|
|
38
|
-
description: Main context for
|
|
38
|
+
description: Main context for Sops
|
|
39
39
|
env: []
|
|
40
40
|
mounted_files:
|
|
41
41
|
- path: /mnt/workspace/plugins/sops/requirements.txt
|
|
@@ -84,7 +84,7 @@ contexts:
|
|
|
84
84
|
"""
|
|
85
85
|
|
|
86
86
|
# Plugin metadata
|
|
87
|
-
__plugin_name__ = "
|
|
87
|
+
__plugin_name__ = "Sops"
|
|
88
88
|
__labels__ = ["secrets management", "encryption"]
|
|
89
89
|
__version__ = "1.0.0"
|
|
90
90
|
__author__ = "Spacelift Team"
|
|
@@ -23,7 +23,7 @@ Samples of these policies are included with the plugin.
|
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
25
|
# Plugin metadata
|
|
26
|
-
__plugin_name__ = "
|
|
26
|
+
__plugin_name__ = "Wiz"
|
|
27
27
|
__labels__ = ["security", "code scanning", "vulnerability"]
|
|
28
28
|
__version__ = "1.0.0"
|
|
29
29
|
__author__ = "Spacelift Team"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name:
|
|
1
|
+
name: Wiz
|
|
2
2
|
version: 1.0.0
|
|
3
3
|
description: |-
|
|
4
4
|
# Plugin Wiz
|
|
@@ -69,7 +69,7 @@ contexts:
|
|
|
69
69
|
"""
|
|
70
70
|
|
|
71
71
|
# Plugin metadata
|
|
72
|
-
__plugin_name__ = "
|
|
72
|
+
__plugin_name__ = "Wiz"
|
|
73
73
|
__labels__ = ["security", "code scanning", "vulnerability"]
|
|
74
74
|
__version__ = "1.0.0"
|
|
75
75
|
__author__ = "Spacelift Team"
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.0.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 0,
|
|
31
|
+
__version__ = version = '0.0.8'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 0, 8)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g3b76eed20'
|
|
@@ -84,7 +84,8 @@ class PluginGenerator:
|
|
|
84
84
|
self.plugin_class = plugin_class
|
|
85
85
|
self.plugin_instance = plugin_class()
|
|
86
86
|
self.plugin_working_directory = (
|
|
87
|
-
"/mnt/workspace/plugins/"
|
|
87
|
+
"/mnt/workspace/plugins/"
|
|
88
|
+
+ plugin_class.__plugin_name__.lower().replace(" ", "_")
|
|
88
89
|
)
|
|
89
90
|
self.config = {
|
|
90
91
|
"setup_virtual_env": (
|
|
@@ -8,6 +8,7 @@ import logging
|
|
|
8
8
|
import os
|
|
9
9
|
import subprocess
|
|
10
10
|
import urllib.request
|
|
11
|
+
from urllib.error import HTTPError
|
|
11
12
|
from abc import ABC
|
|
12
13
|
from typing import Any, Dict, List, Optional, Tuple
|
|
13
14
|
|
|
@@ -48,14 +49,14 @@ class SpaceforgePlugin(ABC):
|
|
|
48
49
|
if self.spacelift_domain and isinstance(self.spacelift_domain, str):
|
|
49
50
|
# this must occur after we check if spacelift domain is false
|
|
50
51
|
# because the domain could be set but not start with https://
|
|
51
|
-
if self.spacelift_domain.startswith("https://"):
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
else:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
# if self.spacelift_domain.startswith("https://"):
|
|
53
|
+
# if self.spacelift_domain.endswith("/"):
|
|
54
|
+
# self.spacelift_domain = self.spacelift_domain[:-1]
|
|
55
|
+
# else:
|
|
56
|
+
# self.logger.warning(
|
|
57
|
+
# "SPACELIFT_DOMAIN does not start with https://, api calls will fail."
|
|
58
|
+
# )
|
|
59
|
+
# self._api_enabled = False
|
|
59
60
|
|
|
60
61
|
if self._api_enabled:
|
|
61
62
|
self._spacelift_markdown_endpoint = self.spacelift_domain.replace(
|
|
@@ -204,8 +205,17 @@ class SpaceforgePlugin(ABC):
|
|
|
204
205
|
json.dumps(data).encode("utf-8"),
|
|
205
206
|
headers,
|
|
206
207
|
)
|
|
207
|
-
|
|
208
|
-
|
|
208
|
+
|
|
209
|
+
try:
|
|
210
|
+
with urllib.request.urlopen(req) as response:
|
|
211
|
+
resp: Dict[str, Any] = json.loads(response.read().decode("utf-8"))
|
|
212
|
+
except urllib.error.HTTPError as e:
|
|
213
|
+
if hasattr(e, 'read'):
|
|
214
|
+
resp = json.loads(e.read().decode('utf-8'))
|
|
215
|
+
else:
|
|
216
|
+
# We should not get here, but if we do re-raise the exception
|
|
217
|
+
self.logger.error(f"HTTP error occurred: ({e.code}) {e.reason} {e.msg}")
|
|
218
|
+
raise e
|
|
209
219
|
|
|
210
220
|
if "errors" in resp:
|
|
211
221
|
self.logger.error(f"Error: {resp['errors']}")
|
|
@@ -287,8 +297,8 @@ class SpaceforgePlugin(ABC):
|
|
|
287
297
|
headers = resp["headers"]
|
|
288
298
|
headers["Content-Type"] = "text/markdown"
|
|
289
299
|
headers["Content-Length"] = str(len(markdown))
|
|
290
|
-
except
|
|
291
|
-
self.logger.error(f"HTTP error occurred: {e.code}
|
|
300
|
+
except HTTPError as e:
|
|
301
|
+
self.logger.error(f"HTTP error occurred: ({e.code}) {e.reason} {e.msg}")
|
|
292
302
|
return False
|
|
293
303
|
|
|
294
304
|
# Now we upload the markdown content to the signed URL
|
|
@@ -299,13 +309,18 @@ class SpaceforgePlugin(ABC):
|
|
|
299
309
|
method="PUT",
|
|
300
310
|
)
|
|
301
311
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
312
|
+
try:
|
|
313
|
+
with urllib.request.urlopen(req) as put_response:
|
|
314
|
+
if put_response.status != 200:
|
|
315
|
+
self.logger.error(
|
|
316
|
+
f"Error uploading markdown content: {put_response.status}"
|
|
317
|
+
)
|
|
318
|
+
return False
|
|
319
|
+
self.logger.debug("Markdown content uploaded successfully.")
|
|
320
|
+
except HTTPError as e:
|
|
321
|
+
self.logger.error(f"HTTP error occurred during upload: ({e.code}) {e.reason} {e.msg}")
|
|
322
|
+
return False
|
|
323
|
+
|
|
309
324
|
return True
|
|
310
325
|
|
|
311
326
|
def add_to_policy_input(self, input_name: str, data: Dict[str, Any]) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|