spaceforge 0.0.10__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.
Files changed (57) hide show
  1. {spaceforge-0.0.10 → spaceforge-0.0.13}/PKG-INFO +1 -1
  2. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/enviroment_manager/plugin.py +32 -1
  3. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/enviroment_manager/plugin.yaml +50 -2
  4. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/_version_scm.py +3 -3
  5. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/cls.py +5 -2
  6. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/plugin.py +59 -5
  7. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/schema.json +12 -5
  8. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge.egg-info/PKG-INFO +1 -1
  9. {spaceforge-0.0.10 → spaceforge-0.0.13}/.github/workflows/ci.yml +0 -0
  10. {spaceforge-0.0.10 → spaceforge-0.0.13}/.github/workflows/release.yml +0 -0
  11. {spaceforge-0.0.10 → spaceforge-0.0.13}/.gitignore +0 -0
  12. {spaceforge-0.0.10 → spaceforge-0.0.13}/LICENSE +0 -0
  13. {spaceforge-0.0.10 → spaceforge-0.0.13}/MANIFEST.in +0 -0
  14. {spaceforge-0.0.10 → spaceforge-0.0.13}/README.md +0 -0
  15. {spaceforge-0.0.10 → spaceforge-0.0.13}/go.mod +0 -0
  16. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/enviroment_manager/requirements.txt +0 -0
  17. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/infracost/plugin.py +0 -0
  18. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/infracost/plugin.yaml +0 -0
  19. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/sops/plugin.py +0 -0
  20. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/sops/plugin.yaml +0 -0
  21. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/sops/requirements.txt +0 -0
  22. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/wiz/plugin.py +0 -0
  23. {spaceforge-0.0.10 → spaceforge-0.0.13}/plugins/wiz/plugin.yaml +0 -0
  24. {spaceforge-0.0.10 → spaceforge-0.0.13}/pyproject.toml +0 -0
  25. {spaceforge-0.0.10 → spaceforge-0.0.13}/setup.cfg +0 -0
  26. {spaceforge-0.0.10 → spaceforge-0.0.13}/setup.py +0 -0
  27. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/README.md +0 -0
  28. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/__init__.py +0 -0
  29. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/__main__.py +0 -0
  30. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/_version.py +0 -0
  31. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/conftest.py +0 -0
  32. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/generator.py +0 -0
  33. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/runner.py +0 -0
  34. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/templates/binary_install.sh.j2 +0 -0
  35. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/templates/ensure_spaceforge_and_run.sh.j2 +0 -0
  36. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_cls.py +0 -0
  37. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_generator.py +0 -0
  38. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_generator_binaries.py +0 -0
  39. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_generator_core.py +0 -0
  40. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_generator_hooks.py +0 -0
  41. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_generator_parameters.py +0 -0
  42. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_plugin.py +0 -0
  43. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_plugin_file_operations.py +0 -0
  44. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_plugin_hooks.py +0 -0
  45. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_plugin_inheritance.py +0 -0
  46. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_runner.py +0 -0
  47. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_runner_cli.py +0 -0
  48. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_runner_core.py +0 -0
  49. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge/test_runner_execution.py +0 -0
  50. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge.egg-info/SOURCES.txt +0 -0
  51. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge.egg-info/dependency_links.txt +0 -0
  52. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge.egg-info/entry_points.txt +0 -0
  53. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge.egg-info/not-zip-safe +0 -0
  54. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge.egg-info/requires.txt +0 -0
  55. {spaceforge-0.0.10 → spaceforge-0.0.13}/spaceforge.egg-info/top_level.txt +0 -0
  56. {spaceforge-0.0.10 → spaceforge-0.0.13}/templates.go +0 -0
  57. {spaceforge-0.0.10 → spaceforge-0.0.13}/test.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaceforge
3
- Version: 0.0.10
3
+ Version: 0.0.13
4
4
  Summary: A Python framework for building Spacelift plugins
5
5
  Home-page: https://github.com/spacelift-io/plugins
6
6
  Author: Spacelift
@@ -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.10'
32
- __version_tuple__ = version_tuple = (0, 0, 10)
31
+ __version__ = version = '0.0.13'
32
+ __version_tuple__ = version_tuple = (0, 0, 13)
33
33
 
34
- __commit_id__ = commit_id = 'ga61c2d59b'
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
- print(json.dumps(TypeAdapter(PluginManifest).json_schema(), indent=2))
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.
@@ -145,9 +199,7 @@ class SpaceforgePlugin(ABC):
145
199
  Run a CLI command with the given arguments.
146
200
 
147
201
  Args:
148
- command: The command to run
149
- *args: Positional arguments for the command
150
- **kwargs: Keyword arguments for the command
202
+ *command: The command to run
151
203
  expect_code: Expected return code
152
204
  print_output: Whether to print the output to the logger
153
205
  """
@@ -277,7 +329,9 @@ class SpaceforgePlugin(ABC):
277
329
  method="POST",
278
330
  )
279
331
 
280
- self.logger.debug(f"Sending request to url: {self._spacelift_markdown_endpoint}")
332
+ self.logger.debug(
333
+ f"Sending request to url: {self._spacelift_markdown_endpoint}"
334
+ )
281
335
  try:
282
336
  with urllib.request.urlopen(req) as response:
283
337
  if response.status != 200:
@@ -260,8 +260,15 @@
260
260
  "type": "string"
261
261
  },
262
262
  "secretFromParameter": {
263
- "title": "Secretfromparameter",
264
- "type": "string"
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
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaceforge
3
- Version: 0.0.10
3
+ Version: 0.0.13
4
4
  Summary: A Python framework for building Spacelift plugins
5
5
  Home-page: https://github.com/spacelift-io/plugins
6
6
  Author: Spacelift
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