Skip to content

Commit f48bcdc

Browse files
Keerthan Malamboersma
authored andcommitted
docs(k8s): add k8s integration documentation in customizing schedulers
1 parent 2c8cdce commit f48bcdc

1 file changed

Lines changed: 68 additions & 22 deletions

File tree

scheduler/k8s.py

Lines changed: 68 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@
3939
"replicas":$num,
4040
"selector":{
4141
"name":"$id",
42-
"version":"$appversion"
42+
"version":"$appversion",
43+
"type":"$type"
4344
},
4445
"template":{
4546
"metadata":{
4647
"labels":{
4748
"name":"$id",
48-
"version":"$appversion"
49+
"version":"$appversion",
50+
"type":"$type"
4951
}
5052
},
5153
"spec":{
@@ -78,7 +80,8 @@
7880
}
7981
],
8082
"selector":{
81-
"name":"$label"
83+
"name":"$label",
84+
"type":"$type"
8285
}
8386
}
8487
}'''
@@ -101,7 +104,7 @@ def __init__(self, target, auth, options, pkey):
101104
self.apiversion = "v1"
102105
self.conn = httplib.HTTPConnection(self.target+":"+self.port)
103106

104-
def _get_old_rc(self, name):
107+
def _get_old_rc(self, name, app_type):
105108
con_app = httplib.HTTPConnection(self.target+":"+self.port)
106109
con_app.request('GET', '/api/'+self.apiversion +
107110
'/namespaces/default/replicationcontrollers')
@@ -118,7 +121,8 @@ def _get_old_rc(self, name):
118121
exists = False
119122
prev_rc = []
120123
for rc in parsed_json['items']:
121-
if 'name' in rc['metadata']['labels'] and name == rc['metadata']['labels']['name']:
124+
if('name' in rc['metadata']['labels'] and name == rc['metadata']['labels']['name'] and
125+
'type' in rc['spec']['selector'] and app_type == rc['spec']['selector']['type']):
122126
exists = True
123127
prev_rc = rc
124128
break
@@ -154,7 +158,8 @@ def _get_rc_(self, name):
154158

155159
def deploy(self, name, image, command, **kwargs):
156160
app_name = kwargs.get('aname', {})
157-
old_rc = self._get_old_rc(app_name)
161+
app_type = name.split(".")[1]
162+
old_rc = self._get_old_rc(app_name, app_type)
158163
new_rc = self._create_rc(name, image, command, **kwargs)
159164
desired = int(old_rc["spec"]["replicas"])
160165
old_rc_name = old_rc["metadata"]["name"]
@@ -257,12 +262,12 @@ def _scale_app(self, name, num):
257262
self._scale_rc(js_template)
258263

259264
def scale(self, name, image, command, **kwargs):
260-
rc_name = name.split(".")[0]
265+
rc_name = name.replace(".", "-")
261266
rc_name = rc_name.replace("_", "-")
262267
if not 200 <= self._get_rc_status(rc_name) <= 299:
263268
self.create(name, image, command, **kwargs)
264269
return
265-
name = name.split(".")[0]
270+
name = name.replace(".", "-")
266271
name = name.replace("_", "-")
267272
num = kwargs.get('num', {})
268273
js_template = self._get_rc_(name)
@@ -279,7 +284,7 @@ def _create_rc(self, name, image, command, **kwargs):
279284
app_name = kwargs.get('aname', {})
280285
app_type = name.split(".")[1]
281286
container_name = app_name+"-"+app_type
282-
name = name.split(".")[0]
287+
name = name.replace(".", "-")
283288
name = name.replace("_", "-")
284289
args = command.split()
285290

@@ -292,6 +297,7 @@ def _create_rc(self, name, image, command, **kwargs):
292297
l["image"] = self.registry+"/"+image
293298
l['num'] = num
294299
l['containername'] = container_name
300+
l['type'] = app_type
295301
template = string.Template(RC_TEMPLATE).substitute(l)
296302
js_template = json.loads(template)
297303
containers = js_template["spec"]["template"]["spec"]["containers"]
@@ -338,17 +344,36 @@ def _create_rc(self, name, image, command, **kwargs):
338344

339345
def create(self, name, image, command, **kwargs):
340346
self._create_rc(name, image, command, **kwargs)
341-
name = name.split(".")[0]
347+
app_type = name.split(".")[1]
348+
name = name.replace(".", "-")
342349
name = name.replace("_", "-")
343350
app_name = kwargs.get('aname', {})
344351
try:
345-
self._create_service(name, app_name)
352+
self._create_service(name, app_name, app_type)
346353
except Exception as e:
354+
self._scale_app(name, 0)
347355
self._delete_rc(name)
348356
err = '{} (create): {}'.format(name, e)
349357
raise RuntimeError(err)
350358

351-
def _create_service(self, name, app_name):
359+
def _get_service(self, name):
360+
con_get = httplib.HTTPConnection(self.target+":"+self.port)
361+
con_get.request('GET', '/api/'+self.apiversion+'/namespaces/default/services/'+name)
362+
resp = con_get.getresponse()
363+
reason = resp.reason
364+
status = resp.status
365+
data = resp.read()
366+
con_get.close()
367+
if not 200 <= status <= 299:
368+
errmsg = "Failed to get Service: {} {} - {}".format(
369+
status, reason, data)
370+
raise RuntimeError(errmsg)
371+
return (status, data, reason)
372+
373+
def _create_service(self, name, app_name, app_type):
374+
random.seed(app_name)
375+
app_id = random.randint(1, 100000)
376+
appname = "app-"+str(app_id)
352377
actual_pod = {}
353378
for _ in xrange(300):
354379
status, data, reason = self._get_pods()
@@ -370,9 +395,8 @@ def _create_service(self, name, app_name):
370395
l["version"] = self.apiversion
371396
l["label"] = app_name
372397
l["port"] = port
373-
random.seed(app_name)
374-
app_id = random.randint(1, 100000)
375-
l["name"] = "app-"+str(app_id)
398+
l['type'] = app_type
399+
l["name"] = appname
376400
template = string.Template(SERVICE_TEMPLATE).substitute(l)
377401
headers = {'Content-Type': 'application/json'}
378402
conn_serv = httplib.HTTPConnection(self.target+":"+self.port)
@@ -383,7 +407,27 @@ def _create_service(self, name, app_name):
383407
reason = resp.reason
384408
status = resp.status
385409
conn_serv.close()
386-
if not 200 <= status <= 299:
410+
if status == 409:
411+
status, data, reason = self._get_service(appname)
412+
srv = json.loads(data)
413+
if srv['spec']['selector']['type'] == 'web':
414+
return
415+
srv['spec']['selector']['type'] = app_type
416+
srv['spec']['ports'][0]['targetPort'] = port
417+
headers = {'Content-Type': 'application/json'}
418+
conn_scalepod = httplib.HTTPConnection(self.target+":"+self.port)
419+
conn_scalepod.request('PUT', '/api/'+self.apiversion+'/namespaces/default/' +
420+
'services/'+appname, headers=headers, body=json.dumps(srv))
421+
resp = conn_scalepod.getresponse()
422+
data = resp.read()
423+
reason = resp.reason
424+
status = resp.status
425+
conn_scalepod.close()
426+
if not 200 <= status <= 299:
427+
errmsg = "Failed to update the Service:{} {} {} - {}".format(
428+
name, status, reason, data)
429+
raise RuntimeError(errmsg)
430+
elif not 200 <= status <= 299:
387431
errmsg = "Failed to create Service:{} {} {} - {}".format(
388432
name, status, reason, data)
389433
raise RuntimeError(errmsg)
@@ -417,9 +461,10 @@ def _delete_rc(self, name):
417461

418462
def destroy(self, name):
419463
"""
420-
Destroy a container
464+
Destroy a the app
421465
"""
422-
name = name.split(".")[0]
466+
name = name.split(".")
467+
name = name[0]+'-'+name[1]
423468
name = name.replace("_", "-")
424469
appname = ''
425470
try:
@@ -454,7 +499,7 @@ def destroy(self, name):
454499
status = resp.status
455500
data = resp.read()
456501
con_serv.close()
457-
if not 200 <= status <= 299:
502+
if status != 404 and not 200 <= status <= 299:
458503
errmsg = "Failed to delete service:{} {} {} - {}".format(
459504
name, status, reason, data)
460505
raise RuntimeError(errmsg)
@@ -529,7 +574,7 @@ def _pod_log(self, name):
529574
return (status, data, reason)
530575

531576
def logs(self, name):
532-
name = name.split(".")[0]
577+
name = name.replace(".", "-")
533578
name = name.replace("_", "-")
534579
status, data, reason = self._get_pods()
535580
parsed_json = json.loads(data)
@@ -544,7 +589,7 @@ def run(self, name, image, entrypoint, command):
544589
"""
545590
Run a one-off command
546591
"""
547-
name = name.split(".")[0]
592+
name = name.replace(".", "-")
548593
name = name.replace("_", "-")
549594
l = {}
550595
l["id"] = name
@@ -603,7 +648,8 @@ def run(self, name, image, entrypoint, command):
603648

604649
def _get_pod_state(self, name):
605650
try:
606-
name = name.split(".")[0]
651+
name = name.split(".")
652+
name = name[0]+'-'+name[1]
607653
name = name.replace("_", "-")
608654
for _ in xrange(120):
609655
status, data, reason = self._get_pods()

0 commit comments

Comments
 (0)