mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
since 4.11.3, haproxy is always restarted when add/delete a lb rule. When haproxy is started, the processes are ``` root@r-854-VM:~# ps aux |grep haproxy root 22272 0.0 0.2 4036 668 ? Ss 07:52 0:00 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid haproxy 22274 0.0 2.3 38444 5856 ? S 07:52 0:00 /usr/sbin/haproxy-master haproxy 22275 0.0 0.3 38444 880 ? Ss 07:52 0:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds ``` When haproxy is reload, the processes are ``` root@r-854-VM:~# ps aux |grep haproxy root 22272 0.0 0.2 4168 632 ? Ss 07:52 0:00 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid haproxy 22283 0.0 2.3 38444 5884 ? S 07:53 0:00 /usr/sbin/haproxy-master haproxy 22286 0.0 0.3 38444 880 ? Ss 07:53 0:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds -sf 22275 ``` We need to change the pid file from /var/run/haproxy.pid to /run/haproxy.pid, so the haproxy will be reloaded instead of restarted.
85 lines
3.3 KiB
Python
Executable File
85 lines
3.3 KiB
Python
Executable File
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
import logging
|
|
import os.path
|
|
import re
|
|
from cs.CsDatabag import CsDataBag
|
|
from CsProcess import CsProcess
|
|
from CsFile import CsFile
|
|
import CsHelper
|
|
|
|
HAPROXY_CONF_T = "/etc/haproxy/haproxy.cfg.new"
|
|
HAPROXY_CONF_P = "/etc/haproxy/haproxy.cfg"
|
|
|
|
|
|
class CsLoadBalancer(CsDataBag):
|
|
""" Manage Load Balancer entries """
|
|
|
|
def process(self):
|
|
if "config" not in self.dbag.keys():
|
|
return
|
|
if 'configuration' not in self.dbag['config'][0].keys():
|
|
return
|
|
config = self.dbag['config'][0]['configuration']
|
|
file1 = CsFile(HAPROXY_CONF_T)
|
|
file1.empty()
|
|
for x in config:
|
|
[file1.append(w, -1) for w in x.split('\n')]
|
|
|
|
file1.commit()
|
|
file2 = CsFile(HAPROXY_CONF_P)
|
|
if not file2.compare(file1):
|
|
CsHelper.copy(HAPROXY_CONF_T, HAPROXY_CONF_P)
|
|
|
|
proc = CsProcess(['/run/haproxy.pid'])
|
|
if not proc.find():
|
|
logging.debug("CsLoadBalancer:: will restart HAproxy!")
|
|
CsHelper.service("haproxy", "restart")
|
|
else:
|
|
logging.debug("CsLoadBalancer:: will reload HAproxy!")
|
|
CsHelper.service("haproxy", "reload")
|
|
|
|
add_rules = self.dbag['config'][0]['add_rules']
|
|
remove_rules = self.dbag['config'][0]['remove_rules']
|
|
stat_rules = self.dbag['config'][0]['stat_rules']
|
|
self._configure_firewall(add_rules, remove_rules, stat_rules)
|
|
|
|
def _configure_firewall(self, add_rules, remove_rules, stat_rules):
|
|
firewall = self.config.get_fw()
|
|
|
|
logging.debug("CsLoadBalancer:: configuring firewall. Add rules ==> %s" % add_rules)
|
|
logging.debug("CsLoadBalancer:: configuring firewall. Remove rules ==> %s" % remove_rules)
|
|
logging.debug("CsLoadBalancer:: configuring firewall. Stat rules ==> %s" % stat_rules)
|
|
|
|
for rules in add_rules:
|
|
path = rules.split(':')
|
|
ip = path[0]
|
|
port = path[1]
|
|
firewall.append(["filter", "", "-A INPUT -p tcp -m tcp -d %s --dport %s -m state --state NEW -j ACCEPT" % (ip, port)])
|
|
|
|
for rules in remove_rules:
|
|
path = rules.split(':')
|
|
ip = path[0]
|
|
port = path[1]
|
|
firewall.append(["filter", "", "-D INPUT -p tcp -m tcp -d %s --dport %s -m state --state NEW -j ACCEPT" % (ip, port)])
|
|
|
|
for rules in stat_rules:
|
|
path = rules.split(':')
|
|
ip = path[0]
|
|
port = path[1]
|
|
firewall.append(["filter", "", "-A INPUT -p tcp -m tcp -d %s --dport %s -m state --state NEW -j ACCEPT" % (ip, port)])
|