Skip to content

Commit b07a699

Browse files
committed
feat(auth): Add SCM authentication support for repository access
1 parent 3fb199d commit b07a699

File tree

11 files changed

+247
-81
lines changed

11 files changed

+247
-81
lines changed

examples/anthropic_tool_use.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
#!/usr/bin/env python
1+
# EXPORT ANTHROPIC_API_KEY=...
2+
# python -m examples.anthropic_tool_use
23

34
from __future__ import annotations
45

@@ -11,6 +12,8 @@
1112
from gitpod import AsyncGitpod
1213
from gitpod.types.environment_initializer_param import Spec
1314

15+
from .scm_auth import verify_context_url # type: ignore
16+
1417
gpclient = AsyncGitpod()
1518
llmclient = Anthropic()
1619

@@ -41,8 +44,8 @@ async def create_environment(args: dict[str, str], cleanup: util.Disposables) ->
4144
env_class = await util.find_most_used_environment_class(gpclient)
4245
if not env_class:
4346
raise Exception("No environment class found. Please create one first.")
44-
env_class_id = env_class.id
45-
assert env_class_id is not None
47+
assert env_class.runner_id is not None
48+
await verify_context_url(gpclient, args["context_url"], env_class.runner_id)
4649

4750
environment = (await gpclient.environments.create(
4851
spec={
@@ -54,18 +57,16 @@ async def create_environment(args: dict[str, str], cleanup: util.Disposables) ->
5457
}
5558
)]},
5659
},
57-
"machine": {"class": env_class_id},
60+
"machine": {"class": env_class.id},
5861
}
5962
)).environment
6063
assert environment is not None
61-
environment_id = environment.id
62-
assert environment_id is not None
63-
cleanup.add(lambda: asyncio.run(gpclient.environments.delete(environment_id=environment_id)))
64+
cleanup.add(lambda: asyncio.run(gpclient.environments.delete(environment_id=environment.id)))
6465

65-
print(f"\nCreated environment: {environment_id} - waiting for it to be ready...")
66-
await util.wait_for_environment_ready(gpclient, environment_id)
67-
print(f"\nEnvironment is ready: {environment_id}")
68-
return environment_id
66+
print(f"\nCreated environment: {environment.id} - waiting for it to be ready...")
67+
await util.wait_for_environment_running(gpclient, environment.id)
68+
print(f"\nEnvironment is ready: {environment.id}")
69+
return environment.id
6970

7071
async def execute_command(args: dict[str, str]) -> str:
7172
lines_iter = await util.run_command(gpclient, args["environment_id"], args["command"])

examples/fs_access.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#!/usr/bin/env python
2-
31
import sys
42
import asyncio
53
from io import StringIO
@@ -11,10 +9,12 @@
119
from gitpod.types.environment_spec_param import EnvironmentSpecParam
1210
from gitpod.types.environment_initializer_param import Spec
1311

12+
from .scm_auth import verify_context_url # type: ignore
13+
1414

1515
# Examples:
16-
# - ./examples/fs_access.py
17-
# - ./examples/fs_access.py https://github.com/gitpod-io/empty
16+
# - python -m examples.fs_access
17+
# - python -m examples.fs_access https://github.com/gitpod-io/empty
1818
async def main(cleanup: util.Disposables) -> None:
1919
client = AsyncGitpod()
2020

@@ -25,8 +25,6 @@ async def main(cleanup: util.Disposables) -> None:
2525
print("Error: No environment class found. Please create one first.")
2626
sys.exit(1)
2727
print(f"Found environment class: {env_class.display_name} ({env_class.description})")
28-
env_class_id = env_class.id
29-
assert env_class_id is not None
3028

3129
print("Generating SSH key pair")
3230
key = paramiko.RSAKey.generate(2048)
@@ -39,13 +37,15 @@ async def main(cleanup: util.Disposables) -> None:
3937
key_id = "fs-access-example"
4038
spec: EnvironmentSpecParam = {
4139
"desired_phase": "ENVIRONMENT_PHASE_RUNNING",
42-
"machine": {"class": env_class_id},
40+
"machine": {"class": env_class.id},
4341
"ssh_public_keys": [{
4442
"id": key_id,
4543
"value": public_key
4644
}]
4745
}
4846
if context_url:
47+
assert env_class.runner_id is not None
48+
await verify_context_url(client, context_url, env_class.runner_id)
4949
spec["content"] = {
5050
"initializer": {"specs": [Spec(
5151
context_url={
@@ -57,11 +57,9 @@ async def main(cleanup: util.Disposables) -> None:
5757
print("Creating environment")
5858
environment = (await client.environments.create(spec=spec)).environment
5959
assert environment is not None
60-
environment_id = environment.id
61-
assert environment_id is not None
62-
cleanup.add(lambda: asyncio.run(client.environments.delete(environment_id=environment_id)))
60+
cleanup.add(lambda: asyncio.run(client.environments.delete(environment_id=environment.id)))
6361

64-
env = util.EnvironmentState(client, environment_id)
62+
env = util.EnvironmentState(client, environment.id)
6563
cleanup.add(lambda: asyncio.run(env.close()))
6664

6765
print("Waiting for environment to be running")

examples/run_command.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#!/usr/bin/env python
2-
31
import sys
42
import asyncio
53

@@ -8,10 +6,12 @@
86
from gitpod.types.environment_spec_param import EnvironmentSpecParam
97
from gitpod.types.environment_initializer_param import Spec
108

9+
from .scm_auth import verify_context_url # type: ignore
10+
1111

1212
# Examples:
13-
# - ./examples/run_command.py 'echo "Hello World!"'
14-
# - ./examples/run_command.py 'echo "Hello World!"' https://github.com/gitpod-io/empty
13+
# - python -m examples.run_command 'echo "Hello World!"'
14+
# - python -m examples.run_command 'echo "Hello World!"' https://github.com/gitpod-io/empty
1515
async def main(cleanup: util.Disposables) -> None:
1616
client = AsyncGitpod()
1717

@@ -27,14 +27,14 @@ async def main(cleanup: util.Disposables) -> None:
2727
print("Error: No environment class found. Please create one first.")
2828
sys.exit(1)
2929
print(f"Found environment class: {env_class.display_name} ({env_class.description})")
30-
env_class_id = env_class.id
31-
assert env_class_id is not None
32-
30+
3331
spec: EnvironmentSpecParam = {
3432
"desired_phase": "ENVIRONMENT_PHASE_RUNNING",
35-
"machine": {"class": env_class_id},
33+
"machine": {"class": env_class.id},
3634
}
3735
if context_url:
36+
assert env_class.runner_id is not None
37+
await verify_context_url(client, context_url, env_class.runner_id)
3838
spec["content"] = {
3939
"initializer": {"specs": [Spec(
4040
context_url={
@@ -46,15 +46,13 @@ async def main(cleanup: util.Disposables) -> None:
4646
print("Creating environment")
4747
environment = (await client.environments.create(spec=spec)).environment
4848
assert environment is not None
49-
environment_id = environment.id
50-
assert environment_id is not None
51-
cleanup.add(lambda: asyncio.run(client.environments.delete(environment_id=environment_id)))
49+
cleanup.add(lambda: asyncio.run(client.environments.delete(environment_id=environment.id)))
5250

5351
print("Waiting for environment to be ready")
54-
await util.wait_for_environment_ready(client, environment_id)
52+
await util.wait_for_environment_running(client, environment.id)
5553

5654
print("Running command")
57-
lines = await util.run_command(client, environment_id, command)
55+
lines = await util.run_command(client, environment.id, command)
5856
async for line in lines:
5957
print(line)
6058

examples/run_service.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#!/usr/bin/env python
2-
1+
import os
32
import sys
43
import asyncio
54

@@ -8,56 +7,60 @@
87
from gitpod.types.environment_spec_param import EnvironmentSpecParam
98
from gitpod.types.environment_initializer_param import Spec
109

10+
from .scm_auth import verify_context_url # type: ignore
11+
1112

1213
# Examples:
13-
# - ./examples/run_service.py
14-
# - ./examples/run_service.py https://github.com/gitpod-io/empty
14+
# - python -m examples.run_service
15+
# - python -m examples.run_service https://github.com/gitpod-io/empty
1516
async def main(cleanup: util.Disposables) -> None:
1617
client = AsyncGitpod()
1718

1819
context_url = sys.argv[1] if len(sys.argv) > 1 else None
20+
env_class_id = os.getenv("GITPOD_ENV_CLASS_ID")
1921

20-
env_class = await util.find_most_used_environment_class(client)
22+
if not env_class_id:
23+
env_class = await util.find_most_used_environment_class(client)
24+
else:
25+
env_class = await util.find_environment_class_by_id(client, env_class_id)
26+
2127
if not env_class:
2228
print("Error: No environment class found. Please create one first.")
2329
sys.exit(1)
2430
print(f"Found environment class: {env_class.display_name} ({env_class.description})")
25-
env_class_id = env_class.id
26-
assert env_class_id is not None
2731

2832
port = 8888
2933
spec: EnvironmentSpecParam = {
3034
"desired_phase": "ENVIRONMENT_PHASE_RUNNING",
31-
"machine": {"class": env_class_id},
35+
"machine": {"class": env_class.id},
3236
"ports": [{
3337
"name": "Lama Service",
3438
"port": port,
3539
"admission": "ADMISSION_LEVEL_EVERYONE"
3640
}]
3741
}
3842
if context_url:
43+
assert env_class.runner_id is not None
44+
await verify_context_url(client, context_url, env_class.runner_id)
3945
spec["content"] = {
4046
"initializer": {"specs": [Spec(
41-
context_url={
42-
"url": context_url
43-
}
44-
)]}
45-
}
47+
context_url={
48+
"url": context_url
49+
}
50+
)]}
51+
}
4652

47-
print("Creating environment")
4853
environment = (await client.environments.create(spec=spec)).environment
4954
assert environment is not None
50-
environment_id = environment.id
51-
assert environment_id is not None
52-
cleanup.add(lambda: asyncio.run(client.environments.delete(environment_id=environment_id)))
55+
cleanup.add(lambda: asyncio.run(client.environments.delete(environment_id=environment.id)))
5356

5457
print("Waiting for environment to be ready")
55-
env = util.EnvironmentState(client, environment_id)
58+
env = util.EnvironmentState(client, environment.id)
5659
cleanup.add(lambda: asyncio.run(env.close()))
5760
await env.wait_until_running()
5861

5962
print("Starting Lama Service")
60-
lines = await util.run_service(client, environment_id, {
63+
lines = await util.run_service(client, environment.id, {
6164
"name":"Lama Service",
6265
"description":"Lama Service",
6366
"reference":"lama-service"
@@ -77,4 +80,4 @@ async def main(cleanup: util.Disposables) -> None:
7780
if __name__ == "__main__":
7881
disposables = util.Disposables()
7982
with disposables:
80-
asyncio.run(main(disposables))
83+
asyncio.run(main(disposables))

0 commit comments

Comments
 (0)