11
11
# See the License for the specific language governing permissions and
12
12
# limitations under the License.
13
13
###############################################################################
14
-
14
+ import csv
15
15
import os
16
16
import subprocess
17
17
import tempfile
18
+ from StringIO import StringIO
18
19
from contextlib import contextmanager
19
20
21
+ import time
20
22
from jinja2 import Template
23
+ import requests
21
24
22
25
from cloudify_rest_client import exceptions as rest_exceptions
23
26
from cloudify import ctx
@@ -58,18 +61,34 @@ def configure(subject=None):
58
61
59
62
60
63
def add_backend (port , maxconn , backend_address = None ):
64
+ backends_before = len (_read_haproxy_stats ())
65
+ ctx .logger .info ('backends before adding ' + str (backends_before ))
66
+
61
67
with _backends_update () as backends :
62
68
backends [ctx .source .instance .id ] = {
63
69
'address' : backend_address or ctx .source .instance .host_ip ,
64
70
'port' : port ,
65
71
'maxconn' : maxconn
66
72
}
67
73
74
+ time .sleep (10 )
75
+
76
+ backends_after = len (_read_haproxy_stats ())
77
+ ctx .logger .info ('backends after adding ' + str (backends_after ))
78
+
68
79
69
80
def remove_backend ():
81
+ backends_before = len (_read_haproxy_stats ())
82
+ ctx .logger .info ('backends before removing ' + str (backends_before ))
83
+
70
84
with _backends_update () as backends :
71
85
backends .pop (ctx .source .instance .id , None )
72
86
87
+ time .sleep (10 )
88
+
89
+ backends_after = len (_read_haproxy_stats ())
90
+ ctx .logger .info ('backends after removing ' + str (backends_after ))
91
+
73
92
74
93
@contextmanager
75
94
def _backends_update ():
@@ -94,6 +113,21 @@ def _backends_update():
94
113
raise
95
114
96
115
116
+ def _read_haproxy_stats ():
117
+ csv_data = requests .get (
118
+ 'http://localhost:9000/haproxy_stats;csv' ,
119
+ auth = ('admin' , 'password' )).text
120
+ buff = StringIO (csv_data )
121
+ parsed_csv_data = list (csv .reader (buff ))
122
+ headers = parsed_csv_data [0 ]
123
+ structured_csv_data = [dict (zip (headers , row ))
124
+ for row in parsed_csv_data ]
125
+ return dict ([(struct ['svname' ], int (struct ['stot' ]))
126
+ for struct in structured_csv_data
127
+ if struct ['# pxname' ] == 'servers' and
128
+ struct ['svname' ] != 'BACKEND' ])
129
+
130
+
97
131
def start ():
98
132
_service ('start' )
99
133
0 commit comments