Skip to content

Commit 4cc656f

Browse files
author
lijianguo
committed
chore(helmbroker): add bind
1 parent 7b24662 commit 4cc656f

4 files changed

Lines changed: 81 additions & 36 deletions

File tree

rootfs/helmbroker/broker.py

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
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
9+
from .meta import InstanceMeta
10+
from .utils import get_instance_path, get_chart_path, get_plan_path, \
11+
get_addon_path, get_addon_name
12+
from .tasks import provision, bind
1113
from helmbroker.loader import read_addons_file
1214

1315

@@ -17,26 +19,7 @@ def catalog(self) -> Union[Service, List[Service]]:
1719
services = read_addons_file()
1820
return [Service(
1921
**addons
20-
) for _,addons in services.items()]
21-
# return Service(
22-
# id='server',
23-
# name='server',
24-
# description='service description',
25-
# bindable=True,
26-
# plans=[
27-
# ServicePlan(
28-
# id='server-1:1-1',
29-
# name='1-1',
30-
# description='plan description',
31-
# ),
32-
# ServicePlan(
33-
# id='server-2:2-2',
34-
# name='2-2',
35-
# description='plan description',
36-
# )
37-
# ],
38-
# plan_updateable=True,
39-
# )
22+
) for _, addons in services.items()]
4023

4124
def provision(self,
4225
instance_id: str,
@@ -54,9 +37,9 @@ def provision(self,
5437
shutil.copy(addon_chart_path, chart_path)
5538
shutil.copy(addon_plan_path, plan_path)
5639
if async_allowed:
57-
provision.delay(instance_id, details. async_allowed, **kwargs)
40+
provision.delay(instance_id, details, async_allowed, **kwargs)
5841
return ProvisionedServiceSpec(state=ProvisionState.IS_ASYNC)
59-
return provision(instance_id, details. async_allowed, **kwargs)
42+
return provision(instance_id, details, async_allowed, **kwargs)
6043

6144
def get_binding(self,
6245
instance_id: str,
@@ -72,7 +55,21 @@ def bind(self,
7255
async_allowed: bool,
7356
**kwargs
7457
) -> Binding:
75-
return Binding(credentials={"url": "postgres://1.1.1.1", "passwd": "123"})
58+
59+
if not (InstanceMeta.load(instance_id) and
60+
InstanceMeta.load(instance_id)['last_operation']['state'] == 'Ready'):
61+
return Binding(state="status error: this instance is not ready")
62+
63+
instance_path = get_instance_path(instance_id)
64+
if os.path.exists(f'{instance_path}/bind.yaml'):
65+
return Binding(state=BindState.IDENTICAL_ALREADY_EXISTS)
66+
chart_path, plan_path =get_chart_path(instance_id), get_plan_path(instance_id)
67+
addon_name = get_addon_name(details.service_id)
68+
shutil.copy(f'{plan_path}/bind.yaml', f'{chart_path}/{addon_name}/templates')
69+
if async_allowed:
70+
bind.delay(instance_id, binding_id, details, async_allowed, **kwargs)
71+
return Binding(state=BindState.IS_ASYNC)
72+
return bind(instance_id, binding_id, details, async_allowed, **kwargs)
7673

7774
def unbind(self,
7875
instance_id: str,

rootfs/helmbroker/loader.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ def download_file(url, dest):
2121

2222
def read_addons_file():
2323
data = read_file(f'{ADDONS_PATH}/addons.yaml')
24+
if not data:
25+
return {}
2426
addons_info = yaml.load(data, Loader=yaml.Loader)
2527
return addons_info
2628

@@ -69,8 +71,7 @@ def addons_meta_file():
6971
plans_meta.append(meta_file.split('/')[1:])
7072
addons_dict = {}
7173
for addon_meta in addons_meta:
72-
with open(f'{ADDONS_PATH}/{"/".join(addon_meta)}',
73-
'r') as f:
74+
with open(f'{ADDONS_PATH}/{"/".join(addon_meta)}', 'r') as f:
7475
meta = yaml.load(f.read(), Loader=yaml.Loader)
7576
meta['plans'] = []
7677
addons_dict[meta['name']] = meta

rootfs/helmbroker/tasks.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import os
22
import shutil
3-
from .utils import command, get_plan_path, get_chart_path, get_or_create_instance_meta
3+
from .utils import command, get_plan_path, get_chart_path, \
4+
get_or_create_instance_meta, get_or_create_binding_meta
45
from openbrokerapi.service_broker import *
56

67

7-
def provision(iself,
8-
instance_id: str,
9-
details: ProvisionDetails,
10-
async_allowed: bool,
11-
**kwargs) -> ProvisionedServiceSpec:
8+
def provision(instance_id: str,
9+
details: ProvisionDetails,
10+
async_allowed: bool,
11+
**kwargs) -> ProvisionedServiceSpec:
1212
chart_path = get_chart_path(instance_id)
1313
values_file = os.path.join(get_plan_path(instance_id), "values.yaml")
1414
args = [
@@ -33,4 +33,30 @@ def provision(iself,
3333
dashboard_url=config.get("dashboard_url", None),
3434
state=ProvisionState.SUCCESSFUL_CREATED,
3535
operation=config.get("operation", None),
36-
)
36+
)
37+
38+
39+
def bind(instance_id: str,
40+
binding_id: str,
41+
details: BindDetails,
42+
async_allowed: bool,
43+
**kwargs) -> Binding:
44+
chart_path = get_chart_path(instance_id)
45+
values_file = os.path.join(get_plan_path(instance_id), "values.yaml")
46+
args = [
47+
"template",
48+
details.context["instance_name"],
49+
chart_path,
50+
"-f",
51+
values_file
52+
]
53+
status, output = command("helm", *args) # templates.yaml
54+
if status != 0:
55+
return Binding(state="status error: %s" % status, operation=output)
56+
else:
57+
config = get_or_create_binding_meta(binding_id, output.split('bind.yaml')[1])
58+
return Binding(
59+
credentials=config.get("credential", None),
60+
state=ProvisionState.SUCCESSFUL_CREATED,
61+
operation=config.get("operation", None),
62+
)

rootfs/helmbroker/utils.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import json
44
import subprocess
55

6-
from .config import INSTANCES_PATH
6+
from .config import INSTANCES_PATH, ADDONS_PATH
7+
from .loader import read_addons_file
78

89

910
def command(cmd, *args, output_type="text"):
@@ -19,9 +20,29 @@ def command(cmd, *args, output_type="text"):
1920
get_chart_path = lambda instance_id: os.path.join(get_instance_path(instance_id), "chart")
2021
get_plan_path = lambda instance_id: os.path.join(get_instance_path(instance_id), "plan")
2122

23+
2224
def get_addon_path(service_id, plan_id):
23-
return ""
25+
services = read_addons_file()
26+
service = [addon for addon in [addons for _, addons in services.items()]
27+
if addon['id'] == service_id][0]
28+
plan = [plan for plan in service['plans'] if plan['id'] == plan_id][0]
29+
service_name = f'{service["name"]}-{service["version"]}'
30+
plan_name = plan['name']
31+
service_path = f'{ADDONS_PATH}/{service_name}'
32+
plan_path = f'{service_path}/plans/{plan_name}'
33+
return service_path, plan_path
34+
35+
36+
def get_addon_name(service_id):
37+
services = read_addons_file()
38+
service = [addon for addon in [addons for _, addons in services.items()]
39+
if addon['id'] == service_id][0]
40+
return service['name']
2441

2542

2643
def get_or_create_instance_meta(instance_id):
44+
pass
45+
46+
47+
def get_or_create_binding_meta(binding_id, credential):
2748
pass

0 commit comments

Comments
 (0)