Skip to content

Commit 76bbe89

Browse files
committed
feat(helmbroker): add provision
1 parent 41e6469 commit 76bbe89

5 files changed

Lines changed: 79 additions & 16 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ htmlcov/
3333

3434
# python virtual environments for testing
3535
venv/
36+
.venv/
3637

3738
# vendored go source code
3839
vendor/

rootfs/helmbroker/broker.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
import os
2+
import shutil
13
from typing import Union, List
2-
3-
import openbrokerapi
44
from openbrokerapi import api
55
from openbrokerapi.api import ServiceBroker
66
from openbrokerapi.catalog import ServicePlan
77
from openbrokerapi.service_broker import *
88

9+
from .utils import get_instance_path, get_chart_path, get_plan_path, get_addon_path
10+
from .tasks import provision
911

1012
class HelmServiceBroker(ServiceBroker):
13+
1114
def catalog(self) -> Union[Service, List[Service]]:
12-
return Service(
15+
return [Service(
1316
id='server',
1417
name='server',
1518
description='service description',
@@ -27,16 +30,27 @@ def catalog(self) -> Union[Service, List[Service]]:
2730
)
2831
],
2932
plan_updateable=True,
30-
)
33+
)]
3134

3235
def provision(self,
3336
instance_id: str,
3437
details: ProvisionDetails,
3538
async_allowed: bool,
3639
**kwargs) -> ProvisionedServiceSpec:
37-
# Create service instance
38-
# ...
39-
return ProvisionedServiceSpec()
40+
instance_path = get_instance_path(instance_id)
41+
if os.path.exists(instance_path):
42+
return ProvisionedServiceSpec(
43+
state=ProvisionState.IDENTICAL_ALREADY_EXISTS
44+
)
45+
os.makedirs(instance_path, exist_ok=True)
46+
chart_path, plan_path =get_chart_path(instance_id), get_plan_path(instance_id)
47+
addon_chart_path, addon_plan_path = get_addon_path(details.service_id, details.plan_id)
48+
shutil.copy(addon_chart_path, chart_path)
49+
shutil.copy(addon_plan_path, plan_path)
50+
if async_allowed:
51+
provision.delay(instance_id, details. async_allowed, **kwargs)
52+
return ProvisionedServiceSpec(state=ProvisionState.IS_ASYNC)
53+
return provision(instance_id, details. async_allowed, **kwargs)
4054

4155
def get_binding(self,
4256
instance_id: str,

rootfs/helmbroker/config.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import os
12
import yaml
23

3-
HELMBROKER_ROOT = '/etc/helmbroker'
4-
ADDONS_PATH = HELMBROKER_ROOT + '/addons'
5-
CONFIG_PATH = HELMBROKER_ROOT + '/config'
4+
HELMBROKER_ROOT = os.environ.get("HELMBROKER_CELERY_BROKER", '/etc/helmbroker')
65

6+
ADDONS_PATH = os.path.join(HELMBROKER_ROOT, 'addons')
7+
CONFIG_PATH = os.path.join(HELMBROKER_ROOT, 'config')
8+
INSTANCES_PATH = os.path.join(HELMBROKER_ROOT, 'instances')
79

810
class Config:
911
with open(CONFIG_PATH, 'r') as f:
10-
repositorie = yaml.load(f.read())
12+
repository = yaml.load(f.read())

rootfs/helmbroker/tasks.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,37 @@
1+
import os
2+
import shutil
13
from .celery import app
4+
from .utils import command, get_plan_path, get_chart_path, get_or_create_instance_meta
5+
from openbrokerapi.service_broker import *
26

37

4-
@app.task
5-
def mul(x, y):
6-
return x * y
8+
def provision(iself,
9+
instance_id: str,
10+
details: ProvisionDetails,
11+
async_allowed: bool,
12+
**kwargs) -> ProvisionedServiceSpec:
13+
chart_path = get_chart_path(instance_id)
14+
values_file = os.path.join(get_plan_path(instance_id), "values.yaml")
15+
args = [
16+
"install",
17+
details.context["instance_name"],
18+
chart_path,
19+
"--namespace",
20+
details.context["namespace"],
21+
"--create-namespace",
22+
"--output",
23+
"--wait",
24+
"--timeout 30m0s"
25+
"-f",
26+
values_file
27+
]
28+
status, output = command("helm", *args)
29+
if status != 0:
30+
return ProvisionedServiceSpec(state="status error: %s" % status, operation=output)
31+
else:
32+
config = get_or_create_instance_meta(instance_id)
33+
return ProvisionedServiceSpec(
34+
dashboard_url=config.get("dashboard_url", None),
35+
state=ProvisionState.SUCCESSFUL_CREATED,
36+
operation=config.get("operation", None),
37+
)

rootfs/helmbroker/utils.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,27 @@
1+
import os
12
import yaml
23
import json
34
import subprocess
45

6+
from .config import INSTANCES_PATH
7+
58

69
def command(cmd, *args, output_type="text"):
7-
output = subprocess.getoutput("%s %s" % (cmd, " ".join(args)))
10+
status, output = subprocess.getstatusoutput("%s %s" % (cmd, " ".join(args)))
811
if output_type == "yaml":
912
return yaml.load(output, Loader=yaml.Loader)
1013
elif output_type == "json":
1114
return json.loads(output)
12-
return output
15+
return status, output
16+
17+
18+
get_instance_path = lambda instance_id: os.path.join(INSTANCES_PATH, instance_id)
19+
get_chart_path = lambda instance_id: os.path.join(get_instance_path(instance_id), "chart")
20+
get_plan_path = lambda instance_id: os.path.join(get_instance_path(instance_id), "plan")
21+
22+
def get_addon_path(service_id, plan_id):
23+
return ""
24+
25+
26+
def get_or_create_instance_meta(instance_id):
27+
pass

0 commit comments

Comments
 (0)