Skip to content

Commit d51fe43

Browse files
author
lijianguo
committed
feat(controller):add drycc resource cmd
1 parent 8b701fd commit d51fe43

7 files changed

Lines changed: 69 additions & 31 deletions

File tree

charts/controller/templates/controller-clusterrole.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ rules:
6767
verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
6868
- apiGroups: ["servicecatalog.k8s.io"]
6969
resources: ["serviceinstances"]
70-
verbs: ["get", "list", "watch", "create", "delete", "update"]
70+
verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
7171
- apiGroups: ["servicecatalog.k8s.io"]
72-
resources: ["serviceinstances"]
73-
verbs: ["get", "list", "watch", "create", "delete", "update"]
72+
resources: ["servicebindings"]
73+
verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
7474
{{- end -}}
7575
{{- end -}}

rootfs/api/models/resource.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def attach(self, *args, **kwargs):
7171

7272
@transaction.atomic
7373
def delete(self, *args, **kwargs):
74-
if self.binding and self.binding == "Ready":
74+
if self.binding == "Ready":
7575
raise DryccException("the plan is still binding")
7676
# Deatch ServiceInstance, updates k8s
7777
self.detach(*args, **kwargs)
@@ -84,18 +84,18 @@ def detach(self, *args, **kwargs):
8484
self._scheduler.servicecatalog.get_instance(self.app.id, self.name)
8585
self._scheduler.servicecatalog.delete_instance(self.app.id, self.name)
8686
except KubeException as e:
87-
raise ServiceUnavailable("Could not delete volume {} for application {}".format(name, self.app_id)) from e # noqa
87+
raise ServiceUnavailable("Could not delete resource {} for application {}".format(self.name, self.app_id)) from e # noqa
8888

8989
def log(self, message, level=logging.INFO):
9090
"""Logs a message in the context of this service.
9191
9292
This prefixes log messages with an application "tag" that the customized
9393
drycc-logspout will be on the lookout for. When it's seen, the message-- usually
9494
an application event of some sort like releasing or scaling, will be considered
95-
as "belonging" to the application instead of the controller and will be handled
95+
as "belonging" to the application instead of the contoller and will be handled
9696
accordingly.
9797
"""
98-
logger.log(level, "[{}]: {}".format(self.id, message))
98+
logger.log(level, "[{}]: {}".format(self.uuid, message))
9999

100100
def bind(self, *args, **kwargs):
101101
if self.status != "Ready":
@@ -124,12 +124,14 @@ def bind(self, *args, **kwargs):
124124
raise ServiceUnavailable(msg) from e
125125

126126
def unbind(self, *args, **kwargs):
127-
if self.binding != "Ready":
127+
if not self.binding:
128128
raise DryccException("the resource is not binding")
129129
try:
130130
# We raise an exception when a resource doesn't exist
131131
self._scheduler.servicecatalog.get_binding(self.app.id, self.name)
132132
self._scheduler.servicecatalog.delete_binding(self.app.id, self.name)
133+
self.binding = None
134+
self.save()
133135
except KubeException as e:
134136
raise ServiceUnavailable("Could not unbind resource {} for application {}".format(self.name, self.app_id)) from e # noqa
135137

@@ -138,21 +140,22 @@ def attach_update(self, *args, **kwargs):
138140
data = self._scheduler.servicecatalog.get_instance(
139141
self.app.id, self.name).json()
140142
except KubeException as e:
141-
self.log("certificate {} does not exist".format(self.app.id),
142-
level=logging.INFO)
143-
data = None
144-
logger.info(e)
143+
self.DryccException("resource {} does not exist".format(self.name))
145144
try:
146145
version = data["metadata"]["resourceVersion"]
147146
instance = self.plan.split(":")
148147
kwargs = {
149148
"instance_class": instance[0],
150149
"instance_plan": ":".join(instance[1:]),
151150
"parameters": self.options,
151+
"external_id": data["spec"]["externalID"]
152152
}
153153
self._scheduler.servicecatalog.put_instance(
154154
self.app.id, self.name, version, **kwargs
155155
)
156+
# self._scheduler.servicecatalog.patch_instance(
157+
# self.app.id, self.name, version, **kwargs
158+
# )
156159
# create/patch/put retrieve_task
157160
data = {
158161
"task_id": uuid.uuid4().hex,
@@ -171,7 +174,7 @@ def retrieve(self, *args, **kwargs):
171174
resp_i = self._scheduler.servicecatalog.get_instance(
172175
self.app.id, self.name).json()
173176
self.status = resp_i.get('status', {}).\
174-
get('lastConditionState', '').lower()
177+
get('lastConditionState')
175178
update_flag = True
176179
except KubeException as e:
177180
logger.info("retrieve instance info error: {}".format(e))
@@ -181,7 +184,7 @@ def retrieve(self, *args, **kwargs):
181184
resp_b = self._scheduler.servicecatalog.get_binding(
182185
self.app.id, self.name).json()
183186
self.binding = resp_b.get('status', {}).\
184-
get('lastConditionState', '').lower()
187+
get('lastConditionState')
185188
self.options = resp_b.get('spec', {}).get('parameters', {})
186189
update_flag = True
187190
secret_name = resp_b.get('spec', {}).get('secretName')
@@ -213,12 +216,8 @@ def detach_resource(self, *args, **kwargs):
213216
logger.info("delete binding info error: {}".format(e))
214217
self.binding = None
215218

216-
if (self.status != "Ready") or (self.binding is None):
217-
try:
218-
self._scheduler.servicecatalog.delete_instance(
219-
self.app.id, self.name)
220-
except KubeException as e:
221-
logger.info("retrieve instance info error: {}".format(e))
219+
if (self.status != "Ready") or (not self.binding):
220+
self.delete()
222221

223222

224223
@task
@@ -234,7 +233,7 @@ def retrieve_task(data):
234233
if _:
235234
return True
236235
else:
237-
t = time.time() - resource.created.timestamps()
236+
t = time.time() - resource.created.timestamp()
238237
if t < 3600:
239238
apply_async(retrieve_task, delay=30000, args=(data, ))
240239
elif t < 3600 * 12:

rootfs/api/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,7 @@ class ResourceSerializer(serializers.ModelSerializer):
659659
owner = serializers.ReadOnlyField(source='owner.username')
660660
name = serializers.CharField(max_length=63, required=True)
661661
plan = serializers.CharField(max_length=128, required=True)
662+
data = JSONFieldSerializer(required=False, binary=True)
662663
options = JSONFieldSerializer(required=False, binary=True)
663664

664665
class Meta:
@@ -670,8 +671,7 @@ def update(self, instance, validated_data):
670671
if instance.plan.split(':')[0] != validated_data.get('plan', '').split(':')[0]: # noqa
671672
raise DryccException("the resource cann't changed")
672673
instance.plan = validated_data.get('plan')
673-
if validated_data.get('options'):
674-
instance.options = validated_data.get('options')
674+
instance.options = validated_data.get('options')
675675
instance.attach_update()
676676
instance.save()
677677
return instance

rootfs/api/settings/production.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -392,10 +392,10 @@
392392
'default': {
393393
'ENGINE': 'django.db.backends.postgresql',
394394
'NAME': os.environ.get(
395-
'DRYCC_DATABASE_NAME', os.environ.get('DRYCC_DATABASE_USER', 'drycc')),
396-
'USER': os.environ.get('DRYCC_DATABASE_USER', ''),
397-
'PASSWORD': os.environ.get('DRYCC_DATABASE_PASSWORD', ''),
398-
'HOST': os.environ.get('DRYCC_DATABASE_SERVICE_HOST', ''),
395+
'DRYCC_DATABASE_NAME', os.environ.get('DRYCC_DATABASE_USER', 'drycc_controller')),
396+
'USER': os.environ.get('DRYCC_DATABASE_USER', 'drycc_controller'),
397+
'PASSWORD': os.environ.get('DRYCC_DATABASE_PASSWORD', '123456'),
398+
'HOST': os.environ.get('DRYCC_DATABASE_SERVICE_HOST', '192.168.6.50'),
399399
'PORT': os.environ.get('DRYCC_DATABASE_SERVICE_PORT', 5432),
400400
# https://docs.djangoproject.com/en/1.11/ref/databases/#persistent-connections
401401
'CONN_MAX_AGE': 600,

rootfs/api/views.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -792,10 +792,14 @@ def binding(self, request, *args, **kwargs):
792792
bind_action = self.request.data.get('bind_action', '').lower()
793793
if bind_action == 'bind':
794794
resource.bind()
795-
return HttpResponse(status=status.HTTP_202_ACCEPTED)
795+
serializer = self.get_serializer(resource, many=False)
796+
logger.info("resoruce bind response data: {}".format(serializer))
797+
return Response(serializer.data)
796798
elif bind_action == 'unbind':
797799
resource.unbind()
798-
return HttpResponse(status=status.HTTP_202_ACCEPTED)
800+
serializer = self.get_serializer(resource, many=False)
801+
logger.info("resoruce unbind response data: {}".format(serializer))
802+
return Response(serializer.data)
799803
else:
800804
return Http404("unknown action")
801805

rootfs/scheduler/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ def http_patch(self, path, data=None, **kwargs):
221221
"""
222222
try:
223223
url = urljoin(self.url, path)
224+
# accepted media types include:
225+
# application/json-patch+json,
226+
# application/merge-patch+json,
227+
# application/apply-patch+yaml
228+
# self.session.headers["Content-Type"] = "application/json-patch+json"
224229
response = self.session.patch(url, data=data, **kwargs)
225230
except requests.exceptions.ConnectionError as err:
226231
# reraise as KubeException, but log stacktrace.

rootfs/scheduler/resources/servicecatalog.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import logging
12
from scheduler.resources import Resource
23
from scheduler.exceptions import KubeHTTPException
34

5+
logger = logging.getLogger(__name__)
6+
47

58
class ServiceCatalog(Resource):
69
api_version = 'servicecatalog.k8s.io/v1beta1'
@@ -22,14 +25,29 @@ def service_instance_manifest(namespace, name, version=None, **kwargs):
2225
"spec": {
2326
"clusterServiceClassExternalName": kwargs.get('instance_class'),
2427
"clusterServicePlanExternalName": kwargs.get('instance_plan'),
25-
#{"param - 1": "value - 1","param - 2": "value - 2"} # noqa
26-
"parameters": kwargs.get('parameters'),
2728
}
2829
}
2930
if version:
3031
data["metadata"]["resourceVersion"] = version
32+
if kwargs.get('parameters'):
33+
data["spec"]["parameters"] = kwargs.get('parameters')
34+
if kwargs.get('external_id'):
35+
data["spec"]["externalID"] = kwargs.get('external_id')
3136
return data
3237

38+
# @staticmethod
39+
# def service_instance_patch_manifest(namespace, name, version=None, **kwargs):
40+
# data = {
41+
# "spec": {
42+
# "clusterServicePlanExternalName": kwargs.get('instance_plan'),
43+
# "parameters": kwargs.get('parameters'),
44+
# }
45+
# }
46+
# if version:
47+
# data["metadata"] = {}
48+
# data["metadata"]["resourceVersion"] = version
49+
# return data
50+
3351
def get_instance(self, namespace, name=None):
3452
"""
3553
Fetch a single serviceinstance or a list of serviceinstances
@@ -52,6 +70,7 @@ def create_instance(self, namespace, name, **kwargs):
5270
"""
5371
url = self.api('/namespaces/{}/serviceinstances', namespace)
5472
data = self.service_instance_manifest(namespace, name, **kwargs)
73+
logging.info("create_instance_data:{}".format(data))
5574
response = self.http_post(url, json=data)
5675
if not response.status_code == 201:
5776
raise KubeHTTPException(
@@ -65,13 +84,24 @@ def put_instance(self, namespace, name, version, **kwargs):
6584
"""
6685
url = self.api('/namespaces/{}/serviceinstances/{}', namespace, name)
6786
data = self.service_instance_manifest(namespace, name, version, **kwargs)
87+
logger.info("put_instance data:{}".format(data))
6888
response = self.http_put(url, json=data)
6989
if not response.status_code == 200:
7090
raise KubeHTTPException(
7191
response,
7292
"update serviceinstances {}".format(namespace))
7393
return response
7494

95+
# def patch_instance(self, namespace, name, version, **kwargs):
96+
# data = self.service_instance_patch_manifest(
97+
# namespace, name, version, **kwargs)
98+
# url = self.api("/namespaces/{}/serviceinstances/{}", namespace, name)
99+
# logger.info("patch_instance data:{}".format(data))
100+
# response = self.http_patch(url, json=data)
101+
# if self.unhealthy(response.status_code):
102+
# raise KubeHTTPException(response, "patch serviceinstances {}".format(namespace))
103+
# return response
104+
75105
def delete_instance(self, namespace, name):
76106
"""
77107
Delete serviceinstances

0 commit comments

Comments
 (0)