spaceforge 0.0.12__tar.gz → 0.0.14__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.12 → spaceforge-0.0.14}/PKG-INFO +1 -1
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/enviroment_manager/plugin.py +32 -1
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/enviroment_manager/plugin.yaml +50 -2
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/_version_scm.py +3 -3
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/cls.py +5 -2
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/plugin.py +58 -2
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/schema.json +12 -5
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/PKG-INFO +1 -1
- {spaceforge-0.0.12 → spaceforge-0.0.14}/.github/workflows/ci.yml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/.github/workflows/release.yml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/.gitignore +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/LICENSE +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/MANIFEST.in +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/README.md +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/go.mod +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/enviroment_manager/requirements.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/infracost/plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/infracost/plugin.yaml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/sops/plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/sops/plugin.yaml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/sops/requirements.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/wiz/plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/wiz/plugin.yaml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/pyproject.toml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/setup.cfg +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/setup.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/README.md +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/__init__.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/__main__.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/_version.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/conftest.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/generator.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/runner.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/templates/binary_install.sh.j2 +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/templates/ensure_spaceforge_and_run.sh.j2 +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_cls.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_binaries.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_core.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_hooks.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_parameters.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin_file_operations.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin_hooks.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin_inheritance.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner_cli.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner_core.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner_execution.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/SOURCES.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/dependency_links.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/entry_points.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/not-zip-safe +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/requires.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/top_level.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/templates.go +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.14}/test.sh +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from spaceforge import SpaceforgePlugin, MountedFile, Context
|
|
1
|
+
from spaceforge import SpaceforgePlugin, MountedFile, Context, Parameter, Variable
|
|
2
2
|
|
|
3
3
|
import yaml
|
|
4
4
|
import os
|
|
@@ -107,6 +107,22 @@ The above configuration will create the following in a plan:
|
|
|
107
107
|
__version__ = "1.0.0"
|
|
108
108
|
__author__ = "Spacelift Team"
|
|
109
109
|
|
|
110
|
+
__parameters__ = [
|
|
111
|
+
Parameter(
|
|
112
|
+
name="Spacelift API Key ID",
|
|
113
|
+
id="spacelift_api_key_id",
|
|
114
|
+
description="The API Key that will trigger the stack previews",
|
|
115
|
+
required=True,
|
|
116
|
+
),
|
|
117
|
+
Parameter(
|
|
118
|
+
name="Spacelift API Key Secret",
|
|
119
|
+
id="spacelift_api_key_secret",
|
|
120
|
+
description="The API Key Secret that will trigger the stack previews",
|
|
121
|
+
required=True,
|
|
122
|
+
sensitive=True
|
|
123
|
+
),
|
|
124
|
+
]
|
|
125
|
+
|
|
110
126
|
__contexts__ = [
|
|
111
127
|
Context(
|
|
112
128
|
name_prefix="Environment Manager",
|
|
@@ -116,6 +132,18 @@ The above configuration will create the following in a plan:
|
|
|
116
132
|
"mv /mnt/workspace/__environment_manager.tf /mnt/workspace/source/$TF_VAR_spacelift_project_root/__environment_manager.tf",
|
|
117
133
|
]
|
|
118
134
|
},
|
|
135
|
+
env=[
|
|
136
|
+
Variable(
|
|
137
|
+
key="SPACELIFT_API_KEY_ID",
|
|
138
|
+
value_from_parameter="spacelift_api_key_id",
|
|
139
|
+
sensitive=False
|
|
140
|
+
),
|
|
141
|
+
Variable(
|
|
142
|
+
key="SPACELIFT_API_KEY_SECRET",
|
|
143
|
+
value_from_parameter="spacelift_api_key_secret",
|
|
144
|
+
sensitive=True
|
|
145
|
+
),
|
|
146
|
+
],
|
|
119
147
|
mounted_files=[
|
|
120
148
|
MountedFile(
|
|
121
149
|
path="__environment_manager.tf",
|
|
@@ -220,6 +248,9 @@ resource "spacelift_environment_variable" "__this" {
|
|
|
220
248
|
"runtimeConfig": yaml.dump(env)
|
|
221
249
|
}
|
|
222
250
|
|
|
251
|
+
self.use_user_token(os.environ.get("SPACELIFT_API_KEY_ID"),
|
|
252
|
+
os.environ.get("SPACELIFT_API_KEY_SECRET"))
|
|
253
|
+
|
|
223
254
|
response = self.query_api(query, variables)
|
|
224
255
|
if "errors" in response:
|
|
225
256
|
self.logger.error(f"Error triggering stack preview for {stack_id}:", response["errors"])
|
|
@@ -99,10 +99,27 @@ author: Spacelift Team
|
|
|
99
99
|
labels:
|
|
100
100
|
- management
|
|
101
101
|
- infrastructure
|
|
102
|
+
parameters:
|
|
103
|
+
- name: Spacelift API Key ID
|
|
104
|
+
description: The API Key that will trigger the stack previews
|
|
105
|
+
sensitive: false
|
|
106
|
+
required: true
|
|
107
|
+
id: spacelift_api_key_id
|
|
108
|
+
- name: Spacelift API Key Secret
|
|
109
|
+
description: The API Key Secret that will trigger the stack previews
|
|
110
|
+
sensitive: true
|
|
111
|
+
required: true
|
|
112
|
+
id: spacelift_api_key_secret
|
|
102
113
|
contexts:
|
|
103
114
|
- name_prefix: Environment Manager
|
|
104
115
|
description: Environment Manager Plugin
|
|
105
|
-
env:
|
|
116
|
+
env:
|
|
117
|
+
- key: SPACELIFT_API_KEY_ID
|
|
118
|
+
value_from_parameter: spacelift_api_key_id
|
|
119
|
+
sensitive: false
|
|
120
|
+
- key: SPACELIFT_API_KEY_SECRET
|
|
121
|
+
value_from_parameter: spacelift_api_key_secret
|
|
122
|
+
sensitive: true
|
|
106
123
|
mounted_files:
|
|
107
124
|
- path: __environment_manager.tf
|
|
108
125
|
content: |-
|
|
@@ -135,7 +152,7 @@ contexts:
|
|
|
135
152
|
sensitive: false
|
|
136
153
|
- path: /mnt/workspace/plugins/environment_manager/plugin.py
|
|
137
154
|
content: |-
|
|
138
|
-
from spaceforge import SpaceforgePlugin, MountedFile, Context
|
|
155
|
+
from spaceforge import SpaceforgePlugin, MountedFile, Context, Parameter, Variable
|
|
139
156
|
|
|
140
157
|
import yaml
|
|
141
158
|
import os
|
|
@@ -244,6 +261,22 @@ contexts:
|
|
|
244
261
|
__version__ = "1.0.0"
|
|
245
262
|
__author__ = "Spacelift Team"
|
|
246
263
|
|
|
264
|
+
__parameters__ = [
|
|
265
|
+
Parameter(
|
|
266
|
+
name="Spacelift API Key ID",
|
|
267
|
+
id="spacelift_api_key_id",
|
|
268
|
+
description="The API Key that will trigger the stack previews",
|
|
269
|
+
required=True,
|
|
270
|
+
),
|
|
271
|
+
Parameter(
|
|
272
|
+
name="Spacelift API Key Secret",
|
|
273
|
+
id="spacelift_api_key_secret",
|
|
274
|
+
description="The API Key Secret that will trigger the stack previews",
|
|
275
|
+
required=True,
|
|
276
|
+
sensitive=True
|
|
277
|
+
),
|
|
278
|
+
]
|
|
279
|
+
|
|
247
280
|
__contexts__ = [
|
|
248
281
|
Context(
|
|
249
282
|
name_prefix="Environment Manager",
|
|
@@ -253,6 +286,18 @@ contexts:
|
|
|
253
286
|
"mv /mnt/workspace/__environment_manager.tf /mnt/workspace/source/$TF_VAR_spacelift_project_root/__environment_manager.tf",
|
|
254
287
|
]
|
|
255
288
|
},
|
|
289
|
+
env=[
|
|
290
|
+
Variable(
|
|
291
|
+
key="SPACELIFT_API_KEY_ID",
|
|
292
|
+
value_from_parameter="spacelift_api_key_id",
|
|
293
|
+
sensitive=False
|
|
294
|
+
),
|
|
295
|
+
Variable(
|
|
296
|
+
key="SPACELIFT_API_KEY_SECRET",
|
|
297
|
+
value_from_parameter="spacelift_api_key_secret",
|
|
298
|
+
sensitive=True
|
|
299
|
+
),
|
|
300
|
+
],
|
|
256
301
|
mounted_files=[
|
|
257
302
|
MountedFile(
|
|
258
303
|
path="__environment_manager.tf",
|
|
@@ -357,6 +402,9 @@ contexts:
|
|
|
357
402
|
"runtimeConfig": yaml.dump(env)
|
|
358
403
|
}
|
|
359
404
|
|
|
405
|
+
self.use_user_token(os.environ.get("SPACELIFT_API_KEY_ID"),
|
|
406
|
+
os.environ.get("SPACELIFT_API_KEY_SECRET"))
|
|
407
|
+
|
|
360
408
|
response = self.query_api(query, variables)
|
|
361
409
|
if "errors" in response:
|
|
362
410
|
self.logger.error(f"Error triggering stack preview for {stack_id}:", response["errors"])
|
|
@@ -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.14'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 0, 14)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'ga50701aaf'
|
|
@@ -145,7 +145,7 @@ class Webhook:
|
|
|
145
145
|
|
|
146
146
|
name_prefix: str
|
|
147
147
|
endpoint: str
|
|
148
|
-
secretFromParameter: str
|
|
148
|
+
secretFromParameter: Optional[str] = optional_field
|
|
149
149
|
labels: Optional[List[str]] = optional_field
|
|
150
150
|
|
|
151
151
|
|
|
@@ -202,4 +202,7 @@ if __name__ == "__main__":
|
|
|
202
202
|
|
|
203
203
|
from pydantic import TypeAdapter
|
|
204
204
|
|
|
205
|
-
|
|
205
|
+
schema = TypeAdapter(PluginManifest).json_schema()
|
|
206
|
+
schema["$schema"] = "http://json-schema.org/draft-07/schema#"
|
|
207
|
+
|
|
208
|
+
print(json.dumps(schema, indent=2))
|
|
@@ -43,6 +43,7 @@ class SpaceforgePlugin(ABC):
|
|
|
43
43
|
self._api_enabled = bool(self._api_token and self.spacelift_domain)
|
|
44
44
|
self._workspace_root = os.getcwd()
|
|
45
45
|
self._spacelift_markdown_endpoint = None
|
|
46
|
+
self._markdown_endpoint_token = os.environ.get("SPACELIFT_API_TOKEN") or False
|
|
46
47
|
|
|
47
48
|
# This should be the last thing we do in the constructor
|
|
48
49
|
# because we set api_enabled to false if the domain is set up incorrectly.
|
|
@@ -109,6 +110,58 @@ class SpaceforgePlugin(ABC):
|
|
|
109
110
|
|
|
110
111
|
return logger
|
|
111
112
|
|
|
113
|
+
def use_user_token(self, id: str, token: str) -> None:
|
|
114
|
+
headers = {
|
|
115
|
+
"Content-Type": "application/json",
|
|
116
|
+
"Authorization": f"Bearer {self._api_token}",
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
query = """
|
|
120
|
+
mutation requestApiKey($id: ID!, $secret: String!){
|
|
121
|
+
apiKeyUser(id: $id, secret: $secret){
|
|
122
|
+
jwt
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
data: Dict[str, Any] = {
|
|
128
|
+
"query": query,
|
|
129
|
+
"variables": {"id": id, "secret": token},
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
req = urllib.request.Request(
|
|
133
|
+
self.spacelift_domain, # type: ignore[arg-type]
|
|
134
|
+
json.dumps(data).encode("utf-8"),
|
|
135
|
+
headers,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
self.logger.debug(f"Sending request to url: {self.spacelift_domain}")
|
|
139
|
+
try:
|
|
140
|
+
with urllib.request.urlopen(req) as response:
|
|
141
|
+
resp: Dict[str, Any] = json.loads(response.read().decode("utf-8"))
|
|
142
|
+
except urllib.error.HTTPError as e:
|
|
143
|
+
if hasattr(e, "read"):
|
|
144
|
+
resp = json.loads(e.read().decode("utf-8"))
|
|
145
|
+
else:
|
|
146
|
+
# We should not get here, but if we do re-raise the exception
|
|
147
|
+
self.logger.error(f"HTTP error occurred: ({e.code}) {e.reason} {e.msg}")
|
|
148
|
+
raise e
|
|
149
|
+
|
|
150
|
+
if "errors" in resp:
|
|
151
|
+
self.logger.error(f"Error: {resp['errors']}")
|
|
152
|
+
return
|
|
153
|
+
|
|
154
|
+
if (
|
|
155
|
+
"data" in resp
|
|
156
|
+
and "apiKeyUser" in resp["data"]
|
|
157
|
+
and "jwt" in resp["data"]["apiKeyUser"]
|
|
158
|
+
):
|
|
159
|
+
self._api_token = resp["data"]["apiKeyUser"]["jwt"]
|
|
160
|
+
self._api_enabled = True
|
|
161
|
+
self.logger.debug("Successfully set user token for API calls.")
|
|
162
|
+
else:
|
|
163
|
+
self.logger.error(f"API call returned no data: {resp}")
|
|
164
|
+
|
|
112
165
|
def get_available_hooks(self) -> List[str]:
|
|
113
166
|
"""
|
|
114
167
|
Get list of hook methods available in this plugin.
|
|
@@ -256,13 +309,16 @@ class SpaceforgePlugin(ABC):
|
|
|
256
309
|
self.logger.info(markdown)
|
|
257
310
|
return True
|
|
258
311
|
|
|
259
|
-
if
|
|
312
|
+
if (
|
|
313
|
+
self._spacelift_markdown_endpoint is None
|
|
314
|
+
or not self._markdown_endpoint_token
|
|
315
|
+
):
|
|
260
316
|
self.logger.error(
|
|
261
317
|
'API is not enabled, please export "SPACELIFT_API_TOKEN" and "TF_VAR_spacelift_graphql_endpoint".'
|
|
262
318
|
)
|
|
263
319
|
return False
|
|
264
320
|
|
|
265
|
-
headers = {"Authorization": f"Bearer {self.
|
|
321
|
+
headers = {"Authorization": f"Bearer {self._markdown_endpoint_token}"}
|
|
266
322
|
body = {
|
|
267
323
|
"plugin_name": self.__plugin_name__,
|
|
268
324
|
}
|
|
@@ -260,8 +260,15 @@
|
|
|
260
260
|
"type": "string"
|
|
261
261
|
},
|
|
262
262
|
"secretFromParameter": {
|
|
263
|
-
"
|
|
264
|
-
|
|
263
|
+
"anyOf": [
|
|
264
|
+
{
|
|
265
|
+
"type": "string"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"type": "null"
|
|
269
|
+
}
|
|
270
|
+
],
|
|
271
|
+
"title": "Secretfromparameter"
|
|
265
272
|
},
|
|
266
273
|
"labels": {
|
|
267
274
|
"anyOf": [
|
|
@@ -280,8 +287,7 @@
|
|
|
280
287
|
},
|
|
281
288
|
"required": [
|
|
282
289
|
"name_prefix",
|
|
283
|
-
"endpoint"
|
|
284
|
-
"secretFromParameter"
|
|
290
|
+
"endpoint"
|
|
285
291
|
],
|
|
286
292
|
"title": "Webhook",
|
|
287
293
|
"type": "object"
|
|
@@ -383,5 +389,6 @@
|
|
|
383
389
|
"author"
|
|
384
390
|
],
|
|
385
391
|
"title": "PluginManifest",
|
|
386
|
-
"type": "object"
|
|
392
|
+
"type": "object",
|
|
393
|
+
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
387
394
|
}
|
|
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
|
{spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/templates/ensure_spaceforge_and_run.sh.j2
RENAMED
|
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
|