spaceforge 0.0.12__tar.gz → 0.0.13__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.13}/PKG-INFO +1 -1
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/enviroment_manager/plugin.py +32 -1
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/enviroment_manager/plugin.yaml +50 -2
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/_version_scm.py +3 -3
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/cls.py +5 -2
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/plugin.py +55 -1
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/schema.json +12 -5
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge.egg-info/PKG-INFO +1 -1
- {spaceforge-0.0.12 → spaceforge-0.0.13}/.github/workflows/ci.yml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/.github/workflows/release.yml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/.gitignore +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/LICENSE +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/MANIFEST.in +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/README.md +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/go.mod +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/enviroment_manager/requirements.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/infracost/plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/infracost/plugin.yaml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/sops/plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/sops/plugin.yaml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/sops/requirements.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/wiz/plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/plugins/wiz/plugin.yaml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/pyproject.toml +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/setup.cfg +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/setup.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/README.md +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/__init__.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/__main__.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/_version.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/conftest.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/generator.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/runner.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/templates/binary_install.sh.j2 +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/templates/ensure_spaceforge_and_run.sh.j2 +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_cls.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_generator.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_generator_binaries.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_generator_core.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_generator_hooks.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_generator_parameters.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_plugin.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_plugin_file_operations.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_plugin_hooks.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_plugin_inheritance.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_runner.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_runner_cli.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_runner_core.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge/test_runner_execution.py +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge.egg-info/SOURCES.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge.egg-info/dependency_links.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge.egg-info/entry_points.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge.egg-info/not-zip-safe +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge.egg-info/requires.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/spaceforge.egg-info/top_level.txt +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/templates.go +0 -0
- {spaceforge-0.0.12 → spaceforge-0.0.13}/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.13'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 0, 13)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g4dc3579b1'
|
|
@@ -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))
|
|
@@ -9,7 +9,7 @@ import os
|
|
|
9
9
|
import subprocess
|
|
10
10
|
import urllib.request
|
|
11
11
|
from abc import ABC
|
|
12
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
12
|
+
from typing import Any, Callable, Dict, List, Optional, Tuple
|
|
13
13
|
from urllib.error import HTTPError
|
|
14
14
|
|
|
15
15
|
|
|
@@ -109,6 +109,60 @@ class SpaceforgePlugin(ABC):
|
|
|
109
109
|
|
|
110
110
|
return logger
|
|
111
111
|
|
|
112
|
+
def use_user_token(
|
|
113
|
+
self, id: str, token: str, api_query: Callable[[str, None], Dict[str, Any]]
|
|
114
|
+
) -> None:
|
|
115
|
+
headers = {
|
|
116
|
+
"Content-Type": "application/json",
|
|
117
|
+
"Authorization": f"Bearer {self._api_token}",
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
query = """
|
|
121
|
+
mutation requestApiKey($id: ID!, $secret: String!){
|
|
122
|
+
apiKeyUser(id: $id, secret: $secret){
|
|
123
|
+
jwt
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
data: Dict[str, Any] = {
|
|
129
|
+
"query": query,
|
|
130
|
+
"variables": {"id": id, "secret": token},
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
req = urllib.request.Request(
|
|
134
|
+
self.spacelift_domain, # type: ignore[arg-type]
|
|
135
|
+
json.dumps(data).encode("utf-8"),
|
|
136
|
+
headers,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
self.logger.debug(f"Sending request to url: {self.spacelift_domain}")
|
|
140
|
+
try:
|
|
141
|
+
with urllib.request.urlopen(req) as response:
|
|
142
|
+
resp: Dict[str, Any] = json.loads(response.read().decode("utf-8"))
|
|
143
|
+
except urllib.error.HTTPError as e:
|
|
144
|
+
if hasattr(e, "read"):
|
|
145
|
+
resp = json.loads(e.read().decode("utf-8"))
|
|
146
|
+
else:
|
|
147
|
+
# We should not get here, but if we do re-raise the exception
|
|
148
|
+
self.logger.error(f"HTTP error occurred: ({e.code}) {e.reason} {e.msg}")
|
|
149
|
+
raise e
|
|
150
|
+
|
|
151
|
+
if "errors" in resp:
|
|
152
|
+
self.logger.error(f"Error: {resp['errors']}")
|
|
153
|
+
return
|
|
154
|
+
|
|
155
|
+
if (
|
|
156
|
+
"data" in resp
|
|
157
|
+
and "apiKeyUser" in resp["data"]
|
|
158
|
+
and "jwt" in resp["data"]["apiKeyUser"]
|
|
159
|
+
):
|
|
160
|
+
self._api_token = resp["data"]["apiKeyUser"]["jwt"]
|
|
161
|
+
self._api_enabled = True
|
|
162
|
+
self.logger.debug("Successfully set user token for API calls.")
|
|
163
|
+
else:
|
|
164
|
+
self.logger.error(f"API call returned no data: {resp}")
|
|
165
|
+
|
|
112
166
|
def get_available_hooks(self) -> List[str]:
|
|
113
167
|
"""
|
|
114
168
|
Get list of hook methods available in this plugin.
|
|
@@ -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.13}/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
|