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.
Files changed (57) hide show
  1. {spaceforge-0.0.12 → spaceforge-0.0.14}/PKG-INFO +1 -1
  2. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/enviroment_manager/plugin.py +32 -1
  3. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/enviroment_manager/plugin.yaml +50 -2
  4. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/_version_scm.py +3 -3
  5. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/cls.py +5 -2
  6. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/plugin.py +58 -2
  7. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/schema.json +12 -5
  8. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/PKG-INFO +1 -1
  9. {spaceforge-0.0.12 → spaceforge-0.0.14}/.github/workflows/ci.yml +0 -0
  10. {spaceforge-0.0.12 → spaceforge-0.0.14}/.github/workflows/release.yml +0 -0
  11. {spaceforge-0.0.12 → spaceforge-0.0.14}/.gitignore +0 -0
  12. {spaceforge-0.0.12 → spaceforge-0.0.14}/LICENSE +0 -0
  13. {spaceforge-0.0.12 → spaceforge-0.0.14}/MANIFEST.in +0 -0
  14. {spaceforge-0.0.12 → spaceforge-0.0.14}/README.md +0 -0
  15. {spaceforge-0.0.12 → spaceforge-0.0.14}/go.mod +0 -0
  16. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/enviroment_manager/requirements.txt +0 -0
  17. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/infracost/plugin.py +0 -0
  18. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/infracost/plugin.yaml +0 -0
  19. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/sops/plugin.py +0 -0
  20. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/sops/plugin.yaml +0 -0
  21. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/sops/requirements.txt +0 -0
  22. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/wiz/plugin.py +0 -0
  23. {spaceforge-0.0.12 → spaceforge-0.0.14}/plugins/wiz/plugin.yaml +0 -0
  24. {spaceforge-0.0.12 → spaceforge-0.0.14}/pyproject.toml +0 -0
  25. {spaceforge-0.0.12 → spaceforge-0.0.14}/setup.cfg +0 -0
  26. {spaceforge-0.0.12 → spaceforge-0.0.14}/setup.py +0 -0
  27. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/README.md +0 -0
  28. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/__init__.py +0 -0
  29. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/__main__.py +0 -0
  30. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/_version.py +0 -0
  31. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/conftest.py +0 -0
  32. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/generator.py +0 -0
  33. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/runner.py +0 -0
  34. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/templates/binary_install.sh.j2 +0 -0
  35. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/templates/ensure_spaceforge_and_run.sh.j2 +0 -0
  36. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_cls.py +0 -0
  37. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator.py +0 -0
  38. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_binaries.py +0 -0
  39. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_core.py +0 -0
  40. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_hooks.py +0 -0
  41. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_generator_parameters.py +0 -0
  42. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin.py +0 -0
  43. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin_file_operations.py +0 -0
  44. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin_hooks.py +0 -0
  45. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_plugin_inheritance.py +0 -0
  46. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner.py +0 -0
  47. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner_cli.py +0 -0
  48. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner_core.py +0 -0
  49. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge/test_runner_execution.py +0 -0
  50. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/SOURCES.txt +0 -0
  51. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/dependency_links.txt +0 -0
  52. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/entry_points.txt +0 -0
  53. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/not-zip-safe +0 -0
  54. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/requires.txt +0 -0
  55. {spaceforge-0.0.12 → spaceforge-0.0.14}/spaceforge.egg-info/top_level.txt +0 -0
  56. {spaceforge-0.0.12 → spaceforge-0.0.14}/templates.go +0 -0
  57. {spaceforge-0.0.12 → spaceforge-0.0.14}/test.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaceforge
3
- Version: 0.0.12
3
+ Version: 0.0.14
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.12'
32
- __version_tuple__ = version_tuple = (0, 0, 12)
31
+ __version__ = version = '0.0.14'
32
+ __version_tuple__ = version_tuple = (0, 0, 14)
33
33
 
34
- __commit_id__ = commit_id = 'g8d47ec028'
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
- 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))
@@ -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 self._spacelift_markdown_endpoint is None:
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._api_token}"}
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
- "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.12
3
+ Version: 0.0.14
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