1
+ import base64
2
+ import codecs
1
3
import json
2
- import datetime
3
- import time
4
- import os
5
- import sys
6
- import threading
7
4
import logging
5
+ import os
8
6
import signal
9
7
import sys
8
+ import threading
9
+ import time
10
10
import uuid
11
- import base64
12
- import codecs
13
- import restserver
14
- import restclient
15
- import logging_aux
11
+ from collections import namedtuple
12
+ from datetime import datetime
16
13
17
14
from mesoshttp .client import MesosClient
15
+ from mesoshttp .offers import Offer
16
+
17
+ import logging_aux
18
+ import restclient
19
+ import restserver
18
20
from restclient import AutoScaleRestClient
21
+ import heartbeat_table
19
22
20
- from mesoshttp .offers import Offer
21
23
22
24
class Test (object ):
23
25
class MesosFramework (threading .Thread ):
@@ -39,15 +41,17 @@ def __init__(self):
39
41
# signal.signal(signal.SIGINT, signal.SIG_IGN)
40
42
logging .getLogger ('mesoshttp' ).setLevel (logging .DEBUG )
41
43
42
- self .hpc_client = AutoScaleRestClient ()
43
- self .core_provisioning = 0.0
44
+ self .heartbeat_table = heartbeat_table .HeartBeatTable ()
45
+
46
+ self .hpc_client = AutoScaleRestClient ()
47
+ self .core_provisioning = 0.0
44
48
with open ("setupscript.ps1" ) as scriptfile :
45
49
hpc_setup_ps1 = scriptfile .read ()
46
- self .logger .info ("Loaded HPC setup script:/ n{}" .format (hpc_setup_ps1 ))
50
+ self .logger .info ("Loaded HPC setup script:\ n {}" .format (hpc_setup_ps1 ))
47
51
hpc_setup_ps1_utf16 = hpc_setup_ps1 .encode ('utf-16' )
48
- hpc_setup_ps1_utf16_nobom = hpc_setup_ps1_utf16 [2 :] if hpc_setup_ps1_utf16 [0 :2 ] == codecs .BOM_UTF16 else hpc_setup_ps1_utf16
52
+ hpc_setup_ps1_utf16_nobom = hpc_setup_ps1_utf16 [2 :] if hpc_setup_ps1_utf16 [
53
+ 0 :2 ] == codecs .BOM_UTF16 else hpc_setup_ps1_utf16
49
54
self .hpc_setup_ps1_b64 = base64 .b64encode (hpc_setup_ps1_utf16_nobom )
50
-
51
55
52
56
self .driver = None # type: MesosClient.SchedulerDriver
53
57
self .mesos_client = MesosClient (mesos_urls = ['http://172.16.1.4:5050' ])
@@ -57,6 +61,10 @@ def __init__(self):
57
61
self .mesos_client .on (MesosClient .UPDATE , self .status_update )
58
62
self .th = Test .MesosFramework (self .mesos_client )
59
63
self .th .start ()
64
+
65
+ self .heartbeat_server = restserver .RestServer (self .heartbeat_table ,8088 )
66
+ self .heartbeat_server .start ()
67
+
60
68
while True and self .th .isAlive ():
61
69
try :
62
70
self .th .join (1 )
@@ -65,11 +73,12 @@ def __init__(self):
65
73
break
66
74
67
75
def shutdown (self ):
68
- print ( 'Stop requested by user, stopping framework....' )
76
+ print 'Stop requested by user, stopping framework....'
69
77
self .logger .warn ('Stop requested by user, stopping framework....' )
70
78
self .driver .tearDown ()
71
79
self .mesos_client .stop = True
72
80
self .stop = True
81
+ self .heartbeat_server .stop ()
73
82
74
83
def subscribed (self , driver ):
75
84
self .logger .warn ('SUBSCRIBED' )
@@ -78,24 +87,25 @@ def subscribed(self, driver):
78
87
def status_update (self , update ):
79
88
# if update['status']['state'] == 'TASK_RUNNING':
80
89
# self.driver.kill(update['status']['agent_id']['value'], update['status']['task_id']['value'])
81
- print ( str (update ))
90
+ self . logger . log ( "Update received: \n {}" . format ( str (update ) ))
82
91
83
92
def offer_received (self , offers ):
84
93
# self.logger.info('OFFER: %s' % (str(offers)))
85
94
grow_decision = self .hpc_client .get_grow_decision ()
86
-
87
- if (grow_decision .cores_to_grow - self .core_provisioning > 0 ):
88
- for offer in offers : # type: Offer
89
- self .logger .info ("offer_received: {}" .format (
90
- (str (offer .get_offer ()))))
95
+
96
+ if grow_decision .cores_to_grow - self .core_provisioning > 0 :
97
+ for offer in offers : # type: Offer
91
98
mesos_offer = offer .get_offer ()
99
+ self .logger .info ("offer_received: {}" .format (
100
+ (str (mesos_offer ))))
92
101
if 'attributes' in mesos_offer :
93
102
attributes = mesos_offer ['attributes' ]
94
103
if self .get_text (attributes , 'os' ) != 'windows_server' :
95
104
offer .decline ()
96
105
else :
97
106
cores = self .get_scalar (attributes , 'cores' )
98
- cpus = self .get_scalar (mesos_offer ['resources' ], 'cpus' )
107
+ cpus = self .get_scalar (
108
+ mesos_offer ['resources' ], 'cpus' )
99
109
100
110
if cores == cpus :
101
111
self .accept_offer (offer )
@@ -105,44 +115,44 @@ def offer_received(self, offers):
105
115
offer .decline ()
106
116
else :
107
117
for offer in offers :
108
- offer .decline ()
118
+ offer .decline ()
109
119
110
120
def accept_offer (self , offer ):
111
- self .logger .info ("Offer %s meets hpc 's requiremnt " %
121
+ self .logger .info ("Offer %s meets HPC 's requirement " %
112
122
offer .get_offer ()['id' ]['value' ])
113
123
self .run_job (offer )
114
-
115
- # i = 0
116
- # for offer in offers:
117
- # if i == 0:
118
- # self.run_job(offer)
119
- # else:
120
- # offer.decline()
121
- # i+=1
122
- def get_scalar (self , dict , name ):
123
- for i in dict :
124
+
125
+ def get_scalar (self , collection , name ):
126
+ for i in collection :
124
127
if i ['name' ] == name :
125
128
return i ['scalar' ]['value' ]
126
129
return 0.0
127
130
128
- def get_text (self , dict , name ):
129
- for i in dict :
131
+ def get_text (self , collection , name ):
132
+ for i in collection :
130
133
if i ['name' ] == name :
131
134
return i ['text' ]['value' ]
132
135
return ""
133
136
134
137
def run_job (self , mesos_offer ):
135
138
offer = mesos_offer .get_offer ()
136
139
self .logger .info ("Accepting offer: {}" .format (str (offer )))
140
+
141
+ agent_id = offer ['agent_id' ]['value' ]
142
+ hostname = offer ['hostname' ]
143
+ task_id = uuid .uuid4 ().hex
144
+ cpus = self .get_scalar (offer ['resources' ], 'cpus' )
145
+
137
146
task = {
138
147
'name' : 'sample test' ,
139
- 'task_id' : {'value' : uuid . uuid4 (). hex },
140
- 'agent_id' : {'value' : offer [ ' agent_id' ][ 'value' ] },
148
+ 'task_id' : {'value' : task_id },
149
+ 'agent_id' : {'value' : agent_id },
141
150
'resources' : [
142
151
{
143
152
'name' : 'cpus' ,
144
153
'type' : 'SCALAR' ,
145
- 'scalar' : {'value' : self .get_scalar (offer ['resources' ], 'cpus' ) - 0.1 }
154
+ # work around of MESOS-8631
155
+ 'scalar' : {'value' : cpus - 0.1 }
146
156
},
147
157
{
148
158
'name' : 'mem' ,
@@ -152,14 +162,10 @@ def run_job(self, mesos_offer):
152
162
],
153
163
'command' : {'value' : 'powershell -EncodedCommand ' + self .hpc_setup_ps1_b64 }
154
164
}
155
- self .logger .debug ("Sending command:/n{}" .format (task ['command' ]['value' ]))
165
+ self .logger .debug (
166
+ "Sending command:\n {}" .format (task ['command' ]['value' ]))
156
167
mesos_offer .accept ([task ])
157
-
168
+ self . heartbeat_table . add_slaveinfo ( hostname , agent_id , task , cpus )
158
169
159
170
if __name__ == "__main__" :
160
- rest_server = restserver .RestServer (8088 )
161
- server_thread = threading .Thread (target = rest_server .run )
162
- server_thread .start ()
163
171
test_mesos = Test ()
164
- rest_server .stop ()
165
- server_thread .join ()
0 commit comments