diff --git a/etc/nca47.conf.sample b/etc/nca47.conf.sample index 327c8bf..193bf46 100644 --- a/etc/nca47.conf.sample +++ b/etc/nca47.conf.sample @@ -1,5 +1,4 @@ [DEFAULT] - # # Options defined in ironic.common.exception # @@ -224,9 +223,9 @@ # MySQL engine to use. (string value) #mysql_engine=InnoDB +connection=mysql://nca47:passw0rd@192.168.33.10:3306/nca47 - -# + # # Options defined in oslo.db # @@ -325,7 +324,6 @@ # database operation up to db_max_retry_interval. (boolean # value) #db_inc_retry_interval=true - # If db_inc_retry_interval is set, the maximum seconds between # retries of a database operation. (integer value) #db_max_retry_interval=10 @@ -384,3 +382,70 @@ # Sets the list of available ciphers. value should be a string # in the OpenSSL cipher list format. (string value) #ciphers= + + [oslo_messaging_rabbit] + +# The RabbitMQ broker address where a single node is used. (string value) +rabbit_host = 192.168.33.1 +#rabbit_host = 192.168.0.104 +#rabbit_host = 192.168.1.105 + +# The RabbitMQ userid. (string value) +#rabbit_userid = nca47 +rabbit_userid = stackrabbit +#rabbit_userid = guest +#rabbit_port = 15672 + +# The RabbitMQ password. (string value) +#rabbit_password = nca47 +rabbit_password = passw0rd +#rabbit_password = guest + +[backend_driver] +dns_driver = zdns +firewall_driver = fw +# cli_driver value is cli or fake +cli_driver = cli + + +# [agent] section use to configure agent host node information +# api/cli interface to show agent lists will use below informations +[agent] +agent_ip = 127.0.0.1 +agent_nat_ip = 127.0.0.1 +dc_name = PDC +network_zone = BIZ +agent_type = FW + +# Seconds between nodes reporting state to server should be less than agent_down_time, +# best if it is half or less than agent_down_time. +report_interval = 30 +# Seconds to regard the agent is down; should be at least twice report_interval, +# to be sure the agent is down for good. +agent_down_time = 75 + +[zdns] +dns_vres_id = eef520f4-1be5-44ca-bc1f-bc23389acc66 +host_ip = 192.168.1.235 +port = 20120 +view_id = default +auth_name = admin +auth_pw = zdns + +# backend firewall device's access infos +[firewall_backend] +host = 192.168.1.234 +username = admin +password = admin_default + + +# backend device's command-line interface's access infos +[cli_backend] +device_type = cisco +host = 192.168.1.118 +port = 22 +username = admin +password = Cisco123 +authorize = False +auth_pass = password + diff --git a/nca47/agent/__init__.py b/nca47/agent/__init__.py index e69de29..929d7e7 100644 --- a/nca47/agent/__init__.py +++ b/nca47/agent/__init__.py @@ -0,0 +1,60 @@ +from oslo_config import cfg +from oslo_log import log as logging +from nca47.agent import cli_driver +from nca47.agent import dns_driver +from nca47.agent import firewall_driver +from nca47.common import exception +from nca47.common.i18n import _ + +LOG = logging.getLogger(__name__) + +DRIVER_OPTS = [ + cfg.StrOpt('dns_driver', default='zdns', + help=_('The dns driver for nca47 calling.')), + cfg.StrOpt('firewall_driver', default='fake', + help=_('The firewall driver for nca47 calling.')), + cfg.StrOpt('cli_driver', default='cli', + help=_('The backend device type for nca47 in calling.')) +] + +CONF = cfg.CONF +opt_group = cfg.OptGroup(name='backend_driver', + title='Options for the backend device service') +CONF.register_group(opt_group) + +CONF.register_opts(DRIVER_OPTS, opt_group) + + +def get_dns_backend(): + LOG.debug("Loading dns backend driver by conf file") + driver_name = CONF.backend_driver.dns_driver + if driver_name == 'zdns': + return dns_driver.zdns_driver.dns_zone_driver.get_instance() + elif driver_name == 'fake': + return dns_driver.fake_driver.fake_dns_driver.get_instance() + else: + raise exception.DriverNotFound(driver_name=driver_name) + + +def get_firewall_backend(): + LOG.debug("Loading firewall backend driver by conf file") + driver_name = CONF.backend_driver.firewall_driver + if driver_name == 'fw': + return firewall_driver.fw_driver.fw_driver.get_instance() +# return fw_driver.zdns_driver.dns_zone_driver.get_instance() + elif driver_name == 'fake': + return firewall_driver.fake_driver.fake_driver.get_instance() + else: + raise exception.DriverNotFound(driver_name=driver_name) + + +def get_cli_backend(**kwargs): + """ + Get backend command-line interface device + """ + LOG.debug("Loading backend command-line interface infos by conf file") + driver_name = CONF.backend_driver.cli_driver + if driver_name == 'cli': + return cli_driver.clios + else: + raise exception.DriverNotFound(driver_name=driver_name) diff --git a/nca47/agent/zdns_driver/__init__.py b/nca47/agent/agentFlag/__init__.py similarity index 100% rename from nca47/agent/zdns_driver/__init__.py rename to nca47/agent/agentFlag/__init__.py diff --git a/nca47/agent/agentFlag/agent_config.py b/nca47/agent/agentFlag/agent_config.py new file mode 100644 index 0000000..b399416 --- /dev/null +++ b/nca47/agent/agentFlag/agent_config.py @@ -0,0 +1,43 @@ +from oslo_config import cfg +from oslo_log import log as logging +from nca47.common.i18n import _ + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +AGENT_OPTS = [ + cfg.StrOpt('agent_net_ip', + default='0.0.0.0', + help=_('The public ip address of agent host ' + 'on which run agent service.')), + cfg.StrOpt('agent_ip', + default='0.0.0.0', + help=_('The internal ip address of agent host ' + 'on which run agent service')), + cfg.StrOpt('dc_name', + default='PDC', + help=_('The DataCenter name which the agent belongs to')), + cfg.StrOpt('network_zone', + default='BIZ', + help=_('The network zone name which the agent belongs to')), + cfg.StrOpt('agent_type', + default='zdns', + help=_('The device type which agent would be connect')) +] + +opt_group = cfg.OptGroup(name='agent', + title='Options for nca47 agent node info') +CONF.register_group(opt_group) +CONF.register_opts(AGENT_OPTS, opt_group) + + +def getAgent_config(): + host = CONF.agent.agent_ip + nat_ip = CONF.agent.agent_net_ip + dc_name = CONF.agent.dc_name + network_zone = CONF.agent.network_zone + agent_type = CONF.agent.agent_type + agent = {"agent_ip": host, "agent_nat_ip": nat_ip, "dc_name": dc_name, + "network_zone": network_zone, "agent_type": agent_type + } + return agent diff --git a/nca47/agent/agentFlag/agent_rpcapi.py b/nca47/agent/agentFlag/agent_rpcapi.py new file mode 100644 index 0000000..c744455 --- /dev/null +++ b/nca47/agent/agentFlag/agent_rpcapi.py @@ -0,0 +1,47 @@ +import oslo_messaging as messaging +from oslo_config import cfg +from oslo_log import log as logging +from nca47.common import rpc +from nca47.common.i18n import _LI + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +AGENT_API = None + + +class AgentAPI(object): + """ + Client side of the agent manager RPC API. + + API version history: + + 1.0 - Initial version + """ + RPC_API_VERSION = '1.0' + + def __init__(self, topic='check_agent_heartbeat'): + rpc.init(CONF) + target = messaging.Target(topic=topic, version=self.RPC_API_VERSION) + self.client = rpc.get_client(target, version_cap=self.RPC_API_VERSION) + + @classmethod + def get_instance(cls): + """ + The rpc.get_client() which is called upon the API object initialization + will cause a assertion error if the designate.rpc.TRANSPORT isn't setup + by rpc.init() before. + + This fixes that by creating the rpcapi when demanded. + """ + global AGENT_API + if not AGENT_API: + AGENT_API = cls() + return AGENT_API + + def report_agent_state(self, agentinfo): + LOG.info(_LI("Checking agent heartbeat: Calling service's " + "report_agent_state.")) + context = {} + return self.client.call(context, 'report_agent_state', + agent_info=agentinfo) diff --git a/nca47/agent/cli_driver/__init__.py b/nca47/agent/cli_driver/__init__.py new file mode 100644 index 0000000..af929ab --- /dev/null +++ b/nca47/agent/cli_driver/__init__.py @@ -0,0 +1 @@ +import clios diff --git a/nca47/agent/cli_driver/clios.py b/nca47/agent/cli_driver/clios.py new file mode 100644 index 0000000..30903e0 --- /dev/null +++ b/nca47/agent/cli_driver/clios.py @@ -0,0 +1,296 @@ +import paramiko +import re +import socket +from oslo_log import log as logging +from oslo_config import cfg +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.common.i18n import _LW + +# py2 vs py3; replace with six via ziploader +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + +LOG = logging.getLogger(__name__) + +CLI_OS_OPTS = [ + cfg.StrOpt('device_type', + default='cisco', + help=_('the target device type which would be connect')), + cfg.StrOpt('host', + default='127.0.0.1', + help=_('The server hostname/ip to connect to.')), + cfg.IntOpt('port', + default=22, + help=_('he server port to connect to')), + cfg.StrOpt('username', + default='admin', + help=_('the username to authenticate on ssh connect.')), + cfg.StrOpt('password', + default='password', + help=_('a password to use for authentication or for ' + 'unlocking a private key')), + cfg.BoolOpt('authorize', + default=False, + help=_('whether need to enable operation privilege')), + cfg.StrOpt('auth_pass', + default='auth_pass', + help=_('the password which authorize operation privilege')) +] + +CONF = cfg.CONF +opt_group = cfg.OptGroup(name='cli_backend', + title='Options for device ssh connection ' + 'informations') +CONF.register_group(opt_group) +CONF.register_opts(CLI_OS_OPTS, opt_group) + +internal_log_path = 'sshClient.log' + +AUTH_ERROR_RE = re.compile(r"access denied", re.I), +AUTH_PASSWD_RE = re.compile(r"[\r\n]?password:", re.I) +NEED_AUTH_RE = re.compile(r"permission denied", re.I) + +CLI_ERRORS_RE = [ + re.compile(r"% ?Error"), + re.compile(r"% ?Bad secret"), + re.compile(r"invalid (?:parameter|command|input)", re.I), + re.compile(r"incomplete ip prefix", re.I), + re.compile(r"invalid ip address", re.I), + re.compile(r"(?:incomplete|ambiguous) command", re.I), + re.compile(r"connection timed out", re.I), + re.compile(r"[^\r\n]+ not found", re.I), + re.compile(r"'[^']' +returned error code: ?\d+"), + re.compile(r"user doesn't have any privilege", re.I), +] + +CLI_PROMPTS_RE = [ + re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), + re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") +] + + +def to_list(val): + if isinstance(val, (list, tuple)): + return list(val) + elif val is not None: + return [val] + else: + return list() + + +class ShellError(Exception): + + def __init__(self, msg, command=None): + super(ShellError, self).__init__(msg) + self.message = msg + self.command = command + + +class AuthError(Exception): + + def __init__(self, msg, command=None): + super(ShellError, self).__init__(msg) + self.message = msg + self.command = command + + +class Command(object): + + def __init__(self, command, prompt=None, response=None): + self.command = command + self.prompt = prompt + self.response = response + + def __str__(self): + return self.command + + +class sshClient(): + """ + Represent an ssh session on target ssh server, call paramiko module + to generate it + """ + + def __init__(self, agent_type=None, target_host=None, port=22, + username=None, password=None, authorize=False, + auth_pass=None, prompts_re=None, errors_re=None, **kwargs): + + self.device_type = CONF.cli_backend.device_type + self.host = target_host or CONF.cli_backend.host + self.port = port or CONF.cli_backend.port + self.username = username or CONF.cli_backend.username + self.password = password or CONF.cli_backend.password + self.authorize = authorize or CONF.cli_backend.authorize + self.auth_pass = auth_pass or CONF.cli_backend.auth_pass + self.prompts = prompts_re or CLI_PROMPTS_RE + self.errors = errors_re or CLI_ERRORS_RE + self._client = None + self._channel = None + self._logon_info = '' + self._connected = False + self.command_result = {} + self.connect() + + @property + def connected(self): + return self._connected + + def connect(self, hostkeys_file=None): + self._logon_info += 'Loginng Host: %s, Port: %d\n' % (self.host, + self.port) + self._logon_info += 'Login User: %s, password: %s\n' % (self.username, + self.password) + paramiko.util.log_to_file(internal_log_path) + self._client = paramiko.SSHClient() + self._client.load_system_host_keys(hostkeys_file) + self._client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + try: + # Connect to an SSH server and authenticate to it. + self._client.connect(self.host, self.port, self.username, + self.password) + + self._channel = self._client.invoke_shell() + if self.authorize: + self.auth() + self.disable_paging(self.device_type) + self._connected = True + self._logon_info += 'Login Successful!\n' + except Exception as e: + LOG.error(_LE("Connect to host %s failed\n" % self.host)) + self._logon_info += e.message + raise e + + def auth(self): + res = self.send(Command('enable', prompt=AUTH_PASSWD_RE, + response=self.auth_pass)) + + auth_res_info = AUTH_PASSWD_RE.findall(res[0]) + if len(auth_res_info) > 1: + raise ShellError('Authorize failed under authorize password as %s' + % self.auth_pass) + + def disable_paging(self, device_type): + if device_type == 'cisco': + self.send('terminal length 0') + elif device_type == 'firewall': + # to do work-dzyu + self.send('terminal length 0') + else: + LOG.warning(_LW('current not support %s device type disable ' + 'paging function')) + + def send(self, commands): + responses = list() + run_result = {} + try: + for command in to_list(commands): + cmd = '%s\r' % str(command) + self._channel.sendall(cmd) + cmd_result = self.combine_result(command, + self.receive(command)) + responses.append(cmd_result) + run_result[command] = 'SUCCESS' + self.log_to_file(responses) + except socket.timeout: + raise ShellError("timeout trying to send command", cmd) + return run_result + + def combine_result(self, command, result): + cmd = str(command) + prefix = "COMMAND: < %s > result -----> \r" % cmd + cmd_result = str(result) + if not cmd_result.strip(): + cmd_result = "---------no returned value---------" + return prefix + cmd_result + + def receive(self, cmd=None): + recv = StringIO() + while True: + data = self._channel.recv(200) + + recv.write(data) + recv.seek(recv.tell() - 200) + + window = recv.read() + if isinstance(cmd, Command): + self.handle_input(window, prompt=cmd.prompt, + response=cmd.response) + try: + if self.read(window): + return self.sanitize(cmd, recv.getvalue()) + except ShellError, exc: + exc.command = cmd + raise + + def read(self, response): + if NEED_AUTH_RE.search(response): + raise ShellError('No authorize to execute command %s' % response) + for regex in self.errors: + if regex.search(response): + raise ShellError('matched error in response: %s' % response) + + for regex in self.prompts: + match = regex.search(response) + if match: + self._matched_prompt = match.group() + return True + + def sanitize(self, cmd, resp): + cleaned = [] + for line in resp.splitlines(): + if line.startswith(str(cmd)) or self.read(line): + continue + cleaned.append(line) + return "\n".join(cleaned) + + def configure(self, commands): + commands = to_list(commands) + commands.insert(0, 'configure terminal') + responses = self.execute(commands) + responses.pop(0) + return responses + + def handle_input(self, resp, prompt, response): + if not prompt or not response: + return + prompt = to_list(prompt) + response = to_list(response) + + for pr, ans in zip(prompt, response): + match = pr.search(resp) + if match: + cmd = '%s\r' % ans + self._channel.sendall(cmd) + + def log_to_file(self, responses, filename='response_result.txt'): + """ + send response logs to one logfile, if they're not already + going somewhere + """ + f = open(filename, 'w') + for res in responses: + f.write('%s\n' % res) + f.close() + + def close(self): + if self._channel is not None: + self._channel.close() + self._client.close() + self._client = None + self._channel = None + self._result = None + + +if __name__ == '__main__': + client = sshClient() + client.connect() + + if client.connected: + commands_list = ['show run'] + response = client.send(commands_list) + for res in response: + print res + client.close() diff --git a/nca47/agent/cli_driver/sshClient.log b/nca47/agent/cli_driver/sshClient.log new file mode 100644 index 0000000..bb16197 --- /dev/null +++ b/nca47/agent/cli_driver/sshClient.log @@ -0,0 +1,28 @@ +DEB [20160506-15:03:24.120] thr=1 paramiko.transport: starting thread (client mode): 0xbd2efe10L +DEB [20160506-15:03:24.120] thr=1 paramiko.transport: Local version/idstring: SSH-2.0-paramiko_1.16.0 +DEB [20160506-15:03:24.160] thr=1 paramiko.transport: Remote version/idstring: SSH-2.0-OpenSSH_6.2 PKIX FIPS +INF [20160506-15:03:24.160] thr=1 paramiko.transport: Connected (version 2.0, client OpenSSH_6.2) +DEB [20160506-15:03:24.161] thr=1 paramiko.transport: kex algos:[u'diffie-hellman-group-exchange-sha256', u'diffie-hellman-group-exchange-sha1', u'diffie-hellman-group14-sha1', u'diffie-hellman-group1-sha1'] server key:[u'ssh-rsa'] client encrypt:[u'aes128-ctr', u'aes192-ctr', u'aes256-ctr', u'aes128-cbc', u'aes192-cbc', u'aes256-cbc'] server encrypt:[u'aes128-ctr', u'aes192-ctr', u'aes256-ctr', u'aes128-cbc', u'aes192-cbc', u'aes256-cbc'] client mac:[u'hmac-sha1'] server mac:[u'hmac-sha1'] client compress:[u'none', u'zlib@openssh.com'] server compress:[u'none', u'zlib@openssh.com'] client lang:[u''] server lang:[u''] kex follows?False +DEB [20160506-15:03:24.162] thr=1 paramiko.transport: Kex agreed: diffie-hellman-group1-sha1 +DEB [20160506-15:03:24.162] thr=1 paramiko.transport: Cipher agreed: aes128-ctr +DEB [20160506-15:03:24.162] thr=1 paramiko.transport: MAC agreed: hmac-sha1 +DEB [20160506-15:03:24.162] thr=1 paramiko.transport: Compression agreed: none +DEB [20160506-15:03:24.306] thr=1 paramiko.transport: kex engine KexGroup1 specified hash_algo +DEB [20160506-15:03:24.306] thr=1 paramiko.transport: Switch to new keys ... +DEB [20160506-15:03:24.322] thr=2 paramiko.transport: Trying SSH agent key 28c88dd1f193b3309781f6236d7adddf +DEB [20160506-15:03:24.493] thr=1 paramiko.transport: userauth is OK +INF [20160506-15:03:24.528] thr=1 paramiko.transport: Auth banner: User Access Verification + +INF [20160506-15:03:24.528] thr=1 paramiko.transport: Authentication (publickey) failed. +DEB [20160506-15:03:24.530] thr=2 paramiko.transport: Trying discovered key 28c88dd1f193b3309781f6236d7adddf in /home/yudazhao/.ssh/id_rsa +DEB [20160506-15:03:24.532] thr=1 paramiko.transport: userauth is OK +INF [20160506-15:03:24.581] thr=1 paramiko.transport: Authentication (publickey) failed. +DEB [20160506-15:03:24.583] thr=1 paramiko.transport: userauth is OK +INF [20160506-15:03:24.596] thr=1 paramiko.transport: Authentication (password) successful! +DEB [20160506-15:03:24.597] thr=2 paramiko.transport: [chan 0] Max packet in: 32768 bytes +DEB [20160506-15:03:24.600] thr=1 paramiko.transport: [chan 0] Max packet out: 32768 bytes +DEB [20160506-15:03:24.600] thr=1 paramiko.transport: Secsh channel 0 opened. +DEB [20160506-15:03:24.603] thr=1 paramiko.transport: [chan 0] Sesch channel 0 request ok +DEB [20160506-15:03:24.606] thr=1 paramiko.transport: [chan 0] Sesch channel 0 request ok +DEB [20160506-15:03:25.784] thr=2 paramiko.transport: [chan 0] EOF sent (0) +DEB [20160506-15:03:25.875] thr=1 paramiko.transport: EOF in transport thread diff --git a/nca47/agent/dns_driver/__init__.py b/nca47/agent/dns_driver/__init__.py new file mode 100644 index 0000000..1c1283b --- /dev/null +++ b/nca47/agent/dns_driver/__init__.py @@ -0,0 +1,2 @@ +import fake_driver +import zdns_driver diff --git a/nca47/agent/dns_driver/fake_driver.py b/nca47/agent/dns_driver/fake_driver.py new file mode 100644 index 0000000..f339920 --- /dev/null +++ b/nca47/agent/dns_driver/fake_driver.py @@ -0,0 +1,410 @@ +from oslo_config import cfg +from oslo_log import log as logging +from nca47.common.i18n import _ +from nca47.common.i18n import _LI +from nca47.common.exception_zdns import ZdnsErrMessage +from nca47.common.exception import NonExistDevices +from nca47.api.controllers.v1 import tools +import requests +import json + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +DNS_DRIVER = None + +ZONES_AGENT_OPTS = [ + cfg.StrOpt('host_ip', + default='0.0.0.0', + help=_('The IP address on which nca47-zdns_driver listens.')), + cfg.PortOpt('port', + default=20120, + help=_('The TCP port on which nca47-zdns_driver listens.')), + cfg.StrOpt('view_id', + default='telecom', + help=_('The TCP view_id on which nca47-zdns_driver listens.')), + cfg.StrOpt('auth_name', + default='admin', + help=_('The TCP auth_name on which nca47-zdns_driver' + 'listens.')), + cfg.StrOpt('auth_pw', + default='zdns', + help=_('The TCP auth_pw on which nca47-zdns_driver listens.')), +] + +CONF = cfg.CONF +opt_group = cfg.OptGroup(name='zdns', + title='Options for the nca47-zdns_driver service') +CONF.register_group(opt_group) +CONF.register_opts(ZONES_AGENT_OPTS, opt_group) + + +class fake_dns_driver(): + + def __init__(self): + self.host = 'https://fake_ip' + self.port = CONF.zdns.port + self.view_id = CONF.zdns.view_id + self.auth_name = CONF.zdns.auth_name + self.auth_pw = CONF.zdns.auth_pw + + @classmethod + def get_instance(cls): + global DNS_DRIVER + if not DNS_DRIVER: + DNS_DRIVER = cls() + return DNS_DRIVER + + def create_zone(self, context, zone): + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones') + LOG.info(_LI("create zones:" + url)) + return {" fake create zone": "success"} + + def update_zone_owners(self, context, zone, zone_id): + url = (self.host + ":" + str(self.port) + '/views/' + + self.view_id + '/zones/' + zone_id + '/owners') + LOG.info(_LI("update_zone_owners:" + url)) + return {"fake update zone owners zone": "success"} + + def update_zone(self, context, zone, zone_id): + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones/' + zone_id) + LOG.info(_LI("update zones :" + url)) + return {"fake update_zone zone": "success"} + + def delete_zone(self, context, zone_id): + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id) + LOG.info(_LI("delete zones :" + url)) + return {"fake delete_zone zone": "success"} + + def create_rrs(self, context, rrs, zone_id): + url = (str(self.host) + ":" + str(self.port) + '/views/' + + self.view_id + '/zones/' + str(zone_id) + '/rrs') + LOG.info(_LI("create rrs:" + url)) + res = { + "fake comment": "", "name": "www.baidu.", "type": "A", + "ttl": 1200, "state": "", + "href": "/views/default/zones/www.baidu/rrs/" + "www.baidu.$1200$A$MTk4LjIwMi4zOC40OA==", + "klass": "IN", "rdata": "198.202.38.48", + "reverse_name": "baidu.www", + "id": "www.baidu.$1200$A$MTk4LjIwMi4zOC40OA==", + "is_shared": "" + } + return res + + def update_rrs(self, context, rrs, zone_id, rrs_id): + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id + '/rrs/' + rrs_id) + LOG.info(_LI("update rrs:" + url)) + return {"id": "update_rrs", "ttl": "100", + "name": "www.baidu.com", "type": "A"} + + def delete_rrs(self, context, zone_id, rrs_id): + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id + '/rrs/' + rrs_id) + LOG.info(_LI("delete rrs :" + url)) + return {"fake delete_rss": "success"} + + def del_cache(self, context, cache_dic): + url = (self.host + ":" + str(self.port) + '/cache/clean') + LOG.info(_LI("delete cache :" + url)) + return {"fake clean cache": "success"} + + def get_zone_one(self, context, zone_id): + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones/' + zone_id) + LOG.info(_LI("view one zone :" + url)) + return {"fake get_zone_one": "success"} + + def get_zones(self, context): + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones') + LOG.info(_LI("view all zone :" + url)) + return {"fake get_zones": "success"} + + def get_rrs(self, context, zone_id): + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id + '/rrs') + LOG.info(_LI("get_rrs :" + url)) + res = { + "total_size": 2, "page_num": 1, + "resources": + [ + { + "comment": "", "name": "www.baidu.", + "type": "NS", "ttl": 3600, "state": "", + "href": "/views/default/zones/www.baidu/rrs/" + "www.baidu.$3600$NS$bnMud3d3LmJhaWR1Lg==", + "klass": "IN", "rdata": "ns.www.baidu.", + "reverse_name": "baidu.www", + "id": "www.baidu.$3600$NS$bnMud3d3LmJhaWR1Lg==", + "is_shared": "" + }, + { + "comment": "", "name": "ns.www.baidu.", + "type": "A", "ttl": 3600, "state": "", + "href": "/views/default/zones/www.baidu/rrs/" + "ns.www.baidu.$3600$A$MTI3LjAuMC4x", + "klass": "IN", "rdata": "127.0.0.1", + "reverse_name": "baidu.www.ns", + "id": "ns.www.baidu.$3600$A$MTI3LjAuMC4x", + "is_shared": "" + } + ], + "page_size": 2 + } + return res + + def create_region(self, context, region): + LOG.info(_LI("create regions...")) + return {"region_id": "123456", "refcnt": "123456"} + + def delete_region(self, context, region): + LOG.info(_LI("delete regions :")) + return {"fake delete_region region": "success"} + + def create_member(self, context, member): + LOG.info(_LI("create members...")) + return {"id": "member123456"} + + def delete_member(self, context, member): + LOG.info(_LI("delete members :")) + return {"fake delete_member member": "success"} + + def create_sp_policy(self, context, policy): + LOG.info(_LI("create policys...")) + return {"sp_policy_id": "policy123456"} + + def delete_sp_policy(self, context, policy): + LOG.info(_LI("delete policys :")) + return {"fake delete_sp_policy policy": "success"} + + def update_sp_policy(self, context, policy): + LOG.info(_LI("update policys :")) + return {"fake update_sp_policy policy": "success"} + + # this is a gmember operation + def create_gmember(self, context, obj_dic): + + values = ["ip", "port", "enable", "name"] + driver_dic = tools.input_dic(values, obj_dic) + gslb_obj = {} + gslb_obj["gmember_name"] = obj_dic['name'] + gslb_obj["current_user"] = self.auth_name + dic = tools.dict_merge(driver_dic, gslb_obj) + dic.pop('name') + LOG.info(_LI("create the gmember values with dic format" + "is %(json)s of dervice"), {"json": dic}) + url = (self.host + ":" + str(self.port) + + '/dc/' + obj_dic["gslb_zone_name"] + "/gmember") + + LOG.info(_LI("create gmember url:" + url)) + return {"refcnt": "10", "id": "test_gmember_id"} + + def delete_gmember(self, context, obj_dic): + + gmember_id = obj_dic["gmember_id"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/dc/' + + obj_dic["gslb_zone_name"] + "/gmember/" + gmember_id) + + return {"result": "successed"} + + def update_gmember(self, context, obj_dic): + + name = obj_dic["gmember_name"] + gslb_obj = ["enable"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the gmember values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/dc/' + + obj_dic["gslb_zone_name"] + "/gmember/" + name) + + return {"update": "successed"} + + # this is a hm_template operation + def create_hm_template(self, context, obj_dic): + gslb_obj = ["name", "types", "check_interval", "timeout", + "max_retries", "max_retries", "sendstring", + "recvstring", "username", "password"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the hm_template values with dic format" + "is %(json)s of dervice"), {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/hm_template') + + return {"refcnt": "10", "id": "test_hm_template_id"} + + def delete_hm_template(self, context, obj_dic): + name = obj_dic["hm_template_id"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/hm_template/' + + name) + return {"result": "successed"} + + def update_hm_template(self, context, obj_dic): + name = obj_dic["hm_template_id"] + gslb_obj = ["check_interval", "timeout", + "max_retries", "max_retries", "sendstring", + "recvstring", "username", "password"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + driver_dic["username"] = self.auth_name + driver_dic["password"] = self.auth_pw + LOG.info(_LI("update the hm_template values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/hm_template/' + name) + return {"update": "successed"} + + def create_syngroup(self, context, obj_dic): + gslb_obj = ["name", "dcs", "probe_range", "pass"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the syngroup values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/syngroup') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create syngroup url:" + url)) + obj_dic['id'] = obj_dic['name'] + return obj_dic + + def delete_syngroup(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/syngroup/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete syngroup url :" + url)) + obj_dic['id'] = obj_dic['name'] + return obj_dic + + def update_syngroup(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["dcs", "probe_range", "pass"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the syngroup values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/syngroup/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create syngroup url:" + url)) + obj_dic['id'] = obj_dic['name'] + return obj_dic + + def create_gpool(self, context, obj_dic): + gslb_obj = ["name", "enable", "ttl", "max_addr_ret", "cname", + "first_algorithm", "second_algorithm", "fallback_ip", + "hms", "pass", "gmember_list", "warning"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the gpool values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/gpool') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gpool url:" + url)) + obj_dic['refcnt'] = 12 + obj_dic['id'] = obj_dic['name'] + return obj_dic + + def update_gpool(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["enable", "ttl", "max_addr_ret", "cname", + "first_algorithm", "second_algorithm", "fallback_ip", + "hms", "pass", "gmember_list", "warning"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the gpool values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/gpool/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gpool url:" + url)) + obj_dic['refcnt'] = 12 + obj_dic['id'] = obj_dic['name'] + return obj_dic + + def delete_gpool(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/gpool/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete gpool url :" + url)) + return obj_dic + + def create_gmap(self, context, obj_dic): + gslb_obj = ["name", "enable", "algorithm", "last_resort_pool", + "gpool_list"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the gmap values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/gmap') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gmap url:" + url)) + obj_dic['id'] = obj_dic['name'] + return obj_dic + + def delete_gmap(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/gmap/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete gmap url :" + url)) + return obj_dic + + def update_gmap(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["enable", "algorithm", "last_resort_pool", + "gpool_list"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the gmap values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/gmap/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gmap url:" + url)) + return obj_dic diff --git a/nca47/agent/dns_driver/zdns_driver.py b/nca47/agent/dns_driver/zdns_driver.py new file mode 100644 index 0000000..579997e --- /dev/null +++ b/nca47/agent/dns_driver/zdns_driver.py @@ -0,0 +1,1103 @@ +from oslo_config import cfg +from oslo_log import log as logging +from nca47.common.i18n import _ +from nca47.common.i18n import _LI +from nca47.common.exception_zdns import ZdnsErrMessage +from nca47.common.exception import NonExistDevices +from nca47.api.controllers.v1 import tools +import requests +import json +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +DNS_DRIVER = None + +ZONES_AGENT_OPTS = [ + cfg.StrOpt('host_ip', + default='0.0.0.0', + help=_('The IP address on which nca47-zdns_driver listens.')), + cfg.PortOpt('port', + default=20120, + help=_('The TCP port on which nca47-zdns_driver listens.')), + cfg.StrOpt('view_id', + default='telecom', + help=_('The TCP view_id on which nca47-zdns_driver listens.')), + cfg.StrOpt('auth_name', + default='admin', + help=_('The TCP auth_name on which nca47-zdns_driver' + 'listens.')), + cfg.StrOpt('auth_pw', + default='zdns', + help=_('The TCP auth_pw on which nca47-zdns_driver listens.')), +] + +CONF = cfg.CONF +opt_group = cfg.OptGroup(name='zdns', + title='Options for the nca47-zdns_driver service') +CONF.register_group(opt_group) +CONF.register_opts(ZONES_AGENT_OPTS, opt_group) + + +class dns_zone_driver(): + def __init__(self): + self.host = 'https://' + CONF.zdns.host_ip + self.port = CONF.zdns.port + self.view_id = CONF.zdns.view_id + self.auth_name = CONF.zdns.auth_name + self.auth_pw = CONF.zdns.auth_pw + self.zdns_error = ZdnsErrMessage() + + @classmethod + def get_instance(cls): + global DNS_DRIVER + if not DNS_DRIVER: + DNS_DRIVER = cls() + return DNS_DRIVER + + def create_zone(self, context, zone): + """ create zones """ + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones') + headers = {'Content-type': 'application/json'} + zone["current_user"] = self.auth_name + data = json.dumps(zone) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create zones:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_zone_owners(self, context, zone, zone_id): + """ update zones owners """ + url = (self.host + ":" + str(self.port) + '/views/' + + self.view_id + '/zones/' + zone_id + '/owners') + headers = {'Content-type': 'application/json'} + zone["current_user"] = self.auth_name + data = json.dumps(zone) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("update zones owners:" + url)) + response = requests.put(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_zone(self, context, zone, zone_id): + """ update zones """ + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones/' + zone_id) + headers = {'Content-type': 'application/json'} + zone["current_user"] = self.auth_name + data = json.dumps(zone) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("update zones :" + url)) + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_zone(self, context, zone_id): + """ delete zones """ + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id) + headers = {'Content-type': 'application/json'} + data = {"current_user": "admin"} + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete zones :" + url)) + response = requests.delete(url, data=data, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def create_rrs(self, context, rrs, zone_id): + """ create zones """ + url = (str(self.host) + ":" + str(self.port) + '/views/' + + self.view_id + '/zones/' + str(zone_id) + '/rrs') + headers = {'Content-type': 'application/json'} + rrs["current_user"] = self.auth_name + data = json.dumps(rrs) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create rrs:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_rrs(self, context, rrs, zone_id, rrs_id): + """ update rrs """ + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id + '/rrs/' + rrs_id) + headers = {'Content-type': 'application/json'} + rrs["current_user"] = self.auth_name + data = json.dumps(rrs) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("update rrs:" + url)) + response = requests.put(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_rrs(self, context, zone_id, rrs_id): + """ delete rrs """ + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id + '/rrs/' + rrs_id) + headers = {'Content-type': 'application/json'} + rrs = {} + rrs["current_user"] = self.auth_name + data = json.dumps(rrs) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete rrs :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def del_cache(self, context, cache_dic): + """ delete cache """ + url = (self.host + ":" + str(self.port) + '/cache/clean') + LOG.info(_LI("delete cache :" + url)) + headers = {'Content-type': 'application/json'} + cache_dic["current_user"] = self.auth_name + auth = (self.auth_name, self.auth_pw) + response = requests.post(url, data=cache_dic, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_zone_one(self, context, zone_id): + """ view one zone """ + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones/' + zone_id) + headers = {'Content-type': 'application/json'} + LOG.info(_LI("view one zone :" + url)) + auth = (self.auth_name, self.auth_pw) + response = requests.get(url, data={"current_user": "admin"}, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_zones(self, context): + """ view all zone """ + url = (self.host + ":" + str(self.port) + + '/views/' + self.view_id + '/zones') + LOG.info(_LI("view all zone :" + url)) + params = {'current_user': 'admin'} + auth = (self.auth_name, self.auth_pw) + response = requests.get(url, data=params, + auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_rrs(self, context, zone_id): + """ view rrs """ + url = (self.host + ":" + str(self.port) + '/views/' + self.view_id + + '/zones/' + zone_id + '/rrs') + params = {'current_user': 'admin'} + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get_rrs :" + url)) + response = requests.get(url, data=params, + auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a hm_template operation + def create_hm_template(self, context, obj_dic): + gslb_obj = ["name", "types", "check_interval", "timeout", + "max_retries", "max_retries", "sendstring", + "recvstring", "username", "password"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the hm_template values with dic format" + "is %(json)s of dervice"), {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/hm_template') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create hm_template url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_hm_template(self, context, obj_dic): + name = obj_dic["hm_template_id"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/hm_template/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete hm_template url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_hm_template(self, context, obj_dic): + + name = obj_dic["hm_template_id"] + gslb_obj = ["check_interval", "timeout", + "max_retries", "max_retries", "sendstring", + "recvstring", "username", "password"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the hm_template values with dic format" + "is %(json)s of dervice"), {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/hm_template/' + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("update hm_template url:" + url)) + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_hm_templates(self, context, obj_dic): + gslb_obj = ["search_attrs"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/hm_template') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all hm_template url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_hm_template(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/hm_template/' + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all hm_template url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a gslb_zone operation + def create_gslb_zone(self, context, obj_dic): + gslb_obj = ["name", "devices", "syn_server"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + + LOG.info(_LI("create the gslb_zone values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/dc') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gslb_zone url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_gslb_zone(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/dc/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete gslb_zone url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_gslb_zone(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["devices", "server", "enable"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name +# driver_dic["username"] = self.auth_name +# driver_dic["password"] = self.auth_pw + LOG.info(_LI("update the gslb_zone values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/dc/' + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gslb_zone url:" + url)) + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gslb_zones(self, context, obj_dic): + gslb_obj = ["search_attrs"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/dc') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gslb_zone url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gslb_zone(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/dc/' + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gslb_zone url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a gmember operation + def create_gmember(self, context, obj_dic): + values = ["ip", "port", "enable", "name"] + driver_dic = tools.input_dic(values, obj_dic) + gslb_obj = {} + gslb_obj["gmember_name"] = obj_dic['name'] + gslb_obj["current_user"] = self.auth_name + dic = tools.dict_merge(driver_dic, gslb_obj) + dic.pop('name') + LOG.info(_LI("create the gmember values with dic format" + "is %(json)s of dervice"), {"json": dic}) + url = (self.host + ":" + str(self.port) + + '/dc/' + obj_dic["gslb_zone_name"] + "/gmember") + LOG.info(_LI("create gmember url:" + url)) + headers = {'Content-type': 'application/json'} + data = json.dumps(dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gmember url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_gmember(self, context, obj_dic): + gmember_id = obj_dic["gmember_id"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/dc/' + + obj_dic["gslb_zone_name"] + "/gmember/" + gmember_id) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete gmember url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_gmember(self, context, obj_dic): + name = obj_dic["gmember_name"] + gslb_obj = ["enable"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the gmember values with dic format" + "is %(json)s of dervice"), {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/dc/' + + obj_dic["gslb_zone_name"] + "/gmember/" + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gmember url:" + url)) + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gmembers(self, context, obj_dic): + gslb_obj = ["search_attrs"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/dc' + obj_dic["gslb_zone_name"] + "/gmember") + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gmember url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gmember(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/dc/' + + obj_dic["gslb_name"] + "/gmember/" + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gmember url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a syngroup operation + def create_syngroup(self, context, obj_dic): + gslb_obj = ["name", "dcs", "probe_range", "pass"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the syngroup values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/syngroup') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create syngroup url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_syngroup(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/syngroup/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete syngroup url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_syngroup(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["dcs", "probe_range", "pass"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the syngroup values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/syngroup/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create syngroup url:" + url)) + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_syngroups(self, context, obj_dic): + gslb_obj = ["search_attrs", "current_user"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/syngroup') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all syngroup url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_syngroup(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/syngroup/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all syngroup url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a gpool operation + def create_gpool(self, context, obj_dic): + gslb_obj = ["name", "enable", "ttl", "max_addr_ret", "cname", + "first_algorithm", "second_algorithm", "fallback_ip", + "hms", "pass", "gmember_list", "warning"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the gpool values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/gpool') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gpool url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_gpool(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/gpool/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete gpool url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_gpool(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["enable", "ttl", "max_addr_ret", "cname", + "first_algorithm", "second_algorithm", "fallback_ip", + "hms", "pass", "gmember_list", "warning"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the gpool values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/gpool/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gpool url:" + url)) + + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gpools(self, context, obj_dic): + gslb_obj = ["search_attrs", "current_user"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/gpool') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gpool url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gpool(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/gpool/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gpool url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a gmap operation + def create_gmap(self, context, obj_dic): + gslb_obj = ["name", "enable", "algorithm", "last_resort_pool", + "gpool_list"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the gmap values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/gmap') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gmap url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_gmap(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/gmap/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete gmap url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_gmap(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["enable", "algorithm", "last_resort_pool", + "gpool_list"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("update the gmap values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + '/gmap/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create gmap url:" + url)) + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gmaps(self, context, obj_dic): + gslb_obj = ["search_attrs", "current_user"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/gmap') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gmap url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_gmap(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/gmap/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all gmap url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a region operation + def create_region(self, context, obj_dic): + gslb_obj = ["name"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the region values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/region') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create region url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_region(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/region/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete region url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def create_member(self, context, obj_dic): + name = obj_dic["name"] + gslb_obj = ["type", "data1", "data2", "data3", "data4"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the region_create_member values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/region/' + name + "/member") + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create region_create_member url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_member(self, context, obj_dic): + region_id = obj_dic["name"] + member_id = obj_dic["member_name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/region/' + + region_id + '/member/' + member_id) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete region_delete_member url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_regions(self, context, obj_dic): + gslb_obj = ["search_attrs", "current_user"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/region') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all region url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_region(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/region/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all region url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + # this is a sp_policy operation + def create_sp_policy(self, context, obj_dic): + gslb_obj = ["priority", "src_type", "src_logic", "src_data1", + "src_data2", "src_data3", "src_data4", "dst_type", + "dst_logic", "dst_data1", "dst_data2"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + LOG.info(_LI("create the sp_policy values with dic format\ + is %(json)s of dervice"), + {"json": driver_dic}) + url = (self.host + ":" + str(self.port) + + '/sp_policy') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create sp_policy url:" + url)) + response = requests.post(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def delete_sp_policy(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/sp_policy/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("delete sp_policy url :" + url)) + response = requests.delete(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def update_sp_policy(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + driver_dic["priority"] = obj_dic["new_priority"] + url = (self.host + ":" + str(self.port) + '/sp_policy/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("create sp_policy url:" + url)) + response = requests.put(url=url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_sp_policys(self, context, obj_dic): + gslb_obj = ["search_attrs", "current_user"] + driver_dic = tools.input_dic(gslb_obj, obj_dic) + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + + '/sp_policy') + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all sp_policy url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() + + def get_sp_policy(self, context, obj_dic): + name = obj_dic["name"] + driver_dic = {} + driver_dic["current_user"] = self.auth_name + url = (self.host + ":" + str(self.port) + '/sp_policy/' + + name) + headers = {'Content-type': 'application/json'} + data = json.dumps(driver_dic) + auth = (self.auth_name, self.auth_pw) + LOG.info(_LI("get all sp_policy url :" + url)) + response = requests.get(url, data=data, + headers=headers, auth=auth, verify=False) + if response.status_code is None: + raise NonExistDevices + if response.status_code is not 200: + raise ZdnsErrMessage(self.zdns_error.getMessage(response. + status_code)) + return response.json() diff --git a/nca47/agent/firewall_driver/__init__.py b/nca47/agent/firewall_driver/__init__.py new file mode 100644 index 0000000..5f08924 --- /dev/null +++ b/nca47/agent/firewall_driver/__init__.py @@ -0,0 +1,2 @@ +import fake_driver +import fw_driver diff --git a/nca47/agent/firewall_driver/fake_driver.py b/nca47/agent/firewall_driver/fake_driver.py new file mode 100644 index 0000000..3890209 --- /dev/null +++ b/nca47/agent/firewall_driver/fake_driver.py @@ -0,0 +1,54 @@ + +FAKE_DRIVER = None + + +class fake_driver(object): + + def __init__(self): + return + + @classmethod + def get_instance(cls): + global FAKE_DRIVER + if not FAKE_DRIVER: + FAKE_DRIVER = cls() + return FAKE_DRIVER + + # this is a vlan operation + def creat_vlan(self, context, vlan_infos): + return {"creat_vlan": "success"} + + def del_vlan(self, context, id_, vlan_infos): + return {"del_vlan": "success"} + + def get_vlan(self, context, vlan_infos): + return {"get_vlan": "success"} + + def get_vlans(self, context, vlan_infos): + return {"get_vlans": "success"} + + # this is a netservice operation + def creat_netservice(self, context, netsev_infos): + return {"creat_netservice": "success"} + + def del_netservice(self, context, id_, netsev_infos): + return {"del_netservice": "success"} + + def get_netservice(self, context, netsev_infos): + return {"get_netservice": "success"} + + def get_netservices(self, context, netsev_infos): + return {"get_netservices": "success"} + + # this is a addrobj operation + def add_addrobj(self, context, addrobj_infos): + return {"add_addrobj": "success"} + + def del_addrobj(self, context, addrobj_infos): + return {"del_addrobj": "success"} + + def get_addrobj(self, context, addrobj_infos): + return {"get_addrobj": "success"} + + def get_addrobjs(self, context, addrobj_infos): + return {"get_addrobjs": "success"} diff --git a/nca47/agent/firewall_driver/fw_driver.py b/nca47/agent/firewall_driver/fw_driver.py new file mode 100644 index 0000000..feba037 --- /dev/null +++ b/nca47/agent/firewall_driver/fw_driver.py @@ -0,0 +1,633 @@ +from oslo_serialization import jsonutils as json +from oslo_config import cfg +from oslo_log import log as logging +from nca47.agent.firewall_driver import soap_client +from nca47.api.controllers.v1 import tools +from nca47.common.exception import DeviceError as deviceError + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) +FW_DRIVER = None + + +class fw_driver(object): + + def __init__(self): + self.ws_client = soap_client.fw_client.get_instance() + + @classmethod + def get_instance(cls): + global FW_DRIVER + if not FW_DRIVER: + FW_DRIVER = cls() + return FW_DRIVER + + def create_vlan(self, context, vlan_infos): + """ creat vlan to webservice """ + vlan_id = int(vlan_infos["vlan_number"]) + ip_addr = tools.joinString(vlan_infos["ipaddr"]) + if_names = tools.joinString(vlan_infos["ifnames"]) + url_dir = "/func/web_main/wsdl/vlan/vlan.wsdl" + LOG.info("creat vlan to webservice: " + url_dir) + service = self.ws_client.get_client(url_dir) + vlan_dic = {} + vlan_dic['vlanId'] = vlan_id + vlan_dic['ipAddr'] = ip_addr + vlan_dic['ifNames'] = if_names + try: + response = service.addVlan(**vlan_dic) + except Exception: + raise deviceError + return response + + def del_vlan(self, context, vlan_infos): + """ del vlan to webservice """ + vlan_id = int(vlan_infos["vlan_number"]) + if_names = tools.joinString(vlan_infos["ifnames"]) + # ws_ip = view['agent_nat_ip'] + other_ip = "/func/web_main/wsdl/vlan/vlan.wsdl" + # url = "%s%s" % (ws_ip, other_ip) + url = other_ip + LOG.info("del vlan to webservice: " + url) + service = self.ws_client.get_client(url) + response = service.delVlan(vlan_id, if_names) + return response + + def get_dev_vlan(self, context, view, dic): + """ get a vlan to webservice """ + vlan_id = dic["vlan_id"] + ws_ip = view['agent_nat_ip'] + other_ip = "/func/web_main/wsdl/vlan/vlan.wsdl" + url = "%s%s" % (ws_ip, other_ip) + LOG.info("get a vlan to webservice: " + url) + client = self.ws_client.get_client(url) + response = client.service.getVlan(vlan_id) + # TODO zhuxy return , print only for test + print json.loads(response) + + def get_dev_vlans(self, context, view, dic): + """ get vlans to webservice """ + ws_ip = view['agent_nat_ip'] + other_ip = "/func/web_main/wsdl/vlan/vlan.wsdl" + url = "%s%s" % (ws_ip, other_ip) + LOG.info("get vlans to webservice: " + url) + client = self.ws_client.get_client(url) + response = client.service.getVlanAll() + # TODO zhuxy return , print only for test + print json.loads(response) + + # this is a netservice operation + def create_netservice(self, context, dic): + """ creat netservice to webservice """ + wsdl = {} + wsdl["name"] = dic["name"] + wsdl["proto"] = dic["proto"] + wsdl["port"] = dic["port"] + wsdl["vfwName"] = dic["vfwname"] + url = "/func/web_main/wsdl/netservice/netservice.wsdl" + LOG.info("creat netservice to webservice: " + url) + client = self.ws_client.get_client(url) + try: + response = client.addService(**wsdl) + except Exception: + raise deviceError + return response + + def del_netservice(self, context, dic): + """ delete netservice to webservice """ + wsdl = {} + wsdl["name"] = dic["name"] + wsdl["vfwName"] = dic["vfwname"] + url = "/func/web_main/wsdl/netservice/netservice.wsdl" + LOG.info("delete netservice to webservice: " + url) + client = self.ws_client.get_client(url) + try: + response = client.delService(**wsdl) + except Exception: + raise deviceError + return response + + def get_dev_netservice(self, context, view, dic): + """ get a netservice to webservice """ + ws_ip = view['agent_nat_ip'] + name = dic["name"] + vfwName = dic["vfwname"] + other_ip = "/func/web_main/wsdl/netservice/netservice.wsdl" + url = "%s%s" % (ws_ip, other_ip) + LOG.info("get a netservice to webservice: " + url) + client = self.ws_client.get_client(url) + response = client.service.getService(name, vfwName) + # TODO zhuxy return , print only for test + print json.loads(response) + + def get_dev_netservices(self, context, view, dic): + """ get all netservices to webservice """ + ws_ip = view['agent_nat_ip'] + vfwName = dic["vfwname"] + other_ip = "/func/web_main/wsdl/netservice/netservice.wsdl" + url = "%s%s" % (ws_ip, other_ip) + LOG.info("get all netservices to webservice: " + url) + client = self.ws_client.get_client(url) + response = client.service.getServiceAll(vfwName) + # TODO zhuxy return , print only for test + print json.loads(response) + + # this is a addrobj operation + def add_addrobj(self, context, addr_infos): + """ create addrobj to webservice """ + url = "/func/web_main/wsdl/netaddr/netaddr.wsdl" + LOG.info("create addrobj to webservice: " + url) + service = self.ws_client.get_client(url) + # response = service.addAddrObj(addr_infos) + # TODO return , print only for test + try: + response = service.addAddrObj(**addr_infos) + except Exception: + raise deviceError + return response + + def del_addrobj(self, context, dic): + """ delete addrobj to webservice """ + # ws_ip = view['agent_nat_ip'] + # name = dic["name"] + # vfwName = dic["vfwname"] + url = "/func/web_main/wsdl/netaddr/netaddr.wsdl" + # url = "%s" % ( other_ip) + LOG.info("delete addrobj to webservice: " + url) + client = self.ws_client.get_client(url) + response = client.delAddrObj(**dic) + # TODO return , print only for test + return response + + def get_dev_addrobj(self, context, view, dic): + """ get a addrobj to webservice """ + ws_ip = view['agent_nat_ip'] + name = dic["name"] + vfwName = dic["vfwname"] + other_ip = "/func/web_main/wsdl/netaddr/netaddr.wsdl" + url = "%s%s" % (ws_ip, other_ip) + LOG.info("get a addrobj to webservice: " + url) + client = self.ws_client.get_client(url) + response = client.service.getAddrObj(name, vfwName) + # TODO return , print only for test + print json.loads(response) + + def get_dev_addrobjs(self, context, view, dic): + """ get a addrobj to webservice """ + ws_ip = view['agent_nat_ip'] + vfwName = dic["vfwname"] + other_ip = "/func/web_main/wsdl/netaddr/netaddr.wsdl" + url = "%s%s" % (ws_ip, other_ip) + LOG.info("get a addrobj to webservice: " + url) + client = self.ws_client.get_client(url) + response = client.service.getAddrObjAll(vfwName) + # TODO return , print only for test + print json.loads(response) + + def create_packetfilter(self, context, packet_info): + """create packetfilter""" + # url = agent_info_dict['agent_ip'] + + url = "/func/web_main/wsdl/pf_policy/pf_policy/pf_policy.wsdl" + trans_info_dict = { + 'name': '', + 'srcZoneName': '', + 'dstZoneName': "", + "srcIpObjNames": '', + 'dstIpObjNames': "", + 'serviceNames': '', + 'action': '', + 'log': '', + 'vfwName': '' + } + for key in trans_info_dict.keys(): + if key.lower() in packet_info.keys(): + trans_info_dict[key] = str(packet_info[key.lower()]) + trans_info_dict['action'] = int(trans_info_dict['action']) + trans_info_dict['log'] = int(trans_info_dict['log']) + client = self.ws_client.get_client(url) + LOG.info("create fw_packetfilter:" + url) + try: + response = client.addPacketFilter(**trans_info_dict) + except Exception as e: + print e + raise e + return response + # if ret == 0: + # return 0 + # else: + # return 'soap fault' + + def delete_packetfilter(self, context, packet_info_dict): + """delete packetfilter""" + url = '/func/web_main/wsdl/pf_policy/pf_policy/pf_policy.wsdl' + LOG.info("delete fw_packetfilter:" + url) + client = self.ws_client.get_client(url) + LOG.info("create fw_packetfilter:" + url) + ret = client.delPacketFilter(**packet_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def get_dev_packetfilter(self, context, packet_info_dict, agent_info_dict): + """get packetfilter""" + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/security_zone/security_zone' + LOG.info("get fw_SecurityZone:" + url) + trans_info_dict = { + 'name': '', + 'vfwName': '' + } + for key in trans_info_dict.keys(): + if key.lower() in packet_info_dict.keys(): + trans_info_dict[key] = packet_info_dict[key.lower()] + client = self.ws_client.get_client(url) + ret = client.getZone(**packet_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def getall_dev_packetfilter(self, context, + packet_info_dict, agent_info_dict): + """GetAll packetfilter""" + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/security_zone/security_zone' + LOG.info("getall fw_SecurityZone:" + url) + client = self.ws_client.get_client(url) + trans_info_dict = { + 'name': '', + } + for key in trans_info_dict.keys(): + if key.lower() in packet_info_dict.keys(): + trans_info_dict[key] = packet_info_dict[key.lower()] + ret = client.getZoneAll(**packet_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def create_securityzone(self, context, sec_infos): + """create securityZone""" + # url = agent_info_dict['agent_ip'] + + url = '/func/web_main/wsdl/security_zone/security_zone.wsdl' + # url_dir = "/func/web_main/wsdl/vlan/vlan.wsdl" + LOG.info("create fw_SecurityZone:" + url) + client = self.ws_client.get_client(url) + trans_info_dict = dict() + trans_info_dict['ifNames'] = tools.joinString(sec_infos['ifnames']) + trans_info_dict['name'] = sec_infos['name'] + trans_info_dict['vfwName'] = sec_infos['vfwname'] + trans_info_dict['priority'] = sec_infos['priority'] + try: + ret = client.addZone(**trans_info_dict) + except Exception as e: + raise e + if ret == 0: + return 0 + else: + return 'soap fault' + + def delete_securityzone(self, context, sec_infos): + """delete SecurityZone""" + url = '/func/web_main/wsdl/security_zone/security_zone.wsdl' + LOG.info("delete fw_SecurityZone:" + url) + client = self.ws_client.get_client(url) + ret = client.delZone(**sec_infos) + if ret == 0: + return 0 + else: + return 'soap fault' + + def get_dev_securityzone(self, context, zone_info_dict, agent_info_dict): + """get SecurityZone if """ + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/security_zone/security_zone' + LOG.info("get fw_SecurityZone:" + url) + trans_info_dict = { + 'name': '', + 'vfwName': '' + } + for key in trans_info_dict.keys(): + if key.lower() in zone_info_dict.keys(): + trans_info_dict[key] = zone_info_dict[key.lower()] + client = self.ws_client.get_client(url) + ret = client.addZoneIf(**zone_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def getall_dev_securityzone( + self, + context, + zone_info_dict, + agent_info_dict): + """GetAll SecurityZone""" + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/security_zone/security_zone' + LOG.info("getall fw_SecurityZone:" + url) + client = self.ws_client.get_client(url) + trans_info_dict = { + 'name': '', + } + for key in trans_info_dict.keys(): + if key.lower() in zone_info_dict.keys(): + trans_info_dict[key] = zone_info_dict[key.lower()] + ret = client.getZoneAll(**zone_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def securityzone_addif(self, context, sec_infos): + """GetAll SecurityZone""" + url = '/func/web_main/wsdl/security_zone/security_zone.wsdl' + LOG.info("addif fw_SecurityZone:" + url) + client = self.ws_client.get_client(url) + ret = client.addZoneIf(**sec_infos) + if ret == 0: + return 0 + else: + return 'soap fault' + + def securityzone_delif(self, context, sec_infos): + """GetAll SecurityZone""" + url = '/func/web_main/wsdl/security_zone/security_zone.wsdl' + LOG.info("delif fw_SecurityZone:" + url) + client = self.ws_client.get_client(url) + ret = client.delZoneIf(**sec_infos) + if ret == 0: + return 0 + else: + return 'soap fault' + + def create_staticnat(self, context, static_info_dict): + """ creat staticnat to webservice """ + + static_dic = {} + static_dic["name"] = static_info_dict["name"] + static_dic["ifName"] = static_info_dict["ifname"] + static_dic["lanIp"] = static_info_dict["lanip"] + static_dic["wanIp"] = static_info_dict["wanip"] + static_dic["slot"] = static_info_dict["slot"] + static_dic["vfwName"] = static_info_dict["vfwname"] + url_dir = "/func/web_main/wsdl/nat/NatManager.wsdl" + LOG.info("creat staticnat to webservice: " + url_dir) + service = self.ws_client.get_client(url_dir) + try: + response = service.addStaticNat(**static_dic) + except Exception as _e: + raise deviceError + return response + + def delete_staticnat(self, context, static_info_dict): + """ creat staticnat to webservice """ + static_dic = {} + static_dic["name"] = static_info_dict["name"] + static_dic["vfwName"] = static_info_dict["vfwName"] + url_dir = "/func/web_main/wsdl/nat/NatManager.wsdl" + LOG.info("creat staticnat to webservice: " + url_dir) + service = self.ws_client.get_client(url_dir) + try: + response = service.delStaticNat(**static_dic) + except Exception as _e: + raise deviceError + return response + + def get_dev_staticnat(self, context, static_info_dict, agent_info_dict): + # get staticnat + """ creat staticnat to webservice """ + static_dic = {} + static_dic["name"] = static_info_dict["name"] + static_dic["vfwName"] = static_info_dict["vfwName"] + url_dir = "/func/web_main/wsdl/nat/NatManager.wsdl" + LOG.info("creat staticnat to webservice: " + url_dir) + service = self.ws_client.get_client(url_dir) + try: + response = service.getStaticNat(**static_dic) + except Exception as _e: + raise deviceError + return response + + def getall_dev_staticnat(self, context, static_info_dict, agent_info_dict): + # get all staticnat + """ creat staticnat to webservice """ + static_dic = {} + static_dic["vfwName"] = static_info_dict["vfwName"] + url_dir = "/func/web_main/wsdl/nat/nat.wsdl" + LOG.info("creat staticnat to webservice: " + url_dir) + service = self.ws_client.get_client(url_dir) + try: + response = service.getStaticNatAll(**static_dic) + except Exception as _e: + raise deviceError + return response + + def create_dnat(self, context, dic): + url = '/func/web_main/wsdl/nat/NatManager.wsdl' + LOG.info("create fw_DNat:" + url) + wsdl = {} + wsdl["name"] = dic["name"] + wsdl["inIfName"] = dic["inifname"] + wsdl["wanIp"] = dic["wanip"] + keys = dic.keys() + if "wantcpports" in keys: + wsdl["wanTcpPorts"] = dic["wantcpports"] + if "wanudpports" in keys: + wsdl["wanUdpPorts"] = dic["wanudpports"] + wsdl["lanIpStart"] = dic["lanipstart"] + wsdl["lanIpEnd"] = dic["lanipend"] + wsdl["lanPort"] = dic["lanport"] + wsdl["slot"] = dic["slot"] + wsdl["vfwName"] = dic["vfwname"] + client = self.ws_client.get_client(url) + try: + ret = client.addDnat(**wsdl) + except Exception: + raise deviceError + return ret + + def delete_dnat(self, context, dic): + # delete dnat + url = '/func/web_main/wsdl/nat/NatManager.wsdl' + LOG.info("delete fw_DNat:" + url) + wsdl = {} + wsdl["name"] = dic["name"] + wsdl["vfwName"] = dic["vfwname"] + client = self.ws_client.get_client(url) + try: + ret = client.delDnat(**wsdl) + except Exception: + raise deviceError + return ret + + def create_snat(self, context, dic): + # create dnat + url = '/func/web_main/wsdl/nat/NatManager.wsdl' + LOG.info("create fw_snat:" + url) + wsdl = {} + wsdl["name"] = dic["name"] + wsdl["outIfname"] = dic["outIfName"] + wsdl["vfwName"] = dic["vfwname"] + keys = dic.keys() + if "srcipobjname" in keys: + wsdl["srcIpObjName"] = dic["srcipobjname"] + if "dstipobjname" in keys: + wsdl["dstIpObjName"] = dic["dstipobjname"] + if "wanippoolname" in keys: + wsdl["wanIpPoolName"] = dic["wanippoolname"] + client = self.ws_client.get_client(url) + try: + ret = client.addSnat(**wsdl) + except Exception: + raise deviceError + return ret + + def delete_snat(self, context, dic): + # delete dnat + url = '/func/web_main/wsdl/nat/NatManager.wsdl' + LOG.info("delete fw_snat:" + url) + wsdl = {} + wsdl["name"] = dic["name"] + wsdl["vfwName"] = dic["vfwname"] + client = self.ws_client.get_client(url) + try: + ret = client.delSnat(**wsdl) + except Exception: + raise deviceError + return ret + + def get_dev_dnat(self, context, dnat_info_dict, agent_info_dict): + # get dnat + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/nat/nat' + LOG.info("delete fw_DNat:" + url) + trans_info_dict = { + 'name': '', + "vfwName": "" + } + for key in trans_info_dict.keys(): + if key.lower() in dnat_info_dict.keys(): + trans_info_dict[key] = dnat_info_dict[key.lower()] + client = self.ws_client.get_client(url) + ret = client.getDnat(**dnat_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def getall_dev_dnat(self, context, dnat_info_dict, agent_info_dict): + # getall dnat + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/nat/nat' + LOG.info("delete fw_DNat:" + url) + trans_info_dict = { + "vfwName": "" + } + for key in trans_info_dict.keys(): + if key.lower() in dnat_info_dict.keys(): + trans_info_dict[key] = dnat_info_dict[key.lower()] + client = self.ws_client.get_client(url) + ret = client.getDnat_all(**dnat_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def create_vfw(self, context, vfw): + # create vfw + wsdl = {} + wsdl["name"] = vfw["name"] + wsdl["type"] = vfw["type"] + wsdl["resource"] = vfw["resource"] + url = "/func/web_main/wsdl/vfw/vfw.wsdl" + LOG.info(" create_vfw to webservice: " + url) + client = self.ws_client.get_client(url) + try: + response = client.addNewVsys(**wsdl) + except Exception: + raise deviceError + return response + + def delete_vfw(self, context, vfw): + # delete + url = "/func/web_main/wsdl/vfw/vfw.wsdl" + LOG.info("delete fw_vfw:" + url) + wsdl = {} + wsdl["name"] = vfw["name"] + client = self.ws_client.get_client(url) + try: + response = client.delVsys(**wsdl) + except Exception: + raise deviceError + return response + + def get_dev_vfw(self, context, vfw_info_dict, agent_info_dict): + # get vfw + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/vfw/vfw' + LOG.info("get fw_vfw:" + url) + trans_info_dict = { + 'name': '' + } + for key in trans_info_dict.keys(): + if key.lower() in vfw_info_dict.keys(): + trans_info_dict[key] = vfw_info_dict[key.lower()] + client = self.ws_client.get_client(url) + ret = client.getVsys(**vfw_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def getall_dev_vfw(self, context, vfw_info_dict, agent_info_dict): + # getall vfw + url = agent_info_dict['agent_ip'] + url += '/func/web_main/webservice/vfw/vfw' + LOG.info("getall fw_vfw:" + url) + trans_info_dict = { + 'name': '' + } + for key in trans_info_dict.keys(): + if key.lower() in vfw_info_dict.keys(): + trans_info_dict[key] = vfw_info_dict[key.lower()] + client = self.ws_client.get_client(url) + ret = client.getVsysAll(**vfw_info_dict) + if ret == 0: + return 0 + else: + return 'soap fault' + + def add_snataddrpool(self, context, sap): + # create snataddrpool + url = "/func/web_main/wsdl/addrpool/addrpool.wsdl" + client = self.ws_client.get_client(url) + trans_dict = { + "name": "", + "ipStart": "", + "ipEnd": "", + "slotIp": "", + "vfwName": "" + } + for key in trans_dict.keys(): + if key.lower() in sap.keys(): + trans_dict[key] = str(sap[key.lower()]) + response = client.addSnatAddrPool(**trans_dict) + return response + + def del_snataddrpool(self, context, sap): + # create snataddrpool + url = "/func/web_main/wsdl/addrpool/addrpool.wsdl" + client = self.ws_client.get_client(url) + trans_dict = { + "name": "", + "vfwName": "" + } + for key in trans_dict.keys(): + if key.lower() in sap.keys(): + trans_dict[key] = str(sap[key.lower()]) + response = client.delSnatAddrPool(**trans_dict) + return response diff --git a/nca47/agent/firewall_driver/soap_client.py b/nca47/agent/firewall_driver/soap_client.py new file mode 100644 index 0000000..9fe8c06 --- /dev/null +++ b/nca47/agent/firewall_driver/soap_client.py @@ -0,0 +1,57 @@ +from nca47.common.i18n import _ +from suds.client import Client +from oslo_config import cfg +from nca47.common.exception import DeviceError as deviceError +import logging +logging.basicConfig(level=logging.INFO) +logging.getLogger('suds.client').setLevel(logging.DEBUG) + +BACKEND_FW_OPTS = [ + cfg.StrOpt('host', + default='127.0.0.1', + help=_('The server hostname/ip to connect to.')), + cfg.StrOpt('username', + default='username', + help=_('The username which use for connect backend ' + 'firewall device')), + cfg.StrOpt('password', + default='password', + help=_('The password which use to connect backend ' + 'firewall device')), +] + +CONF = cfg.CONF +opt_group = cfg.OptGroup(name='firewall_backend', + title="The backend firewall device's access infos") +CONF.register_group(opt_group) +CONF.register_opts(BACKEND_FW_OPTS, opt_group) + +SOAP_CLIENT = None +username = None +password = None + + +class fw_client(): + + def __init__(self): + self.host = CONF.firewall_backend.host + self.username = CONF.firewall_backend.username + self.password = CONF.firewall_backend.password + + @classmethod + def get_instance(cls): + global SOAP_CLIENT + if not SOAP_CLIENT: + SOAP_CLIENT = cls() + return SOAP_CLIENT + + def get_client(self, url_dir): + try: + ip_link = 'http://%s' % self.host + full_url = "%s%s" % (ip_link, url_dir) + client = Client(full_url, username=self.username, + password=self.password) + service = client.service + except: + raise deviceError + return service diff --git a/nca47/api/controllers/v1/agent/__init__.py b/nca47/api/controllers/v1/agent/__init__.py new file mode 100644 index 0000000..016adc0 --- /dev/null +++ b/nca47/api/controllers/v1/agent/__init__.py @@ -0,0 +1 @@ +from nca47.api.controllers.v1.agent import agent diff --git a/nca47/api/controllers/v1/agent/agent.py b/nca47/api/controllers/v1/agent/agent.py new file mode 100644 index 0000000..cca8375 --- /dev/null +++ b/nca47/api/controllers/v1/agent/agent.py @@ -0,0 +1,29 @@ +import pecan +from oslo_log import log as logging +from pecan import expose +from pecan.rest import RestController +from nca47.manager.central import CentralManager + + +LOG = logging.getLogger(__name__) + + +class AgentController(RestController): + + def __init__(self): + self.manager = CentralManager.get_instance() + super(AgentController, self).__init__() + + @expose('json') + def index(self): + return {"Information": "The url is for nca's agent RestApi " + "interface"} + + _custom_actions = { + 'listagent': ['GET'] + } + + @expose('json') + def listagent(self, *args, **kwargs): + context = pecan.request.context + return self.manager.get_agent_list(context) diff --git a/nca47/api/controllers/v1/base.py b/nca47/api/controllers/v1/base.py index 8f8ec5d..bfaf9d9 100644 --- a/nca47/api/controllers/v1/base.py +++ b/nca47/api/controllers/v1/base.py @@ -1,10 +1,8 @@ import exceptions as exc import functools import pecan -from pecan import rest - from oslo_log import log as logging - +from pecan import rest from nca47.common.i18n import _ LOG = logging.getLogger(__name__) @@ -19,7 +17,12 @@ def expose(function): @functools.wraps(function) def decorated_function(self, *args, **kwargs): func = functools.partial(function, self, pecan.request) - return func(*args, **kwargs) + try: + func = func(*args, **kwargs) + except Exception: + pecan.response.status = 500 + return {"ret_code": 500, "ret_msg": "Bad Method Request"} + return func return decorated_function @@ -28,48 +31,61 @@ class BaseRestController(rest.RestController): """ A base class implement pecan RestController. """ + @property + def response(self): + return pecan.response @expose def post(self, req, *args, **kwargs): LOG.debug(_('args: %(args)s, kwargs: %(kwargs)s'), {"args": args, "kwargs": kwargs}) - return self._post(req, *args, **kwargs) + try: + operation = args[0] + req = pecan.request + if operation == 'addif': + return self.addif(req, *args, **kwargs) + elif operation == 'delif': + return self.delif(req, *args, **kwargs) + except Exception as e: + pass + + return self.create(req, *args, **kwargs) @expose def put(self, req, id, *args, **kwargs): LOG.debug(_('id: %(id)s, args: %(args)s, kwargs: %(kwargs)s'), {"id": id, "args": args, "kwargs": kwargs}) - return self._put(req, id, *args, **kwargs) + return self.update(req, id, *args, **kwargs) @expose def delete(self, req, id, *args, **kwargs): LOG.debug(_('id: %(id)s, args: %(args)s, kwargs: %(kwargs)s'), {"id": id, "args": args, "kwargs": kwargs}) - return self._delete(req, id, *args, **kwargs) + return self.remove(req, id, *args, **kwargs) @expose def get_all(self, req, *args, **kwargs): LOG.debug(_('args: %(args)s, kwargs: %(kwargs)s'), {"args": args, "kwargs": kwargs}) - return self._get_all(req, *args, **kwargs) + return self.list(req, *args, **kwargs) @expose def get_one(self, req, id, *args, **kwargs): LOG.debug(_('id: %(id)s, args: %(args)s, kwargs: %(kwargs)s'), {"id": id, "args": args, "kwargs": kwargs}) - return self._get_one(req, id, *args, **kwargs) + return self.show(req, id, *args, **kwargs) - def _post(self, req, *args, **kwargs): + def create(self, req, *args, **kwargs): raise exc.NotImplementedError - def _put(self, req, id, *args, **kwargs): + def update(self, req, id, *args, **kwargs): raise exc.NotImplementedError - def _delete(self, req, id, *args, **kwargs): + def remove(self, req, id, *args, **kwargs): raise exc.NotImplementedError - def _get_all(self, req, *args, **kwargs): + def list(self, req, *args, **kwargs): raise exc.NotImplementedError - def _get_one(self, req, id, *args, **kwargs): + def show(self, req, id, *args, **kwargs): raise exc.NotImplementedError diff --git a/nca47/api/controllers/v1/dns/__init__.py b/nca47/api/controllers/v1/dns/__init__.py new file mode 100644 index 0000000..473412b --- /dev/null +++ b/nca47/api/controllers/v1/dns/__init__.py @@ -0,0 +1,26 @@ +import pecan + +from nca47.api.controllers.v1.dns import dns_records +from nca47.api.controllers.v1.dns import cache_clean +from nca47.api.controllers.v1.dns import dns_zones + + +class DNSController(object): + def __init__(self): + return + + @pecan.expose('json') + def index(self): + return {"Information": "The url is for DNS base RestApi " + "interface"} + + @pecan.expose() + def _lookup(self, kind, *remainder): + if kind == 'record': + return dns_records.DnsRecordsController(), remainder + elif kind == 'zones': + return dns_zones.DnsZonesController(), remainder + elif kind == 'cache': + return cache_clean.CacheCleanController(), remainder + else: + pecan.abort(404) diff --git a/nca47/api/controllers/v1/dns/cache_clean.py b/nca47/api/controllers/v1/dns/cache_clean.py new file mode 100644 index 0000000..1d24018 --- /dev/null +++ b/nca47/api/controllers/v1/dns/cache_clean.py @@ -0,0 +1,76 @@ +from nca47.common.i18n import _ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from pecan import rest +from pecan import expose +from nca47.manager.central import CentralManager +from nca47.api.controllers.v1 import tools as tool, tools +from oslo_serialization import jsonutils as json +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamFormatError +from nca47.common.exception import ParamNull +from nca47.common.i18n import _LE +from nca47.api.controllers.v1.tools import validat_values +from nca47.api.controllers.v1.tools import is_not_nil + +import pecan +LOG = logging.getLogger(__name__) + + +class CacheCleanController(rest.RestController): + def __init__(self): + self.manager = CentralManager.get_instance() + super(CacheCleanController, self).__init__() + + @expose('json') + def post(self, *args, **kwargs): + return self.clean_cache(*args, **kwargs) + + """the method clean the cache""" + def clean_cache(self, *args, **kwargs): + list_ = ['owners', 'domain_name', 'view_name'] + req = pecan.request + context = req.context + try: + # get the body + values = json.loads(req.body) + + LOG.info(_("req is %(json)s, args is %(args)s," + " kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + self.validat_parms(values, list_) + caches = self.manager.del_cache(context, values) + LOG.info(_("Return of delete cache JSON is %(zones)s !"), + {"zones": caches}) + return tools.ret_info("200", caches) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + + def validat_parms(self, values, valid_keys): + """The Check been the parameter is null or an array""" + recom_msg = validat_values(values, valid_keys) + for value in recom_msg: + if value == "owners": + if isinstance(values['owners'], list): + if not values['owners']: + raise ParamNull(param_name=value) + else: + raise ParamFormatError(param_name=value) + elif value == "domain_name": + if not is_not_nil(values['domain_name']): + raise ParamNull(param_name=value) + elif value == "view_name": + if not is_not_nil(values['view_name']): + raise ParamNull(param_name=value) + return recom_msg diff --git a/nca47/api/controllers/v1/dns/dns_records.py b/nca47/api/controllers/v1/dns/dns_records.py new file mode 100644 index 0000000..c58de34 --- /dev/null +++ b/nca47/api/controllers/v1/dns/dns_records.py @@ -0,0 +1,269 @@ +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _ +from nca47.api.controllers.v1 import tools as tool +from oslo_log import log as logging +from nca47.manager import central +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamIsNotHaveError +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamValueError +from nca47.common.exception import ParamFormatError +from oslo_serialization import jsonutils as json +from nca47.common.i18n import _LE +from oslo_messaging import RemoteError + +LOG = logging.getLogger(__name__) + + +class DnsRecordsController(base.BaseRestController): + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(DnsRecordsController, self).__init__() + + def create(self, req, *args, **kwargs): + """create the dns zone_record""" + try: + # test environment begin + list1 = ['name', 'type', 'rdata', "tenant_id", "environment_name"] + # end + # production environment + # list1 = ['name', 'type', 'rdata', "tenant_id"] + # Add a default value for the attribute of the list2 + list2 = ['ttl', "klass"] + # get the body + dic = json.loads(req.body) + # validate the in values of the zone_record + dic_body = self.message_regrouping(dic, list1, list2) + context = req.context + LOG.info(_("req is %(json)s, args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + # from rpc server create the zone_record + # production environment + # record = self.manager.create_record(context, dic_body) + # test environment + record = self.manager.create_record_in_test_env(context, dic_body) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tool.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tool.ret_info(self.response.status, exception.message) + LOG.info(_("Return of create_zone_record JSON is %(record)s !"), + {"record": record}) + return record + + def update(self, req, id, *args, **kwargs): + """update the dns zone_record""" + try: + dic = json.loads(req.body) + dic['id'] = id + list_ = ["tenant_id", "id"] + if "ttl" not in dic.keys() and "rdata" not in dic.keys(): + raise ParamIsNotHaveError(param_name="rdata or ttl") + if "ttl" in dic.keys(): + if tool.check_ttl(dic['ttl']): + list_.append("ttl") + else: + raise ParamFormatError(param_name="ttl") + if "rdata" in dic.keys(): + if tool.check_rdata(dic['rdata']): + list_.append("rdata") + else: + raise ParamFormatError(param_name="rdata") + if len(list_) == 0: + raise ParamValueError(param_name="JSON") + # get the body + # validate the in values of the zone_record + dic_body = self.validat_parms(dic, list_) + c = req.context + LOG.info(_("req is %(json)s, args is %(args)s, " + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + # from rpc server update the zone_record + record = self.manager.update_record(c, dic_body) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tool.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tool.ret_info(self.response.status, exception.message) + LOG.info(_("Return of update_record JSON is %(record)s !"), + {"record": record}) + return record + + def remove(self, req, id, *args, **kwargs): + """delete the dns zone_record""" + try: + dic = {} + dic.update(kwargs) + list_ = ["tenant_id", "id"] + dic['id'] = id + dic_body = self.validat_parms(dic, list_) + # get the body + # validate the in values of the zone_record + c = req.context + LOG.info(_("server is %(json)s, args is %(args)s, " + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + """from rpc server delete the zone_record""" + record = self.manager.delete_record(c, dic_body) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tool.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tool.ret_info(self.response.status, exception.message) + LOG.info(_("Return of remove_record JSON is %(record)s !"), + {"record": record}) + return record + + def show(self, req, id, *args, **kwargs): + """get the one of the dns zone_record""" + record = None + try: + context = req.context + if kwargs.get('device'): + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from rpc server show the zone_record + # the id is ID of the device + record = self.manager.get_dev_records(context, id) + else: + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from db server show the zone_record + record = self.manager.get_db_records(context, args[0]) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tool.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tool.ret_info(self.response.status, exception.message) + LOG.info(_("Return of show_record JSON is %(record)s !"), + {"record": record}) + return record + + def list(self, req, *args, **kwargs): + """get the one of the dns zone_record""" + record = None + try: + context = req.context + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + dic = {} + dic.update(kwargs) + # production environment + # record = self.manager.query_records(context, dic) + # test environment + list_ = ["tenant_id", "test_environment"] + for key in list_: + if key not in dic.keys(): + raise ParamNull(param_name="tenant_id or test_environment") + record = self.manager.query_records_in_test_env(context, dic) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tool.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tool.ret_info(self.response.status, exception.message) + LOG.info(_("Return of query records JSON is %(record)s !"), + {"record": record}) + return record + + def validat_parms(self, values, valid_keys): + """check the in value is null and nums""" + recom_msg = tool.validat_values(values, valid_keys) + for value in recom_msg: + if value == "name": + if not tool.check_areaname(values['name']): + raise ParamFormatError(param_name=value) + elif value == "id": + if not tool.is_not_nil(values['id']): + raise ParamNull(param_name=value) + elif value == "tenant_id": + if not tool.is_not_nil(values['tenant_id']): + raise ParamNull(param_name=value) + elif value == "type": + if not tool.is_not_nil(values['type']): + raise ParamFormatError(param_name=value) + elif value == "ttl": + if not tool.check_ttl(values['ttl']): + raise ParamFormatError(param_name=value) + elif value == "rdata": + if not tool.check_rdata(values['rdata']): + raise ParamFormatError(param_name=value) + return recom_msg + + def message_regrouping(self, dic, list_imp, list_uni): + tool.validat_values(dic, list_imp) + values = {} + dic_key = dic.keys() + for key_imp in list_imp: + values[key_imp] = dic[key_imp] + + uni = {} + for k in list_uni: + if k not in dic_key: + if k == "ttl": + uni[k] = "3600" + elif k == "klass": + uni[k] = "IN" + else: + continue + + merge = tool.dict_merge(values, uni) + + exist_imp = {} + for key in dic_key: + if key == "ttl": + if tool.is_not_nil(dic[key]): + exist_imp[key] = dic[key] + else: + exist_imp[key] = "3600" + elif key == "klass": + if tool.is_not_nil(dic[key]): + exist_imp[key] = dic[key] + else: + exist_imp[key] = "IN" + else: + continue + new_list = list_imp + list_uni + new_dic = tool.dict_merge(merge, exist_imp) + return self.validat_parms(new_dic, new_list) diff --git a/nca47/api/controllers/v1/dns/dns_zones.py b/nca47/api/controllers/v1/dns/dns_zones.py new file mode 100644 index 0000000..994a385 --- /dev/null +++ b/nca47/api/controllers/v1/dns/dns_zones.py @@ -0,0 +1,225 @@ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1 import tools +from nca47.common.exception import NonExistParam +from nca47.common.exception import ParamFormatError +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamValueError +from nca47.common.exception import Nca47Exception +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1.tools import check_ttl +from nca47.api.controllers.v1.tools import check_renewal + +LOG = logging.getLogger(__name__) + + +class DnsZonesController(base.BaseRestController): + + """ + nca47 dnsZones class, using for add/delete/update/query the zones info, + validate parameters whether is legal, handling DB operations and calling + rpc client's corresponding method to send messaging to agent endpoints + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(DnsZonesController, self).__init__() + + def create(self, req, *args, **kwargs): + """create the dns zones""" + # get the context + context = req.context + try: + # get the body + values = json.loads(req.body) + if 'default_ttl' not in values.keys(): + values['default_ttl'] = "300" + if 'renewal' not in values.keys(): + raise NonExistParam(param_name='renewal') + if values['renewal'] == 'no': + # check the in values + valid_attributes = ['name', 'owners', 'default_ttl', 'renewal', + 'tenant_id'] + elif values['renewal'] == 'yes': + # check the in values + valid_attributes = ['name', 'owners', 'default_ttl', 'renewal', + 'zone_content', 'slaves', 'tenant_id'] + else: + raise ParamValueError(param_name='renewal') + # check the in values + recom_msg = self.validat_parms(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server create the zones in db and device + zones = self.manager.create_zone(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return zones + + def update(self, req, id, *args, **kwargs): + """update the dns zones by currentUser/owners""" + # get the context + context = req.context + try: + values = json.loads(req.body) + values['id'] = id + LOG.info(_("the in value body is %(body)s"), {"body": values}) + LOG.info(_("the id is %(id)s"), {"id": id}) + if kwargs.get('owners'): + # check the in values + valid_attributes = ['id', 'tenant_id', 'owners'] + recom_msg = self.validat_parms(values, valid_attributes) + # from rpc server update the zones in db and device + zones = self.manager.update_zone_owners(context, recom_msg, + recom_msg['id']) + else: + # check the in values + valid_attributes = ['id', 'tenant_id', 'default_ttl'] + recom_msg = self.validat_parms(values, valid_attributes) + # from rpc server update the zones in db and device + zones = self.manager.update_zone(context, recom_msg, + recom_msg['id']) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return zones + + def remove(self, req, id, *args, **kwargs): + """delete the dns zones""" + # get the context + context = req.context + try: + values = {} + values.update(kwargs) + values['id'] = id + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # check the in values + valid_attributes = ['tenant_id', 'id'] + recom_msg = self.validat_parms(values, valid_attributes) + # from rpc server delete the zones in db and device + zones = self.manager.delete_zone(context, recom_msg['id']) + except Nca47Exception as e: + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return zones + + def list(self, req, *args, **kwargs): + """get the list of the dns zones""" + # get the context + context = req.context + try: + if kwargs.get('device'): + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from rpc server get the zones in device + zones = self.manager.get_zones(context) + else: + # get the body + values = {} + values.update(kwargs) + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from rpc server get the zones in db + zones = self.manager.get_db_zones(context, values) + LOG.info(_("Return of get_all_db_zone JSON is %(zones)s !"), + {"zones": zones}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return zones + + def show(self, req, id, *args, **kwargs): + """get one dns zone info""" + # get the context + context = req.context + try: + if kwargs.get('device'): + LOG.info(_(" args is %(args)s"), {"args": args}) + # from rpc server get the zone in device + zones = self.manager.get_zones(context) + else: + LOG.info(_(" args is %(args)s"), {"args": args}) + # from rpc server get the zone in db + zones = self.manager.get_zone_db_details(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return zones + + def validat_parms(self, values, valid_keys): + """check the in value is null and nums""" + recom_msg = tools.validat_values(values, valid_keys) + for value in recom_msg: + if value == "default_ttl": + if not check_ttl(values['default_ttl']): + raise ParamFormatError(param_name=value) + elif value == "renewal": + if not check_renewal(values['renewal']): + raise ParamValueError(param_name=value) + elif value == "owners": + if isinstance(values['owners'], list): + if not values['owners']: + raise ParamNull(param_name=value) + else: + raise ParamFormatError(param_name=value) + elif value == "slaves": + if isinstance(values['slaves'], list): + if not values['slaves']: + raise ParamNull(param_name=value) + else: + raise ParamFormatError(param_name=value) + return recom_msg diff --git a/nca47/api/controllers/v1/dns_servers.py b/nca47/api/controllers/v1/dns_servers.py deleted file mode 100644 index e09dac6..0000000 --- a/nca47/api/controllers/v1/dns_servers.py +++ /dev/null @@ -1,36 +0,0 @@ -from oslo_log import log as logging - -from nca47.api.controllers.v1 import base -from nca47.common.i18n import _ -from nca47.db import api as db_api -from nca47.db.sqlalchemy.models import DnsServer - -LOG = logging.getLogger(__name__) - - -class DnsServersController(base.BaseRestController): - def __init__(self): - self.db_api = db_api.get_instance() - super(DnsServersController, self).__init__() - - def _post(self, req, server, *args, **kwargs): - LOG.debug( - _("server is %(server)s, args is %(args)s, kwargs is %(kwargs)s"), - {"server": server, "args": args, "kwargs": kwargs}) - dns_server = self.db_api.create(DnsServer, server) - return dns_server - - def _put(self, req, id, *args, **kwargs): - values = kwargs['server'] - return self.db_api.update_object(DnsServer, id, values) - - def _delete(self, req, id, *args, **kwargs): - self.db_api.delete_object(DnsServer, id=id) - - def _get_all(self, req, *args, **kwargs): - dns_servers = self.db_api.get_objects(DnsServer, **kwargs) - return {'servers': dns_servers} - - def _get_one(self, req, id, *args, **kwargs): - dns_server = self.db_api.get_object(DnsServer, id=id, **kwargs) - return {'server': dns_server} diff --git a/nca47/api/controllers/v1/firewall/__init__.py b/nca47/api/controllers/v1/firewall/__init__.py new file mode 100644 index 0000000..8e278c8 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/__init__.py @@ -0,0 +1,52 @@ +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _ + +from nca47.api.controllers.v1.firewall import dnat +from nca47.api.controllers.v1.firewall import packetfilter +from nca47.api.controllers.v1.firewall import vfw +from nca47.api.controllers.v1.firewall import vlan +from nca47.api.controllers.v1.firewall import fw_addrobj +from nca47.api.controllers.v1.firewall import fw_snat_addr_pool +from nca47.api.controllers.v1.firewall import vrf +from nca47.api.controllers.v1.firewall import snat +from nca47.api.controllers.v1.firewall import staticnat +from nca47.api.controllers.v1.firewall import securityZone +from nca47.api.controllers.v1.firewall import net_service +import pecan + + +class FirewallController(object): + def __init__(self): + return + + @pecan.expose('json') + def index(self): + return {"Information": "The url is for firewall base RestApi " + "interface"} + + @pecan.expose() + def _lookup(self, kind, *remainder): + if kind == 'vfw': + return vfw.VFWController(), remainder + elif kind == 'dnat': + return dnat.DnatController(), remainder + elif kind == 'packetfilter': + return packetfilter.PacketFilterController(), remainder + elif kind == 'vlan': + return vlan.VLANController(), remainder + elif kind == 'addrobj': + return fw_addrobj.AddrObjController(), remainder + elif kind == 'snataddrpool': + return fw_snat_addr_pool.SnatAddrPoolController(), remainder + elif kind == 'vrf': + return vrf.VRFController(), remainder + elif kind == 'snat': + return snat.SNATController(), remainder + elif kind == 'staticnat': + return staticnat.StaticnatController(), remainder + elif kind == 'securityzone': + return securityZone.SecurityZoneController(), remainder + elif kind == 'netservice': + return net_service.NetServiceController(), remainder + else: + pecan.abort(404) diff --git a/nca47/api/controllers/v1/firewall/dnat.py b/nca47/api/controllers/v1/firewall/dnat.py new file mode 100644 index 0000000..f875a92 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/dnat.py @@ -0,0 +1,142 @@ +from oslo_log import log as logging +from oslo_serialization import jsonutils as json +from oslo_messaging import RemoteError + +from nca47.api.controllers.v1 import tools +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LE +from nca47.manager import central +from nca47.common.exception import BadRequest +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamValueError +from nca47.common.i18n import _LI + +LOG = logging.getLogger(__name__) + + +class DnatController(base.BaseRestController): + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(DnatController, self).__init__() + + def create(self, req, *args, **kwargs): + context = req.context + try: + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'name', 'inifname', 'wanip', 'lanipstart', + 'lanipend', 'lanport', 'slot', 'vfwname'] + values = tools.validat_values(body_values, valid_attributes) + keys = body_values.keys() + if not tools._is_valid_ipv4_addr(values['wanip']): + raise ParamValueError(param_name='wanip') + if not tools._is_valid_ipv4_addr(values['lanipstart']): + raise ParamValueError(param_name='lanipstart') + if not tools._is_valid_ipv4_addr(values['lanipend']): + raise ParamValueError(param_name='lanipend') + if values['lanport'] != "0": + if not tools._is_valid_port(values['lanport']): + raise ParamValueError(param_name='lanport') + if 'wantcpports' in keys and 'wanudpports' in keys: + raise BadRequest(resource="dnat", msg="Only have one" + " between wantcpports and wanudpport") + if 'wantcpports' in keys: + for port_range in body_values['wantcpports']: + if not tools._is_valid_port_range(port_range): + raise BadRequest(resource="wantcpports", + msg=port_range) + values['wantcpports'] = body_values['wantcpports'] + if 'wanudpports' in keys: + for port_range in body_values['wanudpports']: + if not tools._is_valid_port_range(port_range): + raise BadRequest(resource="wantcpports", + msg=port_range) + values['wanudpports'] = body_values['wanudpports'] + dnat_info = self.manager.create_dnat(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", dnat_info) + + def remove(self, req, id, *args, **kwargs): + context = req.context + try: + key_values = {} + key_values.update(kwargs) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone'] + values = tools.validat_values(key_values, valid_attributes) + values["id"] = id + self.manager.delete_dnat(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def list(self, req, *args, **kwargs): + context = req.context + try: + key_values = {} + key_values.update(kwargs) + LOG.info(_LI("get_all the staticnat values with dic format" + " is %(json)s"), {"json": key_values}) + list_ = ['tenant_id', 'dc_name', 'network_zone'] + tools.validat_values(key_values, list_) + dnat_infos = self.manager.get_dnats_by_fuzzy_query(context, + key_values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", dnat_infos) + + def show(self, req, id, *args, **kwargs): + context = req.context + try: + dnat_info = self.manager.get_dnat(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", dnat_info) diff --git a/nca47/api/controllers/v1/firewall/fw_addrobj.py b/nca47/api/controllers/v1/firewall/fw_addrobj.py new file mode 100644 index 0000000..0e7c5f9 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/fw_addrobj.py @@ -0,0 +1,157 @@ +from oslo_log import log as logging +from nca47.common.exception import NonExistParam +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamValueError +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +from oslo_messaging import RemoteError +from nca47.common.exception import Nca47Exception +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import tools +from nca47.api.controllers.v1 import base + +LOG = logging.getLogger(__name__) + + +class AddrObjController(base.BaseRestController): + """ + nca47 addrobj class, using for add/delete/update/query the addrobj info, + validate parameters whether is legal, handling DB operations and calling + rpc client's corresponding method to send messaging to agent endpoints + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(AddrObjController, self).__init__() + + def create(self, req, *args, **kwargs): + """create the addrobj""" + try: + # get the body + json_body = req.body + # get the context + context = req.context + values = json.loads(json_body) + # check the in values + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'ip', 'name', 'vfwname'] + # check the in values + recom_msg = self.validat_values(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server create the addrobj in db and device + addrobj = self.manager.add_addrobj(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", addrobj) + + def remove(self, req, id, *args, **kwargs): + """del the addrobj""" + try: + # get the context + context = req.context + # check the in values + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'vfwname', 'id'] + # check the in values + key_values = {} + key_values.update(kwargs) + key_values['id'] = id + recom_msg = self.validat_values(key_values, valid_attributes) + # from rpc server delete the addrobj in db and device + self.manager.delete_addrobj(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', 'success') + + def show(self, req, id, *args, **kwargs): + """get the one addrobj""" + try: + # get the context + context = req.context + addrobj = self.manager.get_addrobj(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", addrobj) + + def list(self, req, *args, **kwargs): + """get the all addrobj""" + try: + # get the context + context = req.context + # check the in values + # ADTEC_request: should be vfwname, not vfw_id + valid_attributes = ['vfwname', 'tenant_id', 'dc_name', + 'network_zone'] + # check the in values + key_values = {} + key_values.update(kwargs) + recom_msg = self.validat_values(key_values, valid_attributes) + # from rpc server get the addrobj in db and device + addrobjs = self.manager.get_addrobjs(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", addrobjs) + + def validat_values(self, values, valid_keys): + """Non null input parameters""" + recom_msg = {} + for key in valid_keys: + # check the IP get + if key == 'ip': + if not tools._is_valid_ipv4_addr(values[key]): + raise ParamValueError(param_name=key) + # if key == 'expip': + # if tools.is_valid_ip_list_with_netmask(values[key]) == False: + # raise ParamValueError(param_name=key) + if key not in values.keys(): + raise NonExistParam(param_name=key) + else: + recom_msg[key] = values[key] + if values[key] is None: + raise ParamNull(param_name=key) + return recom_msg diff --git a/nca47/api/controllers/v1/firewall/fw_snat_addr_pool.py b/nca47/api/controllers/v1/firewall/fw_snat_addr_pool.py new file mode 100644 index 0000000..14298bb --- /dev/null +++ b/nca47/api/controllers/v1/firewall/fw_snat_addr_pool.py @@ -0,0 +1,160 @@ +from oslo_log import log as logging +from nca47.common.exception import NonExistParam +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamValueError +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +from oslo_messaging import RemoteError +from nca47.common.exception import Nca47Exception +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import tools +from nca47.api.controllers.v1 import base + +LOG = logging.getLogger(__name__) + + +class SnatAddrPoolController(base.BaseRestController): + + """ + nca47 snataddrpool class, using for add/delete/query/queryallname the + snataddrpool info, validate parameters whether is legal, handling DB + operations and calling rpc client's corresponding method to send + messaging to agent endpoints + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(SnatAddrPoolController, self).__init__() + + def create(self, req, *args, **kwargs): + """create the snataddrpool""" + try: + # get the body + json_body = req.body + # get the context + context = req.context + values = json.loads(json_body) + # check the in values + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', 'name', + 'ipstart', 'ipend', 'slotip', 'vfwname'] + # check the in values + recom_msg = self.validat_values(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server create the snataddrpool in db and device + snataddrpool = self.manager.add_snataddrpool(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", snataddrpool) + + def remove(self, req, id, *args, **kwargs): + """del the snataddrpool""" + try: + # get the context + context = req.context + # check the in values + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'vfwname', 'id'] + key_values = {} + key_values.update(kwargs) + key_values['id'] = id + # check the in values + recom_msg = self.validat_values(key_values, valid_attributes) + # from rpc server delete the snataddrpool in db and device + self.manager.del_snataddrpool(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def show(self, req, id, *args, **kwargs): + """get the one snataddrpool""" + try: + # get the context + context = req.context + snataddrpool = self.manager.get_snataddrpool(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", snataddrpool) + + def list(self, req, *args, **kwargs): + """get the all snataddrpool""" + try: + # get the context + context = req.context + # check the in values + key_values = {} + key_values.update(kwargs) + valid_attributes = ['vfwname', 'tenant_id', 'dc_name', + 'network_zone'] + # check the in values + recom_msg = self.validat_values(key_values, valid_attributes) + # from rpc server get the snataddrpool in db and device + snataddrpools = self.manager.get_snataddrpools(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", snataddrpools) + + def validat_values(self, values, valid_keys): + """Non null input parameters""" + recom_msg = {} + for key in valid_keys: + if key == 'ipstart': + if not tools._is_valid_ipv4_addr(values[key]): + raise ParamValueError(param_name=key) + if key == 'ipend': + if not tools._is_valid_ipv4_addr(values[key]): + raise ParamValueError(param_name=key) + if key == 'slotip': + if not tools._is_valid_slotip(values[key]): + raise ParamValueError(param_name=key) + if key not in values.keys(): + raise NonExistParam(param_name=key) + else: + recom_msg[key] = values[key] + if values[key] is None: + raise ParamNull(param_name=key) + return recom_msg diff --git a/nca47/api/controllers/v1/firewall/net_service.py b/nca47/api/controllers/v1/firewall/net_service.py new file mode 100644 index 0000000..c3bb0bc --- /dev/null +++ b/nca47/api/controllers/v1/firewall/net_service.py @@ -0,0 +1,128 @@ +from nca47.manager.central import CentralManager +from nca47.common.exception import ParamFormatError +from nca47.common.exception import Nca47Exception +from oslo_log import log +from nca47.common.i18n import _LI +from nca47.common.i18n import _LE +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import tools +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base + +LOG = log.getLogger(__name__) + + +class NetServiceController(base.BaseRestController): + + """the method NetService operation""" + + def __init__(self): + self.manager = CentralManager.get_instance() + super(NetServiceController, self).__init__() + + def create(self, req, *args, **kwargs): + try: + json_body = req.body + context = req.context + dic = json.loads(json_body) + LOG.info(_LI("create_netservice body is %(json)s,args is " + "%(args)s, kwargs is %(kwargs)s"), + {"json": dic, "args": args, "kwargs": kwargs}) + list_ = ['tenant_id', 'dc_name', 'proto', + 'network_zone', 'port', 'vfwname'] + dic_body = self.firewall_params(dic, list_) + response = self.manager.create_netservice(context, dic_body) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def remove(self, req, id, *args, **kwargs): + context = req.context + try: + LOG.info(_LI("args is %(args)s," "kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + values = {} + values.update(kwargs) + list_ = ['tenant_id', 'dc_name', 'network_zone'] + dic_body = self.firewall_params(values, list_) + dic_body["id"] = id + self.manager.del_netservice(context, dic_body) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def show(self, req, id, *args, **kwargs): + context = req.context + try: + LOG.info(_LI("args is %(args)s,""kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + response = self.manager.get_netservice(context, id) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def list(self, req, *args, **kwargs): + try: + context = req.context + LOG.info(_LI("netserivce list args is %(args)s,kwargs" + " is %(kwargs)s"), {"args": args, "kwargs": kwargs}) + values = {} + values.update(kwargs) + list_ = ['tenant_id', 'dc_name', 'network_zone'] + self.firewall_params(values, list_) + response = self.manager.get_netservices_by_fuzzy_query(context, + values) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def firewall_params(self, dic, list_): + dic = tools.filter_string_not_null(dic, list_) + dic_key = dic.keys() + for key in dic_key: + val_key = dic[key] + if key == "proto": + if not tools.is_proto_range(val_key): + raise ParamFormatError(param_name=key) + elif key == "port": + if not tools._is_valid_port_range(val_key): + raise ParamFormatError(param_name=key) + else: + continue + return dic diff --git a/nca47/api/controllers/v1/firewall/packetfilter.py b/nca47/api/controllers/v1/firewall/packetfilter.py new file mode 100644 index 0000000..7e400a0 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/packetfilter.py @@ -0,0 +1,170 @@ +from oslo_log import log as logging +from oslo_serialization import jsonutils as json +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import tools +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LE +from nca47.common.exception import Nca47Exception +from nca47.common.exception import NonExistParam +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamValueError +from nca47.manager import central + +LOG = logging.getLogger(__name__) + + +class PacketFilterController(base.BaseRestController): + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(PacketFilterController, self).__init__() + + def create(self, req, *args, **kwargs): + context = req.context + try: + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'name', 'srczonename', 'dstzonename', + 'vfwname'] + self.check_create(body_values, valid_attributes) + values = self.check_value(body_values) + packetfilter_info = self.manager.create_packetfilter(context, + values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", packetfilter_info) + + def remove(self, req, id, *args, **kwargs): + context = req.context + try: + key_values = {} + key_values.update(kwargs) + key_values['id'] = id + valid_attributes = ['id', 'tenant_id', 'dc_name', 'network_zone'] + values = tools.validat_values(key_values, valid_attributes) + self.manager.delete_packetfilter(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', 'success') + + def list(self, req, *args, **kwargs): + context = req.context + try: + key_values = {} + key_values.update(kwargs) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'vfwname'] + values = tools.validat_values(key_values, valid_attributes) + packetfilter_infos = self.manager.get_all_packetfilters(context, + values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", packetfilter_infos) + + def show(self, req, id, *args, **kwargs): + context = req.context + try: + packetfilter_info = self.manager.get_packetfilter(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", packetfilter_info) + + def check_value(self, values): + if 'srcipobjips' in values.keys() and isinstance( + values['srcipobjips'], list): + for ipinfo in values['srcipobjips']: + if not tools._is_valid_ipv4_addr(ipinfo): + raise ParamValueError(param_name=ipinfo) + values['srcipobjips'] = values['srcipobjips'] + if 'dstipobjips' in values.keys() and isinstance( + values['srcipobjips'], list): + for ipinfo in values['dstipobjips']: + if not tools._is_valid_ipv4_addr(ipinfo): + raise ParamValueError(param_name=ipinfo) + values['dstipobjips'] = values['dstipobjips'] + if 'servicenames' in values.keys(): + values['servicenames'] = values['servicenames'] + else: + values['servicenames'] = [] + valid_range = (0, 1) + if 'action' in values.keys(): + if values['action'] not in valid_range: + raise ParamValueError(param_name='action') + values['action'] = values['action'] + else: + values['action'] = 0 + if 'log' in values.keys(): + if values['log'] not in valid_range: + raise ParamValueError(param_name='log') + values['log'] = values['log'] + else: + values['log'] = 0 + if "srczonename" in values.keys(): + values["srczonename"] = (values["tenant_id"] + "_" + + values["network_zone"] + + "_" + values["srczonename"]) + if "dstzonename" in values.keys(): + values["dstzonename"] = (values["tenant_id"] + "_" + + values["network_zone"] + + "_" + values["dstzonename"]) + return values + + def check_create(self, values, valid_keys): + for key in valid_keys: + if key not in values.keys(): + raise NonExistParam(param_name=key) + else: + if isinstance(values[key], basestring): + if (values[key].isspace()) or (len(values[key]) == 0): + raise ParamNull(param_name=key) + elif isinstance(values[key], list): + if len(values[key]) == 0: + raise ParamNull(param_name=key) diff --git a/nca47/api/controllers/v1/firewall/securityZone.py b/nca47/api/controllers/v1/firewall/securityZone.py new file mode 100644 index 0000000..41e4284 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/securityZone.py @@ -0,0 +1,183 @@ +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LI, _LE +from nca47.common.exception import Nca47Exception +from oslo_log import log +from nca47.api.controllers.v1 import tools +from nca47.manager.central import CentralManager +from nca47.common.exception import BadRequest +from oslo_messaging import RemoteError +from nca47.common import exception + +LOG = log.getLogger(__name__) + + +class SecurityZoneController(base.BaseRestController): + + def __init__(self): + self.manager = CentralManager.get_instance() + super(SecurityZoneController, self).__init__() + + def create(self, req, *args, **kwargs): + try: + context = req.context + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'name', 'ifnames', 'priority', 'vfwname'] + values = tools.validat_values(body_values, valid_attributes) + LOG.info(_LI("input the SecurityZone values with dic format" + " is %(json)s"), {"json": body_values}) + values["name"] = (values["tenant_id"] + "_" + + values["network_zone"] + + "_" + values["name"]) + response = self.manager.create_securityzone(context, values) + return response + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + + def remove(self, req, id, *args, **kwargs): + try: + context = req.context + remove_dict = {} + remove_dict.update(req.GET) + valid_attributes = ['id', 'tenant_id', 'dc_name', 'network_zone'] + values = tools.validat_values(remove_dict, valid_attributes) + # input the SecurityZone values with dic format + LOG.info(_LI("delete the SecurityZone values with dic format" + " is %(json)s"), {"json": remove_dict}) + self.manager.delete_securityzone(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def list(self, req, *args, **kwargs): + try: + context = req.context + key_values = {} + key_values.update(kwargs) + valid_attributes = ['tenant_id', 'dc_name', + 'network_zone', 'vfwname'] + values = tools.validat_values(key_values, valid_attributes) + # get_all the SecurityZone values with dic format + LOG.info(_LI("get_all the SecurityZone values with dic format" + " is %(json)s"), {"json": key_values}) + response = self.manager.get_securityzones(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def show(self, req, id, *args, **kwargs): + try: + context = req.context + response = self.manager.get_securityzone(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def addif(self, req, *args, **kwargs): + try: + url = req.url + if len(args) > 1: + raise BadRequest(resource="SecurityZone add vlan", msg=url) + context = req.context + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', 'id', + 'ifname'] + values = tools.validat_values(body_values, valid_attributes) + # input the SecurityZone values with dic format + LOG.info(_LI("input the SecurityZone values with dic format is" + " %(json)s"), {"json": body_values}) + response = self.manager.securityzone_addif(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def delif(self, req, *args, **kwargs): + try: + url = req.url + if len(args) > 1: + raise BadRequest(resource="SecurityZone del vlan", msg=url) + context = req.context + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', 'id', + 'ifname'] + values = tools.validat_values(body_values, valid_attributes) + LOG.info(_LI("input the SecurityZone values with dic format" + " is %(json)s"), {"json": body_values}) + # response = self.manager.securityZone_addif(context, values) + response = self.manager.securityzone_delif(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: %' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) diff --git a/nca47/api/controllers/v1/firewall/snat.py b/nca47/api/controllers/v1/firewall/snat.py new file mode 100644 index 0000000..ab8e220 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/snat.py @@ -0,0 +1,134 @@ +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LI, _LE +from nca47.common.exception import Nca47Exception +from oslo_log import log +from nca47.api.controllers.v1 import tools +from nca47.manager.central import CentralManager +from oslo_messaging import RemoteError + +LOG = log.getLogger(__name__) + + +class SNATController(base.BaseRestController): + def __init__(self): + self.manager = CentralManager.get_instance() + super(SNATController, self).__init__() + + def create(self, req, *args, **kwargs): + try: + context = req.context + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', + 'name', 'outIfName', 'vfwname'] + values = tools.validat_values(body_values, valid_attributes) + values["outifname"] = body_values["outIfName"] + + if "srcIpObjIP" not in body_values.keys(): + values["srcipobjname"] = ["all"] + else: + values["srcipobjname"] = body_values["srcIpObjIP"] + + if "dstIpObjIP" not in body_values.keys(): + values["dstipobjname"] = ["all"] + else: + values["dstipobjname"] = body_values["dstIpObjIP"] + + if "wanIpPoolIP" not in body_values.keys(): + values["wanippoolname"] = "" + else: + values["wanippoolname"] = body_values["wanIpPoolIP"] + # input the staticnat values with dic format + LOG.info(_LI("input the snat values with dic format" + " is %(json)s"), {"json": body_values}) + response = self.manager.create_snat(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def remove(self, req, id, *args, **kwargs): + try: + context = req.context + key_values = {} + key_values.update(kwargs) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone'] + values = tools.validat_values(key_values, valid_attributes) + values["id"] = id + # input the snat values with dic format + LOG.info(_LI("delete the snat values with dic format" + " is %(json)s"), {"json": key_values}) + self.manager.del_snat(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def list(self, req, *args, **kwargs): + try: + context = req.context + key_values = {} + key_values.update(kwargs) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone'] + values = tools.validat_values(key_values, valid_attributes) + # input the staticnat values with dic format + LOG.info(_LI("get_all the snat values with dic format" + " is %(json)s"), {"json": key_values}) + response = self.manager.get_snats_by_fuzzy_query(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def show(self, req, id, *args, **kwargs): + try: + context = req.context + response = self.manager.get_snats(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) diff --git a/nca47/api/controllers/v1/firewall/staticnat.py b/nca47/api/controllers/v1/firewall/staticnat.py new file mode 100644 index 0000000..139ca4e --- /dev/null +++ b/nca47/api/controllers/v1/firewall/staticnat.py @@ -0,0 +1,124 @@ +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LI, _LE +from nca47.common.exception import Nca47Exception +from oslo_log import log +from nca47.api.controllers.v1 import tools +from nca47.manager.central import CentralManager +from oslo_messaging import RemoteError + +LOG = log.getLogger(__name__) + + +class StaticnatController(base.BaseRestController): + + def __init__(self): + self.manager = CentralManager.get_instance() + super(StaticnatController, self).__init__() + + def create(self, req, *args, **kwargs): + + try: + context = req.context + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', 'name', + 'ifname', 'lanip', 'wanip', 'slot', 'vfwname'] + values = tools.validat_values(body_values, valid_attributes) + + # input the staticnat values with dic format + LOG.info(_LI("input the staticnat values with dic format" + " is %(json)s"), {"json": body_values}) + + response = self.manager.create_staticnat(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def remove(self, req, id, *args, **kwargs): + try: + context = req.context + key_values = {} + key_values.update(kwargs) + key_values["id"] = id + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', "id"] + values = tools.validat_values(key_values, valid_attributes) + + # input the staticnat values with dic format + LOG.info(_LI("delete the staticnat values with dic format" + " is %(json)s"), {"json": key_values}) + self.manager.del_staticnat(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def list(self, req, *args, **kwargs): + try: + context = req.context + dic = {} + dic.update(kwargs) + list_ = ['tenant_id', 'dc_name', 'network_zone'] + tools.validat_values(dic, list_) + # input the staticnat values with dic format + LOG.info(_LI("get_all the staticnat values with dic format" + " is %(json)s"), {"json": dic}) + + response = self.manager.get_staticnats_by_fuzzy_query(context, dic) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: %' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def show(self, req, id, *args, **kwargs): + try: + context = req.context + response = self.manager.get_staticnat(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) diff --git a/nca47/api/controllers/v1/firewall/vfw.py b/nca47/api/controllers/v1/firewall/vfw.py new file mode 100644 index 0000000..dc2e868 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/vfw.py @@ -0,0 +1,127 @@ +from oslo_log import log as logging +from oslo_serialization import jsonutils as json +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LE +from nca47.common.i18n import _LI +from nca47.manager import central +from nca47.api.controllers.v1 import tools +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamValueError + +LOG = logging.getLogger(__name__) + + +class VFWController(base.BaseRestController): + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(VFWController, self).__init__() + + def create(self, req, *args, **kwargs): + LOG.info("create vfw") + context = req.context + valid_attributes = ['name', 'type', 'resource', 'tenant_id', + 'dc_name', 'network_zone', + 'network_zone_class'] + try: + body_values = json.loads(req.body) + values = tools.validat_values(body_values, valid_attributes) + if 'protection_class' in body_values.keys(): + values['protection_class'] = body_values['protection_class'] + type_range = (2, 4, 8) + if values['type'] not in type_range: + raise ParamValueError(param_name='type') + vfw_info = self.manager.create_vfw(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", vfw_info) + + def remove(self, req, id, *args, **kwargs): + LOG.info("delete vfw") + context = req.context + try: + valid_attributes = ['tenant_id', 'dc_name', 'network_zone'] + key_values = {} + key_values.update(kwargs) + values = tools.validat_values(key_values, valid_attributes) + values["id"] = id + self.manager.delete_vfw(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def list(self, req, *args, **kwargs): + LOG.info(_LI("vfw list method")) + context = req.context + try: + # valid_attributes = ['tenant_id', 'dc_name', \ + # 'network_zone'] + # key_values = {} + # key_values.update(kwargs) + # values = tools.validat_values(key_values, valid_attributes) + # if 'protection_class' in key_values.keys(): + # values['protection_class'] = key_values['protection_class'] + dic = {} + dic.update(kwargs) + list_ = ['tenant_id', 'dc_name', 'network_zone'] + tools.validat_values(dic, list_) + vfw_info = self.manager.get_vfws_by_fuzzy_query(context, dic) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", vfw_info) + + def show(self, req, id, *args, **kwargs): + context = req.context + try: + vfw_info = self.manager.get_vfw(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", vfw_info) diff --git a/nca47/api/controllers/v1/firewall/vlan.py b/nca47/api/controllers/v1/firewall/vlan.py new file mode 100644 index 0000000..bbd74f8 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/vlan.py @@ -0,0 +1,159 @@ +from nca47.manager.central import CentralManager +from nca47.common.exception import ParamFormatError +from nca47.common.exception import ParamValueError +from nca47.common.exception import ParamNull +from nca47.common.exception import Nca47Exception +from oslo_log import log +from nca47.common.i18n import _LI, _LE +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import tools +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base + +LOG = log.getLogger(__name__) + + +class VLANController(base.BaseRestController): + + """the method vlan operation""" + + def __init__(self): + self.manager = CentralManager.get_instance() + super(VLANController, self).__init__() + + def create(self, req, *args, **kwargs): + try: + json_body = req.body + context = req.context + dic = json.loads(json_body) + LOG.info(_LI("add_vlan body is %(json)s,args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": dic, "args": args, "kwargs": kwargs}) + list_ = ['tenant_id', 'dc_name', 'vlan_number', 'ifnames', + 'network_zone', 'ipaddr'] + + dic_body = self.firewall_params(dic, list_) + response = self.manager.create_vlan(context, dic_body) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def remove(self, req, id, *args, **kwargs): + try: + context = req.context + LOG.info(_LI("args is %(args)s," "kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + list_ = [ + 'id', + 'tenant_id', + 'dc_name', + 'network_zone', + 'ifnames'] + key_values = {} + key_values.update(kwargs) + key_values.update({'id': id}) + dic_body = self.firewall_params(key_values, list_) + self.manager.del_vlan(context, dic_body) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def show(self, req, id, *args, **kwargs): + try: + context = req.context + response = self.manager.get_vlan(context, id) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def list(self, req, *args, **kwargs): + try: + context = req.context + search_opts = {} + search_opts.update(req.GET) + LOG.info(_LI("get_all_vlan body is %(json)s, args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": search_opts, "args": args, "kwargs": kwargs}) + # list_ = ['tenant_id', 'dc_name', 'network_zone'] + response = self.manager.get_vlans(context, search_opts) + response = self.replace_string_to_list(response) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def firewall_params(self, dic, list_): + dic = tools.filter_string_not_null(dic, list_) + dic_key = dic.keys() + for key in dic_key: + value = dic[key] + if key == "ifnames": + if isinstance( + dic['ifnames'], + basestring) and len( + dic['ifnames']) != 0: + dic['ifnames'] = eval(dic['ifnames']) + if not tools.is_list_and_no_emtpy_string(dic[key]): + raise ParamValueError(param_name=key) + if key == "ipaddr": + flag = tools.is_or_not_list(value) + if flag == "0": + raise ParamFormatError(param_name=key) + elif flag == "1": + raise ParamNull(param_name=key) + else: + for v in dic['ipaddr']: + v0 = v.split("/")[0] + if not tools._is_valid_ipv4_addr(v0): + raise ParamFormatError(param_name=key) + v1 = v.split("/")[1] + try: + v1 = int(v1) + if v1 < 0 or v1 > 32: + raise ParamFormatError(param_name=key) + except Exception: + raise ParamFormatError(param_name=key) + else: + continue + return dic + + def replace_string_to_list(self, response): + for res in response: + res['ipaddr'] = eval(res['ipaddr']) + res['ifnames'] = eval(res['ifnames']) + return response diff --git a/nca47/api/controllers/v1/firewall/vrf.py b/nca47/api/controllers/v1/firewall/vrf.py new file mode 100644 index 0000000..38ebfd4 --- /dev/null +++ b/nca47/api/controllers/v1/firewall/vrf.py @@ -0,0 +1,105 @@ +from oslo_serialization import jsonutils as json +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LI, _LE +from nca47.common.exception import Nca47Exception +from oslo_log import log +from nca47.api.controllers.v1 import tools +from nca47.manager.central import CentralManager +from oslo_messaging import RemoteError + +LOG = log.getLogger(__name__) + + +class VRFController(base.BaseRestController): + def __init__(self): + self.manager = CentralManager.get_instance() + super(VRFController, self).__init__() + + def create(self, req, *args, **kwargs): + try: + context = req.context + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', 'name', + 'vrfInterface'] + values = tools.validat_values(body_values, valid_attributes) + # input the staticnat values with dic format + LOG.info(_LI("input the vrf values with dic format" + " is %(json)s"), {"json": body_values}) + response = self.manager.create_vrf(context, values) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def remove(self, req, id, *args, **kwargs): + try: + context = req.context + key_values = {} + key_values.update(kwargs) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone', 'id'] + values = tools.validat_values(key_values, valid_attributes) + # input the vrf values with dic format + LOG.info(_LI("delete the vrf values with dic format" + " is %(json)s"), {"json": key_values}) + self.manager.del_vrf(context, values) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", "success") + + def list(self, req, *args, **kwargs): + try: + context = req.context + key_values = {} + key_values.update(kwargs) + valid_attributes = ['tenant_id', 'dc_name', 'network_zone'] + values = tools.validat_values(key_values, valid_attributes) + # input the staticnat values with dic format + LOG.info(_LI("get_all the vrf values with dic format" + " is %(json)s"), {"json": key_values}) + response = self.manager.get_vrfs(context, values) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) + + def show(self, req, id, *args, **kwargs): + try: + context = req.context + response = self.manager.get_vrf(context, id) + except Nca47Exception as e: + LOG.error(_LE('Nca47Exception! error info: ' + e.message)) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception! error info: ' + e.message)) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", response) diff --git a/nca47/api/controllers/v1/gslb/__init__.py b/nca47/api/controllers/v1/gslb/__init__.py new file mode 100644 index 0000000..58743bb --- /dev/null +++ b/nca47/api/controllers/v1/gslb/__init__.py @@ -0,0 +1,52 @@ +""" +This module is for operate gslb's functions, such as CRUD the related +resource via RestAPI interface. +""" +import pecan +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1.gslb.gmap import GMapController +from nca47.api.controllers.v1.gslb.gmember import GmemberController +from nca47.api.controllers.v1.gslb.gpool import GPoolController +from nca47.api.controllers.v1.gslb.gslb_zone import GlsbZoneController +from nca47.api.controllers.v1.gslb.hm_template import HmTemplateController +from nca47.api.controllers.v1.gslb.sp_policy import SP_PolicyController +from nca47.api.controllers.v1.gslb.syncgroup import SyngroupController +from nca47.api.controllers.v1.gslb.user_region_member import \ + RegionMemberController +from nca47.api.controllers.v1.gslb.user_region import RegionController +from nca47.common.i18n import _ + + +class GSLBController(object): + """Global Server Load Balance's base restApi interface""" + + def __init__(self): + return + + @pecan.expose('json') + def index(self): + return {"Information": "The url is for GSLB base RestApi " + "interface"} + + @pecan.expose() + def _lookup(self, kind, *remainder): + if kind == "sp_policy": + return SP_PolicyController(), remainder + elif kind == "member": + return RegionMemberController(), remainder + elif kind == "region": + return RegionController(), remainder + elif kind == "gmember": + return GmemberController(), remainder + elif kind == "hm_template": + return HmTemplateController(), remainder + elif kind == "gslb_zone": + return GlsbZoneController(), remainder + elif kind == 'syngroup': + return SyngroupController(), remainder + elif kind == "gpool": + return GPoolController(), remainder + elif kind == "gmap": + return GMapController(), remainder + else: + pecan.abort(404) diff --git a/nca47/api/controllers/v1/gslb/gmap.py b/nca47/api/controllers/v1/gslb/gmap.py new file mode 100644 index 0000000..dad21a9 --- /dev/null +++ b/nca47/api/controllers/v1/gslb/gmap.py @@ -0,0 +1,263 @@ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1 import tools +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamValueError +from nca47.common.exception import Nca47Exception +from nca47.common.exception import IllegalParam +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +import json + +LOG = logging.getLogger(__name__) + + +class GMapController(base.BaseRestController): + """ + nca47 GMap class ,using for add/put/delete/get/getall the GMap info, + validate parameters whether is legal,handling DB operations and calling rpc + client's corresponding method to send messaging to agent endpoint + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(GMapController, self).__init__(self) + + def create(self, req, *args, **kwargs): + """ + Create GMap method + :param req: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + values = json.loads(req.body) + values = self.check_null(values) + self.check_create(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + gmap = self.manager.create_gmap(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE("Error exception ! error info: " + e.message)) + LOG.exception(e) + return tools.ret_info(self.response.status, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', gmap) + + def update(self, req, id, *args, **kwargs): + """ + Update GMap method + :param req: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + values = json.loads(req.body) + values['id'] = id + self.check_not_null(values) + values = self.check_update(values) + # values = self.check_null(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + gmap = self.manager.update_gmap(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE("Error exception ! error info: " + e.message)) + LOG.exception(e) + return tools.ret_info(self.response.status, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', gmap) + + def remove(self, req, id, *args, **kwargs): + """ + delete GMap method + :param req: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + values = {} + values.update(kwargs) + values['id'] = id + self.check_remove(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + gmap = self.manager.delete_gmap(context, values) + except Nca47Exception as e: + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', 'success') + + def list(self, req, *args, **kwargs): + """ + get GMaps method + :param req: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + search_opts = {} + search_opts.update(req.GET) + LOG.info(_("search_opts is %s"), search_opts) + # values = json.loads(req.body) + try: + LOG.info( + _("args is %(args)s,kwargs is %(kwargs)s"), { + 'args': args, "kwargs": kwargs}) + # self.check_search(search_opts) + gmap = self.manager.get_gmaps(context, search_opts) + gmaps = self.get_return_convert(gmap) + LOG.info(_("Retrun of get_all_db_zone JSON is %(gmap)s !"), + {"gmap": gmap}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', gmaps) + + def show(self, req, id, *args, **kwargs): + """ + get GMap method + :param req: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + LOG.info(_("args is %(args)s"), {"args": args}) + gmap = self.manager.get_gmap(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', gmap) + + def check_create(self, dic): + """ + check must exits and values + :param lis: is a list ,contain all must exits keys; + :param dic: is a dict, contain the body give us keys; + :return: not return + """ + self.check_value(dic) + self.check_is_list(dic) + validate_list = [ + 'tenant_id', + 'name', + ] + tools.validat_values(dic, validate_list) + + def check_update(self, dic): + if 'name' in dic.keys(): + del dic['name'] + self.check_value(dic) + validate_list = ['id', 'tenant_id'] + tools.validat_values(dic, validate_list) + self.check_is_list(dic) + return dic + + def check_not_null(self, values): + null_list = ['last_resort_pool'] + for key in values.keys(): + if key not in null_list: + result = tools.is_not_nil(values[key]) + if isinstance(values[key], basestring) and not result: + raise ParamNull(param_name=key) + + def check_search(self, dic): + validate_list = [ + "tenant_id", + "name", + "enable", + "algorithm", + "last_resort_pool", + "gpool_list"] + for key in dic.keys(): + if key not in validate_list: + raise IllegalParam(param_name=key) + + def check_remove(self, dic): + validate_list = ['id', 'tenant_id'] + dic = tools.validat_values(dic, validate_list) + + def get_return_convert(self, gmap): + for dic in gmap: + if 'gpool_list' in dic: + if dic['gpool_list'] == "": + dic['gpool_list'] = [] + else: + try: + dic['gpool_list'] = eval(dic['gpool_list']) + except: + pass + return gmap + + def check_null(self, values): + ret = {} + for key in values: + if values[key] != '' and values[key] != []: + ret[key] = values[key] + return ret + + def check_is_list(self, dic): + validate_list = ['gpool_list'] + for key in validate_list: + if key in dic.keys(): + if not isinstance(dic[key], list): + raise ParamValueError(param_name=key) + + def check_value(self, dic): + if 'enable' in dic.keys() and dic['enable'] not in ['yes', 'no']: + raise ParamValueError(param_name="enable") + if "algorithm" in dic.keys() and dic['algorithm'] not in [ + 'rr', 'wrr', 'sp', 'ga']: + raise ParamValueError(param_name="algorithm") diff --git a/nca47/api/controllers/v1/gslb/gmember.py b/nca47/api/controllers/v1/gslb/gmember.py new file mode 100644 index 0000000..9fe642f --- /dev/null +++ b/nca47/api/controllers/v1/gslb/gmember.py @@ -0,0 +1,205 @@ +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _ +from nca47.api.controllers.v1 import tools as tool +from oslo_log import log as logging +from nca47.manager import central +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamValueError +from oslo_serialization import jsonutils as json +from nca47.common.i18n import _LE +from oslo_messaging import RemoteError + +LOG = logging.getLogger(__name__) + + +class GmemberController(base.BaseRestController): + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(GmemberController, self).__init__() + + def create(self, req, *args, **kwargs): + """create one gmember""" + try: + LOG.info(_("create gmember:body is %(json)s, args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + array = ["gslb_zone_name", "tenant_id", "name", + "ip", "port", "enable"] + # get the body + dic = json.loads(req.body) + dic_body = self.validat_parms(dic, array) + context = req.context + response = self.manager.create_gmember(context, dic_body) + LOG.info(_("Return of Created Gmember Json is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info('200', response) + + def update(self, req, id, *args, **kwargs): + """update the dns gmember""" + try: + LOG.info(_("update gmember:body is %(json)s, args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + # get the body + dic = json.loads(req.body) + dic['id'] = id + list_ = ["enable", "id", "tenant_id"] + dic_body = self.validat_parms(dic, list_) + # the attributes can be changed + k = dic_body.keys() + upd_dic = {} + if "enable" in k: + upd_dic["enable"] = dic["enable"] + else: + pass + c = req.context + response = self.manager.update_gmember(c, upd_dic, dic['id']) + LOG.info(_("Return of update gmember JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info('200', response) + + def remove(self, req, id, *args, **kwargs): + """delete the dns gmember""" + try: + LOG.info(_("delete gmember:body is %(json)s, args is %(args)s, " + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + c = req.context + # get the body + dic = {} + dic.update(kwargs) + dic['id'] = id + list_ = ["id", "tenant_id"] + self.validat_parms(dic, list_) + """from rpc server delete the gmember""" + response = self.manager.delete_gmember(c, dic['id']) + LOG.info(_("Return of remove gmember JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info('200', "success") + + def show(self, req, id, *args, **kwargs): + """get one of the dns gmember""" + try: + LOG.info(_("get a gmember: args is %(args)s, " + "kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + context = req.context + response = self.manager.get_one_gmember_db(context, id) + LOG.info(_("Return of gmember JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info('200', response) + + def list(self, req, *args, **kwargs): + """get all of the dns gmember""" + try: + LOG.info(_("Get all gmembers: args is %(args)s, " + "kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + context = req.context + dic = {} + dic.update(req.GET) + + response = self.manager.get_gmembers_db(context, dic) + LOG.info(_("Return of get all gmember JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info('200', response) + + def validat_parms(self, values, valid_keys): + """check the in value is null and nums""" + recom_msg = tool.validat_values(values, valid_keys) + dic_key = recom_msg.keys() + for key in dic_key: + val_key = recom_msg[key] + if key == "ip": + if not tool._is_valid_ipv4_addr(val_key): + raise ParamValueError(param_name=key) + elif key == "port": + if not tool._is_valid_port(val_key): + raise ParamValueError(param_name=key) + elif key == "enable": + validat = ["yes", "no"] + if val_key not in validat: + raise ParamValueError(param_name=key) + else: + continue + return recom_msg diff --git a/nca47/api/controllers/v1/gslb/gpool.py b/nca47/api/controllers/v1/gslb/gpool.py new file mode 100644 index 0000000..5178d97 --- /dev/null +++ b/nca47/api/controllers/v1/gslb/gpool.py @@ -0,0 +1,258 @@ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1 import tools +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamValueError +from nca47.common.exception import Nca47Exception +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +import json + +LOG = logging.getLogger(__name__) + + +class GPoolController(base.BaseRestController): + """ + nca47 GPool class ,using for add/put/delete/get/getall the GPool info, + validate parameters whether is legal,handling DB operations and calling rpc + client's corresponding method to send messaging to agent endpoint + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(GPoolController, self).__init__(self) + + def create(self, req, *args, **kwargs): + """ + create GPool method + :param req: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + values = json.loads(req.body) + values = self.check_null(values) + self.check_create(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + gpool = self.manager.create_gpool(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE("Error exception ! error info: " + e.message)) + LOG.exception(e) + return tools.ret_info(self.response.status, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', gpool) + + def update(self, req, id, *args, **kwargs): + """ + update GPool method + :param req: + :param args: + :param kwargs: + :return: + """ + context = req.context + try: + values = json.loads(req.body) + values['id'] = id + self.check_can_be_null(values) + values = self.check_update(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + gpool = self.manager.update_gpool(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE("Error exception ! error info: " + e.message)) + LOG.exception(e) + return tools.ret_info(self.response.status, e.message) + except RemoteError as e: + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', gpool) + + def remove(self, req, id, *args, **kwargs): + """ + delete GPool method + :param req: + :param id: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + values = {} + values.update(kwargs) + values['id'] = id + self.check_remove(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + self.manager.delete_gpool(context, values) + except Nca47Exception as e: + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', 'success') + + def list(self, req, *args, **kwargs): + """ + get GPools method + :param req: + :param id: + :param args: + :param kwargs: + :return: return http response + """ + + context = req.context + try: + search_opts = {} + search_opts.update(req.GET) + # self.check_search(values) + LOG.info( + _("args is %(args)s,kwargs is %(kwargs)s"), { + 'args': args, "kwargs": kwargs}) + gpools = self.manager.get_gpools(context, search_opts) + gpools = self.get_return_convert(gpools) + LOG.info(_("Retrun of get_all_db_zone JSON is %(gpool)s !"), + {"gpool": gpools}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', gpools) + + def show(self, req, id, *args, **kwargs): + """ + get GPool method + :param req: + :param id: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + LOG.info(_("args is %(args)s"), {"args": args}) + gpool = self.manager.get_gpool(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: %' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', gpool) + + def check_create(self, dic): + self.check_is_list(dic) + validate_list = ['tenant_id', 'name', 'enable', 'ttl', ] + tools.validat_values(dic, validate_list) + self.check_value(dic) + + def check_update(self, dic): + if 'name' in dic.keys(): + del dic['name'] + self.check_value(dic) + validate_list = ['id', 'tenant_id'] + tools.validat_values(dic, validate_list) + self.check_is_list(dic) + return dic + + def check_remove(self, dic): + validate_list = ['id', 'tenant_id'] + tools.validat_values(dic, validate_list) + + def check_null(self, values): + ret = {} + for key in values: + if len(str(values[key])) != 0: + ret[key] = values[key] + return ret + + def check_can_be_null(self, values): + null_list = ['cname'] + for key in values.keys(): + if key not in null_list: + if isinstance( + values[key], + basestring) and not tools.is_not_nil( + values[key]): + raise ParamNull(param_name=key) + + def check_is_list(self, dic): + validate_list = ['hms', 'gmember_list'] + for key in validate_list: + if key in dic.keys(): + if not isinstance(dic[key], list): + raise ParamValueError(param_name=key) + + def get_return_convert(self, gpool): + for dic in gpool: + if 'hms' in dic: + if dic['hms'] == "": + dic['hms'] = [] + else: + try: + dic['hms'] = eval(dic['hms']) + except: + pass + if 'gmember_list' in dic: + if dic['gmember_list'] == "": + dic['gmember_list'] = [] + else: + try: + dic['gmember_list'] = eval(dic['gmember_list']) + except: + pass + return gpool + + def check_value(self, dic): + if 'ttl' in dic.keys(): + try: + ttl = int(dic['ttl']) + if not(ttl >= 0 and ttl <= 2147483647): + raise ParamValueError(param_name='ttl') + except: + raise ParamValueError(param_name='ttl') + if 'enable' in dic.keys() and dic['enable'] not in ['yes', 'no']: + raise ParamValueError(param_name="enable") + if "warning" in dic.keys() and dic["warning"] not in ['yes', 'no']: + raise ParamValueError(param_name="warning") diff --git a/nca47/api/controllers/v1/gslb/gslb_zone.py b/nca47/api/controllers/v1/gslb/gslb_zone.py new file mode 100644 index 0000000..c2edc58 --- /dev/null +++ b/nca47/api/controllers/v1/gslb/gslb_zone.py @@ -0,0 +1,172 @@ +from nca47.api.controllers.v1 import base +from oslo_serialization import jsonutils as json +from nca47.common.i18n import _LI, _LE +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamValueError +from oslo_log import log +from nca47.api.controllers.v1 import tools +from nca47.manager.central import CentralManager +from oslo_messaging import RemoteError + +LOG = log.getLogger(__name__) + + +class GlsbZoneController(base.BaseRestController): + def __init__(self): + self.manager = CentralManager.get_instance() + super(GlsbZoneController, self).__init__() + + def create(self, req, *args, **kwargs): + try: + flag = True + context = req.context + body_values = json.loads(req.body) + valid_attributes = ['tenant_id', 'name', 'devices', 'syn_server'] +# valid_devices = ["group_name", "device_name"] + values = tools.validat_values(body_values, valid_attributes) + obj_devices = body_values["devices"] +# for key in obj_devices: +# tools.validat_values(key, valid_devices) +# tools.validat_values(body_values["syn_server"], valid_devices) + for key in obj_devices: + if body_values["syn_server"] in key: + flag = False + if flag: + raise ParamValueError(param_name=body_values["syn_server"]) + # input the gslb_zone values with dic format + LOG.info(_LI("input the gslb_zone values with dic format" + " is %(json)s"), {"json": body_values}) + + response = self.manager.create_gslb_zone(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', response) + + def remove(self, req, id, *args, **kwargs): + try: + context = req.context + body_values = {} + gslb_zone_id = id + body_values["id"] = gslb_zone_id + # input the gslb_zone values with dic format + LOG.info(_LI("delete the gslb_zone values with dic format" + " is %(json)s"), {"json": body_values}) + + self.manager.del_gslb_zone(context, body_values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', "success") + + def update(self, req, id, *args, **kwargs): + try: + context = req.context + body_values = json.loads(req.body) + gslb_zone_id = id + valid_attributes = ['enable', 'devices', 'syn_server'] + # valid_devices = ["group_name", "device_name"] + values = tools.validat_values(body_values, valid_attributes) + obj_devices = body_values["devices"] + # for key in obj_devices: + # tools.validat_values(key, valid_devices) + # tools.validat_values(body_values["syn_server"], valid_devices) + for key in obj_devices: + if body_values["syn_server"] in key: + flag = False + if flag: + raise ParamValueError(param_name=body_values["syn_server"]) + # input the gslb_zone values with dic format + LOG.info(_LI("update the gslb_zone values with dic format" + " is %(json)s"), {"json": body_values}) + + response = self.manager.update_gslb_zone(context, + gslb_zone_id, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', response) + + def list(self, req, *args, **kwargs): + try: + context = req.context + search_opts = {} + search_opts.update(req.GET) + # input the staticnat values with dic format + LOG.info(_LI("get_all the gslb_zone")) + response = self.manager.get_gslb_zones(context, search_opts) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', response) + + def show(self, req, id, *args, **kwargs): + try: + context = req.context + body_values = {} + gslb_zone_id = id + body_values["id"] = gslb_zone_id + # input the gslb_zone values with dic format + LOG.info(_LI("get the staticnat values with dic format" + " is %(json)s"), {"json": body_values}) + + response = self.manager.get_gslb_zone(context, body_values) + return tools.ret_info('200', response) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) diff --git a/nca47/api/controllers/v1/gslb/hm_template.py b/nca47/api/controllers/v1/gslb/hm_template.py new file mode 100644 index 0000000..e11c32f --- /dev/null +++ b/nca47/api/controllers/v1/gslb/hm_template.py @@ -0,0 +1,289 @@ +from nca47.api.controllers.v1 import base, tools as tool +from nca47.common.exception import ParamNull +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamValueError +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +from oslo_log import log as logging +from oslo_messaging import RemoteError +from oslo_serialization import jsonutils as json + +LOG = logging.getLogger(__name__) + + +class HmTemplateController(base.BaseRestController): + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(HmTemplateController, self).__init__() + + def create(self, req, *args, **kwargs): + """create one hm_template""" + try: + LOG.info(_("create hm_template:body is %(json)s, args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + array1 = ["tenant_id", "name", "types"] + array2 = ["check_interval", "timeout", "max_retries"] + # get the body + dic = json.loads(req.body) + dic_body = self.message_regrouping(dic, array1, array2) + context = req.context + response = self.manager.create_hm_template(context, dic_body) + LOG.info(_("Return of Created hm_template Json is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.value) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info("200", response) + + def update(self, req, id, *args, **kwargs): + """update the target hm template""" + try: + LOG.info(_("update hm template:body is %(json)s, args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + dic = json.loads(req.body) + dic['id'] = id + c = req.context + list_ = ["id", "tenant_id"] + self.validat_parms(dic, list_) + # the attributes can be changed + attr_list = ["check_interval", "timeout", "max_retries", + "sendstring", "recvstring", "username", "password"] + keys = dic.keys() + if "check_interval" in keys: + if not tool.is_not_nil(dic["check_interval"]): + raise ParamNull(param_name="check_interval") + if "timeout" in keys: + if not tool.is_not_nil(dic["timeout"]): + raise ParamNull(param_name="timeout") + if "max_retries" in keys: + if not tool.is_not_nil(dic["max_retries"]): + raise ParamNull(param_name="max_retries") + upd_dic = {} + for attr in attr_list: + if attr in keys: + upd_dic[attr] = dic[attr] + else: + continue + response = self.manager.update_hm_template(c, upd_dic, dic['id']) + LOG.info(_("Return of update hm template JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info("200", response) + + def remove(self, req, id, *args, **kwargs): + """delete the target hm template""" + try: + LOG.info(_("delete hm template:body is %(json)s, args is %(args)s," + "kwargs is %(kwargs)s"), + {"json": req.body, "args": args, "kwargs": kwargs}) + dic = {} + dic.update(kwargs) + dic['id'] = id + c = req.context + list_ = ["id", "tenant_id"] + self.validat_parms(dic, list_) + """from rpc server delete the hm template""" + response = self.manager.delete_hm_template(c, dic['id']) + LOG.info(_("Return of remove hm template JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info("200", "success") + + def show(self, req, id, *args, **kwargs): + """show the target hm template""" + try: + LOG.info(_("get a hm template: args is %(args)s, " + "kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + context = req.context + response = self.manager.get_one_hm_template_db(context, id) + LOG.info(_("Return of hm template JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info("200", response) + + def list(self, req, *args, **kwargs): + """show all of the hm template""" + try: + LOG.info(_("Get all hm template: args is %(args)s, " + "kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + context = req.context + dic = {} + dic.update(kwargs) + # from db server show the zone_records + response = self.manager.get_hm_templates_db(context, dic) + LOG.info(_("Return of get all hm template JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tool.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tool.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tool.ret_info(self.response.status, e.message) + return tool.ret_info("200", response) + + def validat_parms(self, values, valid_keys): + """check the in value is null and nums""" + recom_msg = tool.validat_values(values, valid_keys) + return recom_msg + + def message_regrouping(self, dic, list_imp, list_uni): + tool.validat_values(dic, list_imp) + values = {} + dic_key = dic.keys() + for key_imp in list_imp: + values[key_imp] = dic[key_imp] + + uni = {} + for k in list_uni: + if k not in dic_key: + if k == "check_interval": + uni[k] = "10" + elif k == "timeout": + uni[k] = "3" + elif k == "max_retries": + uni[k] = "2" + else: + continue + + merge = tool.dict_merge(values, uni) + + exist_imp = {} + for key in dic_key: + if key == "check_interval": + if tool.is_not_nil(dic[key]): + try: + val = int(dic[key]) + if val < 1 or val > 86400: + raise ParamValueError(param_name=val) + except Exception: + raise ParamValueError(param_name=val) + exist_imp[key] = dic[key] + else: + exist_imp[key] = "10" + elif key == "timeout": + if tool.is_not_nil(dic[key]): + try: + val = int(dic[key]) + if val < 1 or val > 86400: + raise ParamValueError(param_name=val) + except Exception: + raise ParamValueError(param_name=val) + exist_imp[key] = dic[key] + else: + exist_imp[key] = "3" + elif key == "max_retries": + if tool.is_not_nil(dic[key]): + try: + val = int(dic[key]) + if val < 1 or val > 10: + raise ParamValueError(param_name=val) + except Exception: + raise ParamValueError(param_name=val) + exist_imp[key] = dic[key] + else: + exist_imp[key] = "2" + else: + continue + new_dic = tool.dict_merge(merge, exist_imp) + + types = new_dic["types"] + if types == "http" or types == "https": + if "sendstring" in dic_key: + new_dic["sendstring"] = dic["sendstring"] + else: + new_dic["sendstring"] = "" + if "recvstring" in dic_key: + new_dic["recvstring"] = dic["recvstring"] + else: + new_dic["recvstring"] = "" + if "username" in dic_key: + new_dic["username"] = dic["username"] + else: + new_dic["username"] = "" + if "password" in dic_key: + new_dic["password"] = dic["password"] + else: + new_dic["password"] = "" + elif types == "udp": + if "sendstring" in dic_key: + new_dic["sendstring"] = dic["sendstring"] + else: + new_dic["sendstring"] = "" + elif types == "icmp" or types == "tcp_syn": + pass + else: + raise ParamValueError(param_name=types) + return new_dic diff --git a/nca47/api/controllers/v1/gslb/sp_policy.py b/nca47/api/controllers/v1/gslb/sp_policy.py new file mode 100644 index 0000000..88b501a --- /dev/null +++ b/nca47/api/controllers/v1/gslb/sp_policy.py @@ -0,0 +1,209 @@ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1 import tools +from nca47.common.exception import ParamFormatError +from nca47.common.exception import ParamValueError +from nca47.common.exception import Nca47Exception +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +from oslo_serialization import jsonutils as json + +LOG = logging.getLogger(__name__) + + +class SP_PolicyController(base.BaseRestController): + + """ + nca47 sp_policy api class, using for add/delete/update/query the sp_poliy + info, validate parameters whether is legal, handling DB operations and + calling rpc client's corresponding method to send messaging to agent + endpoints + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(SP_PolicyController, self).__init__() + + def create(self, req, *args, **kwargs): + """create one sp_policy(static_proximity policy)""" + # get the context + context = req.context + try: + values = json.loads(req.body) + valid_attributes = ['tenant_id', 'priority', 'src_type', + 'src_logic', 'src_data1', 'dst_type', + 'dst_logic', 'dst_data1'] + # check the in values + recom_msg = self.validat_parms(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server create the proximitys in db and device + proximitys = self.manager.create_sp_policy(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', proximitys) + + def update(self, req, id, *args, **kwargs): + """update the target sp_policy""" + # get the context + context = req.context + try: + # get the body + values = json.loads(req.body) + values['id'] = id + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # check the in values + valid_attributes = ['new_priority', 'tenant_id', 'id'] + recom_msg = self.validat_parms(values, valid_attributes) + # from rpc server update the proximitys in db and device + proximitys = self.manager.update_sp_policy(context, recom_msg, + recom_msg['id']) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', proximitys) + + def remove(self, req, id, *args, **kwargs): + """delete the target static proximitys policy""" + # get the context + context = req.context + try: + # get the body + values = {} + values.update(kwargs) + values['id'] = id + valid_attributes = ['tenant_id', 'id'] + # check the in values + recom_msg = self.validat_parms(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server delete the proximitys in db and device + self.manager.delete_sp_policy(context, recom_msg['id']) + except Nca47Exception as e: + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', "success") + + def list(self, req, *args, **kwargs): + """get all of the required sp_policy""" + # get the context + context = req.context + try: + # get the body + values = {} + values.update(req.GET) + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from rpc server get the proximitys in device + proximitys = self.manager.get_db_proximitys(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', proximitys) + + def show(self, req, id, *args, **kwargs): + """get the target sp_policy info""" + # get the context + context = req.context + try: + LOG.info(_(" args is %(args)s"), {"args": args}) + # from rpc server get the proximity in device + proximitys = self.manager.get_sp_policy(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', proximitys) + + def validat_parms(self, values, valid_keys): + """check the in value is null and nums""" + recom_msg = tools.validat_values(values, valid_keys) + for value in recom_msg: + if value == "src_logic": + if not ((values['src_logic'] == "0") or + (values['src_logic'] == "1")): + raise ParamValueError(param_name=value) + elif value == "dst_logic": + if not ((values['dst_logic'] == "0") or + (values['dst_logic'] == "1")): + raise ParamValueError(param_name=value) + elif value == "priority": + try: + int_priority = int(values['priority']) + except Exception: + raise ParamFormatError(param_name=value) + if (int_priority < 1) or (int_priority > 65535): + raise ParamValueError(param_name=value) + elif value == "src_type": + src_type_array = ['ip_subnet', 'region', 'ISP', 'country', + 'province'] + if values['src_type'] not in src_type_array: + raise ParamValueError(param_name=value) + if values['src_type'] == "ip_subnet": + ser_str = '/' + try: + values['src_data1'].index(ser_str) + except Exception: + raise ParamFormatError(param_name="src_data1") + elif value == "dst_type": + dst_type_array = ['ip_subnet', 'region', 'ISP', 'country', + 'province'] + if values['dst_type'] not in dst_type_array: + raise ParamValueError(param_name=value) + if values['dst_type'] == "ip_subnet": + ser_str = '/' + try: + values['dst_data1'].index(ser_str) + except Exception: + raise ParamFormatError(param_name="dst_data1") + return recom_msg diff --git a/nca47/api/controllers/v1/gslb/syncgroup.py b/nca47/api/controllers/v1/gslb/syncgroup.py new file mode 100644 index 0000000..83a2a96 --- /dev/null +++ b/nca47/api/controllers/v1/gslb/syncgroup.py @@ -0,0 +1,285 @@ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1 import tools +from nca47.common.exception import ParamNull +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamValueError +from nca47.common.exception import IllegalParam +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +import json + +LOG = logging.getLogger(__name__) + + +class SyngroupController(base.BaseRestController): + """ + nca47 Syngroup class ,using for add/put/delete/get/getall the Syngroup + info, validate parameters whether is legal,handling DB operations and + calling rpc client's corresponding method to send messaging to agent + endpoint. + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(SyngroupController, self).__init__(self) + + def create(self, req, *args, **kwargs): + """ + Create syngorup method + :param req: + :param args: + :param kwargs: + :return: + """ + context = req.context + try: + values = json.loads(req.body) + values = self.check_null(values) + self.check_create(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + syngroups = self.manager.create_syngroup(context, values) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE("Error exception ! error info: " + e.message)) + LOG.exception(e) + return tools.ret_info(self.response.status, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', syngroups) + + def update(self, req, id, *args, **kwargs): + """ + update Syngroup method + :param req: + :param args: + :param kwargs: + :return: + """ + context = req.context + try: + values = json.loads(req.body) + values['id'] = id + LOG.info(_("the in value body if %(body)s"), {'body': values}) + self.check_not_null(values) + values = self.check_update(values) + syngroups = self.manager.update_syngroup(context, values) + # args[0] is id + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE("Error exception! error info: " + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.reponse.status = 500 + message = exception.value + return tools.ret_info(self.reponse.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', syngroups) + + def remove(self, req, id, *args, **kwargs): + """ + delete the syngroup method + :param req: + :param id: + :param args: + :param kwargs: + :return: + """ + context = req.context + try: + values = {} + values.update(kwargs) + values['id'] = id + self.check_remove(values) + LOG.info(_('the in value body is %(body)s'), {'body': values}) + self.manager.delete_syngroup(context, values) + except Nca47Exception as e: + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', 'success') + + def get(self, req, *args, **kwargs): + """ + not use + # get info for one or more + :param req: + :param args: + :param kwargs: + :return: + """ + context = req.context + try: + LOG.info( + _("args is %(args)s,kwargs is %(kwargs)s"), { + 'args': args, "kwargs": kwargs}) + syngroups = self.manager.get_syngroups(context) + LOG.info(_("Retrun of get_all_db_zone JSON is %(syngroup)s !"), + {"syngroup": syngroups}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', syngroups) + + def list(self, req, *args, **kwargs): + """ + list all syngroup method + :param req: + :param id: + :param args: + :param kwargs: + :return: + """ + context = req.context + try: + search_opts = {} + search_opts.update(req.GET) + # values = json.loads(req.body) + # if 'device' in args: + # LOG.info(_("args is %(args)s,kwargs is %(kwargs)s"), + # {'args': args, 'kwargs': kwargs}) + # zones = self.manager.list_syngroup(context) + # else: + LOG.info( + _("args is %(args)s,kwargs is %(kwargs)s"), { + 'args': args, "kwargs": kwargs}) + # self.check_search(search_opts) + syngroup = self.manager.get_syngroups(context, search_opts) + self.get_return_convert(syngroup) + LOG.info(_("Retrun of get_all_db_zone JSON is %(syngroup)s !"), + {"syngroup": syngroup}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', syngroup) + + def show(self, req, id, *args, **kwargs): + """ + get syngroup by id + :param req: + :param id: + :param args: + :param kwargs: + :return: return http response + """ + context = req.context + try: + LOG.info(_("args is %(args)s"), {"args": args}) + syngroups = self.manager.get_syngroup(context, id) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', syngroups) + + def check_search(self, dic): + validate_list = [ + 'tenant_id', + 'name', + 'gslb_zone_names', + 'pass', + 'probe_range'] + for key in dic.keys(): + if key not in validate_list: + raise IllegalParam(param_name=key) + + def check_update(self, dic): + if 'name' in dic.keys(): + del dic['name'] + validate_list = ['id', 'tenant_id'] + tools.validat_values(dic, validate_list) + self.check_is_list(dic) + return dic + + def check_create(self, dic): + self.check_is_list(dic) + validate_list = ['tenant_id', 'name', ] + tools.validat_values(dic, validate_list) + + def check_remove(self, dic): + validate_list = ['id', 'tenant_id'] + dic = tools.validat_values(dic, validate_list) + + def check_not_null(self, values): + null_list = [] + for key in values.keys(): + if key not in null_list: + if isinstance(values[key], basestring) and not tools.\ + is_not_nil(values[key]): + raise ParamNull(param_name=key) + + def get_return_convert(self, syngroup): + for dic in syngroup: + if 'gslb_zone_names' in dic: + if dic['gslb_zone_names'] == "": + dic['gslb_zone_names'] = [] + else: + try: + dic['gslb_zone_names'] = eval(dic['gslb_zone_names']) + except: + pass + return syngroup + + def check_null(self, values): + ret = {} + for key in values: + if values[key] != '' and values[key] != []: + ret[key] = values[key] + return ret + + def check_is_list(self, dic): + validate_list = ['gslb_zone_names'] + for key in validate_list: + if key in dic.keys(): + if not isinstance(dic[key], list): + raise ParamValueError(param_name=key) diff --git a/nca47/api/controllers/v1/gslb/user_region.py b/nca47/api/controllers/v1/gslb/user_region.py new file mode 100644 index 0000000..8525d10 --- /dev/null +++ b/nca47/api/controllers/v1/gslb/user_region.py @@ -0,0 +1,155 @@ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1 import tools +from nca47.common.exception import Nca47Exception +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +from oslo_serialization import jsonutils as json + +LOG = logging.getLogger(__name__) + + +class RegionController(base.BaseRestController): + + """ + nca47 Region class, using for add/delete/query the regions info, + validate parameters whether is legal, handling DB operations and calling + rpc client's corresponding method to send messaging to agent endpoints + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(RegionController, self).__init__() + + def create(self, req, *args, **kwargs): + """create the user regions""" + # get the context + context = req.context + try: + # get the body + values = json.loads(req.body) + valid_attributes = ['tenant_id', 'name'] + # check the in values + recom_msg = self.validat_parms(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server create the regions in db and device + regions = self.manager.create_region(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', regions) + + def remove(self, req, id, *args, **kwargs): + """delete the dns regions""" + # get the context + context = req.context + try: + # get the body + values = {} + values.update(kwargs) + values['id'] = id + valid_attributes = ['tenant_id', 'id'] + # check the in values + recom_msg = self.validat_parms(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server delete the regions in db and device + self.manager.delete_region(context, recom_msg['id']) + except Nca47Exception as e: + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', "success") + + def list(self, req, *args, **kwargs): + """get the list of the dns regions""" + # get the context + context = req.context + try: + # get the body + values = {} + values.update(kwargs) + if kwargs.get('device'): + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from rpc server get the regions in device + regions = self.manager.get_regions(context) + else: + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from db server get the regions in db + regions = self.manager.get_db_regions(context, values) + LOG.info(_("Return get_db_regions JSON is %(regions)s !"), + {"regions": regions}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', regions) + + def show(self, req, id, *args, **kwargs): + """get one dns region info""" + # get the context + context = req.context + try: + if kwargs.get('device'): + LOG.info(_(" args is %(args)s"), {"args": args}) + # from rpc server get the region in device + regions = self.manager.get_region(context) + else: + LOG.info(_(" args is %(args)s"), {"args": args}) + # from rpc server get the region in db + regions = self.manager.get_region_db_detail(context, id) + regions_user = self.manager.get_members(context) + region_users = [] + for key in regions_user: + region_users.append(dict(key)) + regions.region_user = region_users + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', regions) + + def validat_parms(self, values, valid_keys): + """check the in value is null and nums""" + recom_msg = tools.validat_values(values, valid_keys) + return recom_msg diff --git a/nca47/api/controllers/v1/gslb/user_region_member.py b/nca47/api/controllers/v1/gslb/user_region_member.py new file mode 100644 index 0000000..d219e84 --- /dev/null +++ b/nca47/api/controllers/v1/gslb/user_region_member.py @@ -0,0 +1,153 @@ +from oslo_log import log as logging +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.api.controllers.v1 import tools +from nca47.common.exception import ParamValueError +from nca47.common.exception import Nca47Exception +from nca47.common.i18n import _ +from nca47.common.i18n import _LE +from nca47.manager import central +from oslo_serialization import jsonutils as json + +LOG = logging.getLogger(__name__) + + +class RegionMemberController(base.BaseRestController): + + """ + nca47 Region Member class, using for add/delete the regions info, + validate parameters whether is legal, handling DB operations and calling + rpc client's corresponding method to send messaging to agent endpoints + """ + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(RegionMemberController, self).__init__() + + def create(self, req, *args, **kwargs): + """create one user region member""" + # get the context + context = req.context + try: + # get the body + values = json.loads(req.body) + # check the in values + valid_attributes = ['tenant_id', 'type', 'region_uuid', 'data1'] + # check the in values + recom_msg = self.validat_parms(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server create the region members in db and device + regions = self.manager.create_member(context, recom_msg) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as e: + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', regions) + + def remove(self, req, id, *args, **kwargs): + """delete the target region member""" + # get the context + context = req.context + try: + # get the body + values = {} + values.update(kwargs) + values['id'] = id + # check the in values + valid_attributes = ['tenant_id', 'id'] + # check the in values + recom_msg = self.validat_parms(values, valid_attributes) + LOG.info(_("the in value body is %(body)s"), {"body": values}) + # from rpc server delete the region members in db and device + self.manager.delete_member(context, recom_msg['id']) + except Nca47Exception as e: + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', "success") + + def list(self, req, *args, **kwargs): + """get the list of the members""" + # get the context + context = req.context + try: + # get the body + values = {} + values.update(kwargs) + LOG.info(_(" args is %(args)s, kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + # from db server get the get_members in db + members = self.manager.get_db_members(context, values) + LOG.info(_("Return get_members JSON is %(members)s !"), + {"members": members}) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as exception: + LOG.exception(exception) + self.response.status = 500 + return tools.ret_info(self.response.status, exception.message) + return tools.ret_info('200', members) + + def show(self, req, id, *args, **kwargs): + """get the target gmember by keys""" + try: + LOG.info(_("get a gmember: args is %(args)s, " + "kwargs is %(kwargs)s"), + {"args": args, "kwargs": kwargs}) + context = req.context + response = self.manager.get_one_member(context, id) + LOG.info(_("Return of gmember JSON is %(response)s !"), + {"response": response}) + except Nca47Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + message = e.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.error(_LE('Exception Message: %s !' % (e.message))) + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info('200', response) + + def validat_parms(self, values, valid_keys): + """check the in value is null and nums""" + recom_msg = tools.validat_values(values, valid_keys) + for value in recom_msg: + if value == "type": + type_array = ['ip_subnet', 'region', 'ISP', 'country', + 'province'] + if values['type'] not in type_array: + raise ParamValueError(param_name=value) + return recom_msg diff --git a/nca47/api/controllers/v1/lb/__init__.py b/nca47/api/controllers/v1/lb/__init__.py new file mode 100644 index 0000000..fd4f6e7 --- /dev/null +++ b/nca47/api/controllers/v1/lb/__init__.py @@ -0,0 +1,23 @@ +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _ + +from nca47.api.controllers.v1.lb import rwlb + +import pecan + + +class LBController(object): + def __init__(self): + return + + @pecan.expose('json') + def index(self): + return {"Information": "The url is for lb base RestApi " + "interface"} + + @pecan.expose() + def _lookup(self, kind, *remainder): + if kind == 'business': + return rwlb.RDLBController(), remainder + else: + pecan.abort(404) diff --git a/nca47/api/controllers/v1/lb/rwlb.py b/nca47/api/controllers/v1/lb/rwlb.py new file mode 100644 index 0000000..ae2e2b1 --- /dev/null +++ b/nca47/api/controllers/v1/lb/rwlb.py @@ -0,0 +1,116 @@ +from oslo_log import log as logging +from oslo_serialization import jsonutils as json +from oslo_messaging import RemoteError +from nca47.api.controllers.v1 import base +from nca47.common.i18n import _LE +from nca47.manager import central +from nca47.api.controllers.v1 import tools +from nca47.common.exception import Nca47Exception +from nca47.common.exception import ParamValueError +import time + + +LOG = logging.getLogger(__name__) + + +class RDLBController(base.BaseRestController): + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(RDLBController, self).__init__() + + def create(self, req, *args, **kwargs): + context = req.context + valid_attributes = ['tenant_id', 'vnetwork_name', 'environment_name', + 'application', 'node', 'rip', 'vip', 'virtualname', + 'vport', 'rport', 'pbindtype', + 'ptmouttime', 'metrictype', "protocol"] + try: + command_list = [] + body_values = json.loads(req.body) + values = tools.validat_values(body_values, valid_attributes) + if not tools.is_no_empty_list(values["rip"]): + raise ParamValueError(param_name="rip") + if not tools.is_no_empty_list(values["vport"]): + raise ParamValueError(param_name="vport") + if not tools.is_no_empty_list(values["rport"]): + raise ParamValueError(param_name="rport") + if "dbindtype" in values.keys(): + if len(values["dbindtype"]) == 0: + values["dbindtype"] = "" + else: + values["dbindtype"] = "" + batch = time.time() + values["batch"] = batch + # create pool + realserver_list = self.manager.create_pool(context, values) + commant_apply = "apply" + for key in realserver_list: + command_input = key["command_input"] + for outp in command_input: + command_list.append(outp) + command_list.append(commant_apply) + values["realservername"] = realserver_list + # create member + member = self.manager.create_lb_member(context, values) + command_input = member["command_input"] + for key in command_input: + command_list.append(key) + command_list.append(commant_apply) + # create vip + vip_list = self.manager.create_vip(context, values) + for key in vip_list["command_input"]: + command_list.append(key) + command_list.append(commant_apply) + # create server + values["virtualservername"] = vip_list + values["groupname"] = member + server_list = self.manager.create_server(context, values) + for key in server_list: + for outp in key["command_input"]: + command_list.append(outp) + command_list.append(commant_apply) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", command_list) + + def remove(self, req, id, *args, **kwargs): + context = req.context + try: + realservername = id + real_dic = {} + real_dic['realservername'] = realservername + real_list = self.manager.delete_real_service(context, real_dic) + command_list = [] + for key in real_list: + for outp in key: + command_list.append(outp) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + self.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + self.response.status = 500 + message = exception.value + return tools.ret_info(self.response.status, message) + except Exception as e: + LOG.exception(e) + self.response.status = 500 + return tools.ret_info(self.response.status, e.message) + return tools.ret_info("200", command_list) + + def list(self, req, *args, **kwargs): + return None diff --git a/nca47/api/controllers/v1/root.py b/nca47/api/controllers/v1/root.py index fab2b46..41aa13d 100644 --- a/nca47/api/controllers/v1/root.py +++ b/nca47/api/controllers/v1/root.py @@ -1,6 +1,11 @@ import pecan -from nca47.api.controllers.v1 import dns_servers +from nca47.api.controllers.v1 import firewall +from nca47.api.controllers.v1 import dns +from nca47.api.controllers.v1 import routerSwitch +from nca47.api.controllers.v1.agent import agent +from nca47.api.controllers.v1 import lb +from nca47.api.controllers.v1 import gslb class V1Controller(object): @@ -13,7 +18,17 @@ def index(self): @pecan.expose() def _lookup(self, kind, *remainder): - if kind == 'dns_servers': - return dns_servers.DnsServersController(), remainder + if kind == 'dns': + return dns.DNSController(), remainder + elif kind == "firewall": + return firewall.FirewallController(), remainder + elif kind == "routerswitch": + return routerSwitch.RouterSwitchController(), remainder + elif kind == "agent": + return agent.AgentController(), remainder + elif kind == "lb": + return lb.LBController(), remainder + elif kind == "gslb": + return gslb.GSLBController(), remainder else: pecan.abort(404) diff --git a/nca47/api/controllers/v1/routerSwitch/__init__.py b/nca47/api/controllers/v1/routerSwitch/__init__.py new file mode 100644 index 0000000..2655be3 --- /dev/null +++ b/nca47/api/controllers/v1/routerSwitch/__init__.py @@ -0,0 +1,61 @@ +""" +Represent router-switch api interface +""" +import pecan +from oslo_log import log as logging +from oslo_messaging import RemoteError +from oslo_serialization import jsonutils as json +from pecan import expose +from pecan.rest import RestController +from nca47.manager import central +from nca47.common.i18n import _LE +from nca47.common.exception import ParamNull +from nca47.common.exception import ParamFormatError +from nca47.common.exception import Nca47Exception +from nca47.api.controllers.v1 import tools + +LOG = logging.getLogger(__name__) + + +class RouterSwitchController(RestController): + + def __init__(self): + self.manager = central.CentralManager.get_instance() + super(RouterSwitchController, self).__init__() + + @expose('json') + def index(self): + return {"Information": "The url is for router-switch base RestApi " + "interface"} + + _custom_actions = { + 'execute': ['POST'] + } + + @expose('json') + def execute(self, *args, **kwargs): + context = pecan.request.context + body = pecan.request.body + try: + body_json = json.loads(body) + not_null_keys = ['dc_name', 'network_zone', 'agent_type', + 'commands'] + tools.validat_values(body_json, not_null_keys) + if not isinstance(body_json['commands'], list): + raise ParamFormatError(param_name="commands") + response = self.manager.execute_commands(context, body_json) + except Nca47Exception as e: + self.response.status = e.code + LOG.error(_LE('Error exception! error info: ' + e.message)) + LOG.exception(e) + pecan.response.status = e.code + return tools.ret_info(e.code, e.message) + except RemoteError as exception: + pecan.response.status = 500 + message = exception.value + return tools.ret_info(pecan.response.status, message) + except Exception as e: + LOG.exception(e) + pecan.response.status = 500 + return tools.ret_info(pecan.response.status, e.message) + return response diff --git a/nca47/api/controllers/v1/tools.py b/nca47/api/controllers/v1/tools.py new file mode 100644 index 0000000..94ab956 --- /dev/null +++ b/nca47/api/controllers/v1/tools.py @@ -0,0 +1,355 @@ +import netaddr +import re +from netaddr.core import INET_PTON + +from nca47.common.exception import ParamNull +from nca47.common.exception import NonExistParam +from nca47.common.exception import checkParam + + +def check_renewal(renewal): + """check into the auxiliary area is not expired""" + if renewal == "yes" or renewal == "no": + return True + return False + + +def check_areaname(name): + """check into the area name""" + if re.match(r'^(?=^.{3,255}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9]' + '[-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+' + '(:\d+)*(\/\w+\.\w+)*$', + name, re.M | re.I): + return True + else: + return False + + +def check_current_user(current_user): + """check into the current_user""" + if (current_user == "admin"): + return True + return False + + +def check_ttl(ttl): + """ttl less than 3600""" + try: + ttl = int(ttl) + if ttl > 0 and ttl <= 3600: + return True + else: + return False + except Exception: + return False + + +def check_rdata(rdata): + """Validation rdata, example:196.168.51.96""" + try: + if netaddr.valid_ipv4(rdata, INET_PTON): + return True + else: + return False + except Exception: + return False + + +def is_not_nil(string): + '''string is not null''' + string = string.strip() + try: + if len(string) > 0: + return True + else: + return False + except Exception: + return False + + +def is_no_empty_list(value): + """ + Use to check the value type if is list and not empty + if value is no empty list then return True, else return False + """ + if isinstance(value, list) and value: + return True + else: + return False + + +def validat_values(values, valid_keys): + """Non null input parameters""" + recom_msg = {} + for key in valid_keys: + if key not in values.keys(): + raise NonExistParam(param_name=key) + else: + if isinstance(values[key], basestring): + if (values[key].isspace()) or (len(values[key]) == 0): + raise ParamNull(param_name=key) + elif isinstance(values[key], list): + if len(values[key]) == 0: + raise ParamNull(param_name=key) + recom_msg[key] = values[key] + return recom_msg + + +def validat_update_values(values, valid_keys): + recom_msg = {} + for key in values.keys(): + if key not in valid_keys: + raise checkParam(param_name=key) + else: + if isinstance(values[key], basestring): + if values[key].isspace(): + raise ParamNull(param_name=key) + elif isinstance(values[key], list): + if len(values[key]) == 0: + raise ParamNull(param_name=key) + recom_msg[key] = values[key] + return recom_msg + + +def ret_info(ret_code, ret_msg): + dic = {"ret_code": ret_code, "ret_msg": ret_msg} + return dic + + +def dict_merge(merge_dict, add_dict): + ''' Note: the same key will be overwritten ''' + return dict(merge_dict, **add_dict) + + +def get_complementary_set(remote_dic, local_dic): + """ + Get complementary set. for example: + t = ['1','2','3'] and s = ['1','2','3','4'], you can get ['4'] + note: t is subset of s + """ + if is_subset(remote_dic, local_dic): + val_ifnames = list(set(local_dic).difference(set(remote_dic))) + return val_ifnames + else: + return None + + +def is_subset(remote_dic, local_dic): + """remote_dic is or not subset of local_dic""" + return set(remote_dic).issubset(set(local_dic)) + + +def _is_valid_port_range(port_range): + """ + Use to judge port range pattern if valid, the pattern must like 8080-8080 + and the first port value must greater than the second port value, also the + port value must be in line with port valid pattern + """ + bool_value = True + reg = r'^([0-9]{1,5}[-][0-9]{1,5})$' + match_obj = re.match(reg, port_range) + if match_obj is None: + bool_value = False + port_list = match_obj.group(0).split('-') + port1 = int(port_list[0]) + port2 = int(port_list[1]) + if port1 > 65535 or port2 > 65535: + bool_value = False + else: + if port1 > port2: + bool_value = False + return bool_value + + +def _is_valid_port(port): + """Use to judge the port whether is valid port value""" + bool_value = True + regex = "^([1-9]|[1-9]\\d{1,3}|[1-6][0-5][0-5][0-3][0-5])$" + match_obj = re.match(regex, port) + if match_obj is None: + bool_value = False + return bool_value + + +def _is_valid_ipv4_addr(ipaddr): + """Use to judge the ip address if is valid IPv4 address""" + if netaddr.valid_ipv4(ipaddr, INET_PTON): + return True + else: + return False + + +def _is_valid_ipv4_mask(mask): + try: + if int(mask) <= 32 and int(mask) >= 1: + return True + else: + return False + except: + return False + + +def clean_end_str(end_str, source_str): + """Remove the specified at the end of the string""" + tem1 = end_str[::-1] + tem2 = source_str[::-1] + return tem2[len(tem1):len(tem2)][::-1] + + +def filter_string_not_null(dic, list_): + """fliter String is or not null ,and get required field""" + dic_key = dic.keys() + value = {} + for key in list_: + if key not in dic_key: + raise NonExistParam(param_name=key) + val = dic[key] + if isinstance(val, list): + pass + elif not is_not_nil(val): + raise ParamNull(param_name=key) + value[key] = val + return value + + +def _is_valid_slotip(slotip): + slotip_list = ['0', '5', '23'] + slotip = str(slotip) + if slotip in slotip_list: + return True + else: + return False + + +def is_or_not_list(value): + """To determine whether the array is not empty""" + flag = "0" + if isinstance(value, list): + if value: + for v in value: + if not is_not_nil(v): + flag = "1" + return flag + return True + else: + flag = "1" + return flag + else: + return flag + + +def is_list_and_no_emtpy_string(values): + if not isinstance(values, list): + return False + for value in values: + if not is_not_nil(value): + return False + return True + + +def is_proto_range(proto): + """protocol range is 0-255""" + try: + val_int = int(proto) + if val_int < 0 or val_int > 255: + return False + except Exception: + return False + return True + + +def input_dic(keys, dic): + """Fill the data in the dictionary""" + obj_dic = {} + for key in keys: + if key not in dic.keys(): + pass + else: + obj_dic[key] = dic[key] + return obj_dic + + +def joinString(dic): + str_n = "" + ind = 0 + for key in dic: + if ind == 0: + str_n = dic[0] + else: + str_n = str_n + "," + key + ind = ind + 1 + return str_n + + +def get_obj_list(keys, values): + obj_list = [] + for value in values: + obj_dic = {} + for column in xrange(len(keys)): + obj_dic[keys[column]] = value[column] + obj_list.append(obj_dic) + return obj_list + + +def get_obj_input_str(str_dict): + str_list = list(str_dict.keys()) + str_list.append('operation_for') + str_list.append('deleted_at') + str_list.append('deleted') + input_str = ','.join(str_list) + return input_str + + +def classfiy_sql_keys(values, lik_list, search_list): + lik_ret = dict() + search_ret = dict() + for key in values.keys(): + if len(values[key].strip()) > 0: + if key in lik_list: + lik_ret[key] = values[key] + elif key in search_list: + search_ret[key] = values[key] + return lik_ret, search_ret + + +def get_sql_str(table_name): + # Get sql header ,like select * from table_name where 1=1 + return "select * from %s where 1=1 " % table_name + + +def is_valid_ip_with_netmask(ip): + if len(ip.split('/')) == 2: + a = ip.split('/') + if _is_valid_ipv4_addr(a[0]) and _is_valid_ipv4_mask(a[1]): + return True + else: + return False + else: + if _is_valid_ipv4_addr(ip): + return True + else: + return False + + +def is_valid_ip_list_with_netmask(ip_list): + if isinstance(ip_list, list): + for ip in ip_list: + if len(ip.split('/')) == 2: + ip_ = ip.split('/') + if not ( + _is_valid_ipv4_addr( + ip_[0]) and _is_valid_ipv4_mask( + ip_[1])): + return False + else: + return True + + +def filter_specific_values(dic, specific_values_keys): + """specific values can not null""" + for key in specific_values_keys: + if key not in dic.keys(): + raise NonExistParam(param_name=key) + else: + continue + return dic diff --git a/nca47/cmd/__init__.py b/nca47/cmd/__init__.py index ed30f46..e69de29 100644 --- a/nca47/cmd/__init__.py +++ b/nca47/cmd/__init__.py @@ -1 +0,0 @@ -__author__ = 'liudong' diff --git a/nca47/cmd/api.py b/nca47/cmd/api.py index 0602297..536bede 100644 --- a/nca47/cmd/api.py +++ b/nca47/cmd/api.py @@ -1,10 +1,9 @@ -"""The nca47 Service API.""" import sys - +sys.path.append('/vagrant/nca47/') from oslo_config import cfg from oslo_log import log - from nca47.common import service as nca47_service +from nca47.manager import service CONF = cfg.CONF @@ -12,6 +11,7 @@ def main(): + """The nca47 Service API.""" # Parse config file and command line options, then start logging nca47_service.prepare_service(sys.argv) @@ -19,6 +19,9 @@ def main(): launcher = nca47_service.process_launcher() server = nca47_service.WSGIService('nca47_api', CONF.api.enable_ssl_api) launcher.launch_service(server, workers=server.workers) + + rpc_server = service.AgentService(topic='check_agent_heartbeat') + launcher.launch_service(rpc_server, workers=2) launcher.wait() diff --git a/nca47/cmd/clios_agent.py b/nca47/cmd/clios_agent.py new file mode 100644 index 0000000..6f7b730 --- /dev/null +++ b/nca47/cmd/clios_agent.py @@ -0,0 +1,18 @@ +import sys + +sys.path.append('/vagrant/nca47') +from nca47.agent.agentFlag import agent_config +from nca47.common import service as nca47_service +from nca47.manager import service + + +def main(): + nca47_service.prepare_service(sys.argv) + launcher = nca47_service.process_launcher() + agentinfo = agent_config.getAgent_config() + server = service.CLIService(topic='cli_manager', agentinfo=agentinfo) + launcher.launch_service(server) + launcher.wait() + +if __name__ == '__main__': + sys.exit(main()) diff --git a/nca47/cmd/db_sync.py b/nca47/cmd/db_sync.py index e532dd7..5ed3a22 100644 --- a/nca47/cmd/db_sync.py +++ b/nca47/cmd/db_sync.py @@ -1,40 +1,1275 @@ import sys - -from oslo_log import log +sys.path.append('/vagrant/nca47') import sqlalchemy as sa +from sqlalchemy import select +from sqlalchemy.ext.compiler import compiles +from sqlalchemy.sql.expression import Executable, ClauseElement -from nca47.common.i18n import _LE +from migrate.changeset.constraint import ForeignKeyConstraint +from oslo_log import log from nca47.common import service as nca47_service +from nca47.common.i18n import _LE from nca47.db import api as db_api from nca47.objects import attributes as attr + LOG = log.getLogger(__name__) +class CreateView(Executable, ClauseElement): + def __init__(self, name, select): + self.name = name + self.select = select + + +@compiles(CreateView) +def visit_create_view(element, compiler, **kw): + return "CREATE VIEW %s AS %s" % ( + element.name, + compiler.process(element.select, literal_binds=True) + ) + + def main(): nca47_service.prepare_service(sys.argv) engine = db_api.get_engine() meta = sa.MetaData() meta.bind = engine - dns_servers = sa.Table('dns_servers', meta, - sa.Column('deleted_at', sa.DateTime(), nullable=True), - sa.Column('deleted', sa.Boolean(), nullable=True), - sa.Column('id', sa.String(attr.UUID_LEN), primary_key=True, - nullable=False), - sa.Column('name', sa.String(attr.NAME_MAX_LEN), nullable=True), - mysql_engine='InnoDB', - mysql_charset='utf8' - ) - - tables = [dns_servers, ] + + nca_agent_info = sa.Table('nca_agent_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('agent_id', sa.String(attr.UUID_LEN), + nullable=True), + sa.Column('agent_ip', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('agent_nat_ip', + sa.String(attr.IP_LEN), + nullable=True), + sa.Column('dc_name', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('network_zone', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('agent_type', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('availiable', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('update_time', sa.DateTime(), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + nca_vres_info = sa.Table('nca_vres_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('vres_id', sa.String(attr.UUID_LEN), + unique=True, + nullable=False), + sa.Column('vres_name', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('tenant_id', + sa.String(attr.TENANT_ID_MAX_LEN), + nullable=True), + sa.Column('agent_id', sa.String(attr.UUID_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + nca_operation_history = sa.Table('nca_operation_history', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('config_id', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('input', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('operation_type', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('operation_time', sa.DateTime(), + nullable=True), + sa.Column('operation_status', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + dns_zone_info = sa.Table('dns_zone_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vres_id', sa.String(attr.UUID_LEN), + nullable=True), + sa.Column('zone_name', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('masters', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('slaves', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('default_ttl', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('ad_controller', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('renewal', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('owners', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('comment', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + dns_rrs_info = sa.Table('dns_rrs_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('rrs_id', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('zone_id', sa.String(attr.UUID_LEN), + nullable=True), + sa.Column('rrs_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('type', sa.String(attr.TYPE_LEN), + nullable=False), + sa.Column('ttl', sa.String(attr.TTL_LEN), + nullable=False), + sa.Column('klass', + sa.String(attr.TENANT_ID_MAX_LEN), + nullable=True), + sa.Column('rdata', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('tenant_id', + sa.String(attr.TENANT_ID_MAX_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_vlan_info = sa.Table('fw_vlan_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('vlan_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('vlan_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('ipaddr', sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('ifnames', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('vres_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_vrf_info = sa.Table('fw_vrf_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('vrfInterface', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('vfwname', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('vfw_id', sa.String(attr.UUID_LEN), + nullable=True), + sa.Column('vres_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_vfw_info = sa.Table('fw_vfw_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('vfw_name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_type', sa.String(attr.STATUS_LEN), + nullable=False), + sa.Column('vfw_info', sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('dc_name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('network_zone_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('network_zone_class', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('protection_class', + sa.String(attr.STATUS_LEN), + nullable=True), + sa.Column('vres_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_security_zone_info = sa.Table('fw_security_zone_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('ifnames', + sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('priority', + sa.String(attr.TTL_LEN), + nullable=False), + sa.Column('vfwname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_addrobj_info = sa.Table('fw_addrobj_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('ip', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('expip', sa.String(attr.UUID_LEN), + nullable=True), + sa.Column('vfwname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_netservices_info = sa.Table('fw_netservices_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('proto', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('port', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('vfwname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_snataddrpool_info = sa.Table('fw_snataddrpool_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('ipstart', + sa.String(attr.IP_LEN), + nullable=False), + sa.Column('ipend', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('slotip', + sa.String(attr.STATUS_LEN), + nullable=False), + sa.Column('vfwname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_snat_info = sa.Table('fw_snat_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('outifname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('srcipobjname', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('dstipobjname', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('wanippoolname', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('vfwname', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_dnat_info = sa.Table('fw_dnat_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('inifname', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('wanip', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('wantcpports', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('wanudpports', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('lanipstart', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('lanipend', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('lanport', sa.String(attr.TTL_LEN), + nullable=False), + sa.Column('slot', sa.String(attr.STATUS_LEN), + nullable=False), + sa.Column('vfwname', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_packetfilter_info = sa.Table('fw_packetfilter_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('srczonename', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('dstzonename', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('srcipobjnames', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('dstipobjnames', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('servicenames', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('action', + sa.String(attr.STATUS_LEN), + nullable=True), + sa.Column('log', + sa.String(attr.STATUS_LEN), + nullable=True), + sa.Column('vfwname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + fw_staticnat_info = sa.Table('fw_staticnat_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('ifname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('lanip', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('wanip', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('slot', sa.String(attr.STATUS_LEN), + nullable=False), + sa.Column('vfwname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vfw_id', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + sp_policy_info = sa.Table('sp_policy_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + primary_key=True, + nullable=False), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('sp_policy_id', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('src_type', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('src_logic', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('src_data1', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('src_data2', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('src_data3', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('src_data4', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('dst_type', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('dst_logic', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('dst_data1', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('dst_data2', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + region_user_info = sa.Table('region_user_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('region_useruser_id', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('region_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('type', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('data1', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('data2', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('data3', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('data4', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + region_info = sa.Table('region_info', meta, + sa.Column('id', sa.String(attr.NAME_MAX_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('region_id', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('region_user', + sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('refcnt', sa.String(attr.TTL_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + gmap_info = sa.Table('gmap_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('enable', sa.String(attr.TTL_LEN), + nullable=True), + sa.Column('algorithm', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('last_resort_pool', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('gpool_list', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('gmap_id', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('refcnt', sa.String(attr.TTL_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + gpool_info = sa.Table('gpool_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('enable', sa.String(attr.TTL_LEN), + nullable=False), + sa.Column('ttl', sa.String(attr.TTL_LEN), + nullable=False), + sa.Column('max_addr_ret', sa.String(attr.TTL_LEN), + nullable=True), + sa.Column('cname', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('first_algorithm', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('second_algorithm', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('fallback_ip', sa.String(attr.IP_LEN), + nullable=True), + sa.Column('hms', sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('pass_', sa.String(attr.TTL_LEN), + nullable=True), + sa.Column('gmember_list', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('warning', sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('refcnt', sa.String(attr.TTL_LEN), + nullable=True), + sa.Column('gpool_id', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + syngroup_info = sa.Table('syngroup_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('gslb_zone_names', + sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('probe_range', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('pass_', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('syngroup_id', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + gmember_info = sa.Table('gmember_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, primary_key=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('gslb_zone_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('ip', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('port', sa.String(attr.FIVE_LEN), + nullable=False), + sa.Column('enable', sa.String(attr.FIVE_LEN), + nullable=False), + sa.Column('gmember_id', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('refcnt', sa.String(attr.TEN_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + gslb_zone_info = sa.Table('gslb_zone_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('name', sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('enable', sa.String(attr.FIVE_LEN), + nullable=True), + sa.Column('devices', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('syn_server', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('gslb_zone_id', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + hm_template_info = sa.Table('hm_template_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('types', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('check_interval', + sa.String(attr.FIVE_LEN), + nullable=False), + sa.Column('timeout', sa.String(attr.FIVE_LEN), + nullable=False), + sa.Column('max_retries', + sa.String(attr.FIVE_LEN), + nullable=False), + sa.Column('sendstring', + sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('recvstring', + sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('hm_template_id', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('refcnt', sa.String(attr.TEN_LEN), + nullable=True), + sa.Column('username', + sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('password', + sa.String(attr.INPUT_MAX_LEN), + nullable=True), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + lb_realserver_info = sa.Table('lb_realserver_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vnetwork_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('environment_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('application', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('node', + sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('realservername', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('rip', sa.String(attr.IP_LEN), + nullable=False), + sa.Column('batch', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('command_input', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + lb_group_info = sa.Table('lb_group_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vnetwork_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('environment_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('application', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('node', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('realservername', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('groupname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('batch', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('command_input', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + lb_vip_info = sa.Table('lb_vip_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('tenant_id', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vnetwork_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('environment_name', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('application', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('node', sa.String(attr.NAME_MAX_LEN), + nullable=True), + sa.Column('virtualservername', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('virtualname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vip', sa.String(attr.TYPES_LEN), + nullable=False), + sa.Column('batch', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('command_input', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + lb_service_info = sa.Table('lb_service_info', meta, + sa.Column('id', sa.String(attr.UUID_LEN), + nullable=False, + primary_key=True), + sa.Column('virtualservername', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('groupname', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('vport', sa.String(attr.TTL_LEN), + nullable=True), + sa.Column('rport', sa.String(attr.TTL_LEN), + nullable=False), + sa.Column('pbindtype', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('dbindtype', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('ptmouttime', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('metrictype', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('batch', sa.String(attr.UUID_LEN), + nullable=False), + sa.Column('command_input', + sa.String(attr.INPUT_MAX_LEN), + nullable=False), + sa.Column('operation_fro', + sa.String(attr.NAME_MAX_LEN), + nullable=False), + sa.Column('deleted_at', sa.DateTime(), + nullable=True), + sa.Column('deleted', sa.Boolean(), + nullable=False), + mysql_engine='InnoDB', + mysql_charset='utf8' + ) + + tables = [dns_zone_info, nca_agent_info, nca_vres_info, + nca_operation_history, dns_rrs_info, fw_vlan_info, + fw_vfw_info, fw_security_zone_info, fw_addrobj_info, + fw_netservices_info, fw_snataddrpool_info, + fw_snat_info, fw_dnat_info, fw_packetfilter_info, + fw_staticnat_info, fw_vrf_info, sp_policy_info, region_user_info, + region_info, gmap_info, gpool_info, syngroup_info, gmember_info, + gslb_zone_info, hm_template_info, lb_realserver_info, + lb_group_info, lb_vip_info, lb_service_info] for table in tables: try: - table.create() + if not table.exists(): + table.create() except Exception: LOG.info(repr(table)) LOG.exception(_LE('Exception while creating table.')) raise + columns = [nca_vres_info.c.id.label('id'), + nca_agent_info.c.id.label('agent_id'), + nca_agent_info.c.agent_ip.label('agent_ip'), + nca_agent_info.c.agent_nat_ip.label('agent_nat_ip'), + nca_vres_info.c.id.label('vres_id'), + nca_vres_info.c.tenant_id.label('tenant_id'), + nca_agent_info.c.dc_name.label('dc_name'), + nca_agent_info.c.network_zone.label('network_zone'), + nca_vres_info.c.vres_name.label('vres_name'), + nca_agent_info.c.agent_type.label('agent_type'), + nca_agent_info.c.deleted_at.label('deleted_at'), + nca_agent_info.c.deleted.label('deleted')] + condition1 = (nca_agent_info.c.id == nca_vres_info.c.agent_id) + condition2 = (nca_agent_info.c.availiable == 'yes') + condition3 = (nca_vres_info.c.deleted == 0) + condition4 = (nca_agent_info.c.deleted == 0) + vres_agent_view = CreateView('vres_agent_view', + select(columns).where(condition1). + where(condition2).where(condition3). + where(condition4)) + engine.execute(vres_agent_view) + + columns = [ + fw_vfw_info.c.id.label('id'), + nca_agent_info.c.id.label('agent_id'), + nca_agent_info.c.agent_ip.label('agent_ip'), + nca_agent_info.c.agent_nat_ip.label('agent_nat_ip'), + + nca_vres_info.c.id.label('vres_id'), + nca_vres_info.c.vres_name.label('vres_name'), + nca_vres_info.c.tenant_id.label('tenant_id'), + + + nca_agent_info.c.dc_name.label('dc_name'), + nca_agent_info.c.network_zone.label('network_zone'), + nca_agent_info.c.agent_type.label('agent_type'), + + fw_vfw_info.c.id.label('vfw_id'), + fw_vfw_info.c.vfw_name.label('vfw_name'), + fw_vfw_info.c.vfw_info.label('vfw_info'), + fw_vfw_info.c.vfw_type.label('vfw_type'), + fw_vfw_info.c.network_zone_name.label('network_zone_name'), + fw_vfw_info.c.network_zone_class.label('network_zone_class'), + fw_vfw_info.c.protection_class.label('protection_class'), + + nca_agent_info.c.deleted_at.label('deleted_at'), + nca_agent_info.c.deleted.label('deleted')] + + condition1 = (nca_agent_info.c.id == nca_vres_info.c.agent_id) + condition2 = (nca_vres_info.c.id == fw_vfw_info.c.vres_id) + condition3 = (nca_agent_info.c.availiable == 'yes') + condition4 = (nca_vres_info.c.deleted == 0) + condition5 = (fw_vfw_info.c.deleted == 0) + condition6 = (nca_agent_info.c.deleted == 0) + view_vfw_vres_agent = CreateView('view_vfw_vres_agent', + select(columns).where(condition1). + where(condition2). + where(condition3). + where(condition4). + where(condition5). + where(condition6)) + engine.execute(view_vfw_vres_agent) + + vfw_trigger = sa.DDL('''\ + CREATE TRIGGER cascadeDel_on_vfw AFTER UPDATE ON + fw_vfw_info FOR EACH ROW + BEGIN + UPDATE fw_dnat_info set deleted_at=now(), deleted=1 + WHERE (vfw_id = old.id) and (old.deleted = 0) and + (new.deleted = 1); + UPDATE fw_staticnat_info set deleted_at=now(), + deleted=1 WHERE (vfw_id = old.id) and + (old.deleted = 0) and (new.deleted = 1); + UPDATE fw_snat_info set deleted_at=now(), deleted=1 + WHERE (vfw_id = old.id) and (old.deleted = 0) + and (new.deleted = 1); + UPDATE fw_addrobj_info set deleted_at=now(), deleted=1 + WHERE (vfw_id = old.id) and (old.deleted = 0) and + (new.deleted = 1); + UPDATE fw_snataddrpool_info set deleted_at=now(), + deleted=1 WHERE (vfw_id = old.id) and + (old.deleted = 0) and (new.deleted = 1); + UPDATE fw_netservices_info set deleted_at=now(), + deleted=1 + WHERE (vfw_id = old.id) and (old.deleted = 0) + and (new.deleted = 1); + UPDATE fw_security_zone_info set deleted_at=now(), + deleted=1 + WHERE (vfw_id = old.id) and (old.deleted = 0) + and (new.deleted = 1); + UPDATE fw_packetfilter_info set deleted_at=now(), + deleted=1 WHERE (vfw_id = old.id) and + (old.deleted = 0) and (new.deleted = 1); + END;''') + engine.execute(vfw_trigger) + + nca_agent_info_table = sa.Table('nca_agent_info', meta, autoload=True) + nca_vres_info_table = sa.Table('nca_vres_info', meta, autoload=True) + nca_operation_history_table = sa.Table('nca_operation_history', meta, + autoload=True) + dns_zone_info_table = sa.Table('dns_zone_info', meta, autoload=True) + dns_rrs_info_table = sa.Table('dns_rrs_info', meta, autoload=True) + + fw_vlan_info_table = sa.Table('fw_vlan_info', meta, autoload=True) + fw_vfw_info_table = sa.Table('fw_vfw_info', meta, autoload=True) + fw_security_zone_info_table = sa.Table('fw_security_zone_info', + meta, autoload=True) + fw_addrobj_info_table = sa.Table('fw_addrobj_info', + meta, autoload=True) + fw_netservices_info_table = sa.Table('fw_netservices_info', + meta, autoload=True) + fw_snataddrpool_info_table = sa.Table('fw_snataddrpool_info', + meta, autoload=True) + fw_snat_info_table = sa.Table('fw_snat_info', meta, autoload=True) + fw_dnat_info_table = sa.Table('fw_dnat_info', meta, autoload=True) + fw_packetfilter_info_table = sa.Table('fw_packetfilter_info', + meta, autoload=True) + fw_staticnat_info_table = sa.Table('fw_staticnat_info', + meta, autoload=True) + fw_vrf_info_table = sa.Table('fw_vrf_info', + meta, autoload=True) + + nca_vres_info_agent_fk = ForeignKeyConstraint( + [nca_vres_info_table.c.agent_id], + [nca_agent_info_table.c.id]) + nca_vres_info_agent_fk.create() + + nca_operation_history_rrs_fk = ForeignKeyConstraint( + [nca_operation_history_table.c.config_id], + [nca_vres_info_table.c.id]) + nca_operation_history_rrs_fk.create() + + dns_zone_info_rrs_fk = ForeignKeyConstraint( + [dns_rrs_info_table.c.zone_id], + [dns_zone_info_table.c.id]) + dns_zone_info_rrs_fk.create() + + dns_zone_info_vres_fk = ForeignKeyConstraint( + [dns_zone_info_table.c.vres_id], + [nca_vres_info_table.c.vres_id]) + dns_zone_info_vres_fk.create() + + fw_vlan_info_fk = ForeignKeyConstraint( + [fw_vlan_info_table.c.vres_id], + [nca_vres_info_table.c.id]) + fw_vlan_info_fk.create() + + fw_vrf_info_fk = ForeignKeyConstraint( + [fw_vrf_info_table.c.vres_id], + [nca_vres_info_table.c.id]) + fw_vrf_info_fk.create() + + fw_vfw_info_fk = ForeignKeyConstraint( + [fw_vfw_info_table.c.vres_id], + [nca_vres_info_table.c.id]) + fw_vfw_info_fk.create() + + fw_security_zone_info_fk = ForeignKeyConstraint( + [fw_security_zone_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_security_zone_info_fk.create() + + fw_addrobj_info_fk = ForeignKeyConstraint( + [fw_addrobj_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_addrobj_info_fk.create() + + fw_netservices_info_fk = ForeignKeyConstraint( + [fw_netservices_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_netservices_info_fk.create() + + fw_snataddrpool_info_fk = ForeignKeyConstraint( + [fw_snataddrpool_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_snataddrpool_info_fk.create() + + fw_snat_info_fk = ForeignKeyConstraint( + [fw_snat_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_snat_info_fk.create() + + fw_dnat_info_fk = ForeignKeyConstraint( + [fw_dnat_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_dnat_info_fk.create() + + fw_packetfilter_info_fk = ForeignKeyConstraint( + [fw_packetfilter_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_packetfilter_info_fk.create() + + fw_staticnat_info_fk = ForeignKeyConstraint( + [fw_staticnat_info_table.c.vfw_id], + [fw_vfw_info_table.c.id]) + fw_staticnat_info_fk.create() + + region_info_user_fk = ForeignKeyConstraint( + [region_user_info.c.region_id], + [region_info.c.id]) + region_info_user_fk.create() + if __name__ == '__main__': sys.exit(main()) diff --git a/nca47/cmd/dns_agent.py b/nca47/cmd/dns_agent.py new file mode 100644 index 0000000..eee4915 --- /dev/null +++ b/nca47/cmd/dns_agent.py @@ -0,0 +1,20 @@ +import sys +sys.path.append('/vagrant/nca47') + +from nca47.common import service as nca47_service +from nca47.manager import service +from nca47.agent.agentFlag import agent_config + + +def main(): + nca47_service.prepare_service(sys.argv) + # Build and start the WSGi app + launcher = nca47_service.process_launcher() + # register agent host informations to agent service + agentinfo = agent_config.getAgent_config() + server = service.DNSService(topic='dns_manager', agentinfo=agentinfo) + launcher.launch_service(server, workers=2) + launcher.wait() + +if __name__ == '__main__': + sys.exit(main()) diff --git a/nca47/cmd/fw_agent.py b/nca47/cmd/fw_agent.py new file mode 100644 index 0000000..edb3fdc --- /dev/null +++ b/nca47/cmd/fw_agent.py @@ -0,0 +1,18 @@ +import sys +sys.path.append('/vagrant/nca47') + +from nca47.agent.agentFlag import agent_config +from nca47.common import service as nca47_service +from nca47.manager import service + + +def main(): + nca47_service.prepare_service(sys.argv) + launcher = nca47_service.process_launcher() + agentinfo = agent_config.getAgent_config() + server = service.FWService(topic='firewall_manager', agentinfo=agentinfo) + launcher.launch_service(server) + launcher.wait() + +if __name__ == '__main__': + sys.exit(main()) diff --git a/nca47/cmd/sync_datas_from_device.py b/nca47/cmd/sync_datas_from_device.py new file mode 100644 index 0000000..1127f83 --- /dev/null +++ b/nca47/cmd/sync_datas_from_device.py @@ -0,0 +1,99 @@ +import sys +import requests +import MySQLdb +import uuid +import json + +# the host of mysql ip +mysql_host = sys.argv[1] +# the user of mysql +mysql_user = sys.argv[2] +# the passwd of mysql +mysql_passwd = sys.argv[3] +# the host of device +device_host = sys.argv[4] +# the port of device +device_port = sys.argv[5] + + +def main(): + """synchronization the database from the device""" + conn, cur = db_connect_open() + cur.execute('delete from dns_rrs_info') + cur.execute('delete from dns_zone_info') + get_zones_device(conn, cur) + conn.commit() + db_connect_close + print "Data synchronization from device success !" + + +def db_connect_open(): + """get the connection from mysql db""" + try: + conn = MySQLdb.connect(host=mysql_host, user=mysql_user, + passwd=mysql_passwd, port=3306, charset='utf8') + conn.select_db('nca47') + cur = conn.cursor() + return conn, cur + except MySQLdb.Error, e: + print "Mysql Error %d: %s" % (e.args[0], e.args[1]) + exit(1) + + +def db_connect_close(conn, cur): + """close the connection from mysql db""" + cur.close() + conn.close() + + +def get_zones_device(conn, cur): + """get the all zones from device""" + url = "https://" + device_host + ":" + device_port + "/views/default/zones" + auth = ("admin", "zdns") + response = requests.get(url, data={"current_user": "admin"}, + auth=auth, verify=False) + if ('error' in response.json().keys()) or (response is None): + print "The data of dns_zone_info from device is null !" + exit(1) + for resourc in response.json()['resources']: + if resourc['name'] != '@': + zone_uuid = uuid.uuid4() + owners = json.dumps(resourc['owners'], encoding='UTF-8', + ensure_ascii=False) + masters = json.dumps(resourc['masters'], encoding='UTF-8', + ensure_ascii=False) + slaves = json.dumps(resourc['slaves'], encoding='UTF-8', + ensure_ascii=False) + value = (zone_uuid, 'egfbank', resourc['name'], masters, slaves, + resourc['default_ttl'], resourc['renewal'], owners, + 'MANUAL') + cur.execute('insert into dns_zone_info (id, tenant_id, zone_name,' + 'masters, slaves, default_ttl, renewal, owners,' + 'operation_fro, deleted) values(%s, %s, %s, %s, %s,' + '%s, %s, %s, %s, False)', value) + get_rrs_device(zone_uuid, cur, resourc['name']) + + +def get_rrs_device(zone_uuid, cur, zone_name): + """get the record from device by the zone_name""" + url = "https://" + device_host + ":" + device_port +\ + "/views/default/zones/" + zone_name + "/rrs" + auth = ("admin", "zdns") + response = requests.get(url, data={"current_user": "admin"}, + auth=auth, verify=False) + if ('error' in response.json().keys()) or (response is None): + print "The data of dns_rrs_info from device is null !" + exit(1) + for resourc in response.json()['resources']: + rrs_uuid = uuid.uuid1() + value = [rrs_uuid, resourc['id'], zone_uuid, resourc['name'], + resourc['type'], resourc['ttl'], resourc['klass'], + resourc['rdata'], 'egfbank', 'MANUAL'] + cur.execute('insert into dns_rrs_info (id, rrs_id, zone_id, rrs_name,' + 'type, ttl, klass, rdata, tenant_id, operation_fro,' + 'deleted) values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s,' + 'False)', value) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/nca47/common/config.py b/nca47/common/config.py index 6025713..f8f3dc7 100644 --- a/nca47/common/config.py +++ b/nca47/common/config.py @@ -1,7 +1,6 @@ from oslo_config import cfg from nca47.common import rpc -from nca47 import version def parse_args(argv, default_config_files=None): diff --git a/nca47/common/exception.py b/nca47/common/exception.py index bf67bfb..ebc45a5 100644 --- a/nca47/common/exception.py +++ b/nca47/common/exception.py @@ -2,13 +2,13 @@ from oslo_log import log as logging import six from six.moves import http_client - from nca47.common.i18n import _ from nca47.common.i18n import _LE from nca47.common.i18n import _LW LOG = logging.getLogger(__name__) + exc_log_opts = [ cfg.BoolOpt('fatal_exception_format_errors', default=False, @@ -102,13 +102,108 @@ class Invalid(Nca47Exception): _msg_fmt = _("Unacceptable parameters.") code = http_client.BAD_REQUEST + +class checkParam(Nca47Exception): + _msg_fmt = _("check param :%(param_name)s is errored") + + +class checkBody(Nca47Exception): + _msg_fmt = _("check body is None!") + code = http_client.BAD_REQUEST + + class BadRequest(Nca47Exception): _msg_fmt = _('Bad %(resource)s request: %(msg)s.') class NotFound(Nca47Exception): - pass + _msg_fmt = _("Resource could not be found.") + code = http_client.NOT_FOUND class Conflict(Nca47Exception): pass + + +class HaveSameObject(Nca47Exception): + _msg_fmt = _("The object with name= %(param_name)s already exists") + code = http_client.BAD_REQUEST + + +class NonExistDevices(NotFound): + _msg_fmt = _("some devices don't exist any more") + + +class DriverNotFound(NotFound): + _msg_fmt = _("Could not find the following driver(s): %(driver_name)s.") + + +class ParamNull(Nca47Exception): + _msg_fmt = _("the values of the %(param_name)s is null") + + +class ParamFormatError(Nca47Exception): + _msg_fmt = _("the values of the %(param_name)s format error") + + +class NonExistParam(Nca47Exception): + _msg_fmt = _("please input the %(param_name)s") + + +class ParamValueError(Nca47Exception): + _msg_fmt = _("the value of the %(param_name)s is error") + + +class ParamIsNotHaveError(Nca47Exception): + _msg_fmt = _("the param havn't %(param_name)s !") + + +class IsNotExistError(Nca47Exception): + _msg_fmt = _("The object of %(param_name)s don't exist!") + + +class NoexistOrMultipleError(Nca47Exception): + _msg_fmt = _("The object of %(param_name)s don't exist or exist multiple" + " results!") + + +class DBError(Nca47Exception): + _msg_fmt = _("DB error happened in %(param_name)s method") + + +class RecordNotInZone(Nca47Exception): + _msg_fmt = _("the record %(record_id)s not in %(zone_id)s !") + + +class RrsNameValueError(Nca47Exception): + _msg_fmt = _("rrs name %(json_name)s don't end of the %(zone_name)s !") + + +class ZoneOfRecordIsError(Nca47Exception): + _msg_fmt = _("Tenant didn't have the zone!" + " %(name)s or %(tenant)s is Error") + + +class DataDeleteError(Nca47Exception): + _msg_fmt = _("The Object already have some members with name=%(name)s !") + + +class IsBeingUsedError(Nca47Exception): + _msg_fmt = _("The Object name=%(name)s is being used !") + + +class HaveSameError(Nca47Exception): + _msg_fmt = _("The %(param_name)s already exists!") + code = http_client.BAD_REQUEST + + +class DeviceError(Nca47Exception): + _msg_fmt = _("Abnormal devices") + + +class NotAllowModify(Nca47Exception): + _msg_fmt = _("The %(param_name)s Not allowed to modify") + + +class IllegalParam(Nca47Exception): + _msg_fmt = _("The %(param_name)s is a illegal param name ") diff --git a/nca47/common/exception_zdns.py b/nca47/common/exception_zdns.py new file mode 100644 index 0000000..aba9bf5 --- /dev/null +++ b/nca47/common/exception_zdns.py @@ -0,0 +1,153 @@ + +EZDNS = { + 1: "any or none acl is read only", + 2: "acl already exists", + 3: "operate non-exist acl", + 4: "dns64 prefix should be a ipv6 addr", + 5: "invalid dns64 prefix netmask", + 6: "suffix is needed if netmask of prefix smaller than 96", + 7: "DNS64 setting already exists", + 8: "operate non-exist DNS64 setting", + 9: "tsig key already exists", + 10: "delete acl is using by view", + 11: "operate non-exist zone", + 12: "cache file not exist", + 13: "cache size too large", + 14: "operate non-exist view", + 15: "get zone from backend server failed", + 16: "zone already exists", + 17: "unsupported meta data type", + 18: "view already exists", + 19: "delete default view", + 20: "cann't modify acl of default view", + 21: "operate non-exist rr", + 22: "conflict key secret", + 23: "not supported zone type", + 24: "operate non-exist shared rr", + 25: "cann't delete the last shared rr", + 26: "operate non-exist tsig key", + 27: "reconfig dns server failed", + 28: "no rndc-confgen installed", + 29: "lack/white list already exists", + 30: "operate non-exist back/white list", + 31: "zone owner doesn't has view owner", + 32: "unsupport acl action", + 33: "no pine-control installed", + 34: "server already started", + 35: "RR format error", + 36: "zone transfer failed", + 37: "more than one ad zone owner", + 38: "update zone failed", + 39: "shared rr already exists", + 40: "add duplicate rr", + 41: "add exclusive rr", + 42: "short of glue rr", + 43: "conflict with exists cname", + 44: "delete unknown rr", + 45: "can't delete soa rr", + 46: "no ns left after delete", + 47: "delete glue needed by other rr", + 48: "reverse zone doesn't exist", + 49: "rdata is valid", + 50: "rr is out of zone", + 51: "onfigure value isn't valid", + 52: "unknown forward style", + 53: "duplicate zone master", + 54: "forwarder exists", + 55: "operate non-exist forwarder", + 56: "operate non-exist view on node", + 57: "already exists root zone", + 58: "only A/AAAA NS is allowed in hint zone", + 59: "already has root configuration", + 60: "rr type isn't supported", + 61: "can't update slave zone", + 62: "duplicate local domain policy", + 63: "zone name isn't valid", + 64: "add duplicate host", + 65: "soa serial number degraded", + 66: "root isn't support in local policy", + 67: "auth zone with same name already exists", + 68: "stub zone with same name already exists", + 69: "forward zone with same name already exists", + 70: "acl is used by view", + 71: "acl is used by AD zone", + 72: "rrl policy already exist", + 73: "non-exist rrl policy", + 74: "delete monitor strategy in use", + 75: "monitor strategy already exist", + 76: "non exist monitor strategy", + 77: "node's view querysource already exists", + 78: "node's view querysource not exist", + 79: "too much rrls(over 999)", + 100: "version is unknown", + 101: "patch file broken", + 102: "source code isn't a release version", + 103: "binding different iface with same ip address", + 104: "ntp interval out of range", + 105: "send a test mail failed, check the configuration", + 300: "invalid ip address", + 301: "no dns server installed", + 302: "not enough params", + 303: "not supported backup method", + 304: "not supported command method", + 305: "service hasn't been init", + 306: "not supported ha type", + 307: "member is not accessible", + 308: "wrong username and password", + 309: "nic config failed", + 310: "service hasn't been started", + 311: "init params is required", + 312: "invalid port", + 313: "verify node failed", + 314: "request body json format error", + 315: "connect backup server timeout", + 316: "data recovery failed", + 317: "data backup failed", + 318: "lower limit bigger than upper limit", + 319: "execute command timeout", + 320: "password/role failed", + 404: "Wrong url, please check it", + 421: "Equipment internal error !", + 600: "operate non-exist group", + 601: "member with same ip alreasy exists", + 602: "member with same name alreasy exists", + 603: "operate non-exist member", + 604: "not supported service type", + 605: "member command queue is full", + 606: "member is performing data recovery", + 607: "group already exists", + 608: "cann't operate local group", + 609: "user already exists", + 610: "operate non-exist user", + 611: "init member service failed", + 612: "owners is required", + 613: "cann't delete the last owner for resource", + 614: "add duplicate owners", + 615: "old password is wrong", + 616: "cann't delete local group", + 617: "cann't delete local member", + 618: "permission denied", + 619: "unkown authority rule", + 620: "authority rule already exist", + 621: "invalid backup data", + 622: "device already under management", + 623: "some devices don't exist any more", + 624: "cann't operation inactive cloud", + 625: "cann't add multi backup devices", + 626: "no backup device", + 627: "not master device", + 628: "not backup device", + 629: "not slave device", + 630: "hasn't managed by cloud yet", + 631: "node can't communicate with master", + 632: "invalid exception handle method", + 800: "time out while sending alarm msg" +} + + +class ZdnsErrMessage(Exception): + _msg_fmt = "None" + + def getMessage(self, cord): + _msg_fmt = str(cord) + ": " + EZDNS[cord] + return _msg_fmt diff --git a/nca47/common/rpc.py b/nca47/common/rpc.py index e311dad..62f33be 100644 --- a/nca47/common/rpc.py +++ b/nca47/common/rpc.py @@ -27,11 +27,7 @@ def init(conf): global TRANSPORT, NOTIFIER exmods = get_allowed_exmods() - # TODO(yudazhao) remote url parameter, to use rabbit parameters in - # cfg.CONF properties - url = 'rabbit://stackrabbit:passw0rd@192.168.33.1:5672/' - TRANSPORT = messaging.get_transport(conf, url=url, - allowed_remote_exmods=exmods, + TRANSPORT = messaging.get_transport(conf, allowed_remote_exmods=exmods, aliases=TRANSPORT_ALIASES) serializer = RequestContextSerializer(messaging.JsonPayloadSerializer()) @@ -81,8 +77,6 @@ def deserialize_entity(self, context, entity): return self._base.deserialize_entity(context, entity) def serialize_context(self, context): - # TODO(yudazhao) context dict - # return context.to_dict() return context def deserialize_context(self, context): @@ -119,7 +113,7 @@ def get_server(target, endpoints, serializer=None): return messaging.get_rpc_server(TRANSPORT, target, endpoints, - executor='blocking', + executor='threading', serializer=serializer) diff --git a/nca47/common/service.py b/nca47/common/service.py index cff82e4..2ec34a2 100644 --- a/nca47/common/service.py +++ b/nca47/common/service.py @@ -13,8 +13,6 @@ from nca47.common import config from nca47.common import exception from nca47.common.i18n import _ -from nca47.common.i18n import _LE -from nca47.common.i18n import _LI from nca47.common import rpc service_opts = [ @@ -108,18 +106,15 @@ def start(self): def stop(self): LOG.debug("Stopping RPC server on topic '%s'" % self._rpc_topic) - for e in self._rpc_endpoints: if e != self and hasattr(e, 'stop'): e.stop() - # Try to shut the connection down, but if we get any sort of # errors, go ahead and ignore them.. as we're shutting down anyway try: self._rpc_server.stop() except Exception: pass - super(RPCService, self).stop() def wait(self): diff --git a/nca47/db/api.py b/nca47/db/api.py index 2c97cfa..b0b0892 100644 --- a/nca47/db/api.py +++ b/nca47/db/api.py @@ -31,8 +31,12 @@ def get_engine(): return facade.get_engine() -def get_session(): - return IMPL.get_session() +def get_session(autocommit=True, expire_on_commit=False, use_slave=False): + """Helper method to grab session.""" + facade = _create_facade_lazily() + return facade.get_session(autocommit=autocommit, + expire_on_commit=expire_on_commit, + use_slave=use_slave) @six.add_metaclass(abc.ABCMeta) @@ -61,4 +65,12 @@ def update_object(self, model, id, values): @abc.abstractmethod def delete_object(self, model, id): - """Delete an object.""" \ No newline at end of file + """Delete an object.""" + + @abc.abstractmethod + def get_all_objects_by_conditions(self, model, like_dic, search_dic): + """search an object""" + + @abc.abstractmethod + def get_all_objects(self, model, str_sql): + """search an object""" diff --git a/nca47/db/sqlalchemy/api.py b/nca47/db/sqlalchemy/api.py index d624216..f7e2f5e 100644 --- a/nca47/db/sqlalchemy/api.py +++ b/nca47/db/sqlalchemy/api.py @@ -4,9 +4,12 @@ from oslo_db.sqlalchemy import utils as oslo_db_utils from oslo_log import log from oslo_utils import uuidutils +from sqlalchemy.orm.base import _entity_descriptor +from sqlalchemy import sql from nca47.common import exception from nca47.db import api +from nca47.api.controllers.v1 import tools LOG = log.getLogger(__name__) @@ -52,6 +55,13 @@ def add_identity_filter(query, id): raise exception.Invalid("invalid id") +def beginSession(sess): + try: + sess.begin_nested() + except: + sess.begin(subtransactions=True) + + class Connection(api.Connection): """SqlAlchemy connection.""" @@ -63,9 +73,16 @@ def create(self, model, values): if 'id' not in values: values['id'] = uuidutils.generate_uuid() db_obj = model(**values) - session.add(db_obj) - session.flush() - return db_obj + beginSession(session) + try: + session.add(db_obj) + session.flush() + session.commit() + except Exception as e: + session.rollback() + LOG.exception(e) + raise exception.DBError(param_name="CREATE") + return dict(db_obj) def get_object(self, model, **kwargs): with _session_for_read(): @@ -88,13 +105,57 @@ def _safe_get_object(self, model, id): return db_obj def update_object(self, model, id, values): - with _session_for_write(): + with _session_for_write() as session: db_obj = self._safe_get_object(model, id) - db_obj.update(values) + beginSession(session) + try: + db_obj.update(values) + session.commit() + except Exception as e: + session.rollback() + LOG.exception(e) + raise exception.DBError(param_name="UPDATE") return db_obj def delete_object(self, model, id): """Delete an object.""" with _session_for_write() as session: + beginSession(session) query = self._safe_get_object(model, id) - query.soft_delete(session) + try: + query.soft_delete(session) + session.commit() + except Exception as e: + session.rollback() + LOG.exception(e) + raise exception.DBError(param_name="UPDATE") + return query + + def get_all_objects_by_conditions(self, model, like_dic, search_dic): + with _session_for_read(): + query = model_query(model) + + like_clauses = [_entity_descriptor(query._joinpoint_zero(), key). + like('%' + value + '%') for key, value in + like_dic.items()] + clauses = [_entity_descriptor(query._joinpoint_zero(), key) == + value for key, value in search_dic.items()] + + clauses.extend(like_clauses) + query = query.filter(sql.and_(*clauses)) + db_obj_list = query.all() + return db_obj_list + + def get_all_objects(self, model, str_sql): + with _session_for_read() as session: + beginSession(session) + try: + connect = session.connection() + result_obj = connect.execute(str_sql) + keys = result_obj.keys() + values = result_obj.fetchall() + except Exception as e: + LOG.exception(e) + raise exception.DBError(param_name="get_all_by_fuzzy") + obj_dic = tools.get_obj_list(keys, values) + return obj_dic diff --git a/nca47/db/sqlalchemy/models/__init__.py b/nca47/db/sqlalchemy/models/__init__.py index 95dc9f0..ec0fdba 100644 --- a/nca47/db/sqlalchemy/models/__init__.py +++ b/nca47/db/sqlalchemy/models/__init__.py @@ -1 +1,33 @@ -from .dns import * +from nca47.db.sqlalchemy.models.dns import Zone +from nca47.db.sqlalchemy.models.dns import DnsServer +from nca47.db.sqlalchemy.models.dns import ZoneRecord + +from nca47.db.sqlalchemy.models.operation_history import OperationHistory +from nca47.db.sqlalchemy.models.nca_agent import Agent +from nca47.db.sqlalchemy.models.nca_agent import Vres_Agent_View +from nca47.db.sqlalchemy.models.nca_agent import Vres_Agent_Vfw_View + +from nca47.db.sqlalchemy.models.firewall import VFW +from nca47.db.sqlalchemy.models.firewall import Dnat +from nca47.db.sqlalchemy.models.firewall import PacketFilter +from nca47.db.sqlalchemy.models.firewall import VLAN +from nca47.db.sqlalchemy.models.firewall import NetService +from nca47.db.sqlalchemy.models.firewall import FW_SecurityZone +from nca47.db.sqlalchemy.models.firewall import FW_Staticnat +from nca47.db.sqlalchemy.models.firewall import FW_vrf +from nca47.db.sqlalchemy.models.firewall import FW_snat + +from nca47.db.sqlalchemy.models.gslb import HmTemplateInfo +from nca47.db.sqlalchemy.models.gslb import GmemberInfo +from nca47.db.sqlalchemy.models.gslb import Region +from nca47.db.sqlalchemy.models.gslb import RegionUser +from nca47.db.sqlalchemy.models.gslb import Proximity +from nca47.db.sqlalchemy.models.gslb import GslbZoneInfo +from nca47.db.sqlalchemy.models.gslb import Syngroup +from nca47.db.sqlalchemy.models.gslb import GMapInfo +from nca47.db.sqlalchemy.models.gslb import GPoolInfo + +from nca47.db.sqlalchemy.models.rwlb import realserver +from nca47.db.sqlalchemy.models.rwlb import lb_group +from nca47.db.sqlalchemy.models.rwlb import lb_service +from nca47.db.sqlalchemy.models.rwlb import lb_vip diff --git a/nca47/db/sqlalchemy/models/base.py b/nca47/db/sqlalchemy/models/base.py index 4749e43..8cda99c 100644 --- a/nca47/db/sqlalchemy/models/base.py +++ b/nca47/db/sqlalchemy/models/base.py @@ -1,4 +1,6 @@ from oslo_db.sqlalchemy import models +import json +from sqlalchemy.types import TypeDecorator, Text from oslo_utils import timeutils from oslo_utils import uuidutils import sqlalchemy as sa @@ -58,7 +60,44 @@ class HasId(object): default=uuidutils.generate_uuid) +class HasOperationMode(object): + """operation_fro mixin, add to subclasses that have an operation_fro.""" + operation_fro = sa.Column(sa.String(attr.NAME_MAX_LEN), + default='AUTO') + + class HasStatus(object): """Status mixin.""" status = sa.Column(sa.String(16), nullable=False) + + +class JsonEncodedList(TypeDecorator): + """ + rewrite oslo.db JsonEncodedList class in type module, in order to + support chinese character, make sure chinese character can be insert + into Database as UTF-8 charset + """ + + type = list + impl = Text + + def process_bind_param(self, value, dialect): + if value is None: + if self.type is not None: + # Save default value according to current type to keep the + # interface consistent. + value = self.type() + elif self.type is not None and not isinstance(value, self.type): + if isinstance(value, basestring): + tmp_value = [] + tmp_value.append(value) + value = tmp_value + serialized_value = json.dumps(value, encoding='UTF-8', + ensure_ascii=False) + return serialized_value + + def process_result_value(self, value, dialect): + if value is not None: + value = json.loads(value) + return value diff --git a/nca47/db/sqlalchemy/models/dns.py b/nca47/db/sqlalchemy/models/dns.py index 435dec2..2d597ad 100644 --- a/nca47/db/sqlalchemy/models/dns.py +++ b/nca47/db/sqlalchemy/models/dns.py @@ -3,13 +3,45 @@ from nca47.db.sqlalchemy.models import base as model_base from nca47.objects import attributes as attr - HasTenant = model_base.HasTenant HasId = model_base.HasId HasStatus = model_base.HasStatus +HasOperationMode = model_base.HasOperationMode +JsonEncodedList = model_base.JsonEncodedList -class DnsServer(model_base.BASE, HasId): +class DnsServer(model_base.BASE, HasId, HasOperationMode): """Represents a dns server.""" name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class Zone(model_base.BASE, HasId, HasOperationMode): + """Represents a dns zone.""" + + __tablename__ = 'dns_zone_info' + + zone_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vres_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + masters = sa.Column(JsonEncodedList, default=[]) + slaves = sa.Column(JsonEncodedList, default=[]) + renewal = sa.Column(sa.String(attr.NAME_MAX_LEN)) + default_ttl = sa.Column(sa.String(attr.NAME_MAX_LEN)) + owners = sa.Column(JsonEncodedList, default=[]) + ad_controller = sa.Column(sa.String(attr.NAME_MAX_LEN)) + comment = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class ZoneRecord(model_base.BASE, HasId, HasOperationMode): + """Represents a dns zone record.""" + + __tablename__ = 'dns_rrs_info' + zone_id = sa.Column(sa.String(attr.UUID_LEN)) + rrs_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + rrs_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + klass = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ttl = sa.Column(sa.String(attr.NAME_MAX_LEN)) + rdata = sa.Column(sa.String(attr.NAME_MAX_LEN)) + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) diff --git a/nca47/db/sqlalchemy/models/firewall.py b/nca47/db/sqlalchemy/models/firewall.py new file mode 100644 index 0000000..60473e1 --- /dev/null +++ b/nca47/db/sqlalchemy/models/firewall.py @@ -0,0 +1,165 @@ +import sqlalchemy as sa +from nca47.db.sqlalchemy.models import base as model_base +from nca47.objects import attributes as attr + + +HasTenant = model_base.HasTenant +HasId = model_base.HasId +HasStatus = model_base.HasStatus +HasOperationMode = model_base.HasOperationMode +JsonEncodedList = model_base.JsonEncodedList + + +class VFW(model_base.BASE, HasId, HasOperationMode): + + """Represents a virtual firewall system server.""" + + __tablename__ = 'fw_vfw_info' + + vfw_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_type = sa.Column(sa.String(attr.STATUS_LEN)) + vfw_info = sa.Column(JsonEncodedList, default=[]) + dc_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + network_zone_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + network_zone_class = sa.Column(sa.String(attr.NAME_MAX_LEN)) + protection_class = sa.Column(sa.String(attr.STATUS_LEN)) + vres_id = sa.Column(sa.String(attr.UUID_LEN)) + + +class Dnat(model_base.BASE, HasId, HasOperationMode): + + """Represents an DNAT.""" + + __tablename__ = 'fw_dnat_info' + + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + inifname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + wanip = sa.Column(sa.String(attr.IP_LEN)) + wantcpports = sa.Column(JsonEncodedList, default=[]) + wanudpports = sa.Column(JsonEncodedList, default=[]) + lanipstart = sa.Column(sa.String(attr.IP_LEN)) + lanipend = sa.Column(sa.String(attr.IP_LEN)) + lanport = sa.Column(sa.String(attr.UUID_LEN)) + slot = sa.Column(sa.String(attr.STATUS_LEN)) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + + +class PacketFilter(model_base.BASE, HasId, HasOperationMode): + + """Represents an firewall packet filter.""" + + __tablename__ = 'fw_packetfilter_info' + + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + srczonename = sa.Column(sa.String(attr.NAME_MAX_LEN)) + dstzonename = sa.Column(sa.String(attr.NAME_MAX_LEN)) + srcipobjnames = sa.Column(JsonEncodedList, default=[]) + dstipobjnames = sa.Column(JsonEncodedList, default=[]) + servicenames = sa.Column(JsonEncodedList, default=[]) + action = sa.Column(sa.String(attr.STATUS_LEN)) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + + +class VLAN(model_base.BASE, HasId, HasOperationMode): + + """Represents a firewall vlan interface.""" + + __tablename__ = 'fw_vlan_info' + + vlan_number = sa.Column(sa.String(attr.UUID_LEN)) + vlan_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ipaddr = sa.Column(JsonEncodedList, default=[]) + ifnames = sa.Column(JsonEncodedList, default=[]) + vres_id = sa.Column(sa.String(attr.UUID_LEN)) + + +class ADDROBJ(model_base.BASE, HasId, HasOperationMode): + + """Represents a firewall addrobj interface.""" + + __tablename__ = 'fw_addrobj_info' + + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ip = sa.Column(sa.String(attr.NAME_MAX_LEN)) + expip = sa.Column(JsonEncodedList, default=[]) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + operation_fro = sa.Column(sa.String(attr.UUID_LEN)) + + +class FwSnatAddrPool(model_base.BASE, HasId, HasOperationMode): + + """Represents a firewall snataddrpool interface.""" + + __tablename__ = 'fw_snataddrpool_info' + + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ipstart = sa.Column(sa.String(attr.IP_LEN)) + ipend = sa.Column(sa.String(attr.IP_LEN)) + slotip = sa.Column(sa.String(attr.STATUS_LEN)) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + operation_fro = sa.Column(sa.String(attr.UUID_LEN)) + + +class NetService(model_base.BASE, HasId, HasOperationMode): + + """Represents a firewall NetService interface.""" + + __tablename__ = 'fw_netservices_info' + + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + proto = sa.Column(sa.String(attr.NAME_MAX_LEN)) + port = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfwname = sa.Column(sa.String(attr.UUID_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + + +class FW_SecurityZone(model_base.BASE, HasId): + """Represents a FW_SecurityZone.""" + __tablename__ = 'fw_security_zone_info' + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ifnames = sa.Column(JsonEncodedList, default=[]) + priority = sa.Column(sa.String(attr.TTL_LEN)) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + operation_fro = sa.Column(sa.String(attr.UUID_LEN)) + + +class FW_Staticnat(model_base.BASE, HasId): + """Represents a FW_Staticnat.""" + __tablename__ = 'fw_staticnat_info' + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ifname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + lanip = sa.Column(sa.String(attr.IP_LEN)) + wanip = sa.Column(sa.String(attr.IP_LEN)) + slot = sa.Column(sa.String(attr.STATUS_LEN)) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + operation_fro = sa.Column(sa.String(attr.UUID_LEN)) + + +class FW_vrf(model_base.BASE, HasId): + """Represents a FW_vrf.""" + __tablename__ = 'fw_vrf_info' + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vrfInterface = sa.Column(JsonEncodedList, default=[]) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + vres_id = sa.Column(sa.String(attr.UUID_LEN)) + operation_fro = sa.Column(sa.String(attr.UUID_LEN)) + + +class FW_snat(model_base.BASE, HasId): + """Represents a FW_vrf.""" + __tablename__ = 'fw_snat_info' + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + outifname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + srcipobjname = sa.Column(JsonEncodedList, default=[]) + dstipobjname = sa.Column(JsonEncodedList, default=[]) + wanippoolname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfwname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + operation_fro = sa.Column(sa.String(attr.UUID_LEN)) diff --git a/nca47/db/sqlalchemy/models/gslb.py b/nca47/db/sqlalchemy/models/gslb.py new file mode 100644 index 0000000..039c33f --- /dev/null +++ b/nca47/db/sqlalchemy/models/gslb.py @@ -0,0 +1,142 @@ +import sqlalchemy as sa + +from nca47.db.sqlalchemy.models import base as model_base +from nca47.objects import attributes as attr + +HasTenant = model_base.HasTenant +HasId = model_base.HasId +HasStatus = model_base.HasStatus +HasOperationMode = model_base.HasOperationMode +JsonEncodedList = model_base.JsonEncodedList + + +class HmTemplateInfo(model_base.BASE, HasId, HasOperationMode): + """Represents a HmTemplateInfo.""" + + __tablename__ = 'hm_template_info' + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + types = sa.Column(sa.String(attr.NAME_MAX_LEN)) + check_interval = sa.Column(sa.String(attr.FIVE_LEN)) + timeout = sa.Column(sa.String(attr.FIVE_LEN)) + max_retries = sa.Column(sa.String(attr.FIVE_LEN)) + sendstring = sa.Column(sa.String(attr.INPUT_MAX_LEN)) + recvstring = sa.Column(sa.String(attr.INPUT_MAX_LEN)) + hm_template_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + refcnt = sa.Column(sa.String(attr.TEN_LEN)) + username = sa.Column(sa.String(attr.NAME_MAX_LEN)) + password = sa.Column(sa.String(attr.NAME_MAX_LEN)) + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class GslbZoneInfo(model_base.BASE, HasId, HasOperationMode): + """Represents a GslbZoneInfo.""" + + __tablename__ = 'gslb_zone_info' + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + devices = sa.Column(JsonEncodedList, default=[]) + syn_server = sa.Column(sa.String(attr.INPUT_MAX_LEN)) + gslb_zone_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + enable = sa.Column(sa.String(attr.INPUT_MAX_LEN), + default='yes') + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class GmemberInfo(model_base.BASE, HasId, HasOperationMode): + """Represents a GmemberInfo.""" + + __tablename__ = 'gmember_info' + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + gslb_zone_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ip = sa.Column(sa.String(attr.IP_LEN)) + port = sa.Column(sa.String(attr.FIVE_LEN)) + enable = sa.Column(sa.String(attr.FIVE_LEN), + default="yes") + refcnt = sa.Column(sa.String(attr.TEN_LEN)) + gmember_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class Region(model_base.BASE, HasId, HasOperationMode): + """Represents a region info.""" + + __tablename__ = 'region_info' + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + region_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + refcnt = sa.Column(sa.String(attr.NAME_MAX_LEN)) + region_user = sa.Column(sa.String(attr.INPUT_MAX_LEN)) + + +class RegionUser(model_base.BASE, HasId, HasOperationMode): + """Represents a region user info.""" + + __tablename__ = 'region_user_info' + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + region_useruser_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + region_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + data1 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + data2 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + data3 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + data4 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class Proximity(model_base.BASE, HasId, HasOperationMode): + """Represents a proximity info.""" + + __tablename__ = 'sp_policy_info' + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + sp_policy_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + src_type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + src_logic = sa.Column(sa.String(attr.NAME_MAX_LEN)) + src_data1 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + src_data2 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + src_data3 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + src_data4 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + dst_type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + dst_logic = sa.Column(sa.String(attr.NAME_MAX_LEN)) + dst_data1 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + dst_data2 = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class Syngroup(model_base.BASE, HasId, HasOperationMode): + """ + Represents a dns Syngroup_zone + """ + __tablename__ = 'syngroup_info' + syngroup_id = sa.Column(sa.String(attr.UUID_LEN)) + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + gslb_zone_names = sa.Column(JsonEncodedList, default=[]) + probe_range = sa.Column(sa.String(attr.NAME_MAX_LEN)) + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + pass_ = sa.Column(sa.String(attr.FIVE_LEN)) + + +class GPoolInfo(model_base.BASE, HasId, HasOperationMode): + __tablename__ = 'gpool_info' + tenant_id = sa.Column(sa.String(attr.UUID_LEN)) + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + enable = sa.Column(sa.String(attr.FIVE_LEN)) + pass_ = sa.Column(sa.String(attr.FIVE_LEN)) + ttl = sa.Column(sa.String(attr.TTL_LEN)) + max_addr_ret = sa.Column(sa.String(attr.NAME_MAX_LEN)) + cname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + first_algorithm = sa.Column(sa.String(attr.FIVE_LEN)) + second_algorithm = sa.Column(sa.String(attr.FIVE_LEN)) + fallback_ip = sa.Column(sa.String(attr.IP_LEN)) + hms = sa.Column(JsonEncodedList, default=[]) + gmember_list = sa.Column(JsonEncodedList, default=[]) + warning = sa.Column(sa.String(attr.TYPE_LEN)) + gpool_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class GMapInfo(model_base.BASE, HasId, HasOperationMode): + __tablename__ = 'gmap_info' + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + gmap_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + gpool_list = sa.Column(JsonEncodedList, default=[]) + last_resort_pool = sa.Column(sa.String(attr.NAME_MAX_LEN)) + algorithm = sa.Column(sa.String(attr.NAME_MAX_LEN)) + enable = sa.Column(sa.String(attr.TEN_LEN)) diff --git a/nca47/db/sqlalchemy/models/nca_agent.py b/nca47/db/sqlalchemy/models/nca_agent.py new file mode 100644 index 0000000..ea46770 --- /dev/null +++ b/nca47/db/sqlalchemy/models/nca_agent.py @@ -0,0 +1,70 @@ +import sqlalchemy as sa + +from nca47.db.sqlalchemy.models import base as model_base +from nca47.objects import attributes as attr + + +HasTenant = model_base.HasTenant +HasId = model_base.HasId +HasStatus = model_base.HasStatus +HasOperationMode = model_base.HasOperationMode +JsonEncodedList = model_base.JsonEncodedList + + +class Agent(model_base.BASE, HasId, HasOperationMode): + """Represents a NCA_AGENT_INFO.""" + + __tablename__ = 'nca_agent_info' + agent_id = sa.Column(sa.String(attr.UUID_LEN)) + agent_ip = sa.Column(sa.String(attr.IP_LEN)) + agent_nat_ip = sa.Column(sa.String(attr.IP_LEN)) + dc_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + network_zone = sa.Column(sa.String(attr.NAME_MAX_LEN)) + agent_type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + availiable = sa.Column(sa.String(attr.IP_LEN)) + update_time = sa.Column(sa.DateTime()) + + +class VresInfo(model_base.BASE, HasId, HasOperationMode): + """Represents a NCA_VRES_INFO.""" + + __tablename__ = 'nca_vres_info' + vres_id = sa.Column(sa.String(attr.UUID_LEN)) + vres_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + tenant_id = sa.Column(sa.String(attr.UUID_LEN)) + agent_id = sa.Column(sa.String(attr.IP_LEN)) + + +class Vres_Agent_View(model_base.BASE, HasId): + """Represents a vres_agent_view.""" + __tablename__ = 'vres_agent_view' + agent_id = sa.Column(sa.String(attr.UUID_LEN)) + agent_ip = sa.Column(sa.String(attr.IP_LEN)) + agent_nat_ip = sa.Column(sa.String(attr.IP_LEN)) + dc_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + network_zone = sa.Column(sa.String(attr.NAME_MAX_LEN)) + agent_type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vres_id = sa.Column(sa.String(attr.UUID_LEN)) + vres_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + tenant_id = sa.Column(sa.String(attr.UUID_LEN)) + + +class Vres_Agent_Vfw_View(model_base.BASE, HasId): + """Represents a view_vfw_vres_agent.""" + __tablename__ = 'view_vfw_vres_agent' + agent_id = sa.Column(sa.String(attr.UUID_LEN)) + agent_ip = sa.Column(sa.String(attr.IP_LEN)) + agent_nat_ip = sa.Column(sa.String(attr.IP_LEN)) + dc_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + network_zone = sa.Column(sa.String(attr.NAME_MAX_LEN)) + agent_type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vres_id = sa.Column(sa.String(attr.UUID_LEN)) + vres_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + tenant_id = sa.Column(sa.String(attr.UUID_LEN)) + vfw_id = sa.Column(sa.String(attr.UUID_LEN)) + vfw_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vfw_info = sa.Column(JsonEncodedList, default=[]) + vfw_type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + network_zone_name = sa.Column(sa.String(attr.INPUT_MAX_LEN)) + network_zone_class = sa.Column(sa.String(attr.INPUT_MAX_LEN)) + protection_class = sa.Column(sa.String(attr.INPUT_MAX_LEN)) diff --git a/nca47/db/sqlalchemy/models/operation_history.py b/nca47/db/sqlalchemy/models/operation_history.py new file mode 100644 index 0000000..4251b94 --- /dev/null +++ b/nca47/db/sqlalchemy/models/operation_history.py @@ -0,0 +1,22 @@ +import sqlalchemy as sa + +from nca47.db.sqlalchemy.models import base as model_base +from nca47.objects import attributes as attr + + +HasTenant = model_base.HasTenant +HasId = model_base.HasId +HasStatus = model_base.HasStatus +HasOperationMode = model_base.HasOperationMode + + +class OperationHistory(model_base.BASE, HasId, HasOperationMode): + """Represents a dns zone.""" + + __tablename__ = 'nca_operation_history' + + config_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + input = sa.Column(sa.String(attr.INPUT_MAX_LEN)) + operation_type = sa.Column(sa.String(attr.NAME_MAX_LEN)) + operation_time = sa.Column(sa.DateTime()) + operation_status = sa.Column(sa.String(attr.NAME_MAX_LEN)) diff --git a/nca47/db/sqlalchemy/models/rwlb.py b/nca47/db/sqlalchemy/models/rwlb.py new file mode 100644 index 0000000..03d7312 --- /dev/null +++ b/nca47/db/sqlalchemy/models/rwlb.py @@ -0,0 +1,73 @@ +import sqlalchemy as sa +from nca47.db.sqlalchemy.models import base as model_base +from nca47.objects import attributes as attr + +HasTenant = model_base.HasTenant +HasId = model_base.HasId +HasStatus = model_base.HasStatus +HasOperationMode = model_base.HasOperationMode +JsonEncodedList = model_base.JsonEncodedList + + +class realserver(model_base.BASE, HasId, HasOperationMode): + """Represents a dns zone.""" + + __tablename__ = 'lb_realserver_info' + + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vnetwork_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + environment_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + application = sa.Column(sa.String(attr.NAME_MAX_LEN)) + node = sa.Column(sa.String(attr.NAME_MAX_LEN)) + realservername = sa.Column(sa.String(attr.NAME_MAX_LEN)) + rip = sa.Column(sa.String(attr.IP_LEN)) + batch = sa.Column(sa.String(attr.TENANT_ID_MAX_LEN)) + command_input = sa.Column(JsonEncodedList, default=[]) + + +class lb_group(model_base.BASE, HasId, HasOperationMode): + """Represents a dns zone.""" + + __tablename__ = 'lb_group_info' + + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vnetwork_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + environment_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + application = sa.Column(sa.String(attr.NAME_MAX_LEN)) + node = sa.Column(sa.String(attr.NAME_MAX_LEN)) + batch = sa.Column(sa.String(attr.TENANT_ID_MAX_LEN)) + command_input = sa.Column(JsonEncodedList, default=[]) + realservername = sa.Column(JsonEncodedList, default=[]) + groupname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class lb_vip(model_base.BASE, HasId, HasOperationMode): + """Represents a dns zone.""" + + __tablename__ = 'lb_vip_info' + tenant_id = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vnetwork_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + environment_name = sa.Column(sa.String(attr.NAME_MAX_LEN)) + application = sa.Column(sa.String(attr.NAME_MAX_LEN)) + node = sa.Column(sa.String(attr.NAME_MAX_LEN)) + batch = sa.Column(sa.String(attr.TENANT_ID_MAX_LEN)) + command_input = sa.Column(JsonEncodedList, default=[]) + virtualservername = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vip = sa.Column(sa.String(attr.TYPES_LEN)) + virtualname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + + +class lb_service(model_base.BASE, HasId, HasOperationMode): + """Represents a dns zone.""" + + __tablename__ = 'lb_service_info' + virtualservername = sa.Column(sa.String(attr.NAME_MAX_LEN)) + groupname = sa.Column(sa.String(attr.NAME_MAX_LEN)) + vport = sa.Column(sa.String(attr.TTL_LEN)) + rport = sa.Column(sa.String(attr.TTL_LEN)) + pbindtype = sa.Column(sa.String(attr.NAME_MAX_LEN)) + dbindtype = sa.Column(sa.String(attr.NAME_MAX_LEN)) + ptmouttime = sa.Column(sa.String(attr.NAME_MAX_LEN)) + metrictype = sa.Column(sa.String(attr.NAME_MAX_LEN)) + command_input = sa.Column(JsonEncodedList, default=[]) + batch = sa.Column(sa.String(attr.TENANT_ID_MAX_LEN)) diff --git a/nca47/manager/central.py b/nca47/manager/central.py new file mode 100644 index 0000000..d5b491c --- /dev/null +++ b/nca47/manager/central.py @@ -0,0 +1,529 @@ +from oslo_config import cfg +from oslo_log import log as logging +from oslo_utils import timeutils +from nca47 import objects +from nca47.manager.cli_manager import CLIManager +from nca47.manager.dns_manager import DNSManager +from nca47.manager.firewall_manager.fw_manager import FirewallManager +from nca47.manager.lb_manager.lb_manager import LBManager +from nca47.common import exception +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +CENTRAL_MANAGER = None + + +class CentralManager(object): + + """ + nca47 central handler class, using for response api client requests, + dispatch client request to dns, firewall or loadbalancer manager + """ + + def __init__(self): + self.dns_manager = DNSManager.get_instance() + self.fw_manager = FirewallManager.get_instance() + self.cli_manager = CLIManager.get_instance() + self.lb_manger = LBManager.get_instance() + + @classmethod + def get_instance(cls): + global CENTRAL_MANAGER + if not CENTRAL_MANAGER: + CENTRAL_MANAGER = cls() + return CENTRAL_MANAGER + + def create_zone(self, context, zone): + """"create new zone""" + zone_obj = self.dns_manager.create_zone(context, zone) + return zone_obj + + def update_zone(self, context, zone, id): + """update target zone""" + zone_obj = self.dns_manager.update_zone(context, zone, id) + return zone_obj + + def update_zone_owners(self, context, zone, id): + """update target zone's owners""" + zone_obj = self.dns_manager.update_zone_owners(context, zone, id) + return zone_obj + + def delete_zone(self, context, id): + """delete target zone""" + response = self.dns_manager.delete_zone(context, id) + return response + + def get_zones(self, context): + """get zones from device""" + # handling zones method in RPC + response = self.dns_manager.get_zones(context) + return response + + def get_zone_db_details(self, context, id): + """show target zone details info from db""" + zone_obj = self.dns_manager.get_zone_db_details(context, id) + return zone_obj + + def get_all_db_zone(self, context): + """call DB to get all zones""" + zone_objs = self.dns_manager.get_all_db_zone(context) + return zone_objs + + def get_db_zones(self, context, zones): + """call DB to get all zones""" + zone_objs = self.dns_manager.get_db_zones(context, zones) + return zone_objs + + def get_dev_records(self, context, zone_id): + """ get all records from device""" + records = self.dns_manager.get_dev_records(context, zone_id) + return records + + def get_db_records(self, context, zone_id): + """get all records belong special zone from db""" + records = self.dns_manager.get_db_records(context, zone_id) + return records + + def query_records(self, context, rrs): + """get all records belong special zone from db""" + records = self.dns_manager.query_records(context, rrs) + return records + + # TODO this is a test environment method,and it will + # be deleted after deployment in a production environment + # Begin + def query_records_in_test_env(self, context, rrs): + """get all records belong special zone from db""" + records = self.dns_manager.query_records_in_test_env(context, rrs) + return records + + def create_record_in_test_env(self, context, rrs): + """get all records belong special zone from db""" + records = self.dns_manager.create_record_in_test_env(context, rrs) + return records + # End test environment + + def get_record_from_db(self, context, record_id): + """get target record detail info from db""" + record = self.dns_manager.get_record_from_db(context, record_id) + return record + + def create_record(self, context, record): + """create one record for special zone""" + record = self.dns_manager.create_record(context, record) + return record + + def update_record(self, context, record): + """update target record info""" + record = self.dns_manager.update_record(context, record) + return record + + def delete_record(self, context, rrs): + """delete target record""" + response = self.dns_manager.delete_record(context, rrs) + return response + + def del_cache(self, context, domain): + """clean cache from dns device""" + response = self.dns_manager.del_cache(context, domain) + return response + + def create_region(self, context, region): + """"create new region""" + zone_obj = self.dns_manager.create_region(context, region) + return zone_obj + + def delete_region(self, context, id): + """delete target region""" + response = self.dns_manager.delete_region(context, id) + return response + + def create_member(self, context, member): + """"create new member""" + zone_obj = self.dns_manager.create_member(context, member) + return zone_obj + + def delete_member(self, context, id): + """delete target member""" + response = self.dns_manager.delete_member(context, id) + return response + + def get_members(self, context): + """show target region details info from db""" + zone_obj = self.dns_manager.get_members(context) + return zone_obj + + def get_db_members(self, context, members): + """call DB to get all members""" + members_objs = self.dns_manager.get_db_members(context, members) + return members_objs + + def get_one_member(self, context, members): + """call DB to get all members""" + members_objs = self.dns_manager.get_one_member(context, members) + return members_objs + + def get_region_db_detail(self, context, id): + """show target region details info from db""" + zone_obj = self.dns_manager.get_region_db_detail(context, id) + return zone_obj + + def get_all_db_region(self, context): + """call DB to get all regions""" + zone_objs = self.dns_manager.get_all_db_region(context) + return zone_objs + + def get_db_regions(self, context, regions): + """call DB to get all regions""" + regions_objs = self.dns_manager.get_db_regions(context, regions) + return regions_objs + + def create_sp_policy(self, context, proximity): + """"create new proximity""" + zone_obj = self.dns_manager.create_sp_policy(context, proximity) + return zone_obj + + def delete_sp_policy(self, context, id): + """delete target proximity""" + response = self.dns_manager.delete_sp_policy(context, id) + return response + + def update_sp_policy(self, context, proximity, id): + """update target proximity""" + zone_obj = self.dns_manager.update_sp_policy(context, proximity, id) + return zone_obj + + def get_sp_policy(self, context, id): + """get policy from device""" + # handling policy method in RPC + response = self.dns_manager.get_sp_policy(context, id) + return response + + def get_sp_policys(self, context): + """get policys from device""" + # handling policys method in RPC + response = self.dns_manager.get_sp_policys(context) + return response + + def get_proximity_db_detail(self, context, id): + """show target proximity details info from db""" + zone_obj = self.dns_manager.get_proximity_db_detail(context, id) + return zone_obj + + def get_all_db_proximity(self, context): + """call DB to get all proximitys""" + zone_objs = self.dns_manager.get_all_db_proximity(context) + return zone_objs + + def get_db_proximitys(self, context, proximitys): + """call DB to get all proximitys""" + proximitys_objs = self.dns_manager.get_db_proximitys( + context, proximitys) + return proximitys_objs + + def get_gmembers_db(self, context, dic): + """get all gmembers""" + response = self.dns_manager.get_gmembers_db(context, dic) + return response + + def get_one_gmember_db(self, context, gmember_uuid): + """get a gmember""" + response = self.dns_manager.get_one_gmember_db(context, gmember_uuid) + return response + + def create_gmember(self, context, dic): + """create a gmember""" + response = self.dns_manager.create_gmember(context, dic) + return response + + def update_gmember(self, context, dic, gmember_uuid): + """update gmember info""" + response = self.dns_manager.update_gmember(context, dic, gmember_uuid) + return response + + def delete_gmember(self, context, gmember_uuid): + """delete target gmember""" + response = self.dns_manager.delete_gmember(context, gmember_uuid) + return response + + def get_hm_templates_db(self, context, dic): + """get all hm_templates""" + response = self.dns_manager.get_hm_templates_db(context, dic) + return response + + def get_one_hm_template_db(self, context, template_uuid): + """get a hm_template""" + return self.dns_manager.get_one_hm_template_db(context, + template_uuid) + + def create_hm_template(self, context, dic): + """create a hm_template""" + response = self.dns_manager.create_hm_template(context, dic) + return response + + def update_hm_template(self, context, dic, template_uuid): + """update hm_template info""" + response = self.dns_manager.update_hm_template(context, + dic, template_uuid) + return response + + def delete_hm_template(self, context, template_uuid): + """delete target hm_template""" + response = self.dns_manager.delete_hm_template(context, template_uuid) + return response + + # this is a vlan operation + def create_vlan(self, context, dic): + return self.fw_manager.create_vlan(context, dic) + + def del_vlan(self, context, dic): + return self.fw_manager.del_vlan(context, dic) + + def get_vlan(self, context, id): + return self.fw_manager.get_vlan(context, id) + + def get_vlans(self, context, dic): + return self.fw_manager.get_vlans(context, dic) + + # this is a netservice operation + def create_netservice(self, context, netsev_infos): + return self.fw_manager.create_netservice(context, netsev_infos) + + def del_netservice(self, context, netsev_infos): + return self.fw_manager.del_netservice(context, netsev_infos) + + def get_netservice(self, context, id): + return self.fw_manager.get_netservice(context, id) + + def get_netservices(self, context, netsev_infos): + return self.fw_manager.get_netservices(context, netsev_infos) + + def get_netservices_by_fuzzy_query(self, context, netsev_infos): + return self.fw_manager.get_netservices_by_fuzzy_query(context, + netsev_infos) + + # this is a addrobj operation + def add_addrobj(self, context, addrobj_infos): + return self.fw_manager.add_addrobj(context, addrobj_infos) + + def delete_addrobj(self, context, addrobj_infos): + return self.fw_manager.delete_addrobj(context, addrobj_infos) + + def get_addrobj(self, context, id): + return self.fw_manager.get_addrobj(context, id) + + def get_addrobjs(self, context, addrobj_infos): + return self.fw_manager.get_addrobjs(context, addrobj_infos) + + # this is a snataddrpool operation + def add_snataddrpool(self, context, snataddrpool_infos): + return self.fw_manager.add_snataddrpool(context, snataddrpool_infos) + + def del_snataddrpool(self, context, snataddrpool_infos): + return self.fw_manager.del_snataddrpool(context, snataddrpool_infos) + + def get_snataddrpool(self, context, snataddrpool_infos): + return self.fw_manager.get_snataddrpool(context, snataddrpool_infos) + + def get_snataddrpools(self, context, snataddrpool_infos): + return self.fw_manager.get_snataddrpools(context, snataddrpool_infos) + + def create_vfw(self, context, vfw): + return self.fw_manager.create_vfw(context, vfw) + + def delete_vfw(self, context, vfw): + return self.fw_manager.delete_vfw(context, vfw) + + def get_vfw(self, context, id): + return self.fw_manager.get_vfw(context, id) + + def get_all_vfws(self, context, vfw): + return self.fw_manager.get_all_vfws(context, vfw) + + def get_vfws_by_fuzzy_query(self, context, vfw): + return self.fw_manager.get_vfws_by_fuzzy_query(context, vfw) + + def create_dnat(self, context, dnat): + return self.fw_manager.create_dnat(context, dnat) + + def delete_dnat(self, context, dnat): + return self.fw_manager.delete_dnat(context, dnat) + + def get_dnat(self, context, id): + return self.fw_manager.get_dnat(context, id) + + def get_all_dnats(self, context, dnat): + return self.fw_manager.get_all_dnats(context, dnat) + + def get_dnats_by_fuzzy_query(self, context, dnat): + return self.fw_manager.get_dnats_by_fuzzy_query(context, dnat) + + def create_packetfilter(self, context, packetfilter): + return self.fw_manager.create_packetfilter(context, packetfilter) + + def delete_packetfilter(self, context, packetfilter): + return self.fw_manager.delete_packetfilter(context, packetfilter) + + def get_packetfilter(self, context, id): + return self.fw_manager.get_packetfilter(context, id) + + def get_all_packetfilters(self, context, packetfilter): + return self.fw_manager.get_all_packetfilters(context, packetfilter) + + # this is a vfw operation + def create_vrf(self, context, fw_object): + return self.fw_manager.create_vrf(context, fw_object) + + def del_vrf(self, context, fw_object): + return self.fw_manager.del_vrf(context, fw_object) + + def get_vrf(self, context, id): + return self.fw_manager.get_vrf(context, id) + + def get_vrfs(self, context, fw_object): + return self.fw_manager.get_vrfs(context, fw_object) + + # this is a snat operation + def create_snat(self, context, fw_object): + return self.fw_manager.create_snat(context, fw_object) + + def del_snat(self, context, fw_object): + return self.fw_manager.del_snat(context, fw_object) + + def get_snats_by_fuzzy_query(self, context, fw_object): + return self.fw_manager.get_snats_by_fuzzy_query(context, fw_object) + + def get_snat(self, context, id): + return self.fw_manager.get_snat(context, id) + + def get_snats(self, context, fw_object): + return self.fw_manager.get_snats(context, fw_object) + + # this is a securityZone operation + def create_securityzone(self, context, fw_object): + return self.fw_manager.create_securityzone(context, fw_object) + + def update_securityzone(self, context, fw_object): + return self.fw_manager.update_securityzone(context, fw_object) + + def delete_securityzone(self, context, fw_object): + return self.fw_manager.delete_securityzone(context, fw_object) + + def get_securityzone(self, context, id): + return self.fw_manager.get_securityzone(context, id) + + def get_securityzones(self, context, fw_object): + return self.fw_manager.get_securityzones(context, fw_object) + + def securityzone_addif(self, context, fw_object): + return self.fw_manager.securityzone_addif(context, fw_object) + + def securityzone_delif(self, context, fw_object): + return self.fw_manager.securityzone_delif(context, fw_object) + + # this is a staticnat operation + def create_staticnat(self, context, fw_object): + return self.fw_manager.create_staticnat(context, fw_object) + + def del_staticnat(self, context, fw_object): + return self.fw_manager.del_staticnat(context, fw_object) + + def get_staticnat(self, context, fw_object): + return self.fw_manager.get_staticnat(context, fw_object) + + def get_staticnats_by_fuzzy_query(self, context, fw_object): + return self.fw_manager.get_staticnats_by_fuzzy_query(context, + fw_object) + + # this is a gslb_zone operation + def create_gslb_zone(self, context, dns_object): + return self.dns_manager.create_gslb_zone(context, dns_object) + + def del_gslb_zone(self, context, dns_object): + return self.dns_manager.del_gslb_zone(context, dns_object) + + def update_gslb_zone(self, context, zone_id, dns_object): + return self.dns_manager.update_gslb_zone(context, zone_id, dns_object) + + def get_gslb_zone(self, context, dns_object): + return self.dns_manager.get_gslb_zone(context, dns_object) + + def get_gslb_zones(self, context, dns_object): + return self.dns_manager.get_gslb_zones(context, dns_object) + + def create_syngroup(self, context, syngroup_dict): + return self.dns_manager.create_syngroup(context, syngroup_dict) + + def update_syngroup(self, context, syngroup_dict): + return self.dns_manager.update_syngroup(context, syngroup_dict) + + def remove_syngroup(self, context, syngroup_id): + return self.dns_manager.remove_syngroup(context, syngroup_id) + + def get_syngroups(self, context, values): + return self.dns_manager.get_syngroups(context, values) + + def get_syngroup(self, context, syngroup_id): + return self.dns_manager.get_syngroup(context, syngroup_id) + + def delete_syngroup(self, context, values): + return self.dns_manager.delete_syngroup(context, values) + + def create_gpool(self, context, gpool_dict): + return self.dns_manager.create_gpool(context, gpool_dict) + + def update_gpool(self, context, gpool_dict): + return self.dns_manager.update_gpool(context, gpool_dict) + + def get_gpools(self, context, values): + return self.dns_manager.get_gpools(context, values) + + def get_gpool(self, context, gpool_id): + return self.dns_manager.get_gpool(context, gpool_id) + + def delete_gpool(self, context, values): + return self.dns_manager.delete_gpool(context, values) + + def create_gmap(self, context, gmap_dict): + return self.dns_manager.create_gmap(context, gmap_dict) + + def update_gmap(self, context, gmap_dict): + return self.dns_manager.update_gmap(context, gmap_dict) + + def get_gmaps(self, context, values): + return self.dns_manager.get_gmaps(context, values) + + def get_gmap(self, context, gmap_id): + return self.dns_manager.get_gmap(context, gmap_id) + + def delete_gmap(self, context, values): + return self.dns_manager.delete_gmap(context, values) + + def execute_commands(self, context, commands): + return self.cli_manager.execute_commands(context, commands) + + def create_pool(self, context, real_dic): + return self.lb_manger.create_pool(context, real_dic) + + def create_lb_member(self, context, member_dic): + return self.lb_manger.create_member(context, member_dic) + + def create_vip(self, context, vip_dic): + return self.lb_manger.create_vip(context, vip_dic) + + def create_server(self, context, server_dic): + return self.lb_manger.create_server(context, server_dic) + + def delete_real_service(self, context, real_dic): + return self.lb_manger.delete_real_service(context, real_dic) + + def get_agent_list(self, context): + agents = objects.Agent(context) + agent_list = agents.get_objects(context) + for agent in agent_list: + print CONF.agent.agent_down_time + is_down = timeutils.is_older_than(agent.update_time, + CONF.agent.agent_down_time) + agent_status = "xxx" if is_down else ':-)' + agent['status'] = agent_status + return agent_list diff --git a/nca47/manager/cli_manager.py b/nca47/manager/cli_manager.py new file mode 100644 index 0000000..4d2d12b --- /dev/null +++ b/nca47/manager/cli_manager.py @@ -0,0 +1,62 @@ +from oslo_log import log as logging +import json +# from oslo_serialization import jsonutils as json +from nca47.common import exception +from nca47.common.i18n import _LI +from nca47.common.i18n import _LW +from nca47.common.i18n import _LE + +from nca47.db import api as db_api +from nca47.manager import rpcapi +from nca47.manager import db_common + +LOG = logging.getLogger(__name__) + +CLI_MANAGER = None + + +class CLIManager(object): + """ + Run commands in command line interface operation handler class, using + for handle client requests, validate parameters whether is legal, + handling DB operations and calling rpc client's corresponding method + to send messaging to agent endpoints + """ + + def __init__(self): + self.db_common = db_common.DBCommon.get_instance() + self.db_api = db_api.get_instance() + self.rpc_api = rpcapi.CLIManagerAPI.get_instance() + + @classmethod + def get_instance(cls): + global CLI_MANAGER + if not CLI_MANAGER: + CLI_MANAGER = cls() + return CLI_MANAGER + + def execute_commands(self, context, commands): + tenant_id = commands['tenant_id'] + net_zone = commands['network_zone'] + dc_name = commands['dc_name'] + agent_type = commands['agent_type'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type=agent_type, + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + agent_ip = view_obj['agent_ip'] + # insert operation history + commands_str = json.dumps(commands) + # to do work-- when run command faild, but early commands have been + # executed how to record the corresponding history info + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=commands_str, + method='EXECUTE', + status='FAILED') + self.rpc_api.reload_topic(agent_ip) + + response = self.rpc_api.execute_commands(context, commands) + return response diff --git a/nca47/manager/db_common.py b/nca47/manager/db_common.py new file mode 100644 index 0000000..0836d90 --- /dev/null +++ b/nca47/manager/db_common.py @@ -0,0 +1,189 @@ +from oslo_config import cfg +from oslo_utils import timeutils +from oslo_db import exception as db_exception +from oslo_log import log as logging +from nca47 import objects +from nca47.common.i18n import _ +from nca47.common.i18n import _LI +from nca47.common.i18n import _LE +from nca47.common import exception +from nca47.db import api as db_api +from amqp.exceptions import NotFound +from oslo_serialization import jsonutils as json + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +DB_COMMON = None + +DNS_VRES_ID_OPT = cfg.StrOpt('dns_vres_id', default=None, + help=_('The dns virtual resource id in database')) + +opt_group = cfg.OptGroup(name='zdns', + title='Options for the nca47-zdns_driver service') +CONF.register_group(opt_group) +CONF.register_opt(DNS_VRES_ID_OPT, opt_group) + + +class DBCommon(object): + + """operate db history table""" + + def __init__(self): + self.db_api = db_api.get_instance() + super(DBCommon, self).__init__() + + @classmethod + def get_instance(cls): + + global DB_COMMON + if not DB_COMMON: + DB_COMMON = cls() + return DB_COMMON + + def create_in_storage(self, context, obj): + """create a data in DB""" + try: + # create the data in db + obj = obj.create(context, obj.as_dict()) + except db_exception: + LOG.error(_LE("Create/Insert db operation failed!")) + raise db_exception + return obj + + def get_vres_agent_view(self, context, **kwargs): + vres_agent_view = { + "tenant_id": kwargs['tenant_id'], + "agent_type": kwargs['agent_type'], + "network_zone": kwargs['network_zone'], + "dc_name": kwargs['dc_name'] + } + vres = objects.Vres_Agent_View(context, **vres_agent_view) + try: + obj = vres.get_object(context, **vres_agent_view) + except Exception as e: + LOG.error(_LE("Cannot get the corresponding vres and agent" + " information!")) + raise exception.NoexistOrMultipleError( + param_name="the vres_agent view object with tenant_id=%s, " + "dc_name=%s, network_zone=%s, agent_type=%s" + % (kwargs['tenant_id'], kwargs['dc_name'], + kwargs['network_zone'], kwargs['agent_type'])) + return obj + + def get_vres_agent_view_for_fw(self, context, **kwargs): + vres_agent_view = { + "tenant_id": kwargs['tenant_id'], + "network_zone": kwargs['network_zone'], + "dc_name": kwargs['dc_name'] + } + vres = objects.Vres_Agent_View(context, **vres_agent_view) + return vres.get_objects(context, **vres_agent_view) + + def get_vres_agent_vfw_view(self, context, **kwargs): + view = { + "tenant_id": kwargs['tenant_id'], + "network_zone": kwargs['network_zone'], + "dc_name": kwargs['dc_name'] + } + vres = objects.Vres_Agent_Vfw_View(context, **view) + return vres.get_objects(context, **view) + + def get_fw_vfw_id(self, context, **kwargs): + # get the value vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = kwargs['vfw_name'] + vfw_dic['vres_id'] = kwargs['vres_id'] + vfw_dic['deleted'] = False + fwvfw = objects.VFW(context, **vfw_dic) + try: + rstfwvfw = fwvfw.get_object(context, **vfw_dic) + except Exception as e: + LOG.error(_LE("Cannot get the corresponding vfw information!")) + LOG.exception(e) + raise exception.NoexistOrMultipleError( + param_name="vfw with vfw_name=" + vfw_dic['vfw_name']) + return rstfwvfw + + def get_addrobj_name(self, context, **kwargs): + # IP address is converted to an address object + vfw_dic = {} + vfw_dic['ip'] = kwargs['ip'] + vfw_dic['vfw_id'] = kwargs['vfw_id'] + vfw_dic['deleted'] = False + obj_addrobj = objects.FwAddrObjInfo(context, **vfw_dic) + try: + obj_addrobj = obj_addrobj.get_object(context, **vfw_dic) + except Exception as e: + LOG.error(_LE("Cannot get the corresponding addrobj information!")) + LOG.exception(e) + raise exception.NoexistOrMultipleError( + param_name="addrobj with ip=" + vfw_dic['ip']) + return obj_addrobj.name + + def insert_operation_history(self, context, **kwargs): + current_time = timeutils.utcnow() + opt_params = {} + if 'vres_id' in kwargs: + opt_params['config_id'] = kwargs['vres_id'] + elif CONF.zdns.dns_vres_id: + opt_params['config_id'] = CONF.zdns.dns_vres_id + else: + LOG.error(_LE("The Resource(with target vres_id) " + "could not be found!")) + raise NotFound() + opt_params['input'] = kwargs['input'] + opt_params['operation_type'] = kwargs['method'] + opt_params['operation_time'] = current_time + opt_params['operation_status'] = kwargs['status'] + opt_obj = objects.OperationHistory(context, **opt_params) + LOG.info(_LI("Inserting operation history record in DB")) + operation_history = self.create_in_storage(context, opt_obj) + LOG.info(_LI("Insert operation history record in DB successful")) + return operation_history + + def update_operation_history(self, context, id_, **kwargs): + opt_params = {} + opt_params['operation_status'] = kwargs['status'] + opt_obj = objects.OperationHistory(context, **opt_params) + LOG.info(_LI("updating operation history record in DB")) + opt_obj.update(context, id_, opt_obj.as_dict()) + LOG.info(_LI("update operation history record in DB successful!")) + return None + + def is_exist_object(self, context, obj): + is_exist = False + target_dic = dict(obj.as_dict(), **{'deleted': False}) + db_obj = None + try: + # create the data in db + db_obj = obj.get_object(context, **target_dic) + except Exception: + pass + if db_obj: + is_exist = True + return is_exist + + def merge_dict_view(self, dic): + kw = {} + kw['tenant_id'] = dic['tenant_id'] + kw['agent_type'] = dic['agent_type'] + kw['network_zone'] = dic['network_zone'] + kw['dc_name'] = dic['dc_name'] + return kw + + def history_col_info(self, dic, method_val, status_val): + input_str = json.dumps(dic) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = method_val + input_operation_history['status'] = status_val + return input_operation_history + + def put_sql(self, str_sql, lik_dic, search_dic): + sql_ = "" + for lik in lik_dic: + sql_ = sql_ + " and " + lik + " like '%%" + lik_dic[lik] + "%%'" + for sea in search_dic: + sql_ = sql_ + " and " + sea + " = '" + search_dic[sea] + "'" + return str_sql + sql_ diff --git a/nca47/manager/dns_manager.py b/nca47/manager/dns_manager.py new file mode 100644 index 0000000..134e356 --- /dev/null +++ b/nca47/manager/dns_manager.py @@ -0,0 +1,2348 @@ +import copy +from oslo_config import cfg +from oslo_serialization import jsonutils as json +from oslo_db import exception as db_exception +from oslo_log import log as logging +from oslo_messaging.exceptions import MessagingTimeout +from nca47 import objects +from nca47.common.i18n import _LI +from nca47.common.i18n import _LW +from nca47.common.i18n import _LE +from nca47.common import exception +from nca47.db import api as db_api +from nca47.manager import rpcapi +from nca47.manager import db_common +from nca47.api.controllers.v1 import tools + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +DNS_MANAGER = None + + +class DNSManager(object): + """ + DNS operation handler class, using for handle client requests, + validate parameters whether is legal, handling DB operations and + calling rpc client's corresponding method to send messaging to agent + endpoints + """ + + def __init__(self): + self.db_common = db_common.DBCommon.get_instance() + self.db_api = db_api.get_instance() + self.rpc_api = rpcapi.DNSManagerAPI.get_instance() + + @classmethod + def get_instance(cls): + + global DNS_MANAGER + if not DNS_MANAGER: + DNS_MANAGER = cls() + return DNS_MANAGER + + def create_zone(self, context, zone): + """ + create zone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # change the zone values with dic format + target_values = self._make_dns_zone_object(zone) + # init the DB operations object + zone_obj = objects.DnsZone(context, **target_values) + # Check the zone which have same name if is exist in DB + target_zone = self._valid_if_zone_exist(context, zone_obj) + if target_zone is not None: + LOG.warning(_LW("Have same zone id/name in DB")) + raise exception.HaveSameObject(param_name=target_zone.zone_name) + # insert operation history type with Creating in DB + input_str = json.dumps(zone) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # create the zone info in db + db_zone_obj = self._create_in_storage(context, zone_obj) + try: + # get the default zone records + zone_id = target_values['zone_name'] + # handling create zone method in RPC + response = self.rpc_api.create_zone(context, zone) + rrs_results = self.rpc_api.get_records(context, zone_id) + for resourc in rrs_results['resources']: + records = {} + records['rrs_id'] = resourc['id'] + records['zone_id'] = db_zone_obj['id'] + records['tenant_id'] = zone['tenant_id'] + records['rrs_name'] = resourc['name'] + records['type'] = resourc['type'] + records['ttl'] = resourc['ttl'] + records['klass'] = resourc['klass'] + records['rdata'] = resourc['rdata'] + # init the DB operations objec with zone_record + zone_rrs_obj = objects.DnsZoneRrs(context, **records) + # create the zone info in db + self._create_in_storage(context, zone_rrs_obj) + except MessagingTimeout as e: + # DB rollback since create zone failed in Device + zone_obj.delete(context, db_zone_obj['id']) + raise e + except Exception as e: + LOG.error(_LE("Create corresponding response on device failed")) + # get the default zone records from db + rrs_dic = {} + rrs_dic['zone_id'] = db_zone_obj['id'] + rrs_dic['deleted'] = False + rrs_obj = objects.DnsZoneRrs(context, **rrs_dic) + zone_records = rrs_obj.get_objects(context, **rrs_dic) + if zone_records is not None: + # get the all id of the zone_records + del_rrs_obj = objects.DnsZoneRrs(context) + for record in zone_records: + # delete the DB operations objec with zone_record + del_rrs_obj.delete(context, record['id']) + # DB rollback since create zone failed in Device + zone_obj.delete(context, db_zone_obj['id']) + raise e + # update operation history type with Failed in DB + + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history(context, history['id'], + **input_operation_history) + return db_zone_obj + + def update_zone(self, context, zone, id): + """ + update zone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + org_db_zone_obj = self.get_zone_db_details(context, id) + + target_values = self._make_dns_zone_object(zone) + # init the DB operations object + zone_obj = objects.DnsZone(context, **target_values) + + # insert operation history type with Creating in DB + input_str = json.dumps(zone) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'UPDATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # update the zone in db + db_zone_obj = zone_obj.update(context, id, zone_obj.as_dict()) + try: + # get the zone_id for device update + zone_id = db_zone_obj['zone_name'] + # handling update zone method in RPC + response = self.rpc_api.update_zone(context, zone, zone_id) + except Exception as e: + LOG.error(_LE("Update corresponding response on device failed")) + # DB rollback since update failed in Device, to re-update back + zone_obj.update(context, id, org_db_zone_obj) + raise e + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history(context, history['id'], + **input_operation_history) + return db_zone_obj + + def update_zone_owners(self, context, zone, id): + """ + update zone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + org_db_zone_obj = self.get_zone_db_details(context, id) + target_values = self._make_dns_zone_object(zone) + # init the DB operations object + zone_obj = objects.DnsZone(context, **target_values) + # insert operation history type with Creating in DB + input_str = json.dumps(zone) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'UPDATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # update the zone in db + db_zone_obj = zone_obj.update(context, id, zone_obj.as_dict()) + try: + # get the zone_id for device update + zone_id = db_zone_obj['zone_name'] + # handling update zone by owaners method in RPC + response = self.rpc_api.update_zone_owners(context, zone, zone_id) + except Exception as e: + LOG.error(_LE("Update corresponding response on device failed")) + # DB rollback since update zone failed in Device + zone_obj.update(context, id, org_db_zone_obj) + # raise the exception for catch + raise e + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history(context, history['id'], + **input_operation_history) + return db_zone_obj + + def delete_zone(self, context, id): + """ + delete zone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + org_db_zone_obj = self.get_zone_db_details(context, id) + # init the DB operations object + zone_obj = objects.DnsZone(context) + # insert operation history type with Creating in DB + input_str = "delete zone" + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # delete the zone in db + db_zone_obj = zone_obj.delete(context, id) + try: + zone_id = db_zone_obj['zone_name'] + # handling delete zone method in RPC + response = self.rpc_api.delete_zone(context, zone_id) + # get the default zone records from db + rrs_dic = {} + rrs_dic['zone_id'] = id + rrs_dic['deleted'] = False + rrs_obj = objects.DnsZoneRrs(context, **rrs_dic) + zone_records = rrs_obj.get_objects(context, **rrs_dic) + # get the all id of the zone_records + del_rrs_obj = objects.DnsZoneRrs(context) + for record in zone_records: + # delete the DB operations objec with zone_record + del_rrs_obj.delete(context, record['id']) + except Exception as e: + LOG.error(_LE("Delete corresponding response on device failed")) + # since delete failed in device, so re-update back object in DB + zone_obj.update(context, id, org_db_zone_obj) + # raise the exception for catch + raise e + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history(context, history['id'], + **input_operation_history) + return response + + def get_zone_one(self, context, zone_id): + """getting target zone details from dns device""" + try: + # handling zone method in RPC + response = self.rpc_api.get_zone_one(context, zone_id) + except Exception as e: + raise e + return response + + def get_zones(self, context): + """handling zones method in RPC""" + try: + # handling zones method in RPC + response = self.rpc_api.get_zones(context) + except Exception as e: + raise e + return response + + def get_zone_db_details(self, context, id): + """Todo call DB to get one zone""" + # init the DB operations object + zone_obj = objects.DnsZone(context) + zone_name_dic = {} + zone_name_dic['id'] = id + zone_name_dic['deleted'] = False + # try/catch the no one get + try: + # Todo call DB to get one zone by id + zone_obj = zone_obj.get_object(context, **zone_name_dic) + except Exception: + LOG.warning(_LW("No zone with id=%(id)s in DB"), {"id": id}) + raise exception.IsNotExistError(param_name="Zone with id=" + id) + return zone_obj + + def get_all_db_zone(self, context): + """Todo call DB to get all zones""" + # init the DB operations object + zone_obj = objects.DnsZone(context) + # Filter the data that has been disabled + zone_name_dic = {} + zone_name_dic['deleted'] = False + # Todo call DB to get all zones + zone_objs = zone_obj.get_objects(context, **zone_name_dic) + if zone_objs is None: + LOG.warning(_LW("There is no data in the DNS_ZONE_INFO")) + raise exception.IsNotExistError(param_name="Zone with id=" + id) + return zone_objs + + def get_db_zones(self, context, zones): + """Todo call DB to get all zones""" + # init the DB operations object + zone_obj = objects.DnsZone(context) + # Filter the data that has been disabled + zones['deleted'] = "0" + # get the like values + like_list = ['zone_name', 'owners', 'default_ttl', 'slaves', 'renewal'] + # get the union values + search_list = ['tenant_id', 'deleted'] + # get the run sqlstr + like_dic, search_dic = tools.classfiy_sql_keys(zones, like_list, + search_list) + zone_objs = zone_obj.get_all_objects_by_conditions(context, like_dic, + search_dic) + if zone_objs is None: + LOG.warning(_LW("There is no data in the dns_zone_info")) + raise exception.IsNotExistError(param_name="Zone with id=" + id) + return zone_objs + + def get_dev_records(self, context, zone_id): + try: + response = self.rpc_api.get_records(context, zone_id) + except MessagingTimeout as e: + raise e + return response + + def get_db_records(self, context, zone_id): + # check zone if is not exsit + target_zone = self.is_exist_zone(context, zone_id) + # dev_zone_id is zone_id of device + if target_zone is None: + raise exception.IsNotExistError(param_name=zone_id) + rrs_dic = {} + rrs_dic['zone_id'] = zone_id + rrs_dic['deleted'] = False + rrs_obj = objects.DnsZoneRrs(context, **rrs_dic) + target = None + try: + target = rrs_obj.get_objects(context, **rrs_dic) + except db_exception as e: + raise e + return target + + def query_records(self, context, rrs): + LOG.info(_LI("the query_records method of the dns_manager start")) + key = rrs.keys() + if "name" in key: + if tools.is_not_nil(rrs['name']): + rrs["rrs_name"] = rrs["name"] + rrs['deleted'] = "0" + like_list = ['rrs_name', 'ttl', "rdata"] + search_list = ["type", "deleted", "tenant_id"] + like_dic, search_dic = tools.classfiy_sql_keys( + rrs, like_list, search_list) + rrs_obj = objects.DnsZoneRrs(context, **rrs) + query = rrs_obj.get_all_objects_by_conditions(context, like_dic, + search_dic) + return query + + # TODO this is a test environment method,and it will + # be deleted after deployment in a production environment + # Begin + def query_records_in_test_env(self, context, rrs): + LOG.info(_LI("the query_records_in_test_env method" + "of the dns_manager start")) + key = rrs.keys() + if tools.is_not_nil(rrs['test_environment']): + zone_name = rrs["test_environment"] + zone_name_dic = {} + zone_name_dic['zone_name'] = zone_name + zone_name_dic['deleted'] = False + zone_obj = objects.DnsZone(context, **zone_name_dic) + try: + target_zone = zone_obj.get_object(context, **zone_name_dic) + except Exception: + raise exception.IsNotExistError( + param_name=rrs["test_environment"]) + zone_id = target_zone["id"] + rrs["zone_id"] = zone_id + search_list = ["type", "deleted", "zone_id", "tenant_id"] + if "name" in key: + if tools.is_not_nil(rrs['name']): + rrs["rrs_name"] = rrs["name"] + rrs['deleted'] = "0" + like_list = ['rrs_name', 'ttl', "rdata"] + like_dic, search_dic = tools.classfiy_sql_keys( + rrs, like_list, search_list) + rrs_obj = objects.DnsZoneRrs(context, **rrs) + query = rrs_obj.get_all_objects_by_conditions(context, like_dic, + search_dic) + return query + + def create_record_in_test_env(self, context, record): + LOG.info(_LI("the create_record_in_test_env method" + "of the dns_manager start")) + zone_name_env = { + "hfadv": "hfadv", + "hfdev": "hfdev", + "hfpfm": "hfpfm", + "hfpre": "hfpre", + "hfsit": "hfsit", + "hfsys": "hfsys", + "hftest": "hftest", + "hf": "hf", + "hfuat": "hfuat", + "test": "test", + "pfm": "pfm", + "uat": "uat" + } + # insert operation history type with Creating in DB + input_str = json.dumps(record) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # check zone_record is or not exsit + target_record = self.is_exist_zone_record(context, record) + if target_record is not None: + LOG.warning(_LW("the record object with name = %(record)s" + " already exists in DB"), + {"record": record['name']}) + raise exception.HaveSameObject(param_name=record['name']) + json_name = record['name'] + zone_name = zone_name_env[record["environment_name"]] + dev_zone_name = '%s%s' % ('.', zone_name) + if not json_name.endswith(dev_zone_name): + exception.ParamValueError(param_name="environment_name") + zone_name_dic = {} + zone_name_dic['zone_name'] = zone_name + zone_name_dic['deleted'] = False + zone_obj = objects.DnsZone(context, **zone_name_dic) + try: + target_zone = zone_obj.get_object(context, **zone_name_dic) + except Exception: + raise exception.IsNotExistError(param_name="environment_name") + zone_id = target_zone["id"] + + LOG.info(_LI("the zone object with id=%(zone_name)s is existed"), + {"zone_name": zone_name}) + record["zone_id"] = zone_id + record_values = self._make_dns_record_object(record) + record_obj = objects.DnsZoneRrs(context, **record_values) + # return response from DB + response = self._create_in_storage(context, record_obj) + new_name = tools.clean_end_str(dev_zone_name, record['name']) + record['name'] = new_name + try: + response_dev = self.rpc_api.create_record(context, record, + zone_name) + except Exception as e: + LOG.error(_LE("Create response on device failed")) + # since create failed in device, so delete object in DB + self.delete_rrs_info(context, response["id"]) + raise e + # update dns_rrs_info table, since record id would be changed + response = self.update_rrs_info(context, response["id"], + None, response_dev) + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return response + + # End test environment + + def get_record_from_db(self, context, record_id): + record_dic = {} + record_dic['id'] = record_id + record_dic['deleted'] = False + rrs_obj = objects.DnsZoneRrs(context) + target = None + try: + target = rrs_obj.get_object(context, **record_dic) + except Exception: + raise exception.IsNotExistError(param_name="records with id = " + + record_id) + return target + + def _valid_if_zone_exist(self, context, zone): + """Check the zone which have same name if is exist in DB""" + zone_name_dic = {} + zone_name_dic['zone_name'] = zone.zone_name + zone_name_dic['deleted'] = False + target_zone = None + try: + # get the zone in db + target_zone = zone.get_object(context, **zone_name_dic) + except Exception: + pass + return target_zone + + def _valid_if_obj_exist(self, context, table_obj, query_obj_dic): + """Check the data which have same name if is exist in DB""" + query_obj_dic['deleted'] = False + rst_qry_obj = None + try: + # get the result in db + rst_qry_obj = table_obj.get_object(context, **query_obj_dic) + except Exception: + pass + return rst_qry_obj + + def _create_in_storage(self, context, obj): + """create the zone in DB""" + try: + # create the obj in db + obj = obj.create(context, obj.as_dict()) + except db_exception: + LOG.error(_LE("Create/Insert db operation failed!")) + raise db_exception + return obj + + def create_record(self, context, record): + LOG.info(_LI("the create_record method of the dns_manager start")) + # insert operation history type with Creating in DB + input_str = json.dumps(record) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # check zone_record is or not exsit + target_record = self.is_exist_zone_record(context, record) + if target_record is not None: + LOG.warning(_LW("the record object with name = %(record)s" + " already exists in DB"), + {"record": record['name']}) + raise exception.HaveSameObject(param_name=record['name']) + json_name = record['name'] + + zones = self.get_zone_name_bytenant_id(context, record['tenant_id']) + if len(zones) == 0: + raise exception.IsNotExistError(param_name="tenant_id") + flag = True + for zone in zones: + zone_name = zone["zone_name"] + dev_zone_name = '%s%s' % ('.', zone_name) + if json_name.endswith(dev_zone_name): + zone_id = zone["id"] + flag = False + break + if flag: + raise exception.ZoneOfRecordIsError(name=json_name, + tenant=record['tenant_id']) + + LOG.info(_LI("the zone object with id=%(zone_name)s is existed"), + {"zone_name": zone_name}) + record["zone_id"] = zone_id + record_values = self._make_dns_record_object(record) + record_obj = objects.DnsZoneRrs(context, **record_values) + # return response from DB + response = self._create_in_storage(context, record_obj) + new_name = tools.clean_end_str(dev_zone_name, record['name']) + record['name'] = new_name + try: + response_dev = self.rpc_api.create_record(context, record, + zone_name) + except Exception as e: + LOG.error(_LE("Create response on device failed")) + # since create failed in device, so delete object in DB + self.delete_rrs_info(context, response["id"]) + raise e + # update dns_rrs_info table, since record id would be changed + response = self.update_rrs_info(context, response["id"], + None, response_dev) + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return response + + def update_record(self, context, record): + # insert operation history type with Creating in DB + input_str = json.dumps(record) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'UPDATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + record_obj = self.get_record_from_db(context, record["id"]) + zone_id = record_obj["zone_id"] + zone = self.is_exist_zone(context, zone_id) + if zone is None: + raise exception.IsNotExistError(param_name="record zone") + dev_zone_id = zone["zone_name"] + LOG.info(_LI("%(zone_name)s is existed"), {"zone_name": dev_zone_id}) + # return response from DB + response = self.update_rrs_info(context, record["id"], record, None) + # dev_rrs_id is rrs_id of device + dev_rrs_id = response["rrs_id"] + try: + # handling update zone record method in RPC + # return response from Device + response_dev = self.rpc_api.update_record(context, record, + dev_zone_id, dev_rrs_id) + except Exception as e: + LOG.error(_LE("Update response on device failed")) + # DB rollback + rrs_obj = objects.DnsZoneRrs(context) + rrs_obj.update(context, record["id"], record_obj) + # raise the exception for catch + raise e + response_upd = self.update_rrs_info(context, record["id"], + None, response_dev) + if ("ttl" in record.keys()) and (record_obj["ttl"] != record["ttl"]): + self.update_rrs_info_byget_objs(context, dev_zone_id, response_dev) + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return response_upd + + def delete_record(self, context, rrs): + # insert operation history type with Creating in DB + input_str = "delete_record" + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + org_db_record_obj = self.get_record_from_db(context, rrs["id"]) + zone_id = org_db_record_obj["zone_id"] + zone = self.is_exist_zone(context, zone_id) + if zone is None: + raise exception.IsNotExistError(param_name="record zone") + dev_zone_id = zone["zone_name"] + LOG.info(_LI("%(dev_zone_id)s is existed"), + {"dev_zone_id": dev_zone_id}) + response = self.delete_rrs_info(context, rrs["id"]) + # dev_rrs_id is rrs_id of device + dev_rrs_id = response["rrs_id"] + try: + # handling delete zone record method in RPC + # delete a information of dns_rrs_info table from Device + response_dev = self.rpc_api.delete_record(context, + dev_zone_id, + dev_rrs_id) + except Exception as e: + LOG.error(_LE("Delete response on device failed")) + # Rollback DB + rrs_obj = objects.DnsZoneRrs(context) + rrs_obj.update(context, rrs["id"], org_db_record_obj) + raise e + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return response_dev + + # The following is a method that cleaning the cache ! + def del_cache(self, context, domain): + """Clear DNS cache""" + # insert operation history type with Creating in DB + input_str = json.dumps(domain) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + try: + # delete the dns cache + response = self.rpc_api.del_cache(context, domain) + except Exception as e: + LOG.error(_LE("Clear Cache response on device failed")) + # raise the exception for catch + raise e + # update operation history type with Success in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return response + + def _make_dns_zone_object(self, zone_values): + target_values = {} + for k in zone_values.keys(): + if k == 'name': + target_values['zone_name'] = zone_values[k] + elif k == 'current_user': + pass + else: + target_values[k] = zone_values[k] + return target_values + + def _make_dns_record_object(self, record_values): + target_values = {} + target_values["zone_id"] = record_values["zone_id"] + for k in record_values.keys(): + if k == 'name': + target_values['rrs_name'] = record_values[k] + else: + target_values[k] = record_values[k] + return target_values + + def is_exist_zone_record(self, context, dic): + rrs_dic = {} + rrs_dic['rrs_name'] = dic["name"] + rrs_dic['rdata'] = dic["rdata"] + rrs_dic['deleted'] = False + rrs_obj = objects.DnsZoneRrs(context, **rrs_dic) + target = None + try: + target = rrs_obj.get_object(context, **rrs_dic) + except Exception: + pass + return target + + def is_exist_zone(self, context, zone_id): + zone_name_dic = {} + zone_name_dic['id'] = zone_id + zone_name_dic['deleted'] = False + zone_obj = objects.DnsZone(context, **zone_name_dic) + target_zone = None + try: + target_zone = zone_obj.get_object(context, **zone_name_dic) + except Exception: + pass + return target_zone + + def update_rrs_info(self, context, record_id, dic, response_dev): + rrs_resp = {} + if response_dev is not None: + rrs_resp["rrs_id"] = response_dev["id"] + else: + if "ttl" in dic.keys(): + rrs_resp["ttl"] = dic["ttl"] + if "rdata" in dic.keys(): + rrs_resp["rdata"] = dic["rdata"] + rrs_obj = objects.DnsZoneRrs(context, **rrs_resp) + try: + record = rrs_obj.update(context, record_id, rrs_resp) + except db_exception: + LOG.error(_LE("update_rrs_info method operation failed!")) + raise db_exception + return record + + def update_rrs_info_byget_objs(self, context, zone_id, rps_dev): + rrs_resp = {} + rrs_resp["ttl"] = rps_dev["ttl"] + get_objs = {} + get_objs["rrs_name"] = rps_dev["name"] + get_objs["type"] = rps_dev["type"] + get_objs["zone_id"] = zone_id + rrs_get_objs = objects.DnsZoneRrs(context, **get_objs) + try: + rrs_list = rrs_get_objs.get_objects(context, **get_objs) + rrs_obj = objects.DnsZoneRrs(context, **rrs_resp) + for rrs in rrs_list: + rrs_info_id = rrs["id"] + rrs_obj.update(context, rrs_info_id, rrs_resp) + except db_exception: + LOG.error(_LE("update_rrs_info_byid method operation failed!")) + raise db_exception + + def delete_rrs_info(self, context, record_id): + rrs_obj = objects.DnsZoneRrs(context) + record = None + try: + record = rrs_obj.delete(context, record_id) + except db_exception: + LOG.error(_LE("delete_rrs_info method operation failed!")) + raise db_exception + return record + + def get_zone_name_bytenant_id(self, context, tenant_id): + zone_name_dic = {} + zone_name_dic['tenant_id'] = tenant_id + zone_name_dic['deleted'] = False + zone_obj = objects.DnsZone(context, **zone_name_dic) + target_zone = None + try: + target_zone = zone_obj.get_objects(context, **zone_name_dic) + except Exception: + pass + return target_zone + + def create_region(self, context, region): + """ + create region handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = json.dumps(region) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # init the DB operations object + region_obj = objects.RegionInfo(context, **region) + # Check the region which have same name if is exist in DB + target_region = self._valid_if_obj_exist(context, region_obj, region) + if target_region is not None: + LOG.warning(_LW("Have same region name and tenant_id in DB")) + raise exception.HaveSameObject(param_name=target_region.name) + # create the region info in db + db_region_obj = self._create_in_storage(context, region_obj) + # the dic for modify + update_region_dic = {} + try: + # handling create region method in RPC + response = self.rpc_api.glsb_math(context, region, "create_region") + except Exception: + LOG.error(_LE("Create corresponding response on device failed")) + # DB rollback since create region failed in Device + region_obj.delete(context, db_region_obj['id']) + raise + # do update the data from device + update_region_dic['region_id'] = response['id'] + update_region_dic['refcnt'] = response['refcnt'] + # modify the database for column(region_id refcnt) + update_region_rst = region_obj.update(context, db_region_obj['id'], + update_region_dic) + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history(context, history['id'], + **input_operation_history) + return update_region_rst + + def create_member(self, context, member): + """ + create region member handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = json.dumps(member) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # if the member is already + query_member_dic = {} + query_member_dic['region_id'] = member['region_uuid'] + query_member_dic['type'] = member['type'] + query_member_dic['data1'] = member['data1'] + # init the DB operations object + region_member_obj = objects.RegionUserInfo(context, **member) + # Check the region which have same name if is exist in DB + target_region_user = self._valid_if_obj_exist(context, + region_member_obj, + query_member_dic) + if target_region_user is not None: + LOG.warning(_LW("Have same region member name in DB")) + raise exception.HaveSameObject(param_name=target_region_user.name) + # query the region_info to get the value of name + query_member_dic = {} + query_member_dic['id'] = member['region_uuid'] + query_member_dic['tenant_id'] = member['tenant_id'] + region_obj = objects.RegionInfo(context) + # Check the region which have same name if is exist in DB + target_region = self._valid_if_obj_exist(context, region_obj, + query_member_dic) + if target_region is None: + LOG.warning(_LW("The object of %(param_name)s don't exist!") + + member['region_uuid']) + raise exception.IsNotExistError(param_name=member['region_uuid']) + # get the region name insert into region_user + member['name'] = target_region.name + member['region_id'] = member['region_uuid'] + # get the DB operations object + region_member_obj = objects.RegionUserInfo(context, **member) + # create the region member info in db + db_region_member_obj = self._create_in_storage(context, + region_member_obj) + # the dic for modify + update_region_dic = {} + try: + # handling create region member method in RPC + response = self.rpc_api.glsb_math(context, member, "create_member") + except Exception: + LOG.error(_LE("Create corresponding response on device failed")) + # DB rollback since create region member failed + region_member_obj.delete(context, db_region_member_obj.id) + raise + # do update the table from device + update_region_dic['region_useruser_id'] = response['id'] + # modify the database for column(region_id refcnt) + update_region_rst = region_member_obj.update(context, + db_region_member_obj.id, + update_region_dic) + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history(context, history['id'], + **input_operation_history) + return update_region_rst + + def delete_member(self, context, id): + """ + delete region member handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = "delete region member" + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # if the member is already + query_member_dic = {} + query_member_dic['id'] = id + # init the DB operations object + region_member_obj = objects.RegionUserInfo(context) + # Check the region which have same name if is exist in DB + target_region_user = self._valid_if_obj_exist(context, + region_member_obj, + query_member_dic) + # delete the region in db + rst_del_member = region_member_obj.delete(context, id) + try: + # get the region info by id + result_region = self.get_region_db_detail(context, + rst_del_member.region_id) + # get the new member dict + del_member_dic = {} + del_member_dic['name'] = result_region['region_id'] + del_member_dic['member_name'] = rst_del_member[ + 'region_useruser_id'] + # handling delete member method in RPC + response = self.rpc_api.glsb_math(context, del_member_dic, + "delete_member") + except Exception: + LOG.error(_LE("Delete corresponding response on device failed")) + # since delete failed in device, so re-update back object in DB + region_member_obj.update(context, id, target_region_user) + # raise the exception for catch + raise + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history(context, history['id'], + **input_operation_history) + return response + + def get_members(self, context): + """Todo call DB to get all members""" + # init the DB operations object + region_obj = objects.RegionUserInfo(context) + # Filter the data that has been disabled + query_region_dic = {} + query_region_dic['deleted'] = False + # Todo call DB to get all regions + region_objs = region_obj.get_objects(context, **query_region_dic) + if region_objs is None: + LOG.warning(_LW("There is no data in the dns_region_info")) + raise exception.IsNotExistError(param_name="region with id=" + id) + return region_objs + + def get_db_members(self, context, members): + """Todo call DB to get all members""" + # init the DB operations object + region_obj = objects.RegionUserInfo(context) + # Filter the data that has been disabled + members['deleted'] = "0" + # get the like values + like_list = ['name', 'data1'] + # get the union values + search_list = ['type', 'tenant_id', 'deleted'] + # get the run sqlstr + like_dic, search_dic = tools.classfiy_sql_keys(members, like_list, + search_list) + members_objs = region_obj.get_all_objects_by_conditions(context, + like_dic, + search_dic) + if members_objs is None: + LOG.warning(_LW("There is no data in the region_user_info")) + raise exception.IsNotExistError(param_name="region with id=" + id) + return members_objs + + def get_one_member(self, context, region_userid): + """Todo call DB to get all members""" + # init the DB operations object + region_obj = objects.RegionUserInfo(context) + # Filter the data that has been disabled + query_region_dic = {} + query_region_dic["id"] = region_userid + query_region_dic['deleted'] = False + # Todo call DB to get all regions + try: + region_objs = region_obj.get_object(context, **query_region_dic) + except Exception: + raise exception.IsNotExistError(param_name="region" + "with id=" + + region_userid) + return region_objs + + def delete_region(self, context, id): + """ + delete region handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = "delete region" + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # get the region info by id + result_region = self.get_region_db_detail(context, id) + # if the region used by sp_policy(src_data1) + qry_policy_src_data1_dic = {} + qry_policy_src_data1_dic['src_data1'] = result_region['name'] + # init the DB operations object + proximity_obj = objects.SP_Policy(context) + # Check the region which have same name(src_data1) in sp_policy + target_sp_policy = self._valid_if_obj_exist(context, proximity_obj, + qry_policy_src_data1_dic) + if target_sp_policy is not None: + LOG.warning(_LW("The Object name=%(name)s is being used !") + + result_region['name']) + raise exception.IsBeingUsedError(name=result_region['name']) + else: + # if the region used by sp_policy(dst_data1) + qry_policy_dst_data1_dic = {} + qry_policy_dst_data1_dic['dst_data1'] = result_region['name'] + # Check the region which have same name(dst_data1) in sp_policy + target_sp_policy = self._valid_if_obj_exist( + context, proximity_obj, qry_policy_dst_data1_dic) + if target_sp_policy is not None: + LOG.warning(_LW("The Object name=%(name)s is being used !") + + result_region['name']) + raise exception.IsBeingUsedError(name=result_region['name']) + # Check the if the region used by region_user + qry_member_data1_dic = {} + qry_member_data1_dic['data1'] = result_region['name'] + # init the DB operations object + region_member_obj = objects.RegionUserInfo(context) + # Check the region which have same name if is exist in DB + target_member_data1 = self._valid_if_obj_exist(context, + region_member_obj, + qry_member_data1_dic) + if target_member_data1 is not None: + LOG.warning(_LW("The Object name=%(name)s is being used !") + + result_region['name']) + raise exception.IsBeingUsedError(name=result_region['name']) + # init the DB operations object + region_obj = objects.RegionInfo(context) + # delete the region in db + db_region_obj = region_obj.delete(context, id) + # get the region members to delete + member_dic = {} + member_dic['region_id'] = id + get_member_obj = objects.RegionUserInfo(context) + region_member_records = get_member_obj.get_objects(context, + **member_dic) + for member_record in region_member_records: + get_member_obj.delete(context, member_record.id) + try: + delete_region_dic = {} + delete_region_dic['name'] = db_region_obj['region_id'] + # handling delete region method in RPC + response = self.rpc_api.glsb_math(context, delete_region_dic, + "delete_region") + except Exception: + LOG.error(_LE("Delete corresponding response on device failed")) + # since delete failed in device, so re-update back object in DB + region_obj.update(context, id, result_region) + for member_record in region_member_records: + get_member_obj.update(context, member_record.id, member_record) + # raise the exception for catch + raise + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return response + + def get_region_db_detail(self, context, id): + """Todo call DB to get one region""" + # init the DB operations object + region_obj = objects.RegionInfo(context) + region_query_dic = {} + region_query_dic['id'] = id + region_query_dic['deleted'] = False + # try/catch the no one get + try: + # Todo call DB to get one region by id + region_obj = region_obj.get_object(context, **region_query_dic) + except Exception: + LOG.warning(_LW("No region with id=%(id)s in DB"), {"id": id}) + raise exception.IsNotExistError(param_name="Region with id=" + id) + return region_obj + + def get_region_user_db_detail(self, context, region_id): + """Todo call DB to get one region user""" + # init the DB operations object + region_user_obj = objects.RegionUserInfo(context) + region_query_dic = {} + region_query_dic['region_id'] = region_id + region_query_dic['deleted'] = False + # try/catch the no one get + try: + # Todo call DB to get one region by id + region_user_obj = region_user_obj.get_object(context, + **region_query_dic) + except Exception: + LOG.warning(_LW("No region user with id=%(id)s in DB"), {"id": id}) + raise exception.IsNotExistError(param_name="region user with id=" + + id) + return region_user_obj + + def get_all_db_region(self, context): + """Todo call DB to get all regions""" + # init the DB operations object + region_obj = objects.RegionInfo(context) + # Filter the data that has been disabled + query_region_dic = {} + query_region_dic['deleted'] = False + # Todo call DB to get all regions + region_objs = region_obj.get_objects(context, **query_region_dic) + if region_objs is None: + LOG.warning(_LW("There is no data in the dns_region_info")) + raise exception.IsNotExistError(param_name="region with id=" + id) + return region_objs + + def get_db_regions(self, context, regions): + """Todo call DB to get all regions""" + # init the DB operations object + region_obj = objects.RegionInfo(context) + # Filter the data that has been disabled + regions['deleted'] = "0" + # get the like values + like_list = ['name'] + # get the union values + search_list = ['tenant_id', 'deleted'] + # get the run sqlstr + like_dic, search_dic = tools.classfiy_sql_keys(regions, like_list, + search_list) + regions_objs = region_obj.get_all_objects_by_conditions(context, + like_dic, + search_dic) + if regions_objs is None: + LOG.warning(_LW("There is no data in the dns_region_info")) + raise exception.IsNotExistError(param_name="region with id=" + id) + return regions_objs + + def create_sp_policy(self, context, proximity): + """ + create proximity handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = json.dumps(proximity) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # init the DB operations object + proximity_obj = objects.SP_Policy(context, **proximity) + # create the proximity info in db + db_proximity_obj = self._create_in_storage(context, proximity_obj) + # the dic for modify + update_proximity_dic = {} + try: + # handling create proximity method in RPC + response = self.rpc_api.glsb_math(context, proximity, + "create_sp_policy") + except Exception: + LOG.error(_LE("Create corresponding response on device failed")) + # DB rollback since create proximity failed in Device + proximity_obj.delete(context, db_proximity_obj['id']) + raise Exception + update_proximity_dic['sp_policy_id'] = response['id'] + update_proximity_dic['name'] = response['id'] + # modify the database for column(sp_policy_id) + update_proximity_rst = proximity_obj.update(context, + db_proximity_obj['id'], + update_proximity_dic) + # return the priority from device + update_proximity_rst['priority'] = response['priority'] + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return update_proximity_rst + + def delete_sp_policy(self, context, id): + """ + delete proximity handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = "delete sp policy" + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # get the proximity info by id + result_proximity = self.get_proximity_db_detail(context, id) + # init the DB operations object + proximity_obj = objects.SP_Policy(context) + # delete the proximity in db + db_proximity_obj = proximity_obj.delete(context, id) + try: + d_proximity_dic = {} + d_proximity_dic['sp_policy_id'] = db_proximity_obj['sp_policy_id'] + d_proximity_dic['name'] = db_proximity_obj['sp_policy_id'] + # handling delete proximity method in RPC + response = self.rpc_api.glsb_math(context, d_proximity_dic, + "delete_sp_policy") + except Exception: + LOG.error(_LE("Delete corresponding response on device failed")) + # since delete failed in device, so re-update back object in DB + proximity_obj.update(context, id, result_proximity) + # raise the exception for catch + raise + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return response + + def update_sp_policy(self, context, proximity, id): + """ + update proximity handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = json.dumps(proximity) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'UPDATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # get the proximity info by id + result_proximity = self.get_proximity_db_detail(context, id) + # update the proximity in device + proximity['priority'] = proximity['new_priority'] + try: + u_proximity_dic = {} + u_proximity_dic['sp_policy_id'] = result_proximity['sp_policy_id'] + u_proximity_dic['name'] = result_proximity['sp_policy_id'] + # the dic for update by device + update_region_dic = tools.dict_merge(proximity, u_proximity_dic) + # handling delete proximity method in RPC + response = self.rpc_api.glsb_math(context, update_region_dic, + "update_sp_policy") + except Exception: + LOG.error(_LE("Delete corresponding response on device failed")) + # raise the exception for catch + raise + # update operation history type with Failed in DB + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + # get the uuid from db + response['id'] = id + return response + + def get_sp_policy(self, context, id): + """getting target policy details from dns device""" + # query the sp_policy_info to get the value of name + query_sp_policy_dic = {} + query_sp_policy_dic['id'] = id + sp_policy_obj = objects.SP_Policy(context) + # Check the region which have same name if is exist in DB + target_sp_policy = self._valid_if_obj_exist(context, sp_policy_obj, + query_sp_policy_dic) + if target_sp_policy is None: + LOG.warning(_LW("The object of %(param_name)s don't exist!") + id) + raise exception.IsNotExistError(param_name=id) + sp_policy_dic = {} + sp_policy_dic['name'] = target_sp_policy['sp_policy_id'] + try: + # handling policy method in RPC + response = self.rpc_api.glsb_math(context, sp_policy_dic, + "get_sp_policy") + response["id"] = id + except Exception as e: + raise e + return response + + def get_sp_policys(self, context): + """handling policys method in RPC""" + try: + # handling policys method in RPC + response = self.rpc_api.glsb_math(context, {}, "get_sp_policys") + except Exception as e: + raise e + return response + + def get_proximity_db_detail(self, context, id): + """Todo call DB to get one proximity""" + # init the DB operations object + region_obj = objects.SP_Policy(context) + region_query_dic = {} + region_query_dic['id'] = id + region_query_dic['deleted'] = False + # try/catch the no one get + try: + # Todo call DB to get one region by id + region_obj = region_obj.get_object(context, **region_query_dic) + except Exception: + LOG.warning(_LW("No proximity with id=%(id)s in DB"), {"id": id}) + raise exception.IsNotExistError(param_name="proximity id=" + id) + return region_obj + + def get_all_db_proximity(self, context): + """Todo call DB to get all proximitys""" + # init the DB operations object + proximity_obj = objects.SP_Policy(context) + # Filter the data that has been disabled + query_proximity_dic = {} + query_proximity_dic['deleted'] = False + # Todo call DB to get all proximitys + proximity_objs = proximity_obj.get_objects(context, + **query_proximity_dic) + if proximity_objs is None: + LOG.warning(_LW("There is no data in the dns_proximity_info")) + raise exception.IsNotExistError(param_name="proximity id=" + id) + return proximity_objs + + def get_db_proximitys(self, context, proximitys): + """Todo call DB to get all proximitys""" + # init the DB operations object + proximity_obj = objects.SP_Policy(context) + # Filter the data that has been disabled + proximitys['deleted'] = "0" + # get the like values + like_list = ['src_data1', 'dst_data1'] + # get the union values + search_list = ['src_type', 'src_logic', 'dst_type', 'dst_logic', + 'tenant_id', 'deleted'] + # get the run sqlstr + like_dic, search_dic = tools.classfiy_sql_keys(proximitys, like_list, + search_list) + proximitys_objs = proximity_obj.get_all_objects_by_conditions( + context, like_dic, search_dic) + if proximitys_objs is None: + LOG.warning(_LW("There is no data in the dns_proximity_info")) + raise exception.IsNotExistError(param_name="proximity id=" + id) + return proximitys_objs + + # operation gmembers + def get_gmembers_db(self, context, dic): + """get all gmembers""" + obj = objects.Gmember(context) + dic['deleted'] = "0" + like_list = ['name', 'gslb_zone_name', 'ip'] + search_list = ["tenant_id", "port", "enable", "deleted"] + like_dic, search_dic = tools.classfiy_sql_keys(dic, like_list, + search_list) + query = obj.get_all_objects_by_conditions(context, like_dic, + search_dic) + return query + + # operation gmembers + def get_gmembers_db_restful(self, context): + """get all gmembers""" + gmember_kwarg = {} + gmember_kwarg["deleted"] = False + gmember_instance = objects.Gmember(context, **gmember_kwarg) + return gmember_instance.get_objects(context, **gmember_kwarg) + + def get_one_gmember_db(self, context, gmember_uuid): + """get a gmember""" + gmember_kwarg = {} + gmember_kwarg["id"] = gmember_uuid + gmember_kwarg["deleted"] = False + gmember_instance = objects.Gmember(context, **gmember_kwarg) + try: + gme_info = gmember_instance.get_object(context, **gmember_kwarg) + except Exception: + raise exception.IsNotExistError(param_name=gmember_uuid) + return gme_info + + def create_gmember(self, context, dic): + """create a gmember""" + # insert operation history type with Creating in DB + history_kwargs = self.db_common.history_col_info(dic, + "CREATE_GMEMBER", + "FAILED") + history = self.db_common.insert_operation_history(context, + **history_kwargs) + # check gslb_zone is or not exsit + gslb_zone_kwarg = {} + gslb_zone_kwarg["tenant_id"] = dic["tenant_id"] + gslb_zone_kwarg["name"] = dic["gslb_zone_name"] + gslb_zone_kwarg["deleted"] = False + + try: + instance = objects.GslbZone(context, **gslb_zone_kwarg) + instance.get_object_one(context, **gslb_zone_kwarg) + except Exception as e: + raise exception.IsNotExistError(param_name=dic["gslb_zone_name"]) + gmember_kwarg = {} + gmember_kwarg["tenant_id"] = dic["tenant_id"] + gmember_kwarg["name"] = dic["name"] + gmember_kwarg['deleted'] = False + try: + instance = objects.Gmember(context, **gmember_kwarg) + get_gmember = instance.get_object(context, **gmember_kwarg) + except Exception: + get_gmember = None + # check gmember is or not exsit + if get_gmember is not None: + raise exception.HaveSameObject(param_name=dic["name"]) + gmember_args = {} + gmember_args["ip"] = dic["ip"] + gmember_args["port"] = dic["port"] + gmember_args['deleted'] = False + try: + instance_args = objects.Gmember(context, **gmember_args) + gmember_args_info = instance_args.get_object(context, + **gmember_args) + except Exception: + gmember_args_info = None + # check gmember is or not exsit + if gmember_args_info is not None: + param_name = '%s and %s' % (dic["ip"], dic["port"]) + raise exception.HaveSameError(param_name=param_name) + + create_instance = objects.Gmember(context, **dic) + # return response from DB + response_create = self.db_common.create_in_storage(context, + create_instance) + try: + response_dev = self.rpc_api.glsb_math(context, dic, + "create_gmember") + except Exception as e: + LOG.error(_LE("Create response on device failed")) + # since create failed in device, so delete object in DB + error_instance = objects.Gmember(context) + error_instance.delete(context, response_create["id"]) + raise e + # update dns_gmember_info table, since record id would be changed + update_info = {} + update_info["refcnt"] = response_dev["refcnt"] + update_info["gmember_id"] = response_dev["id"] + update_instance = objects.Gmember(context, **update_info) + response_db = update_instance.update(context, + response_create["id"], + update_info) + # update operation history type with Failed in DB + history_kwargs = self.db_common.history_col_info(dic, + "CREATE_GMEMBER", + "SUCCESS") + self.db_common.update_operation_history(context, history['id'], + **history_kwargs) + return response_db + + def update_gmember(self, context, dic, gmember_uuid): + """update gmember info""" + # insert operation history type with Creating in DB + history_kwargs = self.db_common.history_col_info(dic, + "UPDATE_GMEMBER", + "FAILED") + history = self.db_common.insert_operation_history(context, + **history_kwargs) + gmember_kwarg = {} + gmember_kwarg["id"] = gmember_uuid + gmember_kwarg['deleted'] = False + gmember = objects.Gmember(context, **gmember_kwarg) + try: + gmemberinfo = gmember.get_object(context, **gmember_kwarg) + except Exception: + raise exception.IsNotExistError(param_name=gmember_uuid) + values = {} + values["enable"] = dic["enable"] + gmember_instance = objects.Gmember(context, **values) + gmember_upd = gmember_instance.update(context, gmember_uuid, values) + dic["gmember_id"] = gmember_upd["gmember_id"] + gslb_zone_kwarg = {} + gslb_zone_kwarg["tenant_id"] = gmember_upd["tenant_id"] + gslb_zone_kwarg["name"] = gmember_upd["gslb_zone_name"] + gslb_zone_kwarg['deleted'] = False + gslb_instance = objects.GslbZone(context, **gslb_zone_kwarg) + try: + gslb_info = gslb_instance.get_object(context, **gslb_zone_kwarg) + except Exception: + raise exception.IsNotExistError(param_name="the gslb_zone ") + dic["gslb_zone_name"] = gslb_info["name"] + dic["gmember_name"] = gmemberinfo["gmember_id"] + try: + self.rpc_api.glsb_math(context, dic, "update_gmember") + except Exception as e: + LOG.error(_LE("Update corresponding response on device failed")) + gmember.update(context, gmember_uuid, gmemberinfo) + raise e + # update operation history type with Failed in DB + history_kwargs = self.db_common.history_col_info(dic, + "UPDATE_GMEMBER", + "SUCCESS") + self.db_common.update_operation_history(context, history['id'], + **history_kwargs) + return gmember_upd + + def delete_gmember(self, context, gmember_uuid): + """delete target gmember""" + # insert operation history type with Creating in DB + history_kwargs = self.db_common.history_col_info("delete_gmember", + "DELETE_GMEMBER", + "FAILED") + history = self.db_common.insert_operation_history(context, + **history_kwargs) + gmember_kwarg = {} + gmember_kwarg["id"] = gmember_uuid + gmember_kwarg['deleted'] = False + gmember = objects.Gmember(context, **gmember_kwarg) + try: + gmemberinfo = gmember.get_object(context, **gmember_kwarg) + except Exception: + raise exception.IsNotExistError(param_name=gmember_uuid) + gmember_del = gmember.delete(context, gmember_uuid) + dic = {} + dic["gmember_id"] = gmember_del["gmember_id"] + gslb_zone_kwarg = {} + gslb_zone_kwarg["tenant_id"] = gmember_del["tenant_id"] + gslb_zone_kwarg["name"] = gmember_del["gslb_zone_name"] + gslb_zone_kwarg['deleted'] = False + gslb_instance = objects.GslbZone(context, **gslb_zone_kwarg) + try: + gslb_info = gslb_instance.get_object(context, **gslb_zone_kwarg) + except Exception: + raise exception.IsNotExistError(param_name="the gslb_zone ") + dic["gslb_zone_name"] = gslb_info["name"] + try: + response_dev = self.rpc_api.glsb_math(context, + dic, "delete_gmember") + except Exception as e: + LOG.error(_LE("Delete corresponding response on device failed")) + + gmember.update(context, gmember_uuid, gmemberinfo) + raise e + # update operation history type with Failed in DB + history_kwargs = self.db_common.history_col_info(dic, + "DELETE_GMEMBER", + "SUCCESS") + self.db_common.update_operation_history(context, history['id'], + **history_kwargs) + return response_dev + + def get_hm_templates_db(self, context, dic): + """get all hm_templates""" + obj = objects.HmTemplate(context) + dic['deleted'] = "0" + like_list = ['name'] + search_list = ["tenant_id", "deleted"] + like_dic, search_dic = tools.classfiy_sql_keys(dic, + like_list, search_list) + query = obj.get_all_objects_by_conditions(context, like_dic, + search_dic) + return query + + def get_one_hm_template_db(self, context, template_uuid): + """get a hm_template""" + hm_template_kwarg = {} + hm_template_kwarg["id"] = template_uuid + hm_template_kwarg["deleted"] = False + instance = objects.HmTemplate(context, **hm_template_kwarg) + try: + hm_template_info = instance.get_object(context, + **hm_template_kwarg) + except Exception: + raise exception.IsNotExistError(param_name=template_uuid) + return hm_template_info + + def create_hm_template(self, context, dic): + """create a hm_template""" + # insert operation history type with Creating in DB + history_kwargs = self.db_common.history_col_info(dic, + "ADD_HM_TEMPLATE", + "FAILED") + history = self.db_common.insert_operation_history(context, + **history_kwargs) + # check gslb_zone is or not exsit + hm_template_kwarg = {} + hm_template_kwarg["tenant_id"] = dic["tenant_id"] + hm_template_kwarg["name"] = dic["name"] + hm_template_kwarg['deleted'] = False + try: + instance = objects.HmTemplate(context, **hm_template_kwarg) + get_hm_template = instance.get_object(context, **hm_template_kwarg) + except Exception: + get_hm_template = None + if get_hm_template is not None: + raise exception.HaveSameObject(param_name=dic["name"]) + create_instance = objects.HmTemplate(context, **dic) + # return response from DB + response_db = self.db_common.create_in_storage(context, + create_instance) + try: + response_dev = self.rpc_api.glsb_math(context, dic, + "create_hm_template") + except Exception as e: + LOG.error(_LE("Create response on device failed")) + # since create failed in device, so delete object in DB + error_instance = objects.HmTemplate(context) + error_instance.delete(context, response_db["id"]) + raise e + # update dns_gmember_info table, since record id would be changed + update_info = {} + update_info["hm_template_id"] = response_dev["id"] + update_info["refcnt"] = response_dev["refcnt"] + update_instance = objects.HmTemplate(context, **update_info) + response_db = update_instance.update(context, + response_db["id"], + update_info) + + # update operation history type with Failed in DB + history_kwargs = self.db_common.history_col_info(dic, + "ADD_HM_TEMPLATE", + "SUCCESS") + self.db_common.update_operation_history(context, history['id'], + **history_kwargs) + return response_db + + def update_hm_template(self, context, dic, template_uuid): + """update hm_template info""" + # insert operation history type with Creating in DB + history_kwargs = self.db_common.history_col_info(dic, + "UPT_HM_TEMPLATE", + "FAILED") + history = self.db_common.insert_operation_history(context, + **history_kwargs) + hm_template_kwarg = {} + hm_template_kwarg["id"] = template_uuid + hm_template_kwarg['deleted'] = False + hm_template = objects.HmTemplate(context, **hm_template_kwarg) + try: + hm_template_info = hm_template.get_object(context, + **hm_template_kwarg) + except Exception: + raise exception.IsNotExistError(param_name=template_uuid) + + hm_template_instance = objects.HmTemplate(context, **dic) + hm_template_upd = hm_template_instance.update(context, + template_uuid, dic) + dic["hm_template_id"] = hm_template_info["hm_template_id"] + try: + self.rpc_api.glsb_math(context, dic, "update_hm_template") + except Exception as e: + LOG.error(_LE("Update corresponding response on device failed")) + hm_template.update(context, template_uuid, hm_template_info) + raise e + # update operation history type with Failed in DB + history_kwargs = self.db_common.history_col_info(dic, + "UPT_HM_TEMPLATE", + "SUCCESS") + self.db_common.update_operation_history(context, history['id'], + **history_kwargs) + return hm_template_upd + + def delete_hm_template(self, context, template_uuid): + """delete target hm_template""" + # insert operation history type with Creating in DB + history_kwargs = self.db_common.history_col_info("delete_hm_template", + "DEL_HM_TEMPLATE", + "FAILED") + history = self.db_common.insert_operation_history(context, + **history_kwargs) + hm_template_kwarg = {} + hm_template_kwarg["id"] = template_uuid + hm_template_kwarg['deleted'] = False + instance = objects.HmTemplate(context, **hm_template_kwarg) + try: + hm_template_info = instance.get_object(context, + **hm_template_kwarg) + except Exception: + raise exception.IsNotExistError(param_name=template_uuid) + hm_template_del = instance.delete(context, template_uuid) + dic = {} + dic["hm_template_id"] = hm_template_del["hm_template_id"] + try: + response_dev = self.rpc_api.glsb_math(context, + dic, "delete_hm_template") + except Exception as e: + LOG.error(_LE("Delete corresponding response on device failed")) + instance.update(context, template_uuid, hm_template_info) + raise e + # update operation history type with Failed in DB + history_kwargs = self.db_common.history_col_info(dic, + "DEL_HM_TEMPLATE", + "SUCCESS") + self.db_common.update_operation_history(context, history['id'], + **history_kwargs) + return response_dev + + # this is a gslb_zone operation + def create_gslb_zone(self, context, dns_object): + """ + update gslb_zone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + input_str = json.dumps(dns_object) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # input the staticnat values with dic format + gslb_obj = objects.GslbZone(context, **dns_object) + # create the staticnat info in db + result = gslb_obj.create(context, gslb_obj.as_dict()) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + + response_dev = self.rpc_api.glsb_math(context, dns_object, + "create_gslb_zone") + update_info = {} + update_info["gslb_zone_id"] = response_dev["id"] + instance = objects.GslbZone(context, **update_info) + response_db = instance.update(context, result["id"], update_info) + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return response_db + + def del_gslb_zone(self, context, dns_object): + """ + delete gslb_zone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + input_str = json.dumps(dns_object) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'delete' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # input the staticnat values with dic format + gslb_obj = objects.GslbZone(context, **dns_object) + # create the staticnat info in db + result = gslb_obj.delete(context, dns_object['id']) + dns_object["name"] = result["name"] + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + response = self.rpc_api.glsb_math(context, dns_object, + "delete_gslb_zone") + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return response + + def update_gslb_zone(self, context, zone_id, dns_object): + """ + update gslb_zone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + input_str = json.dumps(dns_object) + input_operation_history = {} + input_operation_history['input'] = input_str + input_operation_history['method'] = 'update' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # input the staticnat values with dic format + gslb_obj = objects.GslbZone(context, **dns_object) + # create the staticnat info in db + result = gslb_obj.update(context, zone_id, gslb_obj.as_dict()) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + dns_object["name"] = result["name"] + self.rpc_api.glsb_math(context, dns_object, "update_gslb_zone") + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def get_gslb_zone(self, context, dns_object): + """ + get gslb_zone handling DB operations + """ + # input the staticnat values with dic format + gslb_obj = objects.GslbZone(context, **dns_object) + # create the staticnat info in db + result = gslb_obj.get_object(context, **dns_object) + return result + + def get_gslb_zones(self, context, dns_object): + """ + get_all gslb_zone handling DB operations + """ + # input the staticnat values with dic format + gslb_obj = objects.GslbZone(context, **dns_object) + # create the staticnat info in db + result = gslb_obj.get_objects(context, **dns_object) + return result + + def _valid_if_exists(self, context, obj): + name_dic = {} + name_dic['name'] = obj.name + name_dic['deleted'] = False + target = None + try: + # get the zone in db + target = obj.get_object(context, **name_dic) + except Exception as e: + pass + return target + + def _get_syngroup_db_detail(self, context, id): + """ + get syngroup detail in db + :param context: + :param id: + :return: + """ + name_dic = {} + name_dic['id'] = id + name_dic['deleted'] = False + Syngroup_obj = objects.SynGroup(context) + target = None + try: + target = Syngroup_obj.get_object(context, **name_dic) + except Exception: + LOG.warning(_LW("No Syngroup with id = %(id)s in DB"), {"id": id}) + raise exception.IsNotExistError( + param_name="Syngroup with id=" + id) + return target + + def create_gpool(self, context, gpool_dict): + # create gpool + gpool_db_dict = copy.deepcopy(gpool_dict) + if 'pass' in gpool_db_dict.keys(): + gpool_db_dict['pass_'] = gpool_db_dict['pass'] + del gpool_db_dict['pass'] + gpool_db_create_obj = objects.GPool( + context, **gpool_db_dict + ) + if self._valid_if_exists(context, gpool_db_create_obj) is not None: + LOG.warning(_LW('Have same gpool id/name in DB')) + raise exception.HaveSameObject(param_name=gpool_db_dict['name']) + history_str = json.dumps(gpool_db_dict) + operation_history_dict = {} + operation_history_dict['input'] = history_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict + ) + gpool_db_create_ret_obj = self._create_in_storage( + context, gpool_db_create_obj) + response = None + try: + gpool_rpc_dict = copy.deepcopy(gpool_dict) + # gpool_rpc_dict['current_user'] = "admin" + del gpool_rpc_dict['tenant_id'] + response = self.rpc_api.glsb_math( + context, gpool_rpc_dict, 'create_gpool') + except MessagingTimeout as e: + LOG.error(_LE("Create corresponding response on device failed")) + gpool_db_create_obj.delete(context, gpool_db_create_ret_obj['id']) + raise e + except Exception as e: + LOG.error(_LE("Create corresponding response on device failed")) + gpool_db_create_obj.delete(context, gpool_db_create_ret_obj['id']) + raise e + id = gpool_db_create_ret_obj['id'] + gpool_db_update_dict = response + gpool_db_update_dict['gpool_id'] = response['id'] + if gpool_db_update_dict['hms'] == "": + gpool_db_update_dict['hms'] = [] + gpool_db_update_dict['pass_'] = gpool_db_update_dict['pass'] + del gpool_db_update_dict['id'], gpool_db_update_dict['status'] + del gpool_db_update_dict['pass'], gpool_db_update_dict['gmember_list'] + gpool_db_update_obj = objects.GPool(context) + gpool_db_update_ret_obj = gpool_db_update_obj.update( + context, id, gpool_db_update_dict) + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + gpool_db_update_ret_dic = self._replace_pass(gpool_db_update_ret_obj) + return gpool_db_update_ret_dic + + def update_gpool(self, context, gpool_dict): + # update gpool + id = gpool_dict['id'] + del gpool_dict['id'] + gpool_db_org_obj = self._get_gpool_db_detail(context, id) + gpool_db_dict = copy.deepcopy(gpool_dict) + if 'pass' in gpool_db_dict.keys(): + gpool_db_dict['pass_'] = gpool_db_dict['pass'] + del gpool_db_dict['pass'] + # for key in gpool_db_dict.keys(): + # gpool_db_dict[key] = str(gpool_db_dict[key]) + gpool_db_update_obj = objects.GPool(context, **gpool_db_dict) + history_str = json.dumps(gpool_db_dict) + operation_history_dict = {} + operation_history_dict['input'] = history_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict + ) + gpool_db_update_ret_obj = gpool_db_update_obj.update( + context, id, gpool_db_update_obj.as_dict()) + try: + gpool_rpc_dict = copy.deepcopy(gpool_dict) + # gpool_rpc_dict['current_user'] = 'admin' + # del gpool_rpc_dict['tenant_id'] + gpool_rpc_dict['name'] = gpool_db_org_obj['gpool_id'] + if 'type' in gpool_rpc_dict.keys(): + gpool_rpc_dict['cname'] = gpool_rpc_dict['type'] + del gpool_rpc_dict['type'] + response = self.rpc_api.glsb_math( + context, gpool_rpc_dict, 'update_gpool' + ) + except MessagingTimeout as e: + LOG.error(_LE("Update corresponding response on device failed")) + gpool_db_update_obj.update(context, id, gpool_db_org_obj) + raise e + except Exception as e: + LOG.error(_LE("Update corresponding response on device failed")) + gpool_db_update_obj.update(context, id, gpool_db_org_obj) + raise + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + gpool_db_update_ret_dic = self._replace_pass(gpool_db_update_ret_obj) + return gpool_db_update_ret_dic + + def delete_gpool(self, context, values): + # delete gpool + id = values['id'] + gpool_db_org_obj = self._get_gpool_db_detail(context, id) + gpool_db_del_obj = objects.GPool(context) + operation_str = json.dumps({}) + operation_history_dict = {} + operation_history_dict['input'] = operation_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict + ) + gpool_db_del_ret_obj = gpool_db_del_obj.delete( + context, id) + response = None + try: + gpool_rpc_del_dict = {'name': gpool_db_org_obj['gpool_id']} + response = self.rpc_api.glsb_math( + context, gpool_rpc_del_dict, 'delete_gpool' + ) + except MessagingTimeout as e: + LOG.error(_LE("Delete corresponding response on device failed")) + gpool_db_del_obj.update(context, id, gpool_db_org_obj) + raise e + except Exception as e: + LOG.error(_LE("Delete corresponding response on device failed")) + gpool_db_del_obj.update(context, id, gpool_db_org_obj) + raise + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + gpool_db_del_ret_obj = self._replace_pass(gpool_db_del_ret_obj) + return {"result": "success"} + + def get_gpool(self, context, id): + # get gpool not use + gpool_obj = self._get_gpool_db_detail(context, id) + gpool_obj = self._replace_pass(gpool_obj) + return gpool_obj + + def get_gpools(self, context, values): + # list gpools + gpool_obj = objects.GPool(context) + name_dic = values + name_dic['deleted'] = '0' + like_list = [ + 'name', + 'cname', + 'hms', + 'gmember_list', 'ttl' + ] + search_list = [ + 'tenant_id', + 'enable', + 'warning', + 'deleted', + 'first_algorithm', + 'second_algorithm', + ] + like_dic, search_dic = tools.classfiy_sql_keys(name_dic, + like_list, search_list) + gpool_objs = gpool_obj.get_all_objects_by_conditions(context, + like_dic, + search_dic) + result = [] + for syngroup_obj in gpool_objs: + result.append(self._replace_pass(syngroup_obj)) + return result + + def _get_gpool_db_detail(self, context, id): + # get gpool info in db + name_dict = {} + name_dict['id'] = id + name_dict['deleted'] = False + gpool_obj = objects.GPool(context) + target = None + try: + target = gpool_obj.get_object(context, **name_dict) + except Exception: + LOG.warning(_LW("No GPool with id = %(id)s in DB"), {"id": id}) + raise exception.IsNotExistError( + param_name="GPool with id=" + id) + return target + + def create_gmap(self, context, gmap_dict): + # create gmap + gmap_db_dict = copy.deepcopy(gmap_dict) + # if 'gpool_list' in gmap_db_dict.keys(): + # gmap_db_dict["gpool_list"] = str(gmap_db_dict['gpool_list']) + gmap_db_create_obj = objects.GMap( + context, **gmap_db_dict + ) + if self._valid_if_exists(context, gmap_db_create_obj) is not None: + LOG.warning(_LW('Have same gmap id/name in DB')) + raise exception.HaveSameObject(param_name=gmap_db_dict['name']) + history_str = json.dumps(gmap_db_dict) + operation_history_dict = {} + operation_history_dict['input'] = history_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict + ) + gmap_db_create_ret_obj = self._create_in_storage_gmap( + context, gmap_db_create_obj) + response = None + try: + gmap_rpc_dict = gmap_dict + del gmap_rpc_dict['tenant_id'] + response = self.rpc_api.glsb_math( + context, gmap_rpc_dict, 'create_gmap') + except MessagingTimeout as e: + LOG.error(_LE("Create corresponding response on device failed")) + gmap_db_create_obj.delete(context, gmap_db_create_ret_obj['id']) + raise e + except Exception as e: + LOG.error(_LE("Create corresponding response on device failed")) + gmap_db_create_obj.delete(context, gmap_db_create_ret_obj['id']) + raise + id = gmap_db_create_ret_obj['id'] + gmap_db_update_dict = response + gmap_db_update_dict['gmap_id'] = response['id'] + del gmap_db_update_dict['id'] + gmap_db_update_obj = objects.GMap(context, **gmap_db_update_dict) + gmap_db_update_ret_obj = gmap_db_update_obj.update( + context, id, gmap_db_update_dict) + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + return gmap_db_update_ret_obj + + def update_gmap(self, context, gmap_dict): + # update gmap + id = gmap_dict['id'] + del gmap_dict['id'] + gmap_db_org_obj = self._get_gmap_db_detail(context, id) + gmap_db_dict = copy.deepcopy(gmap_dict) + gmap_db_update_obj = objects.GMap(context, **gmap_db_dict) + history_str = json.dumps(gmap_db_dict) + operation_history_dict = {} + operation_history_dict['input'] = history_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict + ) + gmap_db_update_ret_obj = gmap_db_update_obj.update( + context, id, gmap_db_update_obj.as_dict()) + try: + gmap_rpc_dict = copy.deepcopy(gmap_dict) + gmap_rpc_dict['name'] = gmap_db_org_obj.gmap_id + response = self.rpc_api.glsb_math( + context, gmap_rpc_dict, 'update_gmap' + ) + except MessagingTimeout as e: + LOG.error(_LE("Update corresponding response on device failed")) + gmap_db_update_obj.update(context, id, gmap_db_org_obj) + raise e + except Exception as e: + LOG.error(_LE("Update corresponding response on device failed")) + gmap_db_update_obj.update(context, id, gmap_db_org_obj) + raise + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + return gmap_db_update_ret_obj + + def delete_gmap(self, context, values): + # delete gmap + id = values['id'] + gmap_db_org_obj = self._get_gmap_db_detail(context, id) + gmap_db_del_obj = objects.GMap(context) + operation_str = json.dumps({}) + operation_history_dict = {} + operation_history_dict['input'] = operation_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict + ) + gmap_db_del_ret_obj = gmap_db_del_obj.delete(context, id) + reponse = None + try: + gmap_rpc_dict = {'name': gmap_db_org_obj.gmap_id} + reponse = self.rpc_api.glsb_math( + context, gmap_rpc_dict, "delete_gmap" + ) + except MessagingTimeout as e: + LOG.error(_LE("Delete corresponding response on device failed")) + gmap_db_del_obj.update(context, id, gmap_db_org_obj) + raise e + except Exception as e: + LOG.error(_LE("Delete corresponding response on device failed")) + gmap_db_del_obj.update(context, id, gmap_db_org_obj) + raise + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + return {"result": "success"} + + def get_gmap(self, context, id): + # get gmap + gmap_obj = self._get_gmap_db_detail(context, id) + return gmap_obj + + def get_gmaps(self, context, values): + # list gmaps + gmap_obj = objects.GMap(context) + name_dic = values + name_dic['deleted'] = '0' + like_list = ['name', 'gpool_list', 'last_resort_pool'] + search_list = ['tenant_id', 'algorithm', 'deleted', 'enable'] + like_dic, search_dic = tools.classfiy_sql_keys(name_dic, like_list, + search_list) + gmap_objs = gmap_obj.get_all_objects_by_conditions(context, like_dic, + search_dic) + return gmap_objs + + def _get_gmap_db_detail(self, context, id): + name_dict = {} + name_dict['id'] = id + name_dict['deleted'] = False + gpool_obj = objects.GMap(context) + target = None + try: + target = gpool_obj.get_object(context, **name_dict) + except Exception: + LOG.warning(_LW("No GMap with id = %(id)s in DB"), {"id": id}) + raise exception.IsNotExistError( + param_name="GMap with id=" + id) + return target + + def create_syngroup(self, context, syngroup_dict): + # create syngroup + syngroup_db_dict = copy.deepcopy(syngroup_dict) + if 'pass' in syngroup_db_dict.keys(): + syngroup_db_dict['pass_'] = syngroup_db_dict['pass'] + del syngroup_db_dict['pass'] + syngroup_db_dict['syngroup_id'] = '1' + syngroup_db_create_obj = objects.SynGroup( + context, **syngroup_db_dict + ) + if self._valid_if_exists(context, syngroup_db_create_obj) is not None: + LOG.warning(_LW('Have same syngroup id/name in DB')) + raise exception.HaveSameObject( + param_name=syngroup_db_dict['name']) + history_str = json.dumps(syngroup_db_dict) + operation_history_dict = {} + operation_history_dict['input'] = history_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict + ) + syngroup_db_create_ret_obj = self._create_in_storage( + context, syngroup_db_create_obj) + response = None + try: + syngroup_rpc_dict = copy.deepcopy(syngroup_dict) + # syngroup_rpc_dict['current_user'] = "admin" + if 'gslb_zone_names' in syngroup_rpc_dict.keys(): + syngroup_rpc_dict['dcs'] = syngroup_rpc_dict['gslb_zone_names'] + del syngroup_rpc_dict['gslb_zone_names'] + del syngroup_rpc_dict['tenant_id'] + response = self.rpc_api.glsb_math( + context, syngroup_rpc_dict, 'create_syngroup') + except MessagingTimeout as e: + LOG.error(_LE("Create corresponding response on device failed")) + syngroup_db_create_obj.delete( + context, syngroup_db_create_ret_obj['id']) + raise e + except Exception as e: + LOG.error(_LE("Create corresponding response on device failed")) + syngroup_db_create_obj.delete( + context, syngroup_db_create_ret_obj['id']) + raise + id = syngroup_db_create_ret_obj['id'] + syngroup_db_update_dict = response + syngroup_db_update_dict['syngroup_id'] = response['id'] + syngroup_db_update_dict['gslb_zone_names'] = response['dcs'] + syngroup_db_update_dict['pass_'] = response['pass'] + del syngroup_db_update_dict['id'], syngroup_db_update_dict[ + 'pass'], syngroup_db_update_dict['dcs'] + syngroup_db_update_obj = objects.SynGroup( + context, **syngroup_db_update_dict) + syngroup_db_update_ret_obj = syngroup_db_update_obj.update( + context, id, syngroup_db_update_dict) + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + syngroup_db_update_ret_dic = self._replace_pass( + syngroup_db_update_ret_obj) + return syngroup_db_update_ret_dic + + def update_syngroup(self, context, syngroup_dict): + # update syngroup + id = syngroup_dict['id'] + del syngroup_dict['id'] + syngroup_db_org_obj = self._get_syngroup_db_detail(context, id) + syngroup_db_dict = copy.deepcopy(syngroup_dict) + if 'pass' in syngroup_db_dict.keys(): + syngroup_db_dict['pass_'] = syngroup_db_dict['pass'] + del syngroup_db_dict['pass'] + syngroup_db_update_obj = objects.SynGroup(context) + history_str = json.dumps(syngroup_db_dict) + operation_history_dict = {} + operation_history_dict['input'] = history_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict) + syngroup_db_update_obj.update(context, id, syngroup_db_dict) + try: + syngroup_rpc_dict = copy.deepcopy(syngroup_dict) + # syngroup_rpc_dict['current_user'] = 'admin' + # del syngroup_rpc_dict['tenant_id'] + if 'gslb_zone_names' in syngroup_rpc_dict.keys(): + syngroup_rpc_dict['dcs'] = syngroup_rpc_dict['gslb_zone_names'] + del syngroup_rpc_dict['gslb_zone_names'] + syngroup_rpc_dict['name'] = syngroup_db_org_obj.syngroup_id + response = self.rpc_api.glsb_math( + context, syngroup_rpc_dict, "update_syngroup" + ) + except MessagingTimeout as e: + LOG.error(_LE("Update corresponding response on device failed")) + syngroup_db_update_obj.update(context, id, syngroup_db_org_obj) + raise e + except Exception as e: + LOG.error(_LE("Update corresponding response on device failed")) + syngroup_db_update_obj.update(context, id, syngroup_db_org_obj) + raise + operation_history_dict['status'] = "SUCCESS" + pas_dict = {"pass_": response['pass']} + replace_pass_obj = objects.SynGroup(context, **pas_dict) + replace_pass_ret = replace_pass_obj.update( + context, id, replace_pass_obj.as_dict()) + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict) + ret_dic = self._replace_pass(replace_pass_ret) + return ret_dic + + def delete_syngroup(self, context, syngroup_dict): + # delete syngroup + id = syngroup_dict['id'] + syngroup_db_org_obj = self._get_syngroup_db_detail(context, id) + syngroup_db_del_obj = objects.SynGroup(context) + operation_str = json.dumps({}) + operation_history_dict = {} + operation_history_dict['input'] = operation_str + operation_history_dict['method'] = "CREATE" + operation_history_dict['status'] = 'FAILD' + history_obj = self.db_common.insert_operation_history( + context, **operation_history_dict) + syngroup_db_del_ret_obj = syngroup_db_del_obj.delete( + context, id) + reponse = None + try: + syngroup_rpc_dict = {'name': syngroup_db_org_obj.syngroup_id} + reponse = self.rpc_api.glsb_math(context, syngroup_rpc_dict, + 'delete_syngroup') + except MessagingTimeout as e: + LOG.error(_LE("Delete corresponding response on device failed")) + syngroup_db_del_obj.update(context, id, syngroup_db_org_obj) + raise e + except Exception as e: + LOG.error(_LE("Delete corresponding response on device failed")) + syngroup_db_del_obj.update(context, id, syngroup_db_org_obj) + raise + operation_history_dict['status'] = "SUCCESS" + self.db_common.update_operation_history( + context, history_obj['id'], **operation_history_dict + ) + self._replace_pass(syngroup_db_del_ret_obj) + return {"result": "success"} + + def get_syngroup(self, context, id): + # get_one syngroup not use + syngroup_obj = self._get_syngroup_db_detail(context, id) + syngroup_obj = self._replace_pass(syngroup_obj) + return syngroup_obj + + def get_syngroups(self, context, values): + # list syngroups + syngroup_obj = objects.SynGroup(context) + name_dic = values + name_dic['deleted'] = '0' + like_list = ['name', 'gslb_zone_names'] + search_list = ['tenant_id', 'probe_range', 'deleted'] + like_dic, search_dic = tools.classfiy_sql_keys( + name_dic, like_list, search_list) + syngroup_objs = syngroup_obj.get_all_objects_by_conditions(context, + like_dic, + search_dic) + result = [] + for syngroup_obj in syngroup_objs: + result.append(self._replace_pass(syngroup_obj)) + return result + + def get_db_syngroups(self, context, values): + # get_all_syngroup not use + syngroup_obj = objects.SynGroup(context) + syngroup_db_search_dict = values + syngroup_db_search_dict['deleted'] = False + syngroup_objs = syngroup_obj.get_objects( + context, **syngroup_db_search_dict) + if syngroup_objs is None: + LOG.warning(_LW("There is no data in the SYNGROUP_INFO")) + raise exception.IsNotExistError( + param_name="GPoll_info table is Null") + result = [] + for syngroup_obj in syngroup_objs: + result.append(self._replace_pass(syngroup_obj)) + return result + + def _create_in_storage_gmap(self, context, obj): + try: + # create the obj in db + s_dic = obj.as_dict() + obj = obj.create(context, s_dic) + except db_exception: + LOG.error(_LE("Create/Insert db operation failed!")) + raise db_exception + return obj + + def _replace_pass(self, obj): + # replace pass_ to pass + dic = dict(obj) + if "pass_" in dic.keys(): + dic['pass'] = dic['pass_'] + del dic['pass_'] + return dic diff --git a/nca47/manager/firewall_manager/__init__.py b/nca47/manager/firewall_manager/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nca47/manager/firewall_manager/fw_manager.py b/nca47/manager/firewall_manager/fw_manager.py new file mode 100644 index 0000000..a3221e8 --- /dev/null +++ b/nca47/manager/firewall_manager/fw_manager.py @@ -0,0 +1,1986 @@ +from oslo_config import cfg +from oslo_serialization import jsonutils as json +from oslo_log import log as logging +from nca47 import objects +from nca47.common.i18n import _LW +from nca47.common.i18n import _LE +from nca47.common.i18n import _LI +from nca47.manager import rpcapi +from nca47.manager import db_common +from nca47.api.controllers.v1 import tools +from nca47.common import exception +from nca47.manager.firewall_manager import protocol +from nca47.common.exception import NonExistParam +from nca47.common.exception import IsNotExistError +from copy import deepcopy + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +FIREWALL_MANAGER = None + + +class FirewallManager(object): + """ + Firewall operation handler class, using for handle client requests, + validate parameters whether is legal, handling DB operations and + calling rpc client's corresponding method to send messaging to agent + endpoints + """ + + def __init__(self): + self.db_common = db_common.DBCommon.get_instance() + self.rpc_api = rpcapi.FWManagerAPI.get_instance() + + @classmethod + def get_instance(cls): + + global FIREWALL_MANAGER + if not FIREWALL_MANAGER: + FIREWALL_MANAGER = cls() + return FIREWALL_MANAGER + + # this is a vlan operation + def create_vlan(self, context, dic): + """ + create a vlan handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # operation veiw + dic['agent_type'] = 'FW' + kw = self.db_common.merge_dict_view(dic) + view = self.db_common.get_vres_agent_view(context, **kw) + vres_id = view["vres_id"] + input_str = json.dumps(dic) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=input_str, + method='CREATE_VLAN', + status='FAILED') + dic['vres_id'] = vres_id + # dic["vlan_id_o"] = dic['vlan_id'] + vlan_name = '%s%s' % ('vlan_if', dic['vlan_number']) + dic["vlan_name"] = vlan_name + dic_vlan = {} + dic_vlan["vlan_number"] = dic['vlan_number'] + dic_vlan['vlan_name'] = dic['vlan_name'] + dic_vlan['deleted'] = False + dic_vlan['vres_id'] = vres_id + vlan_obj = objects.FwVlanInfo(context, **dic) + vlan_query = objects.FwVlanInfo(context, **dic_vlan) + is_exist = False + try: + val_vlan = dict(vlan_query.get_object(context, **dic_vlan)) + except: + res = self.db_common.create_in_storage(context, vlan_obj) + else: + is_exist = True + for ifname in val_vlan['ifnames']: + if ifname not in dic['ifnames']: + dic['ifnames'].append(ifname) + res = vlan_query.update(context, val_vlan['id'], dic) + self.rpc_api.reload_topic(view['agent_ip']) + try: + self.rpc_api.create_vlan(context, dic) + except Exception as e: + if is_exist: + vlan_query.update(context, res.id, + val_vlan) + else: + vlan_obj.delete(context, res.id) + raise e + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return res + + def del_vlan(self, context, dic): + """ + delete a vlan handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + + org_obj = objects.FwVlanInfo(context, **dic) + dic['agent_type'] = 'FW' + kw = self.db_common.merge_dict_view(dic) + view = self.db_common.get_vres_agent_view(context, **kw) + # tenant_id is or not exist + if view is None: + raise exception.IsNotExistError(param_name=dic['tenant_id']) + vres_id = view["vres_id"] + input_str = json.dumps(dic) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=input_str, + method='DEL_VLAN', + status='FAILED') + dic["vres_id"] = vres_id + uuid = dic["id"] + dic_vlan = {} + dic_vlan["id"] = uuid + dic_vlan['deleted'] = False + vlan_query = objects.FwVlanInfo(context, **dic_vlan) + try: + is_vlan = dict(vlan_query.get_object(context, **dic_vlan)) + except Exception as e: + raise exception.IsNotExistError(param_name=uuid) + val_ifnames = [] + val_ifnames += is_vlan['ifnames'] + for ifname in dic['ifnames']: + if ifname not in is_vlan['ifnames']: + raise exception.ParamValueError(param_name=ifname) + else: + val_ifnames.remove(ifname) + if len(val_ifnames) == 0: + vlan_obj = objects.FwVlanInfo(context) + response = vlan_obj.delete(context, is_vlan['id']) + else: + target_values = {} + target_values["ifnames"] = val_ifnames + vlan_obj = objects.FwVlanInfo(context, **target_values) + response = vlan_obj.update(context, uuid, vlan_obj.as_dict()) + self.rpc_api.reload_topic(view['agent_ip']) + try: + rpc_dict = {} + rpc_dict['vlan_number'] = is_vlan['vlan_number'] + rpc_dict['ifnames'] = dic['ifnames'] + response_fw = self.rpc_api.del_vlan(context, rpc_dict) + except Exception as e: + vlan_obj = objects.FwVlanInfo(context) + vlan_ret = vlan_obj.update(context, dic['id'], is_vlan) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return response + + def get_vlan(self, context, id): + """ + get a vlan handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + target_values = {} + target_values["id"] = id + target_values['deleted'] = False + target_values = dict(target_values) + vlan_obj = objects.FwVlanInfo(context, **target_values) + try: + response = vlan_obj.get_object(context, **target_values) + except Exception: + LOG.warning( + _LW("No vlan with id=%(id)s in DB"), + {"id": target_values["id"]}) + raise exception.IsNotExistError( + param_name="vlan with id=" + target_values['id']) + return response + + def get_vlans(self, context, dic): + vlan_obj = objects.FwVlanInfo(context) + sql_str_header = "select fw_vlan_info.* from" \ + " fw_vlan_info,vres_agent_view" \ + " where fw_vlan_info.vres_id = " \ + "vres_agent_view.vres_id " \ + "and fw_vlan_info.deleted = '0' " + name_dic = dic + lik_list = ['ifnames', 'ipaddr'] + search_list = ['tenant_id', 'dc_name', 'network_zone'] + lik_dic, search_dic = tools.classfiy_sql_keys( + name_dic, lik_list, search_list) + sql_str = self.db_common.put_sql(sql_str_header, lik_dic, search_dic) + vlan_objs = vlan_obj.get_all_objects(context, sql_str) + return vlan_objs + + # this is a netservice operation + def create_netservice(self, context, dic): + """ + create a netservice handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + dic['agent_type'] = 'FW' + kw = self.db_common.merge_dict_view(dic) + + view = self.db_common.get_vres_agent_view(context, **kw) + # tenant_id is or not exist + if view is None: + raise exception.IsNotExistError(param_name=dic['tenant_id']) + vres_id = view["vres_id"] + input_str = json.dumps(dic) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=input_str, + method='ADD_NETSERV', + status='FAILED') + # VFW is or not exist + vfw_dic = {} + vfw_dic['vfw_name'] = dic['vfwname'] + vfw_dic['vres_id'] = vres_id + vfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + if vfw is None: + raise exception.IsNotExistError(param_name=dic['vfwname']) + vfw_id = vfw["id"] + proto_name = protocol.match_proto(dic['proto']) + name = "%s%s" % (proto_name, dic['port']) + target_values = {} + target_values['vfw_id'] = vfw_id + target_values['name'] = name + target_values['deleted'] = False + netserv_obj = objects.FwNetservicesInfo(context, **target_values) + ner_serv = netserv_obj.get_objects(context, **target_values) + if len(ner_serv) != 0: + raise exception.HaveSameObject(param_name="%s,%s" % (dic['proto'], + dic['port'])) + vfwname = vfw["vfw_name"] + dic["name"] = name + dic["vfw_id"] = vfw_id + dic["vfwname"] = vfwname + netserv_obj = objects.FwNetservicesInfo(context, **dic) + res = netserv_obj.create(context, netserv_obj.as_dict()) + self.rpc_api.reload_topic(view['agent_ip']) + try: + response_fw = self.rpc_api.create_netservice(context, dic) + except Exception as e: + LOG.error(_LE("Create Netservice response on device failed")) + netserv_obj.delete(context, res["id"]) + raise e + + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return res + + def del_netservice(self, context, dic): + """ + delete a netservice handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + dic['agent_type'] = 'FW' + kw = self.db_common.merge_dict_view(dic) + view = self.db_common.get_vres_agent_view(context, **kw) + # tenant_id is or not exist + if view is None: + raise exception.IsNotExistError(param_name=dic['tenant_id']) + vres_id = view["vres_id"] + input_str = json.dumps(dic) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=input_str, + method='DEL_NETSERV', + status='FAILED') + uuid = dic["id"] + target_values = {} + target_values['id'] = uuid + target_values['deleted'] = False + netserv_obj = objects.FwNetservicesInfo(context, **target_values) + # query is or not net service by id + try: + netserv_info = netserv_obj.get_object(context, **target_values) + except Exception: + raise exception.IsNotExistError(param_name=uuid) + response = netserv_obj.delete(context, uuid) + self.rpc_api.reload_topic(view['agent_ip']) + try: + self.rpc_api.del_netservice(context, netserv_info) + except Exception as e: + LOG.error(_LE("delete netservice on device failed")) + netserv_obj.update(context, uuid, netserv_info) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return response + + def get_netservice(self, context, id): + """ + get a netservice handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + target_values = {} + target_values["id"] = id + target_values['deleted'] = False + netserv_obj = objects.FwNetservicesInfo(context, **target_values) + try: + response = netserv_obj.get_object(context, **target_values) + except Exception: + LOG.warning( + _LW("No netserivce with id=%(id)s in DB"), + {"id": target_values["id"]}) + raise exception.IsNotExistError( + param_name="netserivce with id=" + target_values['id']) + return response + + def get_netservices(self, context, dic): + """ + get all netservices handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + dic['agent_type'] = 'FW' + kw = self.db_common.merge_dict_view(dic) + view = self.db_common.get_vres_agent_view(context, **kw) + # tenant_id is or not exist + if view is None: + raise exception.IsNotExistError(param_name=dic['tenant_id']) + vres_id = view["vres_id"] + # get the colunm vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = dic['vfwname'] + vfw_dic['vres_id'] = vres_id + vfw_info = self.db_common.get_fw_vfw_id(context, **vfw_dic) + target_values = {} + target_values["vfw_id"] = vfw_info["id"] + target_values['deleted'] = False + netserv_obj = objects.FwNetservicesInfo(context, **target_values) + return netserv_obj.get_objects(context, **target_values) + + def get_netservices_by_fuzzy_query(self, context, dic): + LOG.info(_LI("the fuzzy_query_for_netservices method of" + " the fw_manager start")) + view = {} + view['tenant_id'] = dic['tenant_id'] + view['network_zone'] = dic['network_zone'] + view['dc_name'] = dic['dc_name'] + view_infos = self.db_common.get_vres_agent_vfw_view(context, **view) + if len(view_infos) == 0: + return view_infos + + # init the DB operations object + obj = objects.FwNetservicesInfo(context) + dic['deleted'] = "0" + search_list = ['deleted'] + like_list = [] + keys = dic.keys() + if "vfwname" in keys: + if tools.is_not_nil(dic['vfwname']): + search_list.append("vfwname") + if "proto" in keys: + if tools.is_not_nil(dic['proto']): + search_list.append("proto") + response = [] + for views in view_infos: + dic["vfw_id"] = views["vfw_id"] + search_list.append("vfw_id") + like_dic, search_dic = tools.classfiy_sql_keys(dic, like_list, + search_list) + infos = obj.get_all_objects_by_conditions(context, + like_dic, search_dic) + response.extend(infos) + return response + + # this is a addrobj operation + def add_addrobj(self, context, addrobj_infos): + """ + create addrobj handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # get the agent info + vres_agent_dic = {} + vres_agent_dic['agent_type'] = 'FW' + vres_agent_dic['tenant_id'] = addrobj_infos['tenant_id'] + vres_agent_dic['network_zone'] = addrobj_infos['network_zone'] + vres_agent_dic['dc_name'] = addrobj_infos['dc_name'] + vres_agent_obj = self.db_common.get_vres_agent_view(context, + **vres_agent_dic) + # insert operation history type with Creating in DB + input_str = json.dumps(addrobj_infos) + input_operation_history = {} + input_operation_history['vres_id'] = vres_agent_obj.vres_id + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # get the value vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = addrobj_infos['vfwname'] + vfw_dic['vres_id'] = vres_agent_obj.vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + # init the DB operations object + find_addrobj_dic = {} + find_addrobj_dic['ip'] = addrobj_infos['ip'] + find_addrobj_dic['name'] = addrobj_infos['name'] + find_addrobj_dic['vfw_id'] = rstfwvfw.id + find_addrobj = objects.FwAddrObjInfo(context, **find_addrobj_dic) + # Check the addrobj which have same name if is exist in DB + target_addrobj = self._valid_if_addrobj_exist(context, find_addrobj, + flag='addrobj') + if target_addrobj is not None: + LOG.warning(_LW("Have same zone id/name in DB")) + raise exception.HaveSameObject(param_name=target_addrobj.name) + # change the addrobj values with dic format + target_values = {} + target_values['vfwname'] = addrobj_infos['vfwname'] + target_values['vfw_id'] = rstfwvfw.id + target_values['operation_fro'] = 'AUTO' + merge_dict = tools.dict_merge(addrobj_infos, target_values) + addrobj = objects.FwAddrObjInfo(context, **merge_dict) + # create the addrobj info in db + result = self.db_common.create_in_storage(context, addrobj) + self.rpc_api.reload_topic(vres_agent_obj['agent_ip']) + try: + dic = {} + dic['name'] = addrobj_infos['name'] + dic['ip'] = addrobj_infos['ip'] + # dic['expIp'] = tools.joinString(addrobj_infos['expip']) + dic['vfwName'] = addrobj_infos['vfwname'] + response_fw = self.rpc_api.add_addrobj(context, dic) + except Exception as e: + result = addrobj.delete(context, result['id']) + raise e + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return result + + def delete_addrobj(self, context, addrobj_infos): + """ + delete addrobj handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # get the agent info + vres_agent_dic = {} + vres_agent_dic['agent_type'] = 'FW' + vres_agent_dic['tenant_id'] = addrobj_infos['tenant_id'] + vres_agent_dic['network_zone'] = addrobj_infos['network_zone'] + vres_agent_dic['dc_name'] = addrobj_infos['dc_name'] + vres_agent_obj = self.db_common.get_vres_agent_view(context, + **vres_agent_dic) + # insert operation history type with Creating in DB + input_str = json.dumps(addrobj_infos) + input_operation_history = {} + input_operation_history['vres_id'] = vres_agent_obj.vres_id + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + # delete the addrobj in db + # addrobj_infos = dict(addrobj_infos) + addrobj = objects.FwAddrObjInfo(context, **addrobj_infos) + try: + dic = addrobj.as_dict() + org_addr_ret = addrobj.get_object(context, **dic) + except Exception as e: + raise IsNotExistError(param_name=addrobj_infos['id']) + # raise e + result = addrobj.delete(context, addrobj_infos['id']) + self.rpc_api.reload_topic(vres_agent_obj['agent_ip']) + try: + trans_dict = {} + trans_dict['name'] = result.name + trans_dict['vfwName'] = result.vfwname + response_fw = self.rpc_api.del_addrobj(context, trans_dict) + except Exception as e: + result = addrobj.update(context, addrobj_infos['id'], org_addr_ret) + raise e + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return result + + def get_addrobj(self, context, id): + # get the one addrobj in db + target_values = {} + target_values = id + target_values['deleted'] = False + addrobj = objects.FwAddrObjInfo(context) + # try/catch the no one get + try: + result = addrobj.get_object(context, **target_values) + except Exception: + LOG.warning( + _LW("No addrobj with id=%(id)s in DB"), + {"id": target_values['id']}) + raise exception.IsNotExistError( + param_name="addrobj with id=" + target_values['id']) + return result + + def get_addrobjs(self, context, addrobj_infos): + """ + get all addrobjs handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # get the agent info + vres_agent_dic = {} + vres_agent_dic['agent_type'] = 'FW' + vres_agent_dic['tenant_id'] = addrobj_infos['tenant_id'] + vres_agent_dic['network_zone'] = addrobj_infos['network_zone'] + vres_agent_dic['dc_name'] = addrobj_infos['dc_name'] + vres_agent_obj = self.db_common.get_vres_agent_view(context, + **vres_agent_dic) + try: + # get the value vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = addrobj_infos['vfwname'] + vfw_dic['vres_id'] = vres_agent_obj.vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + except Exception: + LOG.warning( + _LW("No addrobj with vres_id=%(vres_id)s in DB"), + {"id": vres_agent_obj.vres_id}) + raise exception.IsNotExistError( + param_name="vfw with vres_id=" + vres_agent_obj.vres_id) + # get the one addrobj in db + target_values = {} + target_values['vfw_id'] = rstfwvfw.id + target_values['vfwname'] = addrobj_infos['vfwname'] + target_values['deleted'] = False + addrobj = objects.FwAddrObjInfo(context, **target_values) + # try/catch the no one get + try: + result = addrobj.get_objects(context, **target_values) + except Exception: + LOG.warning(_LW("No addrobj with vfw_id=%(vfw_id)s in DB"), { + "vfw_id": target_values['vfw_id']}) + raise exception.IsNotExistError( + param_name="addrobj with vfw_id=" + target_values['vfw_id']) + return result + + # this is a snataddrpool operation + def add_snataddrpool(self, context, snataddrpool_infos): + """ + create addrobj handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # get the agent info + vres_agent_dic = {} + vres_agent_dic['agent_type'] = 'FW' + vres_agent_dic['tenant_id'] = snataddrpool_infos['tenant_id'] + vres_agent_dic['network_zone'] = snataddrpool_infos['network_zone'] + vres_agent_dic['dc_name'] = snataddrpool_infos['dc_name'] + vres_agent_obj = self.db_common.get_vres_agent_view(context, + **vres_agent_dic) + # insert operation history type with Creating in DB + input_str = json.dumps(snataddrpool_infos) + input_operation_history = {} + input_operation_history['vres_id'] = vres_agent_obj.vres_id + input_operation_history['input'] = input_str + input_operation_history['method'] = 'CREATE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + try: + # get the colunm vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = snataddrpool_infos['vfwname'] + vfw_dic['vres_id'] = vres_agent_obj.vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + except Exception: + LOG.warning( + _LW("No addrobj with vres_id=%(vres_id)s in DB"), + {"id": vres_agent_obj.vres_id}) + raise exception.IsNotExistError( + param_name="vfw with vres_id=" + vres_agent_obj.vres_id) + # init the DB operations object + find_addrobj_dic = {} + find_addrobj_dic['name'] = snataddrpool_infos['name'] + find_addrobj_dic['vfw_id'] = rstfwvfw.id + find_snataddrpool = objects.FwSnatAddrPoolInfo(context, + **find_addrobj_dic) + # Check the addrobj which have same name if is exist in DB + target_addrobj = self._valid_if_addrobj_exist(context, + find_snataddrpool, + flag='snataddrpool') + if target_addrobj is not None: + LOG.warning(_LW("Have same zone id/name in DB")) + raise exception.HaveSameObject(param_name=target_addrobj.name) + # change the snataddrpool values with dic format + target_values = {} + target_values['vfwname'] = snataddrpool_infos['vfwname'] + target_values['vfw_id'] = rstfwvfw.id + target_values['operation_fro'] = 'AUTO' + merge_dict = tools.dict_merge(snataddrpool_infos, target_values) + snataddrpool = objects.FwSnatAddrPoolInfo(context, **merge_dict) + # create the snataddrpool info in db + result = self.db_common.create_in_storage(context, snataddrpool) + self.rpc_api.reload_topic(vres_agent_obj['agent_ip']) + try: + response_fw = self.rpc_api.add_snataddrpool(context, + snataddrpool_infos) + except Exception as e: + snataddrpool.delete(context, result['id']) + raise e + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return result + + def del_snataddrpool(self, context, snataddrpool_infos): + """ + delete snataddrpool handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # get the agent info + vres_agent_dic = {} + vres_agent_dic['agent_type'] = 'FW' + vres_agent_dic['tenant_id'] = snataddrpool_infos['tenant_id'] + vres_agent_dic['network_zone'] = snataddrpool_infos['network_zone'] + vres_agent_dic['dc_name'] = snataddrpool_infos['dc_name'] + vres_agent_obj = self.db_common.get_vres_agent_view(context, + **vres_agent_dic) + # insert operation history type with Creating in DB + input_str = json.dumps(snataddrpool_infos) + input_operation_history = {} + input_operation_history['vres_id'] = vres_agent_obj.vres_id + input_operation_history['input'] = input_str + input_operation_history['method'] = 'DELETE' + input_operation_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history( + context, **input_operation_history) + org_obj = objects.FwSnatAddrPoolInfo(context, **snataddrpool_infos) + try: + dic = org_obj.as_dict() + dic['deleted'] = False + org_dict = dict(org_obj.get_object(context, **dic)) + except Exception as e: + raise IsNotExistError(param_name=snataddrpool_infos['id']) + snataddrpool = objects.FwSnatAddrPoolInfo(context, + **snataddrpool_infos) + result = snataddrpool.delete(context, snataddrpool_infos['id']) + self.rpc_api.reload_topic(vres_agent_obj['agent_ip']) + try: + response_fw = self.rpc_api.del_snataddrpool(context, + org_dict) + except Exception as e: + snataddrpool.update(context, snataddrpool_infos['id'], org_dict) + raise e + input_operation_history['status'] = 'SUCCESS' + self.db_common.update_operation_history( + context, history['id'], **input_operation_history) + return result + + def get_snataddrpool(self, context, snataddrpool_infos): + """ + get one snataddrpool handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # get the one snataddrpool in db + target_values = {} + target_values['deleted'] = False + merge_dict = tools.dict_merge(snataddrpool_infos, target_values) + snataddrpool = objects.FwSnatAddrPoolInfo(context, **merge_dict) + # try/catch the no one get + try: + result = snataddrpool.get_object(context, **merge_dict) + except Exception: + LOG.warning( + _LW("No snataddrpool with id=%(id)s in DB"), + {"id": merge_dict['id']}) + raise exception.IsNotExistError( + param_name="snataddrpool with id=" + merge_dict['id']) + return result + + def get_snataddrpools(self, context, snataddrpool_infos): + """ + get all snataddrpools handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # get the agent info + vres_agent_dic = {} + vres_agent_dic['agent_type'] = 'FW' + vres_agent_dic['tenant_id'] = snataddrpool_infos['tenant_id'] + vres_agent_dic['network_zone'] = snataddrpool_infos['network_zone'] + vres_agent_dic['dc_name'] = snataddrpool_infos['dc_name'] + vres_agent_obj = self.db_common.get_vres_agent_view(context, + **vres_agent_dic) + # get the colunm vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = snataddrpool_infos['vfwname'] + vfw_dic['vres_id'] = vres_agent_obj.vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + + # get the one snataddrpool in db + target_values = {} + target_values['vfwname'] = snataddrpool_infos['vfwname'] + target_values['vfw_id'] = rstfwvfw.id + target_values['deleted'] = False + snataddrpool = objects.FwSnatAddrPoolInfo(context, **target_values) + # try/catch the no one get + try: + result = snataddrpool.get_objects(context, **target_values) + except Exception: + LOG.warning(_LW("No snataddrpool with vfw_id=%(vfw_id)s in DB"), { + "vfw_id": target_values['vfw_id']}) + raise exception.IsNotExistError( + param_name="snataddrpool vfw_id=" + target_values['vfw_id']) + return result + + def _valid_if_addrobj_exist(self, context, qry_db_obj, flag): + """Check the addrobj which have same name if is exist in DB""" + qry_db_obj_dic = {} + if flag == 'addrobj': + qry_db_obj_dic['ip'] = qry_db_obj.ip + qry_db_obj_dic['name'] = qry_db_obj.name + qry_db_obj_dic['vfw_id'] = qry_db_obj.vfw_id + qry_db_obj_dic['deleted'] = False + rst_qry_db_obj = None + try: + # get the addrobj in db + rst_qry_db_obj = qry_db_obj.get_object(context, **qry_db_obj_dic) + except Exception: + pass + return rst_qry_db_obj + + def create_vfw(self, context, vfw): + target_vfw = self._make_vfw_object(vfw) + tenant_id = vfw['tenant_id'] + net_zone = vfw['network_zone'] + dc_name = vfw['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + target_vfw['vres_id'] = vres_id + vfw_obj = objects.VFW(context, **target_vfw) + # insert operation history + vfw_str = json.dumps(vfw) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=vfw_str, + method='CREATE', + status='FAILED') + check_vfw_dic = {} + check_vfw_dic['vfw_name'] = target_vfw['vfw_name'] + check_vfw_dic['vres_id'] = vres_id + check_vfw_obj = objects.VFW(context, **check_vfw_dic) + if self.db_common.is_exist_object(context, check_vfw_obj): + raise exception.HaveSameObject(param_name=check_vfw_obj.vfw_name) + response_vfw = self.db_common.create_in_storage(context, vfw_obj) + self.rpc_api.reload_topic(view_obj['agent_ip']) + try: + self.rpc_api.create_vfw(context, vfw) + except Exception as e: + LOG.error(_LE("Create vfw on device failed")) + # since create failed in device, so delete object in DB + vfw_obj.delete(context, response_vfw['id']) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return response_vfw + + def delete_vfw(self, context, vfw): + tenant_id = vfw['tenant_id'] + net_zone = vfw['network_zone'] + dc_name = vfw['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + vfw_str = json.dumps(vfw) + vfw_obj = objects.VFW(context, **vfw) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=vfw_str, + method='DELETE', + status='FAILED') + vfw_dic = {} + vfw_dic['id'] = vfw['id'] + vfw_dic['deleted'] = False + try: + vfw_info = vfw_obj.get_object(context, **vfw_dic) + except Exception: + raise exception.IsNotExistError(param_name="vfw with id=" + + vfw_dic['id']) + vfw["name"] = vfw_info["vfw_name"] + response_vfw = vfw_obj.delete(context, vfw['id']) + self.rpc_api.reload_topic(view_obj['agent_ip']) + try: + self.rpc_api.delete_vfw(context, vfw) + except Exception as e: + LOG.error(_LE("Delete vfw on device failed")) + vfw_obj.update(context, response_vfw['id'], vfw_dic) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return response_vfw + + def get_vfw(self, context, id): + vfw_dic = {} + vfw_dic['id'] = id + vfw_dic['deleted'] = False + vfw_obj = objects.VFW(context) + try: + response_vfw = vfw_obj.get_object(context, **vfw_dic) + except Exception: + raise exception.IsNotExistError(param_name="vfw with id=" + + vfw_dic['id']) + return response_vfw + + def get_all_vfws(self, context, vfw): + vfw_obj = objects.VFW(context) + vfw_dic = {} + vfw_dic['network_zone_name'] = vfw['network_zone'] + vfw_dic['dc_name'] = vfw['dc_name'] + vfw_dic['deleted'] = False + response_vfw = vfw_obj.get_objects(context, **vfw_dic) + return response_vfw + + def get_vfws_by_fuzzy_query(self, context, dic): + view = {} + view['tenant_id'] = dic['tenant_id'] + view['network_zone'] = dic['network_zone'] + view['dc_name'] = dic['dc_name'] + view_infos = self.db_common.get_vres_agent_view_for_fw(context, **view) + if len(view_infos) == 0: + return view_infos + + # init the DB operations object + obj = objects.VFW(context) + dic['deleted'] = "0" + search_list = ['deleted'] + like_list = [] + keys = dic.keys() + if "network_zone_class" in keys: + if tools.is_not_nil(dic['network_zone_class']): + search_list.append("network_zone_class") + if "protection_class" in keys: + if tools.is_not_nil(dic['protection_class']): + search_list.append("protection_class") + if "resource" in keys: + if tools.is_not_nil(dic['resource']): + like_list.append("resource") + if "name" in keys: + if tools.is_not_nil(dic['name']): + like_list.append("name") + response = [] + for views in view_infos: + dic["vres_id"] = views["vres_id"] + search_list.append("vres_id") + like_dic, search_dic = tools.classfiy_sql_keys(dic, like_list, + search_list) + infos = obj.get_all_objects_by_conditions(context, + like_dic, search_dic) + response.extend(infos) + return response + + def _make_vfw_object(self, values): + target_values = {} + for k in values.keys(): + if k == 'name': + target_values['vfw_name'] = values[k] + elif k == 'type': + target_values['vfw_type'] = values[k] + elif k == 'resource': + target_values['vfw_info'] = values[k] + elif k == 'network_zone': + target_values['network_zone_name'] = values[k] + else: + target_values[k] = values[k] + return target_values + + def create_dnat(self, context, dnat): + tenant_id = dnat['tenant_id'] + net_zone = dnat['network_zone'] + dc_name = dnat['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + + # get the colunm vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = dnat['vfwname'] + vfw_dic['vres_id'] = vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + target_values = {} + target_values['vfw_id'] = rstfwvfw.id + merge_dict = tools.dict_merge(dnat, target_values) + dnat_obj = objects.Dnat(context, **merge_dict) + # insert operation history + dnat_str = json.dumps(dnat) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=dnat_str, + method='CREATE', + status='FAILED') + check_dnat_dic = {} + check_dnat_dic['vfw_id'] = rstfwvfw.id + check_dnat_dic['name'] = dnat['name'] + check_dnat_obj = objects.Dnat(context, **check_dnat_dic) + if self.db_common.is_exist_object(context, check_dnat_obj): + raise exception.HaveSameObject(param_name=check_dnat_obj.name) + response_dnat = self.db_common.create_in_storage(context, dnat_obj) + self.rpc_api.reload_topic(view_obj['agent_ip']) + + try: + self.rpc_api.create_dnat(context, dnat) + except Exception as e: + LOG.error(_LE("Create vfw on device failed")) + # since create failed in device, so delete object in DB + dnat_obj.delete(context, response_dnat['id']) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return response_dnat + + def delete_dnat(self, context, dnat): + tenant_id = dnat['tenant_id'] + net_zone = dnat['network_zone'] + dc_name = dnat['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + # insert operation history + dnat_str = json.dumps(dnat) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=dnat_str, + method='CREATE', + status='FAILED') + dnat_obj = objects.Dnat(context) + dnat_dic = {} + dnat_dic['id'] = dnat['id'] + dnat_dic['deleted'] = False + try: + dnat_obj.get_object(context, **dnat_dic) + except Exception: + raise exception.IsNotExistError(param_name="dnat with id=" + + dnat_dic['id']) + dnat_info = dnat_obj.delete(context, dnat['id']) + dnat["vfwname"] = dnat_info["vfwname"] + dnat["name"] = dnat_info["name"] + self.rpc_api.reload_topic(view_obj['agent_ip']) + try: + self.rpc_api.delete_dnat(context, dnat) + except Exception as e: + LOG.error(_LE("Delete dnat on device failed")) + dnat_obj.update(context, dnat_info['id'], dnat_dic) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + + return dnat_info + + def get_dnat(self, context, id): + dnat_dic = {} + dnat_dic['id'] = id + dnat_dic['deleted'] = False + dnat_obj = objects.Dnat(context) + try: + dnat_info = dnat_obj.get_object(context, **dnat_dic) + except Exception: + raise exception.IsNotExistError(param_name="dnat with id=" + + dnat_dic['id']) + return dnat_info + + def get_all_dnats(self, context, dnat): + tenant_id = dnat['tenant_id'] + net_zone = dnat['network_zone'] + dc_name = dnat['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + # get the colunm vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = dnat['vfwname'] + vfw_dic['vres_id'] = vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + dnat_dic = {} + dnat_dic['vfw_id'] = rstfwvfw.id + dnat_dic['deleted'] = False + dnat_obj = objects.Dnat(context) + response_dnat = dnat_obj.get_objects(context, **dnat_dic) + return response_dnat + + def get_dnats_by_fuzzy_query(self, context, dic): + """ + get dnat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + view = {} + view['tenant_id'] = dic['tenant_id'] + view['network_zone'] = dic['network_zone'] + view['dc_name'] = dic['dc_name'] + view_infos = self.db_common.get_vres_agent_vfw_view(context, **view) + if len(view_infos) == 0: + return view_infos + + # init the DB operations object + obj = objects.Dnat(context) + dic['deleted'] = "0" + search_list = ['deleted'] + like_list = [] + keys = dic.keys() + if "vfwname" in keys: + if tools.is_not_nil(dic['vfwname']): + search_list.append("vfwname") + if "inifname" in keys: + if tools.is_not_nil(dic['inifname']): + like_list.append("inifname") + if "slot" in keys: + if tools.is_not_nil(dic['slot']): + like_list.append("slot") + if "lanipstart" in keys: + if tools.is_not_nil(dic['lanipstart']): + like_list.append("lanipstart") + if "wanip" in keys: + if tools.is_not_nil(dic['wanip']): + like_list.append("wanip") + if "lanipend" in keys: + if tools.is_not_nil(dic['lanipend']): + like_list.append("lanipend") + response = [] + for views in view_infos: + dic["vfw_id"] = views["vfw_id"] + search_list.append("vfw_id") + like_dic, search_dic = tools.classfiy_sql_keys(dic, like_list, + search_list) + infos = obj.get_all_objects_by_conditions(context, + like_dic, search_dic) + response.extend(infos) + return response + + def _make_dnat_object(self, values): + """ + From client request, the parameters in lowercase by unify, + in order to operation on target device, we must convert these + parameters into device can know parameters + """ + target_values = {} + for k in values.keys(): + if k == 'inifname': + target_values['inIfName'] = values[k] + elif k == 'wanip': + target_values['wanIp'] = values[k] + elif k == 'wantcpports': + target_values['wanTcpPorts'] = values[k] + elif k == 'wanudpports': + target_values['wanUdpPorts'] = values[k] + elif k == 'lanipstart': + target_values['lanIpStart'] = values[k] + elif k == 'lanipend': + target_values['lanIpEnd'] = values[k] + elif k == 'lanport': + target_values['lanport'] = values[k] + elif k == 'vfwname': + target_values['vfwName'] = values[k] + else: + target_values[k] = values[k] + return target_values + + def create_packetfilter(self, context, packetfilter): + tenant_id = packetfilter['tenant_id'] + net_zone = packetfilter['network_zone'] + dc_name = packetfilter['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + # get the colunm vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = packetfilter['vfwname'] + vfw_dic['vres_id'] = vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + # insert operation history + pf_str = json.dumps(packetfilter) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=pf_str, + method='CREATE', + status='FAILED') + # Check src/dst address object base on address object ip info + srcipobjnames = [] + dstipobjnames = [] + if 'srcipobjips' in packetfilter.keys(): + srcips = packetfilter['srcipobjips'] + for ip in srcips: + name = self._get_addrobjname(context, rstfwvfw.id, ip) + srcipobjnames.append(name) + if 'dstipobjips' in packetfilter.keys(): + srcips = packetfilter['dstipobjips'] + dstipobjnames = [] + for ip in srcips: + name = self._get_addrobjname(context, rstfwvfw.id, ip) + dstipobjnames.append(name) + target_values = {} + target_values['vfw_id'] = rstfwvfw.id + # if srcIpObjNames/dstIpObjNames is [], it's mean 'no ip limit' + target_values['srcipobjnames'] = srcipobjnames + target_values['dstipobjnames'] = dstipobjnames + merge_dict = tools.dict_merge(packetfilter, target_values) + packetfilter_obj = objects.PacketFilter(context, **merge_dict) + check_packetfilter_dic = {} + check_packetfilter_dic['name'] = packetfilter['name'] + check_packetfilter_dic['vfw_id'] = rstfwvfw.id + checkpacketfilter = objects.PacketFilter(context, + **check_packetfilter_dic) + if self.db_common.is_exist_object(context, checkpacketfilter): + raise exception.HaveSameObject(param_name=checkpacketfilter.name) + response = self.db_common.create_in_storage(context, packetfilter_obj) + self.rpc_api.reload_topic(view_obj['agent_ip']) + try: + merge_dict['srcipobjnames'] = tools.joinString( + merge_dict['srcipobjnames']) + merge_dict['dstipobjnames'] = tools.joinString( + merge_dict['dstipobjnames']) + merge_dict['servicenames'] = tools.joinString( + merge_dict['servicenames']) + self.rpc_api.create_packetfilter(context, merge_dict) + except Exception as e: + LOG.error(_LE("Create vfw on device failed")) + # since create failed in device, so delete object in DB + packetfilter_obj.delete(context, response['id']) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return response + + def delete_packetfilter(self, context, packetfilter): + tenant_id = packetfilter['tenant_id'] + net_zone = packetfilter['network_zone'] + dc_name = packetfilter['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + input_str = json.dumps(packetfilter) + packetfilter_obj = objects.PacketFilter(context) + history = self.db_common.insert_operation_history(context, + vres_id=vres_id, + input=input_str, + method='DELETE', + status='FAILED') + packetfilter_dic = {} + packetfilter_dic['id'] = packetfilter['id'] + packetfilter_dic['deleted'] = False + try: + packetfilter_obj.get_object(context, **packetfilter_dic) + except Exception: + LOG.error( + _LE("No target packetfilter with id=%s" % packetfilter['id'])) + raise exception.IsNotExistError( + param_name="packetfilter" + " with id=" + packetfilter['id']) + response = packetfilter_obj.delete(context, packetfilter['id']) + self.rpc_api.reload_topic(view_obj['agent_ip']) + try: + trans_dict = {} + trans_dict['vfwName'] = response.vfwname + trans_dict['name'] = response.name + self.rpc_api.delete_packetfilter(context, trans_dict) + except Exception as e: + LOG.error(_LE("Delete packetfilter on device failed")) + packetfilter_obj.update(context, response['id'], packetfilter_dic) + raise e + self.db_common.update_operation_history(context, history['id'], + status='SUCCESS') + return response + + def get_packetfilter(self, context, id): + packetfilter_obj = objects.PacketFilter(context) + packetfilter_dic = {} + packetfilter_dic['id'] = id + packetfilter_dic['deleted'] = False + try: + response = packetfilter_obj.get_object(context, **packetfilter_dic) + except Exception: + raise exception.IsNotExistError(param_name="packetfilter" + " with id=" + id) + return response + + def get_all_packetfilters(self, context, packetfilter): + tenant_id = packetfilter['tenant_id'] + net_zone = packetfilter['network_zone'] + dc_name = packetfilter['dc_name'] + view_obj = self.db_common.get_vres_agent_view(context, + tenant_id=tenant_id, + agent_type='FW', + network_zone=net_zone, + dc_name=dc_name) + vres_id = view_obj['vres_id'] + # get the colunm vfw_id(fw_vfw_info_id) + vfw_dic = {} + vfw_dic['vfw_name'] = packetfilter['vfwname'] + vfw_dic['vres_id'] = vres_id + rstfwvfw = self.db_common.get_fw_vfw_id(context, **vfw_dic) + packetfilter_dic = {} + packetfilter_dic['vfw_id'] = rstfwvfw.id + packetfilter_dic['deleted'] = False + packetfilter_obj = objects.PacketFilter(context) + packetfilters = packetfilter_obj.get_objects(context, + **packetfilter_dic) + + return packetfilters + + def _make_packetfilter_object(self, values): + """ + From client request, the parameters in lowercase by unify, + in order to operation on target device, we must convert these + parameters into the parameters which device can know + """ + target_values = {} + for k in values.keys(): + if k == 'srczonename': + target_values['srcZoneName'] = values[k] + elif k == 'dstzonename': + target_values['dstZoneName'] = values[k] + elif k == 'srcipobjnames': + target_values['srcIpObjNames'] = values[k] + elif k == 'dstipobjnames': + target_values['dstIpObjNames'] = values[k] + elif k == 'servicenames': + target_values['serviceNames'] = values[k] + elif k == 'vfwname': + target_values['vfwName'] = values[k] + else: + target_values[k] = values[k] + return target_values + + def _get_addrobjname(self, context, vfwid, addrobjip): + """ + Use for get address object name by the address object's + corresponding IP info and related vfw info + """ + target_addrobj = objects.FwAddrObjInfo(context) + addr_obj_dic = {} + addr_obj_dic['vfw_id'] = vfwid + addr_obj_dic['ip'] = addrobjip + addr_obj_dic['deleted'] = False + try: + addrobjinfo = target_addrobj.get_object(context, **addr_obj_dic) + except Exception: + raise exception.IsNotExistError( + param_name="addrObjInfo" + " with ip=" + + addr_obj_dic['ip'] + + "and vfw_id=" + + addr_obj_dic['vfw_id']) + return addrobjinfo.name + + # this is a vrf operation + def create_vrf(self, context, fw_object): + """ + create vrf handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + vargs = {} + vargs['tenant_id'] = fw_object['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_object['network_zone'] + vargs['dc_name'] = fw_object['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + vargs_history = {} + vargs_history['input'] = json.dumps(fw_object) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'CREATE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + # input the vrf value with dic format + fw_object['vres_id'] = revs_agent.vres_id + fw_object['operation_fro'] = 'AUTO' + fw_obj = objects.FW_Vrf_Object(context, **fw_object) + # create the vrf info in db + result = self.db_common.create_in_storage(context, fw_obj) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def del_vrf(self, context, fw_object): + """ + del vrf handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + vargs = {} + vargs['tenant_id'] = fw_object['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_object['network_zone'] + vargs['dc_name'] = fw_object['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + vargs_history = {} + vargs_history['input'] = json.dumps(fw_object) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'DELETE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + # del the vrf values with dic format + fw_obj = objects.FW_Vrf_Object(context, **fw_object) + # del the vrf info in db + result = fw_obj.delete(context, fw_object["id"]) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def get_vrf(self, context, id): + + # get the vrf values with dic format + target_values = {} + target_values['deleted'] = False + target_values["id"] = id + + fw_obj = objects.FW_Vrf_Object(context, **target_values) + try: + result = fw_obj.get_object(context, **target_values) + except Exception: + raise exception.IsNotExistError(param_name="vrf with id=" + + target_values['id']) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + return result + + def get_vrfs(self, context, fw_object): + """ + get_all vrf handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + vargs = {} + vargs['tenant_id'] = fw_object['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_object['network_zone'] + vargs['dc_name'] = fw_object['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + + # get the vrf values with dic format + target_values = {} + target_values['deleted'] = False + target_values['vres_id'] = revs_agent.vres_id + + # merge_dict = tools.dict_merge(fw_object, target_values) + fw_obj = objects.FW_Vrf_Object(context, **target_values) + # get the vrf info in db + + result = fw_obj.get_objects(context, **target_values) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + return result + + # this is a snat operation + def create_snat(self, context, fw_object): + """ + create snat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + vargs = {} + vargs['tenant_id'] = fw_object['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_object['network_zone'] + vargs['dc_name'] = fw_object['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + vargs_history = {} + vargs_history['input'] = json.dumps(fw_object) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'CREATE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + # get the value vfw_id(fw_vfw_info_id) + rstfwvfw = self.db_common.get_fw_vfw_id(context, + vfw_name=fw_object['vfwname'], + vres_id=revs_agent.vres_id, + ) + # IP address is converted to an address object + vfw_id = rstfwvfw.id + srcipobjname = fw_object['srcipobjname'] + dstipobjname = fw_object['dstipobjname'] + srcipobjname_new = [] + dstipobjname_new = [] + addrobj = {} + addrobj["vfw_id"] = vfw_id + if len(srcipobjname) == 0: + srcipobjname_new.append("all") + elif len(srcipobjname) == 1: + if (srcipobjname[0] is not "all"): + addrobj["ip"] = srcipobjname[0] + ipname = self.db_common.get_addrobj_name(context, **addrobj) + srcipobjname_new.append(ipname) + else: + srcipobjname_new.append("all") + else: + for key in srcipobjname: + addrobj["ip"] = key + ipname = self.db_common.get_addrobj_name(context, **addrobj) + srcipobjname_new.append(ipname) + + if len(dstipobjname) == 0: + dstipobjname_new.append("all") + elif len(dstipobjname) == 1: + if (dstipobjname[0] is not "all"): + addrobj["ip"] = dstipobjname[0] + ipname = self.db_common.get_addrobj_name(context, **addrobj) + dstipobjname_new.append(ipname) + else: + dstipobjname_new.append("all") + else: + for key in dstipobjname: + addrobj["ip"] = key + ipname = self.db_common.get_addrobj_name(context, **addrobj) + dstipobjname_new.append(ipname) + fw_object['srcipobjname'] = srcipobjname_new + fw_object['dstipobjname'] = dstipobjname_new + # input the snat values with dic format + # fw_object['vfwname'] = revs_agent.tenant_id + fw_object['vfw_id'] = vfw_id + fw_object['operation_fro'] = 'AUTO' + fw_obj = objects.FW_Snat_Object(context, **fw_object) + # create the snat info in db + result = self.db_common.create_in_storage(context, fw_obj) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + try: + self.rpc_api.create_snat(context, fw_object) + except Exception as e: + fw_obj.delete(context, result["id"]) + raise e + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def del_snat(self, context, fw_object): + """ + del snat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + vargs = {} + vargs['tenant_id'] = fw_object['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_object['network_zone'] + vargs['dc_name'] = fw_object['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + vargs_history = {} + vargs_history['input'] = json.dumps(fw_object) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'DELETE' + vargs_history['status'] = 'FAILED' + + history = self.db_common.insert_operation_history(context, + **vargs_history) + # del the snat values with dic format + fw_obj = objects.FW_Snat_Object(context, **fw_object) + # del the snat info in db + result = fw_obj.delete(context, fw_object["id"]) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + try: + self.rpc_api.del_snat(context, result) + except Exception as e: + val = {} + val["deleted"] = False + fw_obj.update(context, result["id"], val) + raise e + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def get_snat(self, context, id): + # get the staticnat values with dic format + target_values = {} + target_values['deleted'] = False + target_values["id"] = id + + fw_obj = objects.FW_Snat_Object(context, **target_values) + # get the staticnat info in db + try: + result = fw_obj.get_object(context, **target_values) + except Exception: + raise exception.IsNotExistError(param_name="snat with id=" + id) + return result + + def get_snats(self, context, fw_object): + """ + get snat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + vargs = {} + vargs['tenant_id'] = fw_object['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_object['network_zone'] + vargs['dc_name'] = fw_object['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + # get the value vfw_id(fw_vfw_info_id) + rstfwvfw = self.db_common.get_fw_vfw_id(context, + vfw_name=fw_object['vfwname'], + vres_id=revs_agent.vres_id, + ) + + # get_all the snat values with dic format + target_values = {} + target_values['deleted'] = False + target_values['vfw_id'] = rstfwvfw.id + # merge_dict = tools.dict_merge(fw_object, target_values) + fw_obj = objects.FW_Snat_Object(context, **target_values) + # del the staticnat info in db + + result = fw_obj.get_objects(context, **target_values) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + return result + + def get_snats_by_fuzzy_query(self, context, dic): + """ + get snat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + view = {} + view['tenant_id'] = dic['tenant_id'] + view['network_zone'] = dic['network_zone'] + view['dc_name'] = dic['dc_name'] + view_infos = self.db_common.get_vres_agent_vfw_view(context, **view) + if len(view_infos) == 0: + return view_infos + + # init the DB operations object + obj = objects.FW_Snat_Object(context) + dic['deleted'] = "0" + search_list = ['deleted'] + like_list = [] + keys = dic.keys() + if "vfwname" in keys: + if tools.is_not_nil(dic['vfwname']): + search_list.append("vfwname") + if "srcIpObjIP" in keys: + if tools.is_not_nil(dic['srcIpObjIP']): + search_list.append("srcIpObjIP") + if "dstIpObjIP" in keys: + if tools.is_not_nil(dic['dstIpObjIP']): + search_list.append("dstIpObjIP") + if "name" in keys: + if tools.is_not_nil(dic['name']): + like_list.append("name") + if "outIfName" in keys: + if tools.is_not_nil(dic['outIfName']): + like_list.append("outIfName") + if "wanIpPoolIP" in keys: + if tools.is_not_nil(dic['wanIpPoolIP']): + like_list.append("wanIpPoolIP") + response = [] + for views in view_infos: + dic["vfw_id"] = views["vfw_id"] + search_list.append("vfw_id") + like_dic, search_dic = tools.classfiy_sql_keys(dic, like_list, + search_list) + infos = obj.get_all_objects_by_conditions(context, + like_dic, search_dic) + response.extend(infos) + return response + + # this is a snat operation + def create_securityzone(self, context, fw_dic): + """ + create securityZone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + vargs = {} + vargs['tenant_id'] = fw_dic['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_dic['network_zone'] + vargs['dc_name'] = fw_dic['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + + vargs_history = {} + vargs_history['input'] = json.dumps(fw_dic) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'CREATE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + # get the value vfw_id(fw_vfw_info_id) + # get the value vfw_id(fw_vfw_info_id) + vfw_ret = self.db_common.get_fw_vfw_id(context, + vfw_name=fw_dic['vfwname'], + vres_id=revs_agent.vres_id, + ) + # input the securityZone values with dic format + # fw_object['vfwname'] = revs_agent.tenant_id + fw_dic['vfw_id'] = vfw_ret.id + fw_dic['operation_fro'] = 'AUTO' + fw_obj = objects.FW_SecurityZone_Object(context, **fw_dic) + # create the securityZone info in db + result = self.db_common.create_in_storage(context, fw_obj) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + try: + response_fw = self.rpc_api.create_securityzone(context, fw_dic) + except Exception as e: + fw_obj.delete(context, result['id']) + raise e + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def update_securityzone(self, context, fw_object): + """ + update securityZone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + vargs = {} + vargs['tenant_id'] = fw_object['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_object['network_zone'] + vargs['dc_name'] = fw_object['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + + vargs_history = {} + vargs_history['input'] = json.dumps(fw_object) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'UPDATE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + # input the staticnat values with dic format + fw_obj = objects.FW_SecurityZone_Object(context, **fw_object) + # create the staticnat info in db + result = fw_obj.update(context, fw_object['id'], fw_object) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def delete_securityzone(self, context, fw_dic): + """ + del securityZone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + vargs = {} + vargs['tenant_id'] = fw_dic['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_dic['network_zone'] + vargs['dc_name'] = fw_dic['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + vargs_history = {} + vargs_history['input'] = json.dumps(fw_dic) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'DELETE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + old_ret = None + try: + fw_obj = objects.FW_SecurityZone_Object(context, **fw_dic) + dic = fw_obj.as_dict() + old_ret = fw_obj.get_object(context, **dic) + except Exception as e: + raise IsNotExistError(param_name=fw_dic['id']) + result = fw_obj.delete(context, fw_dic["id"]) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + try: + transe_dict = {} + transe_dict['name'] = old_ret.name + transe_dict['vfwName'] = old_ret.vfwname + response_fw = self.rpc_api.delete_securityzone( + context, transe_dict) + except Exception as e: + fw_obj.update(context, fw_dic['id'], old_ret) + raise e + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return {"ret_msg": "success", "ret_code": "200"} + + def get_securityzone(self, context, id): + # get_all the securityZone values with dic format + target_values = {} + target_values['deleted'] = False + target_values["id"] = id + fw_obj = objects.FW_SecurityZone_Object(context) + try: + result = fw_obj.get_object(context, **target_values) + except Exception: + raise exception.IsNotExistError( + param_name="securityZone with id=" + id) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + return result + + def get_securityzones(self, context, fw_dic): + """ + get_all securityZone handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + vlan_obj = objects.FwVlanInfo(context) + sql_str_header = "select fw_security_zone_info.* from " \ + "fw_security_zone_info,view_vfw_vres_agent " \ + "where fw_security_zone_info.vres_id = " \ + "view_vfw_vres_agent.vres_id " \ + "and fw_security_zone_info.deleted = '0' " \ + "and fw_security_zone_info.vfw_id" + name_dic = fw_dic + lik_list = ['ifnames', 'ipaddr'] + search_list = ['tenant_id', 'dc_name', 'network_zone'] + lik_dic, search_dic = tools.classfiy_sql_keys( + name_dic, lik_list, search_list) + sql_str = self.db_common.put_sql(sql_str_header, lik_dic, search_dic) + vlan_objs = vlan_obj.get_all_objects(context, sql_str) + return vlan_objs + + # vargs = {} + # vargs['tenant_id'] = fw_dic['tenant_id'] + # vargs['agent_type'] = 'FW' + # vargs['network_zone'] = fw_dic['network_zone'] + # vargs['dc_name'] = fw_dic['dc_name'] + # revs_agent = self.db_common.get_vres_agent_view(context, + # **vargs) + # # get the value vfw_id(fw_vfw_info_id) + # rstfwvfw = self.db_common.get_fw_vfw_id(context, + # vfw_name=fw_dic['vfw'], + # vres_id=revs_agent.vres_id, + # ) + # + # # get_all the securityZone values with dic format + # target_values = {} + # target_values['deleted'] = False + # target_values['vfw_id'] = rstfwvfw.id + # # merge_dict = tools.dict_merge(fw_object, target_values) + # fw_obj = objects.FW_SecurityZone_Object(context, **target_values) + # # get_all the securityZone info in db + # + # result = fw_obj.get_objects(context, **target_values) + # # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + # return result + + def securityzone_addif(self, context, fw_dic): + vargs = {} + vargs['tenant_id'] = fw_dic['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_dic['network_zone'] + vargs['dc_name'] = fw_dic['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + + vargs_history = {} + vargs_history['input'] = json.dumps(fw_dic) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'UPDATE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + history = self.db_common.insert_operation_history(context, + **vargs_history) + # input the staticnat values with dic format + fw_obj = objects.FW_SecurityZone_Object(context, **fw_dic) + try: + dic = fw_obj.as_dict() + old_ret = fw_obj.get_object(context, **dic) + except: + raise IsNotExistError(param_name=fw_dic['id']) + # create the staticnat info in db + ifnames_dict = {} + ifnames_dict['ifnames'] = deepcopy(old_ret.ifnames) + if fw_dic['ifname'] not in ifnames_dict['ifnames']: + ifnames_dict['ifnames'].append(fw_dic['ifname']) + reuslt = fw_obj.update(context, fw_dic['id'], ifnames_dict) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + try: + transe_dic = {} + transe_dic['ifName'] = fw_dic['ifname'] + transe_dic['vfwName'] = old_ret.vfwname + transe_dic['zoneName'] = old_ret.name + response_fw = self.rpc_api.securityzone_addif(context, transe_dic) + except Exception as e: + fw_obj.update(context, fw_dic['id'], old_ret) + raise e + self.db_common.update_operation_history( + context, history.id, status='SUCCESS') + return reuslt + + def securityzone_delif(self, context, fw_dic): + vargs = {} + vargs['tenant_id'] = fw_dic['tenant_id'] + vargs['agent_type'] = 'FW' + vargs['network_zone'] = fw_dic['network_zone'] + vargs['dc_name'] = fw_dic['dc_name'] + revs_agent = self.db_common.get_vres_agent_view(context, + **vargs) + + vargs_history = {} + vargs_history['input'] = json.dumps(fw_dic) + vargs_history['vres_id'] = revs_agent.vres_id + vargs_history['method'] = 'UPDATE' + vargs_history['status'] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **vargs_history) + # input the staticnat values with dic format + fw_obj = objects.FW_SecurityZone_Object(context, **fw_dic) + try: + dic = fw_obj.as_dict() + old_ret = fw_obj.get_object(context, **dic) + except: + raise IsNotExistError(param_name=fw_dic['id']) + # create the staticnat info in db + ifnames_dict = {} + ifnames_dict['ifnames'] = deepcopy(old_ret.ifnames) + if fw_dic['ifname'] in ifnames_dict['ifnames']: + ifnames_dict['ifnames'].remove(fw_dic['ifname']) + reuslt = fw_obj.update(context, fw_dic['id'], ifnames_dict) + self.rpc_api.reload_topic(revs_agent['agent_ip']) + try: + transe_dic = {} + transe_dic['ifName'] = fw_dic['ifname'] + response_fw = self.rpc_api.securityzone_delif(context, transe_dic) + except Exception as e: + fw_obj.update(context, fw_dic['id'], old_ret) + raise e + self.db_common.update_operation_history( + context, history.id, status='SUCCESS') + return reuslt + + # this is a staticnat operation + def create_staticnat(self, context, fw_object): + """ + create staticnat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + fw_object['agent_type'] = 'FW' + kw = self.db_common.merge_dict_view(fw_object) + view = self.db_common.get_vres_agent_view(context, **kw) + vres_id = view["vres_id"] + input_str = json.dumps(fw_object) + history_dic = {} + history_dic["vres_id"] = vres_id + history_dic["input"] = input_str + history_dic["method"] = 'CREATE' + history_dic["status"] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **history_dic) + # get the value vfw_id(fw_vfw_info_id) + varstaticnat = {} + varstaticnat['vfw_name'] = fw_object['vfwname'] + varstaticnat['vres_id'] = view.vres_id + varstaticnat['deleted'] = False + rstfwvfw = self.db_common.get_fw_vfw_id(context, **varstaticnat) + # input the staticnat values with dic format + # fw_object['vfwname'] = fw_object['vfwname'] + fw_object['vfw_id'] = rstfwvfw.id + fw_object['operation_fro'] = 'AUTO' + fw_obj = objects.FW_Staticnat_Object(context, **fw_object) + # create the staticnat info in db + result = self.db_common.create_in_storage(context, fw_obj) + self.rpc_api.reload_topic(view['agent_ip']) + try: + self.rpc_api.create_staticnat(context, fw_object) + except Exception as e: + + fw_obj.delete(context, result["id"]) + raise e + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def del_staticnat(self, context, fw_object): + """ + del staticnat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + # insert operation history type with Creating in DB + + fw_object['agent_type'] = 'FW' + kw = self.db_common.merge_dict_view(fw_object) + view = self.db_common.get_vres_agent_view(context, **kw) + vres_id = view["vres_id"] + input_str = json.dumps(fw_object) + history_dic = {} + history_dic["vres_id"] = vres_id + history_dic["input"] = input_str + history_dic["method"] = 'DELETE' + history_dic["status"] = 'FAILED' + history = self.db_common.insert_operation_history(context, + **history_dic) + + # del the staticnat values with dic format + fw_obj = objects.FW_Staticnat_Object(context, **fw_object) + # del the staticnat info in db + result = fw_obj.delete(context, fw_object["id"]) + fw_object["name"] = result["name"] + fw_object["vfwName"] = result["vfwname"] + self.rpc_api.reload_topic(view['agent_ip']) + try: + self.rpc_api.del_staticnat(context, fw_object) + except Exception as e: + val = {} + val["deleted"] = False + fw_obj.update(context, result["id"], val) + raise e + self.db_common.update_operation_history( + context, history['id'], status='SUCCESS') + return result + + def get_staticnat(self, context, fw_object): + target_values = {} + target_values['deleted'] = False + target_values["id"] = fw_object["id"] + + fw_obj = objects.FW_Staticnat_Object(context, **target_values) + try: + result = fw_obj.get_object(context, **target_values) + except Exception: + raise exception.IsNotExistError(param_name="Staticnat with id=" + + target_values['id']) + # response_fw = self.rpc_api.creat_addrobj(context, addrobj_infos) + return result + + def get_staticnats_by_fuzzy_query(self, context, dic): + """ + get staticnat handling DB operations and calling rpc client's + corresponding method to send messaging to agent endpoints + """ + view = {} + view['tenant_id'] = dic['tenant_id'] + view['network_zone'] = dic['network_zone'] + view['dc_name'] = dic['dc_name'] + view_infos = self.db_common.get_vres_agent_vfw_view(context, **view) + if len(view_infos) == 0: + return view_infos + + # init the DB operations object + obj = objects.FW_Staticnat_Object(context) + dic['deleted'] = "0" + search_list = ['deleted'] + like_list = [] + keys = dic.keys() + if "vfwname" in keys: + if tools.is_not_nil(dic['vfwname']): + search_list.append("vfwname") + if "name" in keys: + if tools.is_not_nil(dic['name']): + like_list.append("name") + if "ifname" in keys: + if tools.is_not_nil(dic['ifname']): + like_list.append("ifname") + if "lanip" in keys: + if tools.is_not_nil(dic['lanip']): + like_list.append("lanip") + if "wanip" in keys: + if tools.is_not_nil(dic['wanip']): + like_list.append("wanip") + response = [] + for views in view_infos: + dic["vfw_id"] = views["vfw_id"] + search_list.append("vfw_id") + like_dic, search_dic = tools.classfiy_sql_keys(dic, like_list, + search_list) + infos = obj.get_all_objects_by_conditions(context, + like_dic, search_dic) + response.extend(infos) + return response diff --git a/nca47/manager/firewall_manager/protocol.py b/nca47/manager/firewall_manager/protocol.py new file mode 100644 index 0000000..0347987 --- /dev/null +++ b/nca47/manager/firewall_manager/protocol.py @@ -0,0 +1,143 @@ +"""Use for match proto with proto id""" + + +def match_proto(str_proto_num): + # 134-254 Unallocated + # 255 retain + proto = { + "0": "HOPOPT", + "1": "ICMP", + "2": "IGMP", + "3": "GGP", + "4": "IP", + "5": "ST", + "6": "TCP", + "7": "CBT", + "8": "EGP", + "9": "IGP", + "10": "BBN-RCC-MON", + "11": "NVP-II", + "12": "PUP", + "13": "ARGUS", + "14": "EMCON", + "15": "XNET", + "16": "CHAOS", + "17": "UDP", + "18": "MUX", + "19": "DCN-MEAS", + "20": "HMP", + "21": "PRM", + "22": "XNS-IDP", + "23": "TRUNK-1", + "24": "TRUNK-2", + "25": "LEAF-1", + "26": "LEAF-2", + "27": "RDP", + "28": "IRTP", + "29": "ISO-TP4", + "30": "NETBLT", + "31": "MFE-NSP", + "32": "MERIT-INP", + "33": "SEP", + "34": "3PC", + "35": "IDPR", + "36": "XTP", + "37": "DDP", + "38": "IDPR-CMTP", + "39": "TP++", + "40": "IL", + "41": "IPv6", + "42": "SDRP", + "43": "IPv6-Route", + "44": "IPv6-Frag", + "45": "IDRP", + "46": "RSVP", + "47": "GRE", + "48": "MHRP", + "49": "BNA", + "50": "ESP", + "51": "AH", + "52": "I-NLSP", + "53": "SWIPE", + "54": "NARP", + "55": "MOBILE", + "56": "TLSP", + "57": "SKIP", + "58": "IPv6-ICMP", + "59": "IPv6-NoNxt", + "60": "IPv6-Opts", + "61": "any host internal protocol", + "62": "CFTP", + "63": "any local network", + "64": "SAT-EXPAK", + "65": "KRYPTOLAN", + "66": "RVD", + "67": "IPPC", + "68": "any distributed ile system", + "69": "SAT-MON", + "70": "VISA", + "71": "IPCV", + "72": "CPNX", + "73": "CPHB", + "74": "WSN", + "75": "PVP", + "76": "BR-SAT-MON", + "77": "SUN-ND", + "78": "WB-MON", + "79": "WB-EXPAK", + "80": "ISO-IP", + "81": "VMTP", + "82": "SECURE-VMTP", + "83": "VINES", + "84": "TTP", + "85": "NSFNET-IGP", + "86": "DGP", + "87": "TCF", + "88": "EIGRP", + "89": "OSPFIGP", + "90": "Sprite-RPC", + "91": "LARP", + "92": "MTP", + "93": "AX.25", + "94": "IPIP", + "95": "MICP", + "96": "SCC-SP", + "97": "ETHERIP", + "98": "ENCAP", + "99": "any private encryption scheme", + "100": "GMTP", + "101": "IFMP", + "102": "PNNI", + "103": "PIM", + "104": "ARIS", + "105": "SCPS", + "106": "QNX", + "107": "A/N", + "108": "IPComp", + "109": "SNP", + "110": "Compaq-Peer", + "111": "IPX-in-IP", + "112": "VRRP", + "113": "PGM", + "114": "any 0-hop protocol", + "115": "L2TP", + "116": "DDX", + "117": "IATP", + "118": "STP", + "119": "SRP", + "120": "UTI", + "121": "SMP", + "122": "SM", + "123": "PTP", + "124": "ISIS", + "125": "FIRE", + "126": "CRTP", + "127": "CRUDP", + "128": "SSCOPMCE", + "129": "IPLT", + "130": "SPS", + "131": "PIPE", + "132": "SCTP", + "133": "FC" + } + return proto[str_proto_num] diff --git a/nca47/manager/lb_manager/__init__.py b/nca47/manager/lb_manager/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nca47/manager/lb_manager/lb_manager.py b/nca47/manager/lb_manager/lb_manager.py new file mode 100644 index 0000000..778c7c6 --- /dev/null +++ b/nca47/manager/lb_manager/lb_manager.py @@ -0,0 +1,147 @@ +from oslo_config import cfg +from oslo_log import log as logging +from nca47 import objects +from nca47.manager import db_common +from nca47.manager.lb_manager import lb_model as model + + +CONF = cfg.CONF +LOG = logging.getLogger(__name__) + +LB_MANAGER = None + + +class LBManager(object): + + """ + LB operation handler class, using for handle client requests, + """ + + def __init__(self): + self.db_common = db_common.DBCommon.get_instance() + + @classmethod + def get_instance(cls): + + global LB_MANAGER + if not LB_MANAGER: + LB_MANAGER = cls() + return LB_MANAGER + + def create_pool(self, context, real_dic): + pool_list = [] + var_dic = {} + var_dic["deleted"] = False + pool = objects.lb_realServer_object(context) + pool = pool.get_objects(context, **var_dic) + index = len(pool) + input_dic = real_dic + rip = real_dic["rip"] + for key in rip: + index = index+1 + input_dic["rip"] = key + input_dic["realservername"] = ( + input_dic["environment_name"] + + "_" + + input_dic["application"] + "_" + + "R_" + + str(index)) + input_dic["command_input"] = model.get_realserver(**input_dic) + pool = objects.lb_realServer_object(context, **input_dic) + pool = pool.create(context, pool.as_dict()) + pool_list.append(pool) + return pool_list + + def create_member(self, context, member_dic): + # member_list = [] + var_dic = {} + sql = ("select * , count(distinct groupname) from \ + lb_group_info where deleted = 0 group by groupname;") + var_dic["sql"] = sql + member = objects.lb_group_object(context) + member = member.get_all_objects(context, **var_dic) + index = len(member) + 1 + input_dic = member_dic + input_dic["groupname"] = ( + input_dic["environment_name"] + + "_" + + input_dic["application"] + "_" + + "G_" + + str(index)) + realservernames = member_dic["realservername"] + realservername_list = [] + for key in realservernames: + realservername_list.append(key["realservername"]) + input_dic["realservername"] = realservername_list + input_dic["command_input"] = model.get_group(**input_dic) + member = objects.lb_group_object(context, **input_dic) + member = member.create(context, member.as_dict()) + # member_list.append(member) + return member + + def create_vip(self, context, vip_dic): + var_dic = {} + var_dic["deleted"] = False + vip = objects.lb_vip_object(context) + vip = vip.get_objects(context, **var_dic) + index = len(vip) + 1 + input_dic = vip_dic + input_dic["virtualservername"] = ( + input_dic["environment_name"] + + "_" + + input_dic["application"] + "_" + + "V_" + + str(index)) + input_dic["command_input"] = model.get_vip(**input_dic) + vip = objects.lb_vip_object(context, **input_dic) + vip = vip.create(context, vip.as_dict()) + return vip + + def create_server(self, context, server_dic): + server_list = [] + var_dic = {} + var_dic["deleted"] = False + server_ = objects.lb_server_object(context) + server_ = server_.get_objects(context, **var_dic) + input_dic = server_dic + virt_name = server_dic["virtualservername"] + froup_name = server_dic["groupname"] + input_dic["virtualservername"] = virt_name["virtualservername"] + input_dic["groupname"] = froup_name["groupname"] + rports = server_dic["rport"] + vports = server_dic["vport"] + index = 0 + for key in rports: + input_dic["rport"] = key + input_dic["vport"] = vports[index] + index = index+1 + input_dic["command_input"] = model.get_service(**input_dic) + server_ = objects.lb_server_object(context, **input_dic) + server_ = server_.create(context, server_.as_dict()) + server_list.append(server_) + return server_list + + def delete_real_service(self, context, real_dic): + var_dic = {} + delete_list = [] + realservername = real_dic["realservername"] + sql = ("select * , count(distinct groupname) from lb_group_info \ + where deleted = 0 and realservername like '%%" + + realservername + "%%' group by groupname;") + var_dic["sql"] = sql + member = objects.lb_group_object(context) + member = member.get_all_objects(context, **var_dic) + member_list = [] + for key in member: + member_list.append(key["groupname"]) + real_dic["groupname"] = member_list + real_list = model.delete_realserver( + realservername) + delete_list.append(real_list) + for key in member_list: + del_group_real_dic = {} + del_group_real_dic["groupname"] = key + del_group_real_dic["realservername"] = realservername + group_del_list = model.delete_group_realser(**del_group_real_dic) + delete_list.append(group_del_list) + return delete_list diff --git a/nca47/manager/lb_manager/lb_model.py b/nca47/manager/lb_manager/lb_model.py new file mode 100644 index 0000000..dcc3ced --- /dev/null +++ b/nca47/manager/lb_manager/lb_model.py @@ -0,0 +1,99 @@ +realservername = "" +rip = "" +groupname = "" +virtualservername = "" +virtualname = "" +vip = "" +vport = "" +rport = "" +pbindtype = "" +dbindtype = "" +ptmouttime = "" +metrictype = "" + + +def get_realserver(**dic): + real_list = [] + realservername = dic['realservername'] + rip = dic['rip'] + real_list.append("/c/slb/real "+realservername) + real_list.append("ena") + real_list.append("ipver v4") + real_list.append("rip "+rip) + # realserver = "/c/slb/real "+realservername+"/ena/ipver v4/rip "+rip + return real_list + + +def get_group(**dic): + group_list = [] + realservername = dic['realservername'] + metrictype = dic['metrictype'] + groupname = dic['groupname'] + group_list.append("/c/slb/group "+groupname) + group_list.append("ipver v4") + for key in realservername: + group_list.append("add "+key) + if metrictype is not None and metrictype is not"": + group_list.append("metric "+metrictype) + group_list.append("health tcp") + # group = ("/c/slb/group " + groupname + "/ipver v4/add " + + # realservername + "/health tcp") + return group_list + + +def get_vip(**dic): + vip_list = [] + virtualservername = dic['virtualservername'] + vip = dic['vip'] + virtualname = dic['virtualname'] + vip_list.append("/c/slb/virt "+virtualservername) + vip_list.append("ena") + vip_list.append("ipver v4") + vip_list.append("vip "+vip) + vip_list.append("vname "+virtualname) + # v_ip = ("/c/slb/virt " + virtualservername + "/ena/ipver v4/vip " + + # vip +"/vname " + virtualname)""" + return vip_list + + +def get_service(**dic): + service_list = [] + protocol = dic["protocol"] + virtualservername = dic['virtualservername'] + groupname = dic['groupname'] + rport = dic['rport'] + vport = dic['vport'] + pbindtype = dic['pbindtype'] + dbindtype = dic['dbindtype'] + ptmouttime = dic['ptmouttime'] + service_list.append("/c/slb/virt " + virtualservername + "/service " + + vport + " " + protocol) + service_list.append("group "+groupname) + service_list.append("rport "+rport) + if pbindtype is not None and pbindtype is not"": + service_list.append("pbind "+pbindtype) + if dbindtype is not None and dbindtype is not"": + service_list.append("dbind "+dbindtype) + if ptmouttime is not None and ptmouttime is not"": + service_list.append("ptmout "+ptmouttime) + # service_ = ("/c/slb/virt " + virtualservername + "/service " + vport + + # " http/group " + groupname + "/rport " + rport + "/pbind " + + # pbindtype + "/dbind " + dbindtype + "/ptmout " + ptmouttime + + # "/metric " + metrictype)""" + return service_list + + +def delete_realserver(real_name): + del_real_ser_list = [] + del_real_ser_list.append("/c/slb/real "+real_name) + del_real_ser_list.append("del") + return del_real_ser_list + + +def delete_group_realser(**dic): + del_group_realser_list = [] + groupname = dic["groupname"] + realservername = dic["realservername"] + del_group_realser_list.append("/c/slb/group "+groupname) + del_group_realser_list.append("rem "+realservername) + return del_group_realser_list diff --git a/nca47/manager/rpcapi.py b/nca47/manager/rpcapi.py index 6912005..e3ca6f7 100644 --- a/nca47/manager/rpcapi.py +++ b/nca47/manager/rpcapi.py @@ -10,6 +10,8 @@ LOG = logging.getLogger(__name__) DNS_MANAGER_API = None +FW_MANAGER_API = None +CLI_MANAGER_API = None class DNSManagerAPI(object): @@ -25,7 +27,7 @@ class DNSManagerAPI(object): def __init__(self, topic='dns_manager'): rpc.init(CONF) - target = messaging.Target(topic=topic, version=self.RPC_API_VERSION) + target = messaging.Target(topic=topic, version=self.RPC_API_VERSION) self.client = rpc.get_client(target, version_cap=self.RPC_API_VERSION) @classmethod @@ -45,16 +47,396 @@ def get_instance(cls): # Zone Methods def create_zone(self, context, zone): LOG.info(_LI("create_zone: Calling central's create_zone.")) - return self.client.cast(context, 'create_zone', zone=zone) + return self.client.call(context, 'create_zone', zone=zone) - def get_zone(self, context, zone_id): - LOG.info(_LI("get_zone: Calling central's get_zone.")) - return self.client.call(context, 'get_zone', zone_id=zone_id) - - def update_zone(self, context, zone): + def update_zone(self, context, zone, zone_id): LOG.info(_LI("update_zone: Calling central's update_zone.")) - return self.client.call(context, 'update_zone', zone=zone) + return self.client.call(context, 'update_zone', zone=zone, + zone_id=zone_id) + + def update_zone_owners(self, context, zone, zone_id): + LOG.info(_LI("update_zone_owners: Calling central's update_zone.")) + return self.client.call(context, 'update_zone_owners', zone=zone, + zone_id=zone_id) def delete_zone(self, context, zone_id): LOG.info(_LI("delete_zone: Calling central's delete_zone.")) return self.client.call(context, 'delete_zone', zone_id=zone_id) + + def get_zone_one(self, context, zone_id): + LOG.info(_LI("get_zone_one: Replying rpc client's" + "get_zone_one.")) + return self.client.call(context, 'get_zone_one', + zone_id=zone_id) + + def get_zones(self, context): + LOG.info(_LI("get_zones: Replying rpc client's get_zones.")) + return self.client.call(context, 'get_zones') + + # Zone_records Methods + def create_record(self, context, records_dic, zone_id): + LOG.info(_LI("create_zone_records: Calling central's" + " create_zone_record.")) + return self.client.call(context, 'create_record', + records_dic=records_dic, zone_id=zone_id) + + def get_records(self, context, zone_id): + LOG.info(_LI("get_zone_record: Calling central's get_zone_record.")) + '''return self.client.call(context, 'get_record', zone_id=zone_id, + rrs_id=rrs_id)''' + return self.client.call(context, 'get_records', zone_id=zone_id) + + def update_record(self, context, records_dic, zone_id, rrs_id): + LOG.info(_LI("update_zone_record: Calling central's" + "update_zone_record.")) + return self.client.call(context, 'update_record', + records_dic=records_dic, zone_id=zone_id, + record_id=rrs_id) + + def delete_record(self, context, zone_id, rrs_id): + LOG.info(_LI("delete_zone_record: Calling central's" + " delete_zone_record.")) + return self.client.call(context, 'delete_record', + zone_id=zone_id, record_id=rrs_id) + + def del_cache(self, context, cache_dic): + LOG.info(_LI("del_cache: Calling central's del_cache.")) + return self.client.call(context, 'del_cache', cache_dic=cache_dic) + + def glsb_math(self, context, obj_dic, math): + LOG.info(_LI("glsb_math: Calling central's" + "glsb_math.")) + return self.client.call(context, 'glsb_math', + obj_dic=obj_dic, + math=math) + + +class FWManagerAPI(object): + """ + Client side of the Firewall manager RPC API. + + API version history: + + 1.0 - Initial version + """ + RPC_API_VERSION = '1.0' + + def __init__(self, topic='firewall_manager'): + rpc.init(CONF) + # Target's base topic as 'firewall_manager' to make sure rpc/service + # can be connected, since firewall have more than one agent endpoint + # so when confirming the goal agent info via api parameters, we need + # reload the topic + target = messaging.Target(topic=topic, version=self.RPC_API_VERSION) + self.client = rpc.get_client(target, version_cap=self.RPC_API_VERSION) + + @classmethod + def get_instance(cls): + """ + The rpc.get_client() which is called upon the API object initialization + will cause a assertion error if the designate.rpc.TRANSPORT isn't setup + by rpc.init() before. + + This fixes that by creating the rpcapi when demanded. + """ + global FW_MANAGER_API + if not FW_MANAGER_API: + FW_MANAGER_API = cls() + return FW_MANAGER_API + + def reload_topic(self, target_host, topic='firewall_manager'): + """ + Reload topic info base on target_host value to make sure message can be + send to the corresponding rpc service endpoint + """ + self.client.target.topic = '%s.%s' % (topic, target_host) + + def create_vlan(self, context, vlan_infos): + LOG.info(_LI("create_vlan: Calling central's" + "create_vlan.")) + return self.client.call(context, 'create_vlan', + vlan_infos=vlan_infos) + + def del_vlan(self, context, vlan_infos): + LOG.info(_LI("del_vlan: Calling central's" + "del_vlan.")) + return self.client.call(context, 'del_vlan', + vlan_infos=vlan_infos) + + def get_vlan(self, context, vlan_infos): + LOG.info(_LI("get_vlan: Calling central's" + "get_vlan.")) + return self.client.call(context, 'get_vlan', + vlan_infos=vlan_infos) + + def get_vlans(self, context, vlan_infos): + LOG.info(_LI("get_vlans: Calling central's" + "get_vlans.")) + return self.client.call(context, 'get_vlans', + vlan_infos=vlan_infos) + + def create_netservice(self, context, netsev_infos): + LOG.info(_LI("create_netservice: Calling central's" + "create_netservice.")) + return self.client.call(context, 'create_netservice', + netsev_infos=netsev_infos) + + def del_netservice(self, context, netsev_infos): + LOG.info(_LI("del_netservice: Calling central's" + " del_netservice.")) + return self.client.call(context, 'del_netservice', + netsev_infos=netsev_infos) + + def get_netservice(self, context, netsev_infos): + LOG.info(_LI("get_netservice: Calling central's" + "get_netservice.")) + return self.client.call(context, 'get_netservice', + netsev_infos=netsev_infos) + + def get_netservices(self, context, netsev_infos): + LOG.info(_LI("get_netservices: Calling central's" + "get_netservices.")) + return self.client.call(context, 'get_netservices', + netsev_infos=netsev_infos) + + def add_addrobj(self, context, addrobj_infos): + LOG.info(_LI("add_addrobj: Calling central's" + "add_addrobj.")) + return self.client.call(context, 'add_addrobj', + addrobj_infos=addrobj_infos) + + def del_addrobj(self, context, addrobj_infos): + LOG.info(_LI("del_addrobj: Calling central's" + "del_addrobj.")) + return self.client.call(context, 'del_addrobj', + addrobj_infos=addrobj_infos) + + def get_addrobj(self, context, addrobj_infos): + LOG.info(_LI("get_addrobj: Calling central's" + "get_addrobj.")) + return self.client.call(context, 'get_addrobj', + addrobj_infos=addrobj_infos) + + def get_addrobjs(self, context, addrobj_infos): + LOG.info(_LI("get_addrobjs: Calling central's" + "get_addrobjs.")) + return self.client.call(context, 'get_addrobjs', + addrobj_infos=addrobj_infos) + + def add_snataddrpool(self, context, snataddrpool_infos): + LOG.info(_LI("add_snataddrpool: Calling central's" + "add_snataddrpool.")) + return self.client.call(context, 'add_snataddrpool', + snataddrpool_infos=snataddrpool_infos) + + def del_snataddrpool(self, context, snataddrpool_infos): + LOG.info(_LI("del_snataddrpool: Calling central's" + "del_snataddrpool.")) + return self.client.call(context, 'del_snataddrpool', + snataddrpool_infos=snataddrpool_infos) + + def get_snataddrpool(self, context, snataddrpool_infos): + LOG.info(_LI("get_snataddrpool: Calling central's" + "get_snataddrpool.")) + return self.client.call(context, 'get_snataddrpool', + snataddrpool_infos=snataddrpool_infos) + + def get_snataddrpools(self, context, snataddrpool_infos): + LOG.info(_LI("get_snataddrpools: Calling central's" + "get_snataddrpools.")) + return self.client.call(context, 'get_snataddrpools', + snataddrpool_infos=snataddrpool_infos) + + def create_vfw(self, context, vfw): + LOG.info(_LI("create_vfw: Calling central's create_vfw.")) + return self.client.call(context, 'create_vfw', vfw=vfw) + + def delete_vfw(self, context, vfw): + LOG.info(_LI("delete_vfw: Calling central's delete_vfw.")) + return self.client.call(context, 'delete_vfw', + vfw=vfw) + + def get_vfw(self, context, vfw): + LOG.info(_LI("get_vfw: Calling central's get_vfw.")) + return self.client.call(context, 'get_vfw', vfw=vfw) + + def get_all_vfws(self, context, vfw): + LOG.info(_LI("get_all_vfws: Calling central's get_all_vfws.")) + return self.client.call(context, 'get_all_vfws', vfw=vfw) + + def create_dnat(self, context, dnat): + LOG.info(_LI("create_dnat: Calling central's create_dnat.")) + return self.client.call(context, 'create_dnat', dnat=dnat) + + def delete_dnat(self, context, dnat): + LOG.info(_LI("delete_dnat: Calling central's delete_dnat.")) + return self.client.call(context, 'delete_dnat', dnat=dnat) + + def get_dnat(self, context, dnat): + LOG.info(_LI("get_dnat: Calling central's get_dnat.")) + return self.client.call(context, 'get_dnat', dnat=dnat) + + def get_all_dnats(self, context, dnat): + LOG.info(_LI("get_all_dnats: Calling central's get_all_dnats.")) + return self.client.call(context, 'get_all_dnats', dnat=dnat) + + def create_packetfilter(self, context, packetfilter): + LOG.info(_LI("create_packetfilter: Calling central's" + "create_packetfilter.")) + return self.client.call(context, 'create_packetfilter', + packetfilter=packetfilter) + + def delete_packetfilter(self, context, packetfilter): + LOG.info(_LI("delete_packetfilter: Calling central's" + "delete_packetfilter.")) + return self.client.call(context, 'delete_packetfilter', + packetfilter=packetfilter) + + def get_packetfilter(self, context, packetfilter): + LOG.info(_LI("get_packetfilter: Calling central's" + "get_packetfilter.")) + return self.client.call(context, 'get_packetfilter', + packetfilter=packetfilter) + + def get_all_packetfilters(self, context, packetfilter): + LOG.info(_LI("get_all_packetfilters: Calling central's" + "get_all_packetfilters.")) + return self.client.call(context, 'get_all_packetfilters', + packetfilter=packetfilter) + + def create_vrf(self, context, vrf): + LOG.info(_LI("create_vrf: Calling central's create_vrf.")) + return self.client.call(context, 'create_vrf', vrf=vrf) + + def del_vrf(self, context, vrf, agent_info): + LOG.info(_LI("del_vrf: Calling central's del_vrf.")) + return self.client.call(context, 'del_vrf', vrf=vrf) + + def get_vrf(self, context, vrf, agent_info): + LOG.info(_LI("get_vrf: Calling central's get_vrf.")) + return self.client.call(context, 'get_vrf', vrf=vrf) + + def get_vrfs(self, context, vrf, agent_info): + LOG.info(_LI("get_vrfs: Calling central's get_vrfs.")) + return self.client.call(context, 'get_vrfs', vrf=vrf) + + def create_snat(self, context, snat): + LOG.info(_LI("create_snat: Calling central's create_snat.")) + return self.client.call(context, 'create_snat', snat=snat) + + def del_snat(self, context, snat): + LOG.info(_LI("del_snat: Calling central's del_snat.")) + return self.client.call(context, 'del_snat', snat=snat) + + def get_snat(self, context, snat): + LOG.info(_LI("get_snat: Calling central's get_snat.")) + return self.client.call(context, 'get_snat', snat=snat) + + def get_snats(self, context, snat): + LOG.info(_LI("get_snats: Calling central's get_snats.")) + return self.client.call(context, 'get_snats', snat=snat) + + def create_securityZone(self, context, sec_infos): + LOG.info(_LI("create_securityZone: Calling central's" + "create_securityZone.")) + return self.client.call(context, 'create_securityZone', + sec_infos=sec_infos) + + def securityZone_addif(self, context, sec_infos): + LOG.info(_LI("securityZone_addif: Calling central's" + "securityZone_addif.")) + return self.client.call(context, 'securityZone_addif', + sec_infos=sec_infos) + + def securityZone_delif(self, context, sec_infos): + LOG.info(_LI("securityZone_delif: Calling central's" + "securityZone_delif.")) + return self.client.call(context, 'securityZone_delif', + sec_infos=sec_infos) + + def delete_securityZone(self, context, sec_infos): + LOG.info(_LI("del_securityZone: Calling central's del_securityZone.")) + return self.client.call(context, 'delete_securityZone', + sec_infos=sec_infos) + + def get_securityZone(self, context, securityzone): + LOG.info(_LI("get_securityZone: Calling central's get_securityZone.")) + return self.client.call(context, 'get_securityZone', + securityzone=securityzone) + + def get_securityZones(self, context, securityzone, agent_info): + LOG.info(_LI("get_securityZones: Calling central's" + "get_securityZones.")) + return self.client.call(context, 'get_securityZones', + securityzone=securityzone, + agent_info=agent_info) + + def create_staticnat(self, context, staticnat): + LOG.info(_LI("create_staticnat: Calling central's create_staticnat.")) + return self.client.call(context, 'create_staticnat', + staticnat=staticnat) + + def del_staticnat(self, context, staticnat): + LOG.info(_LI("del_staticnat: Calling central's" + "del_staticnat.")) + return self.client.call(context, 'del_staticnat', + staticnat=staticnat) + + def get_staticnat(self, context, staticnat): + LOG.info(_LI("get_staticnat: Calling central's" + "get_staticnat.")) + return self.client.call(context, 'get_staticnat', + staticnat=staticnat) + + def get_staticnats(self, context, staticnat): + LOG.info(_LI("get_staticnats: Calling central's" + "get_staticnats.")) + return self.client.call(context, 'get_staticnats', + staticnat=staticnat) + + def create_syngroup(self, context, syngroup): + LOG.info(_LI("create syngroup: calling Central's create syngroup")) + return self.client.call(context, 'create syngroup', syngroup=syngroup) + + +class CLIManagerAPI(object): + """ + Client side of the command-line interface operation manager RPC API. + + API version history: + + 1.0 - Initial version + """ + RPC_API_VERSION = '1.0' + + def __init__(self, topic='cli_manager'): + rpc.init(CONF) + target = messaging.Target(topic=topic, version=self.RPC_API_VERSION) + self.client = rpc.get_client(target, version_cap=self.RPC_API_VERSION) + + def reload_topic(self, target_host, topic='cli_manager'): + """ + Reload topic info base on target_host value to make sure message can be + send to the corresponding rpc service endpoint + """ + self.client.target.topic = '%s.%s' % (topic, target_host) + + @classmethod + def get_instance(cls): + """ + The rpc.get_client() which is called upon the API object initialization + will cause a assertion error if the designate.rpc.TRANSPORT isn't setup + by rpc.init() before. + + This fixes that by creating the rpcapi when demanded. + """ + global CLI_MANAGER_API + if not CLI_MANAGER_API: + CLI_MANAGER_API = cls() + return CLI_MANAGER_API + + def execute_commands(self, context, req): + LOG.info(_LI("execute_commands: Calling central's" + "execute_commands.")) + return self.client.call(context, 'execute_commands', + req=req) diff --git a/nca47/manager/service.py b/nca47/manager/service.py index d410e3b..ced7ced 100644 --- a/nca47/manager/service.py +++ b/nca47/manager/service.py @@ -1,49 +1,504 @@ from oslo_config import cfg from oslo_log import log as logging from nca47.common import service -# from nca47.common import coordination + +from oslo_utils import timeutils +from nca47.common.i18n import _ from nca47.common.i18n import _LI +from nca47 import agent +from nca47 import objects +from nca47.agent.agentFlag.agent_rpcapi import AgentAPI +from oslo_service import loopingcall CONF = cfg.CONF LOG = logging.getLogger(__name__) RPC_API_VERSION = '1.0' +count = 0 + +AGENT_OPTS = [ + cfg.IntOpt('report_interval', + default='60', + help=_('Seconds between nodes reporting state to server; ' + 'should be less than agent_down_time, best if it ' + 'is half or less than agent_down_time.')), + cfg.IntOpt('agent_down_time', + default='120', + help=_('Seconds to regard the agent is down; should be at ' + 'least twice report_interval, to be sure the ' + 'agent is down for good.')), +] + +opt_group = cfg.OptGroup(name='agent', + title='Options for nca47 agent node info') +CONF.register_group(opt_group) +CONF.register_opts(AGENT_OPTS, opt_group) + +class DNSService(service.RPCService, service.Service): + """ Use for handling DNS requests and validation request parameters""" -class Service(service.RPCService, service.Service): RPC_API_VERSION = '1.0' # Since the RPC Service class will be use for handle/reply all message # for every RPC client, so will initialize some keys - def __init__(self, topic='', threads=None): + def __init__(self, topic='dns_manager', agentinfo=None, threads=None): self.rpc_topic = topic - super(Service, self).__init__(threads=threads) + super(DNSService, self).__init__(threads=threads) + self.agent = agent.get_dns_backend() + +# self.agent_rpcapi = AgentAPI.get_instance() +# periodic = loopingcall.FixedIntervalLoopingCall( +# self.get_agent_status, agentinfo) +# periodic.start(interval=CONF.agent.report_interval) + + def get_agent_status(self, agentInfo): + try: + self.agent_rpcapi.report_agent_state(agentInfo) + except Exception as e: + raise e @property def service_name(self): return self.rpc_topic def start(self): - super(Service, self).start() + super(DNSService, self).start() + + def stop(self): + super(DNSService, self).stop() # Zone Methods def create_zone(self, context, zone): LOG.info(_LI("create_zone: Replying rpc client's create_zone.")) - print 'create_zone' - return 'create_zone' + zone = self.agent.create_zone(context, zone) + return zone - def get_zone(self, context, zone_id): - LOG.info(_LI("get_zone: Replying rpc client's get_zone.")) - print 'get_zone' - return 'get_zone' - - def update_zone(self, context, zone): + def update_zone(self, context, zone, zone_id): LOG.info(_LI("update_zone: Replying rpc client's update_zone.")) - return 'update_zone' - return 'update_zone' + zone = self.agent.update_zone(context, zone, zone_id) + return zone + + def update_zone_owners(self, context, zone, zone_id): + LOG.info(_LI("update_zone_owners: Replying rpcclient's update_zone.")) + zone = self.agent.update_zone_owners(context, zone, zone_id) + return zone def delete_zone(self, context, zone_id): LOG.info(_LI("delete_zone: Replying rpc client's delete_zone.")) - return 'delete_zone' - return 'delete_zone' + response = self.agent.delete_zone(context, zone_id) + return response + + def get_zone_one(self, context, zone_id): + LOG.info(_LI("get_zone_one: Replying rpc client's " + "get_zone_one.")) + response = self.agent.get_zone_one(context, zone_id) + return response + + def get_zones(self, context): + LOG.info(_LI("get_zones: Replying rpc client's get_zones.")) + response = self.agent.get_zones(context) + return response + + # Zone_records Methods + def create_record(self, context, records_dic, zone_id): + LOG.info(_LI("create_record: Calling central's create_zone_record.")) + response = self.agent.create_rrs(context, records_dic, zone_id) + return response + + def get_records(self, context, zone_id): + LOG.info(_LI("get_records: Calling central's get_zone_record.")) + response = self.agent.get_rrs(context, zone_id) + return response + + def update_record(self, context, records_dic, zone_id, record_id): + LOG.info(_LI("update_record: Calling central's update_zone_record.")) + response = self.agent.update_rrs(context, records_dic, zone_id, + record_id) + return response + + def delete_record(self, context, zone_id, record_id): + LOG.info(_LI("delete_record: Calling central's delete_zone_record.")) + response = self.agent.delete_rrs(context, zone_id, record_id) + return response + + def del_cache(self, context, cache_dic): + LOG.info(_LI("del_cache: Calling central's del_cache.")) + response = self.agent.del_cache(context, cache_dic) + return response + + def glsb_math(self, context, obj_dic, math): + LOG.info(_LI("glsb_math: Replying rpc client's glsb_math.")) + funt = getattr(self.agent, math) + response = funt(context, obj_dic) + return response + + +class FWService(service.RPCService, service.Service): + """ + Use for handling FireWall's requests and validation + request parametes + """ + RPC_API_VERSION = '1.0' + + def __init__(self, topic='firewall_manager', agentinfo=None, + threads=None): + if agentinfo: + self.rpc_topic = '%s.%s' % (topic, agentinfo['agent_ip']) + else: + self.rpc_topic = topic + super(FWService, self).__init__(threads=threads) + self.agent = agent.get_firewall_backend() + self.agent_rpcapi = AgentAPI.get_instance() + periodic = loopingcall.FixedIntervalLoopingCall(self.get_agent_status, + agentinfo) + periodic.start(interval=CONF.agent.report_interval) + + def get_agent_status(self, agentInfo): + try: + self.agent_rpcapi.report_agent_state(agentInfo) + except Exception as e: + raise e + + @property + def service_name(self): + return self.rpc_topic + + def start(self): + super(FWService, self).start() + + def stop(self): + super(FWService, self).stop() + + # this is a vlan operation + def create_vlan(self, context, vlan_infos): + LOG.info(_LI("create_vlan: Calling central's create_vlan.")) + response = self.agent.create_vlan(context, vlan_infos) + return response + + def del_vlan(self, context, vlan_infos): + LOG.info(_LI("del_vlan: Calling central's del_vlan.")) + response = self.agent.del_vlan(context, vlan_infos) + return response + + def get_vlan(self, context, vlan_infos): + LOG.info(_LI("get_vlan: Calling central's get_vlan.")) + response = self.agent.get_vlan(context, vlan_infos) + return response + + def get_vlans(self, context, vlan_infos): + LOG.info(_LI("get_vlans: Calling central's get_vlans.")) + response = self.agent.get_vlans(context, vlan_infos) + return response + + # this is a netservice operation + def create_netservice(self, context, netsev_infos): + LOG.info(_LI("create_netservice: Calling central's" + " create_netservice.")) + response = self.agent.create_netservice(context, netsev_infos) + return response + + def del_netservice(self, context, netsev_infos): + LOG.info(_LI("del_netservice: Calling central's del_netservice.")) + response = self.agent.del_netservice(context, netsev_infos) + return response + + def get_netservice(self, context, netsev_infos): + LOG.info(_LI("get_netservice: Calling central's get_netservice.")) + response = self.agent.get_netservice(context, netsev_infos) + return response + + def get_netservices(self, context, netsev_infos): + LOG.info(_LI("get_netservices: Calling central's get_netservices.")) + response = self.agent.get_netservices(context, netsev_infos) + return response + + # this is a addrobj operation + def add_addrobj(self, context, addrobj_infos): + LOG.info(_LI("add_addrobj: Calling central's add_addrobj.")) + response = self.agent.add_addrobj(context, addrobj_infos) + return response + + def del_addrobj(self, context, addrobj_infos): + LOG.info(_LI("del_addrobj: Calling central's del_addrobj.")) + response = self.agent.del_addrobj( + context, addrobj_infos) + return response + + def get_addrobj(self, context, addrobj_infos): + LOG.info(_LI("get_addrobj: Calling central's get_addrobj.")) + response = self.agent.get_addrobj(context, addrobj_infos) + return response + + def get_addrobjs(self, context, addrobj_infos): + LOG.info(_LI("get_addrobjs: Calling central's get_addrobjs.")) + response = self.agent.get_addrobjs(context, addrobj_infos) + return response + + # this is a snataddrpool operation + def add_snataddrpool(self, context, snataddrpool_infos): + LOG.info(_LI("add_snataddrpool: Calling central's add_snataddrpool.")) + response = self.agent.add_snataddrpool(context, snataddrpool_infos) + return response + + def del_snataddrpool(self, context, snataddrpool_infos): + LOG.info(_LI("del_snataddrpool: Calling central's del_snataddrpool.")) + response = self.agent.del_snataddrpool( + context, snataddrpool_infos) + return response + + def get_snataddrpool(self, context, snataddrpool_infos): + LOG.info(_LI("get_snataddrpool: Calling central's get_snataddrpool.")) + response = self.agent.get_snataddrpool(context, snataddrpool_infos) + return response + + def get_snataddrpools(self, context, snataddrpool_infos): + LOG.info(_LI("get_snataddrpools: Calling central's" + "get_snataddrpools.")) + response = self.agent.get_snataddrpools(context, snataddrpool_infos) + return response + + def create_vfw(self, context, vfw): + LOG.info(_LI("create_vfw: Calling central's create_vfw.")) + response = self.agent.create_vfw(context, vfw) + return response + + def delete_vfw(self, context, vfw): + LOG.info(_LI("delete_vfw: Calling central's delete_vfw.")) + response = self.agent.delete_vfw(context, vfw) + return response + + def get_vfw(self, context, vfw): + LOG.info(_LI("get_vfw: Calling central's get_vfw.")) + response = self.agent.get_vfw(context, vfw) + return response + + def get_all_vfws(self, context, vfw): + LOG.info(_LI("get_all_vfws: Calling central's get_all_vfws.")) + response = self.agent.get_all_vfws(context, vfw) + return response + + def create_dnat(self, context, dnat): + LOG.info(_LI("create_dnat: Calling central's create_dnat.")) + response = self.agent.create_dnat(context, dnat) + return response + + def delete_dnat(self, context, dnat): + LOG.info(_LI("delete_dnat: Calling central's delete_dnat.")) + response = self.agent.delete_dnat(context, dnat) + return response + + def get_dnat(self, context, dnat): + LOG.info(_LI("get_dnat: Calling central's get_dnat.")) + response = self.agent.get_dnat(context, dnat) + return response + + def get_all_dnats(self, context, dnat): + LOG.info(_LI("get_all_dnats: Calling central's get_all_dnats.")) + response = self.agent.get_all_dnats(context, dnat) + return response + + def create_packetfilter(self, context, packetfilter): + LOG.info(_LI("create_packetfilter: Calling central's" + "create_packetfilter.")) + response = self.agent.create_packetfilter(context, packetfilter) + return response + + def delete_packetfilter(self, context, packetfilter): + LOG.info(_LI("delete_packetfilter: Calling central's" + "delete_packetfilter.")) + response = self.agent.delete_packetfilter(context, packetfilter) + return response + + def get_packetfilter(self, context, packetfilter): + LOG.info(_LI("get_packetfilter: Calling central's get_packetfilter.")) + response = self.agent.get_packetfilter(context, packetfilter) + return response + + def get_all_packetfilters(self, context, packetfilter): + LOG.info(_LI("get_all_packetfilters: Calling central's" + "get_all_packetfilters.")) + response = self.agent.get_all_packetfilters(context, packetfilter) + return response + + def create_vrf(self, context, vrf): + LOG.info(_LI("create_vrf: Calling central's create_vrf.")) + response = self.agent.create_vrf(context, vrf) + return response + + def del_vrf(self, context, vrf): + LOG.info(_LI("del_vrf: Calling central's del_vrf.")) + response = self.agent.del_vrf(context, vrf) + return response + + def get_vrf(self, context, vrf): + LOG.info(_LI("get_vrf: Calling central's get_vrf.")) + response = self.agent.get_vrf(context, vrf) + return response + + def get_vrfs(self, context, vrf): + LOG.info(_LI("get_vrfs: Calling central's get_vrfs.")) + response = self.agent.get_vrfs(context, vrf) + return response + + def create_snat(self, context, snat): + LOG.info(_LI("create_snat: Calling central's create_snat.")) + response = self.agent.create_snat(context, snat) + return response + + def del_snat(self, context, snat): + LOG.info(_LI("del_snat: Calling central's del_snat.")) + response = self.agent.delete_snat(context, snat) + return response + + def get_snat(self, context, snat): + LOG.info(_LI("get_snat: Calling central's get_snat.")) + response = self.agent.get_snat(context, snat) + return response + + def get_snats(self, context, snat): + LOG.info(_LI("get_snats: Calling central's get_snats.")) + response = self.agent.get_snats(context, snat) + return response + + def create_securityzone(self, context, sec_infos): + LOG.info(_LI("create_securityZone: Calling central's" + "create_securityZone.")) + response = self.agent.create_securityzone(context, sec_infos) + return response + + def securityzone_addif(self, context, sec_infos): + LOG.info(_LI("securityZone_addif: Calling central's" + "securityZone_addif.")) + response = self.agent.securityzone_addif(context, sec_infos) + return response + + def securityzone_delif(self, context, sec_infos): + LOG.info(_LI("securityZone_delif: Calling central's" + "securityZone_delif.")) + response = self.agent.securityzone_delif(context, sec_infos) + return response + + def delete_securityzone(self, context, sec_infos): + LOG.info(_LI("del_securityZone: Calling central's del_securityZone.")) + response = self.agent.delete_securityzone(context, sec_infos) + return response + + def get_securityzone(self, context, securityzone): + LOG.info(_LI("get_securityZone: Calling central's" + "get_securityZone.")) + response = self.agent.get_securityzone(context, securityzone) + return response + + def get_securityzones(self, context, securityzone): + LOG.info(_LI("get_securityZones: Calling central's" + "get_securityZones.")) + response = self.agent.get_securityzones(context, securityzone) + return response + + def create_staticnat(self, context, staticnat): + LOG.info(_LI("create_staticnat: Calling central's create_staticnat.")) + response = self.agent.create_staticnat(context, staticnat) + return response + + def del_staticnat(self, context, staticnat): + LOG.info(_LI("del_staticnat: Calling central's del_staticnat.")) + response = self.agent.delete_staticnat(context, staticnat) + return response + + def get_staticnat(self, context, staticnat): + LOG.info(_LI("get_staticnat: Calling central's get_staticnat.")) + response = self.agent.get_staticnat(context, staticnat) + return response + + def get_staticnats(self, context, staticnat): + LOG.info(_LI("get_staticnats: Calling central's get_staticnats.")) + response = self.agent.get_staticnats(context, staticnat) + return response + + +class AgentService(service.RPCService, service.Service): + """ + Use for handling device-agent's requests and validation + request parametes + """ + RPC_API_VERSION = '1.0' + + def __init__(self, topic='check_agent_heartbeat', threads=None): + self.rpc_topic = topic + super(AgentService, self).__init__(threads=threads) + + @property + def service_name(self): + return self.rpc_topic + + def start(self): + super(AgentService, self).start() + + def stop(self): + super(AgentService, self).stop() + + def report_agent_state(self, context, agent_info): + LOG.info(_LI("updating agent state: Replying rpc client's " + "report_agent_state.")) + agent_obj = objects.Agent(context, **agent_info) + # Check the target agent object whether exist in DB + conditions = {} + conditions['dc_name'] = agent_info['dc_name'] + conditions['network_zone'] = agent_info['network_zone'] + conditions['agent_ip'] = agent_info['agent_ip'] + conditions['agent_nat_ip'] = agent_info['agent_nat_ip'] + conditions['agent_type'] = agent_info['agent_type'] + conditions['deleted'] = False + target_agent = None + try: + target_agent = agent_obj.get_object(context, **conditions) + except: + LOG.info(_LI('cannot find related agent record in DB, so think ' + 'this agent info as new, need to save in DB')) + pass + if target_agent: + update_agent = {} + update_agent['update_time'] = timeutils.utcnow() + update_agent['availiable'] = 'yes' + update_infos = objects.Agent(context, **update_agent) + agent_obj.update(context, target_agent['id'], + update_infos.as_dict()) + else: + agent_obj.availiable = 'yes' + agent_obj.update_time = timeutils.utcnow() + agent_obj.create(context, agent_obj.as_dict()) + return agent + + +class CLIService(service.RPCService, service.Service): + """ + Use for handling command-line interface requests and validation + request parametes + """ + RPC_API_VERSION = '1.0' + + def __init__(self, topic='cli_manager', agentinfo=None, threads=None): + if agentinfo: + self.rpc_topic = '%s.%s' % (topic, agentinfo['agent_ip']) + else: + self.rpc_topic = topic + super(CLIService, self).__init__(threads=threads) + self.agent = agent.get_cli_backend() + + @property + def service_name(self): + return self.rpc_topic + + def start(self): + super(CLIService, self).start() + + def stop(self): + super(CLIService, self).stop() + + def execute_commands(self, context, req): + cli_client = self.agent.sshClient(**req) + commands = req['commands'] + response = cli_client.send(commands) + return response diff --git a/nca47/objects/__init__.py b/nca47/objects/__init__.py index ed30f46..298e802 100644 --- a/nca47/objects/__init__.py +++ b/nca47/objects/__init__.py @@ -1 +1,34 @@ -__author__ = 'liudong' +from nca47.objects.dns.dns_zone import DnsZone +from nca47.objects.dns.dns_zone_rrs import DnsZoneRrs + +from nca47.objects.operation_history import OperationHistory +from nca47.objects.nca_agents import Agent +from nca47.objects.view_revs_agent import Vres_Agent_View + +from nca47.objects.firewall.fw_vlan_info import FwVlanInfo +from nca47.objects.firewall.fw_netservices_info import FwNetservicesInfo +from nca47.objects.firewall.firewall_dnat import Dnat +from nca47.objects.firewall.firewall_packetfilter import PacketFilter +from nca47.objects.firewall.firewall_vfw import VFW +from nca47.objects.firewall.fw_addrobj_info import FwAddrObjInfo +from nca47.objects.firewall.fw_snataddrpool_info import FwSnatAddrPoolInfo +from nca47.objects.firewall.fw_nat_object import FW_SecurityZone_Object +from nca47.objects.firewall.fw_nat_object import FW_Staticnat_Object +from nca47.objects.firewall.fw_nat_object import FW_Vrf_Object +from nca47.objects.firewall.fw_nat_object import FW_Snat_Object +from nca47.objects.view_vres_vfw_agent import Vres_Agent_Vfw_View + +from nca47.objects.gslb.gmember import Gmember +from nca47.objects.gslb.gslb_zone import GslbZone +from nca47.objects.gslb.hm_template import HmTemplate +from nca47.objects.gslb.region_info import RegionInfo +from nca47.objects.gslb.region_user_info import RegionUserInfo +from nca47.objects.gslb.sp_policy import SP_Policy +from nca47.objects.gslb.syncgroup import SynGroup +from nca47.objects.gslb.gpool import GPool +from nca47.objects.gslb.gmap import GMap + +from nca47.objects.lb.lb_group_info import lb_group_object +from nca47.objects.lb.lb_realserver_info import lb_realServer_object +from nca47.objects.lb.lb_service_info import lb_server_object +from nca47.objects.lb.lb_vip_info import lb_vip_object diff --git a/nca47/objects/attributes.py b/nca47/objects/attributes.py index f8743f6..b84ba55 100644 --- a/nca47/objects/attributes.py +++ b/nca47/objects/attributes.py @@ -5,4 +5,13 @@ ATTR_NOT_SPECIFIED = object() UUID_LEN = 36 NAME_MAX_LEN = 255 +INPUT_MAX_LEN = 1024 TENANT_ID_MAX_LEN = 36 +IP_LEN = 15 +TYPE_LEN = 20 +STATUS_LEN = 2 +TTL_LEN = 10 +TYPES_LEN = 15 +FIVE_LEN = 5 +TEN_LEN = 10 +SIXTYFOUR_LEN = 64 diff --git a/nca47/objects/base.py b/nca47/objects/base.py index 807c629..2650087 100644 --- a/nca47/objects/base.py +++ b/nca47/objects/base.py @@ -10,6 +10,10 @@ from nca47.db import api as db_api +class NotSpecifiedSentinel: + pass + + class ObjectUpdateForbidden(exception.Nca47Exception): _msg_fmt = _("Unable to update the following object fields: %(fields)s") @@ -42,11 +46,15 @@ class Nca47Object(obj_base.VersionedObject, def __init__(self, context=None, **kwargs): super(Nca47Object, self).__init__(context, **kwargs) - self.obj_set_defaults() def to_dict(self): return dict(self.items()) + def as_dict(self): + return dict((k, getattr(self, k)) + for k in self.fields + if hasattr(self, k)) + @classmethod def clean_obj_from_primitive(cls, primitive, context=None): obj = cls.obj_from_primitive(primitive, context) @@ -71,7 +79,7 @@ def validate_filters(cls, **kwargs): def get_objects(cls, context, **kwargs): raise NotImplementedError() - def create(self): + def create(self, context, values): raise NotImplementedError() def update(self): @@ -80,6 +88,9 @@ def update(self): def delete(self): raise NotImplementedError() + def get_object(self, context, values): + raise NotImplementedError() + class Nca47DbObject(Nca47Object): # should be overridden for all persistent objects diff --git a/nca47/objects/dns/__init__.py b/nca47/objects/dns/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nca47/objects/dns/dns_zone.py b/nca47/objects/dns/dns_zone.py new file mode 100644 index 0000000..0b7aac2 --- /dev/null +++ b/nca47/objects/dns/dns_zone.py @@ -0,0 +1,67 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Zone as ZoneModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class DnsZone(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'tenant_id': object_fields.StringField(), + 'zone_name': object_fields.StringField(), + 'vres_id': object_fields.StringField(), + 'masters': object_fields.ListOfStringsField(), + 'slaves': object_fields.ListOfStringsField(), + 'owners': object_fields.ListOfStringsField(), + 'ad_controller': object_fields.ListOfStringsField(), + 'default_ttl': object_fields.StringField(), + 'renewal': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(DnsZone, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_zone, db_dns_zone): + """Converts a database entity to a formal :class:`DnsZone` object. + + :param dns_zone: An object of :class:`DnsZone`. + :param db_dns_zone: A DB model of a DnsZone. + :return: a :class:`DnsZone` object. + """ + for field in dns_zone.fields: + dns_zone[field] = db_dns_zone[field] + + dns_zone.obj_reset_changes() + return dns_zone + + def create(self, context, values): + zone = self.db_api.create(ZoneModel, values) + return zone + + def update(self, context, id, values): + zone = self.db_api.update_object(ZoneModel, id, values) + return zone + + def get_object(self, context, **values): + zone = self.db_api.get_object(ZoneModel, **values) + return zone + + def delete(self, context, id): + zone = self.db_api.delete_object(ZoneModel, id) + return zone + + def get_objects(self, context, **values): + zone = self.db_api.get_objects(ZoneModel, **values) + return zone + + def get_all_objects(self, context, values): + zone = self.db_api.get_all_objects(ZoneModel, values) + return zone + + def get_all_objects_by_conditions(self, context, lik_dic, search_dic): + zone = self.db_api.get_all_objects_by_conditions(ZoneModel, lik_dic, + search_dic) + return zone diff --git a/nca47/objects/dns/dns_zone_rrs.py b/nca47/objects/dns/dns_zone_rrs.py new file mode 100644 index 0000000..11b0593 --- /dev/null +++ b/nca47/objects/dns/dns_zone_rrs.py @@ -0,0 +1,66 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import ZoneRecord +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class DnsZoneRrs(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'rrs_id': object_fields.StringField(), + 'zone_id': object_fields.StringField(), + 'rrs_name': object_fields.StringField(), + 'type': object_fields.StringField(), + 'klass': object_fields.StringField(), + 'ttl': object_fields.StringField(), + 'rdata': object_fields.StringField(), + 'tenant_id': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(DnsZoneRrs, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_zone_rrs, db_dns_zone_rrs): + """Converts a database entity to a formal :class:`DnsZoneRrs` object. + :param dns_zone_rrs: An object of :class:`DnsZoneRrs`. + :param db_dns_zone_rrs: A DB model of a DnsZoneRrs. + :return: a :class:`DnsZoneRrs` object. + """ + for field in dns_zone_rrs.fields: + dns_zone_rrs[field] = db_dns_zone_rrs[field] + + dns_zone_rrs.obj_reset_changes() + return dns_zone_rrs + + def create(self, context, values): + zone = self.db_api.create(ZoneRecord, values) + return zone + + def update(self, context, id, values): + record = self.db_api.update_object(ZoneRecord, id, values) + return record + + def delete(self, context, id): + record = self.db_api.delete_object(ZoneRecord, id) + return record + + def get_objects(self, context, **values): + record = self.db_api.get_objects(ZoneRecord, **values) + return record + + def get_object(self, context, **values): + record = self.db_api.get_object(ZoneRecord, **values) + return record + + def get_all_objects(self, str_sql): + record = self.db_api.get_all_objects(ZoneRecord, str_sql) + return record + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + record = self.db_api.get_all_objects_by_conditions(ZoneRecord, + like_dic, + search_dic) + return record diff --git a/nca47/objects/fields.py b/nca47/objects/fields.py new file mode 100644 index 0000000..15dac12 --- /dev/null +++ b/nca47/objects/fields.py @@ -0,0 +1,47 @@ +import ast +import six +from oslo_versionedobjects import fields as object_fields + + +class IntegerField(object_fields.IntegerField): + pass + + +class UUIDField(object_fields.UUIDField): + pass + + +class StringField(object_fields.StringField): + pass + + +class DateTimeField(object_fields.DateTimeField): + pass + + +class BooleanField(object_fields.BooleanField): + pass + + +class ListOfStringsField(object_fields.ListOfStringsField): + pass + + +class FlexibleDict(object_fields.FieldType): + @staticmethod + def coerce(obj, attr, value): + if isinstance(value, six.string_types): + value = ast.literal_eval(value) + return dict(value) + + +class FlexibleDictField(object_fields.AutoTypedField): + AUTO_TYPE = FlexibleDict() + + # TODO(lucasagomes): In our code we've always translated None to {}, + # this method makes this field to work like this. But probably won't + # be accepted as-is in the oslo_versionedobjects library + def _null(self, obj, attr): + if self.nullable: + return {} + super(FlexibleDictField, self)._null(obj, attr) diff --git a/nca47/objects/firewall/__init__.py b/nca47/objects/firewall/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nca47/objects/firewall/firewall_dnat.py b/nca47/objects/firewall/firewall_dnat.py new file mode 100644 index 0000000..e7b6e47 --- /dev/null +++ b/nca47/objects/firewall/firewall_dnat.py @@ -0,0 +1,66 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Dnat as DnatModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class Dnat(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'name': object_fields.StringField(), + 'inifname': object_fields.StringField(), + 'wanip': object_fields.StringField(), + 'wantcpports': object_fields.ListOfStringsField(), + 'wanudpports': object_fields.ListOfStringsField(), + 'lanipstart': object_fields.StringField(), + 'lanipend': object_fields.StringField(), + 'lanport': object_fields.StringField(), + 'slot': object_fields.StringField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(Dnat, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dnat, db_dnat): + """Converts a database entity to a formal :class:`Dnat` object. + + :param dns_zone: An object of :class:`Dnat`. + :param db_dns_zone: A DB model of a Dnat. + :return: a :class:`Dnat` object. + """ + for field in dnat.fields: + dnat[field] = db_dnat[field] + + dnat.obj_reset_changes() + return dnat + + def create(self, context, values): + dnat = self.db_api.create(DnatModel, values) + return dnat + + def update(self, context, id, values): + dnat = self.db_api.update_object(DnatModel, id, values) + return dnat + + def get_object(self, context, **values): + dnat = self.db_api.get_object(DnatModel, **values) + return dnat + + def delete(self, context, id): + dnat = self.db_api.delete_object(DnatModel, id) + return dnat + + def get_objects(self, context, **values): + dnat = self.db_api.get_objects(DnatModel, **values) + return dnat + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + dnats = self.db_api.get_all_objects_by_conditions(DnatModel, + like_dic, + search_dic) + return dnats diff --git a/nca47/objects/firewall/firewall_packetfilter.py b/nca47/objects/firewall/firewall_packetfilter.py new file mode 100644 index 0000000..da14b48 --- /dev/null +++ b/nca47/objects/firewall/firewall_packetfilter.py @@ -0,0 +1,58 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import PacketFilter as PacketFilterModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class PacketFilter(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'name': object_fields.StringField(), + 'srczonename': object_fields.StringField(), + 'dstzonename': object_fields.StringField(), + 'srcipobjnames': object_fields.ListOfStringsField(), + 'dstipobjnames': object_fields.ListOfStringsField(), + 'servicenames': object_fields.ListOfStringsField(), + 'action': object_fields.StringField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(PacketFilter, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(filter, db_filter): + """Converts a database entity to a formal :class:`PacketFilter` object. + + :param dns_zone: An object of :class:`PacketFilter`. + :param db_dns_zone: A DB model of a PacketFilter. + :return: a :class:`PacketFilter` object. + """ + for field in filter.fields: + filter[field] = db_filter[field] + + filter.obj_reset_changes() + return filter + + def create(self, context, values): + pf = self.db_api.create(PacketFilterModel, values) + return pf + + def update(self, context, id, values): + pf = self.db_api.update_object(PacketFilterModel, id, values) + return pf + + def get_object(self, context, **values): + pf = self.db_api.get_object(PacketFilterModel, **values) + return pf + + def delete(self, context, id): + pf = self.db_api.delete_object(PacketFilterModel, id) + return pf + + def get_objects(self, context, **values): + pf = self.db_api.get_objects(PacketFilterModel, **values) + return pf diff --git a/nca47/objects/firewall/firewall_vfw.py b/nca47/objects/firewall/firewall_vfw.py new file mode 100644 index 0000000..0298d3d --- /dev/null +++ b/nca47/objects/firewall/firewall_vfw.py @@ -0,0 +1,66 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import VFW as VfwModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class VFW(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'vfw_name': object_fields.StringField(), + 'vfw_type': object_fields.StringField(), + 'vfw_info': object_fields.ListOfStringsField(), + 'dc_name': object_fields.StringField(), + 'network_zone_name': object_fields.StringField(), + 'network_zone_class': object_fields.StringField(), + 'protection_class': object_fields.StringField(), + 'vres_id': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(VFW, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_zone, db_dns_zone): + """Converts a database entity to a formal :class:`VFW` object. + + :param dns_zone: An object of :class:`VFW`. + :param db_dns_zone: A DB model of a VFW. + :return: a :class:`VFW` object. + """ + for field in dns_zone.fields: + dns_zone[field] = db_dns_zone[field] + + dns_zone.obj_reset_changes() + return dns_zone + + def create(self, context, values): + vfw = self.db_api.create(VfwModel, values) + return vfw + + def update(self, context, id, values): + vfw = self.db_api.update_object(VfwModel, id, values) + return vfw + + def get_object(self, context, **values): + vfw = self.db_api.get_object(VfwModel, **values) + return vfw + + def delete(self, context, id): + vfw = self.db_api.delete_object(VfwModel, id) + return vfw + + def get_objects(self, context, **values): + vfw = self.db_api.get_objects(VfwModel, **values) + return vfw + + def get_all_objects(self, context, values): + vfw = self.db_api.get_all_objects(VfwModel, values) + return vfw + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + vfws = self.db_api.get_all_objects_by_conditions(VfwModel, + like_dic, search_dic) + return vfws diff --git a/nca47/objects/firewall/fw_addrobj_info.py b/nca47/objects/firewall/fw_addrobj_info.py new file mode 100644 index 0000000..c0710e0 --- /dev/null +++ b/nca47/objects/firewall/fw_addrobj_info.py @@ -0,0 +1,56 @@ +from nca47.db import api as db_api +from nca47.objects import base +from nca47.objects import fields as object_fields +from nca47.db.sqlalchemy.models.firewall import ADDROBJ + + +class FwAddrObjInfo(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'ip': object_fields.StringField(), + 'expip': object_fields.ListOfStringsField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + 'operation_fro': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FwAddrObjInfo, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_addrobj_info, db_fw_addrobj_info): + """Converts a database entity to a formal :class:`ADDROBJ` object. + + :param fw_addrobj_info: An object of :class:`ADDROBJ`. + :param fw_addrobj_info: A DB model of a ADDROBJ. + :return: a :class:`ADDROBJ` object. + """ + for field in fw_addrobj_info.fields: + fw_addrobj_info[field] = db_fw_addrobj_info[field] + + fw_addrobj_info.obj_reset_changes() + return fw_addrobj_info + + def create(self, context, values): + addrobj = self.db_api.create(ADDROBJ, values) + return addrobj + + def delete(self, context, id_): + addrobj = self.db_api.delete_object(ADDROBJ, id_) + return addrobj + + def get_object(self, context, **values): + addrobj = self.db_api.get_object(ADDROBJ, **values) + return addrobj + + def get_objects(self, context, **values): + addrobj = self.db_api.get_objects(ADDROBJ, **values) + return addrobj + + def update(self, context, id, values): + addrobj = self.db_api.update_object(ADDROBJ, id, values) + return addrobj diff --git a/nca47/objects/firewall/fw_nat_object.py b/nca47/objects/firewall/fw_nat_object.py new file mode 100644 index 0000000..3e003ce --- /dev/null +++ b/nca47/objects/firewall/fw_nat_object.py @@ -0,0 +1,289 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import FW_SecurityZone as scurityZone +from nca47.db.sqlalchemy.models import FW_Staticnat as staticnat +from nca47.db.sqlalchemy.models import FW_vrf as vrf +from nca47.db.sqlalchemy.models import FW_snat as snat +from nca47.objects import base +from nca47.objects import fields as object_fields +from nca47.common.exception import HaveSameObject +from nca47.common.exception import IsNotExistError + + +class FW_SecurityZone_Object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'ifnames': object_fields.ListOfStringsField(), + 'priority': object_fields.StringField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + 'operation_fro': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FW_SecurityZone_Object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_object, db_fw_object): + """Converts a database entity to a formal :class:`FW_SecurityZone` object. + + :param fw_object: An object of :class:`FW_SecurityZone`. + :param db_fw_object: A DB model of a FW_SecurityZone. + :return: a :class:`FW_SecurityZone` object. + """ + for field in fw_object.fields: + fw_object[field] = db_fw_object[field] + + fw_object.obj_reset_changes() + return fw_object + + def create(self, context, values): + value = {} + value["name"] = values["name"] + value["vfw_id"] = values["vfw_id"] + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) != 0: + raise HaveSameObject(param_name=value["name"]) + obj = self.db_api.create(scurityZone, values) + return obj + + def update(self, context, id, values): + obj = self.db_api.update_object(scurityZone, id, values) + return obj + + def get_object(self, context, **values): + obj = self.db_api.get_object(scurityZone, **values) + return obj + + def delete(self, context, id): + value = {} + value["id"] = id + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) == 0: + raise IsNotExistError(param_name="id:" + + value["id"]) + obj = self.db_api.delete_object(scurityZone, id) + return obj + + def get_objects(self, context, **values): + obj = self.db_api.get_objects(scurityZone, **values) + return obj + + +class FW_Staticnat_Object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'ifname': object_fields.StringField(), + 'lanip': object_fields.StringField(), + 'wanip': object_fields.StringField(), + 'slot': object_fields.StringField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + 'operation_fro': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FW_Staticnat_Object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_object, db_fw_object): + """Converts a database entity to a formal :class:`FW_Staticnat` object. + + :param fw_object: An object of :class:`FW_Staticnat_Object`. + :param db_fw_object: A DB model of a FW_Staticnat_Object. + :return: a :class:`FW_Staticnat` object. + """ + for field in fw_object.fields: + fw_object[field] = db_fw_object[field] + + fw_object.obj_reset_changes() + return fw_object + + def create(self, context, values): + value = {} + value["name"] = values["name"] + value["vfw_id"] = values["vfw_id"] + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) != 0: + raise HaveSameObject(param_name=value["name"]) + objec = self.db_api.create(staticnat, values) + return objec + + def update(self, context, id, values): + obj = self.db_api.update_object(staticnat, id, values) + return obj + + def get_object(self, context, **values): + obj = self.db_api.get_object(staticnat, **values) + return obj + + def delete(self, context, id): + value = {} + value["id"] = id + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) == 0: + raise IsNotExistError(param_name="id:" + + value["id"]) + obj = self.db_api.delete_object(staticnat, id) + return obj + + def get_objects(self, context, **values): + obj = self.db_api.get_objects(staticnat, **values) + return obj + + def get_all_objects(self, context, str_sql): + obj = self.db_api.get_all_objects(staticnat, str_sql) + return obj + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + staticnats = self.db_api.get_all_objects_by_conditions(staticnat, + like_dic, + search_dic) + return staticnats + + +class FW_Vrf_Object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'vrfInterface': object_fields.ListOfStringsField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + 'vres_id': object_fields.StringField(), + 'operation_fro': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FW_Vrf_Object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_object, db_fw_object): + """Converts a database entity to a formal :class:`FW_Staticnat` object. + + :param fw_object: An object of :class:`FW_Staticnat_Object`. + :param db_fw_object: A DB model of a FW_Staticnat_Object. + :return: a :class:`FW_Staticnat` object. + """ + for field in fw_object.fields: + fw_object[field] = db_fw_object[field] + + fw_object.obj_reset_changes() + return fw_object + + def create(self, context, values): + value = {} + value["name"] = values["name"] + value["vres_id"] = values["vres_id"] + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) != 0: + raise HaveSameObject(param_name=value["name"]) + obj = self.db_api.create(vrf, values) + return obj + + def update(self, context, id, values): + obj = self.db_api.update_object(vrf, id, values) + return obj + + def get_object(self, context, **values): + obj = self.db_api.get_object(vrf, **values) + return obj + + def delete(self, context, id): + value = {} + value["id"] = id + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) == 0: + raise IsNotExistError(param_name="id:" + + value["id"]) + obj = self.db_api.delete_object(vrf, id) + return obj + + def get_objects(self, context, **values): + obj = self.db_api.get_objects(vrf, **values) + return obj + + +class FW_Snat_Object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'outifname': object_fields.StringField(), + 'srcipobjname': object_fields.ListOfStringsField(), + 'dstipobjname': object_fields.ListOfStringsField(), + 'wanippoolname': object_fields.StringField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + 'operation_fro': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FW_Snat_Object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_object, db_fw_object): + """Converts a database entity to a formal :class:`FW_Staticnat` object. + + :param fw_object: An object of :class:`FW_Staticnat_Object`. + :param db_fw_object: A DB model of a FW_Staticnat_Object. + :return: a :class:`FW_Staticnat` object. + """ + for field in fw_object.fields: + fw_object[field] = db_fw_object[field] + + fw_object.obj_reset_changes() + return fw_object + + def create(self, context, values): + value = {} + value["name"] = values["name"] + value["vfw_id"] = values["vfw_id"] + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) != 0: + raise HaveSameObject(param_name=value["name"]) + obj = self.db_api.create(snat, values) + return obj + + def get_object(self, context, **values): + obj = self.db_api.get_object(snat, **values) + return obj + + def delete(self, context, id): + value = {} + value["id"] = id + value["deleted"] = False + obj_old = self.get_objects(context, **value) + if len(obj_old) == 0: + raise IsNotExistError(param_name="id:" + + value["id"]) + obj = self.db_api.delete_object(snat, id) + return obj + + def get_objects(self, context, **values): + obj = self.db_api.get_objects(snat, **values) + return obj + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + snats = self.db_api.get_all_objects_by_conditions(snat, + like_dic, + search_dic) + return snats diff --git a/nca47/objects/firewall/fw_netservices_info.py b/nca47/objects/firewall/fw_netservices_info.py new file mode 100644 index 0000000..bd9fd9e --- /dev/null +++ b/nca47/objects/firewall/fw_netservices_info.py @@ -0,0 +1,64 @@ +from nca47.db import api as db_api +from nca47.objects import base +from nca47.objects import fields as object_fields +from nca47.db.sqlalchemy.models.firewall import NetService + + +class FwNetservicesInfo(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'name': object_fields.StringField(), + 'proto': object_fields.StringField(), + 'port': object_fields.StringField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FwNetservicesInfo, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_netservices_info, db_fw_netservices_info): + """Converts a database entity to a formal :class:`NetService` object. + + :param fw_netservices_info: An object of :class:`NetService`. + :param db_fw_netservices_info: A DB model of a NetService. + :return: a :class:`NetService` object. + """ + for field in fw_netservices_info.fields: + fw_netservices_info[field] = db_fw_netservices_info[field] + + fw_netservices_info.obj_reset_changes() + return fw_netservices_info + + def create(self, context, values): + zone = self.db_api.create(NetService, values) + return zone + + def update(self, context, id_, values): + record = self.db_api.update_object(NetService, id_, values) + return record + + def delete(self, context, id_): + record = self.db_api.delete_object(NetService, id_) + return record + + def get_objects(self, context, **values): + record = self.db_api.get_objects(NetService, **values) + return record + + def get_object(self, context, **values): + record = self.db_api.get_object(NetService, **values) + return record + + def get_all_objects(self, str_sql): + record = self.db_api.get_all_objects(NetService, str_sql) + return record + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + netservices = self.db_api.get_all_objects_by_conditions(NetService, + like_dic, + search_dic) + return netservices diff --git a/nca47/objects/firewall/fw_snataddrpool_info.py b/nca47/objects/firewall/fw_snataddrpool_info.py new file mode 100644 index 0000000..f2bd0f8 --- /dev/null +++ b/nca47/objects/firewall/fw_snataddrpool_info.py @@ -0,0 +1,57 @@ +from nca47.db import api as db_api +from nca47.objects import base +from nca47.objects import fields as object_fields +from nca47.db.sqlalchemy.models.firewall import FwSnatAddrPool + + +class FwSnatAddrPoolInfo(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'ipstart': object_fields.StringField(), + 'ipend': object_fields.StringField(), + 'slotip': object_fields.StringField(), + 'vfwname': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + 'operation_fro': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FwSnatAddrPoolInfo, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_snataddrpool_info, db_fw_snataddrpool_info): + """Converts a database entity to a formal :class:`FwSnatAddrPool` + object. + :param fw_snataddrpool_info: An object of :class:`FwSnatAddrPool`. + :param fw_snataddrpool_info: A DB model of a FwSnatAddrPool. + :return: a :class:`FwSnatAddrPool` object. + """ + for field in fw_snataddrpool_info.fields: + fw_snataddrpool_info[field] = db_fw_snataddrpool_info[field] + + fw_snataddrpool_info.obj_reset_changes() + return fw_snataddrpool_info + + def create(self, context, values): + snataddrpool = self.db_api.create(FwSnatAddrPool, values) + return snataddrpool + + def delete(self, context, id_): + snataddrpool = self.db_api.delete_object(FwSnatAddrPool, id_) + return snataddrpool + + def get_object(self, context, **values): + snataddrpool = self.db_api.get_object(FwSnatAddrPool, **values) + return snataddrpool + + def get_objects(self, context, **values): + snataddrpool = self.db_api.get_objects(FwSnatAddrPool, **values) + return snataddrpool + + def update(self, context, id, values): + snataddrpool = self.db_api.update_object(FwSnatAddrPool, id, values) + return snataddrpool diff --git a/nca47/objects/firewall/fw_vlan_info.py b/nca47/objects/firewall/fw_vlan_info.py new file mode 100644 index 0000000..ac7ecd0 --- /dev/null +++ b/nca47/objects/firewall/fw_vlan_info.py @@ -0,0 +1,58 @@ +from nca47.db import api as db_api +from nca47.objects import base +from nca47.objects import fields as object_fields +from nca47.db.sqlalchemy.models import VLAN + + +class FwVlanInfo(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'vlan_number': object_fields.StringField(), + 'vlan_name': object_fields.StringField(), + 'ipaddr': object_fields.ListOfStringsField(), + 'ifnames': object_fields.ListOfStringsField(), + 'vres_id': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(FwVlanInfo, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(fw_vlan_info, db_fw_vlan_info): + """Converts a database entity to a formal :class:`VLAN` object. + + :param fw_vlan_info: An object of :class:`VLAN`. + :param db_fw_vlan_info: A DB model of a VLAN. + :return: a :class:`VLAN` object. + """ + for field in fw_vlan_info.fields: + fw_vlan_info[field] = db_fw_vlan_info[field] + + fw_vlan_info.obj_reset_changes() + return fw_vlan_info + + def create(self, context, values): + zone = self.db_api.create(VLAN, values) + return zone + + def update(self, context, id, values): + record = self.db_api.update_object(VLAN, id, values) + return record + + def delete(self, context, id): + record = self.db_api.delete_object(VLAN, id) + return record + + def get_objects(self, context, **values): + record = self.db_api.get_objects(VLAN, **values) + return record + + def get_all_objects(self, context, str_sql): + vlan = self.db_api.get_all_objects(VLAN, str_sql) + return vlan + + def get_object(self, context, **values): + record = self.db_api.get_object(VLAN, **values) + return record diff --git a/nca47/objects/gslb/__init__.py b/nca47/objects/gslb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nca47/objects/gslb/gmap.py b/nca47/objects/gslb/gmap.py new file mode 100644 index 0000000..0a6fea2 --- /dev/null +++ b/nca47/objects/gslb/gmap.py @@ -0,0 +1,62 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import GMapInfo as GMapModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class GMap(base.Nca47Object): + VERSION = '1.0' + fields = { + 'gmap_id': object_fields.StringField(), + 'tenant_id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'enable': object_fields.StringField(), + 'algorithm': object_fields.StringField(), + 'last_resort_pool': object_fields.StringField(), + 'gpool_list': object_fields.ListOfStringsField(), + } + + def __init__(self, context=None, **kwargs): + self.db_api = db_api.get_instance() + super(GMap, self).__init__(context=None, **kwargs) + + @staticmethod + def __from_db_object(dns_gmap, db_dns_gmap): + """ + :param dns_syngroup: + :param db_dns_syngroup: + :return: + """ + for field in dns_gmap.fields: + dns_gmap[field] = db_dns_gmap + dns_gmap.obj_reset_changes() + return dns_gmap + + def create(self, context, values): + gmap = self.db_api.create(GMapModel, values) + return gmap + + def update(self, context, id, values): + gmap = self.db_api.update_object(GMapModel, id, values) + return gmap + + def get_object(self, context, **values): + gmap = self.db_api.get_object(GMapModel, **values) + return gmap + + def get_objects(self, context, **values): + gmap = self.db_api.get_objects(GMapModel, **values) + return gmap + + def delete(self, context, id): + gmap = self.db_api.delete_object(GMapModel, id) + return gmap + + def get_all_objects(self, context, str_sql): + gmap = self.db_api.get_all_objects(GMapModel, str_sql) + return gmap + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + gmap = self.db_api.get_all_objects_by_conditions(GMapModel, like_dic, + search_dic) + return gmap diff --git a/nca47/objects/gslb/gmember.py b/nca47/objects/gslb/gmember.py new file mode 100644 index 0000000..177d06d --- /dev/null +++ b/nca47/objects/gslb/gmember.py @@ -0,0 +1,67 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import GmemberInfo +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class Gmember(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'name': object_fields.StringField(), + 'gslb_zone_name': object_fields.StringField(), + 'ip': object_fields.StringField(), + 'port': object_fields.ListOfStringsField(), + 'enable': object_fields.StringField(), + 'gmember_id': object_fields.StringField(), + 'refcnt': object_fields.StringField(), + 'tenant_id': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(Gmember, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_gmember, db_dns_gmember): + """Converts a database entity to a formal :class:`Gmember` object. + + :param dns_gmember: An object of :class:`Gmember`. + :param db_dns_gmember: A DB model of a Gmember. + :return: a :class:`Gmember` object. + """ + for field in dns_gmember.fields: + dns_gmember[field] = db_dns_gmember[field] + + dns_gmember.obj_reset_changes() + return dns_gmember + + def create(self, context, values): + gmember = self.db_api.create(GmemberInfo, values) + return gmember + + def update(self, context, id, values): + gmember = self.db_api.update_object(GmemberInfo, id, values) + return gmember + + def delete(self, context, id): + gmember = self.db_api.delete_object(GmemberInfo, id) + return gmember + + def get_objects(self, context, **values): + gmember = self.db_api.get_objects(GmemberInfo, **values) + return gmember + + def get_object(self, context, **values): + gmember = self.db_api.get_object(GmemberInfo, **values) + return gmember + + def get_all_objects(self, str_sql): + gmember = self.db_api.get_all_objects(GmemberInfo, str_sql) + return gmember + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + gmember = self.db_api.get_all_objects_by_conditions(GmemberInfo, + like_dic, + search_dic) + return gmember diff --git a/nca47/objects/gslb/gpool.py b/nca47/objects/gslb/gpool.py new file mode 100644 index 0000000..59359cb --- /dev/null +++ b/nca47/objects/gslb/gpool.py @@ -0,0 +1,69 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import GPoolInfo as GPoolModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class GPool(base.Nca47Object): + VERSION = '1.0' + fields = { + 'tenant_id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'enable': object_fields.StringField(), + 'pass_': object_fields.StringField(), + 'ttl': object_fields.StringField(), + 'max_addr_ret': object_fields.StringField(), + 'cname': object_fields.StringField(), + 'first_algorithm': object_fields.StringField(), + 'second_algorithm': object_fields.StringField(), + 'fallback_ip': object_fields.StringField(), + 'hms': object_fields.ListOfStringsField(), + 'gmember_list': object_fields.ListOfStringsField(), + 'warning': object_fields.StringField(), + 'gpool_id': object_fields.StringField(), + } + + def __init__(self, context=None, **kwargs): + self.db_api = db_api.get_instance() + super(GPool, self).__init__(context=None, **kwargs) + + @staticmethod + def __from_db_object(dns_gpool, db_dns_gpool): + """ + :param dns_syngroup: + :param db_dns_syngroup: + :return: + """ + for field in dns_gpool.fields: + dns_gpool[field] = db_dns_gpool + dns_gpool.obj_reset_changes() + return dns_gpool + + def create(self, context, values): + gpool = self.db_api.create(GPoolModel, values) + return gpool + + def update(self, context, id, values): + gpool = self.db_api.update_object(GPoolModel, id, values) + return gpool + + def get_object(self, context, **values): + gpool = self.db_api.get_object(GPoolModel, **values) + return gpool + + def delete(self, context, id): + gpool = self.db_api.delete_object(GPoolModel, id) + return gpool + + def get_objects(self, context, **values): + gpool = self.db_api.get_objects(GPoolModel, **values) + return gpool + + def get_all_objects(self, context, str_sql): + gpool = self.db_api.get_all_objects(GPoolModel, str_sql) + return gpool + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + gpool = self.db_api.get_all_objects_by_conditions(GPoolModel, like_dic, + search_dic) + return gpool diff --git a/nca47/objects/gslb/gslb_zone.py b/nca47/objects/gslb/gslb_zone.py new file mode 100644 index 0000000..3840e2e --- /dev/null +++ b/nca47/objects/gslb/gslb_zone.py @@ -0,0 +1,87 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import GslbZoneInfo +from nca47.objects import base +from nca47.objects import fields as object_fields +from nca47.common.exception import HaveSameObject +from nca47.common.exception import IsNotExistError + + +class GslbZone(base.Nca47Object): + VERSION = '1.0' + fields = { + 'name': object_fields.StringField(), + 'devices': object_fields.ListOfStringsField(), + 'syn_server': object_fields.StringField(), + 'enable': object_fields.StringField(), + 'gslb_zone_id': object_fields.StringField(), + 'tenant_id': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(GslbZone, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_gslb_zone, db_dns_gslb_zone): + """Converts a database entity to a formal :class:`GslbZone` object. + + :param dns_zone: An object of :class:`GslbZone`. + :param db_dns_zone: A DB model of a GslbZone. + :return: a :class:`GslbZone` object. + """ + for field in dns_gslb_zone.fields: + dns_gslb_zone[field] = db_dns_gslb_zone[field] + + dns_gslb_zone.obj_reset_changes() + return dns_gslb_zone + + def create(self, context, values): + value = {} + value["name"] = values["name"] + value["tenant_id"] = values["tenant_id"] + obj_old = self.get_objects(context, **value) + if len(obj_old) != 0: + raise HaveSameObject(param_name=value["name"]) + gslb_zone = self.db_api.create(GslbZoneInfo, values) + return gslb_zone + + def update(self, context, zone_id, values): + value = {} + value["id"] = zone_id + obj_old = self.get_objects(context, **value) + if len(obj_old) == 0: + raise IsNotExistError(param_name=zone_id) + gslb_zone = self.db_api.update_object(GslbZoneInfo, zone_id, values) + return gslb_zone + + def delete(self, context, zone_id): + value = {} + value["id"] = zone_id + obj_old = self.get_objects(context, **value) + if len(obj_old) == 0: + raise IsNotExistError(param_name=value["id"]) + gslb_zone = self.db_api.delete_object(GslbZoneInfo, zone_id) + return gslb_zone + + def get_objects(self, context, **values): + values["deleted"] = False + gslb_zone = self.db_api.get_objects(GslbZoneInfo, **values) + return gslb_zone + + def get_object(self, context, **values): + values["deleted"] = False + try: + gslb_zone = self.db_api.get_object(GslbZoneInfo, **values) + except Exception: + raise IsNotExistError(param_name=values["id"]) + return gslb_zone + + def get_object_one(self, context, **values): + # get one information of gslb_zone + gslb_zone = self.db_api.get_object(GslbZoneInfo, **values) + return gslb_zone + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + gslb_zone = self.db_api.get_all_objects(GslbZoneInfo, like_dic, + search_dic) + return gslb_zone diff --git a/nca47/objects/gslb/hm_template.py b/nca47/objects/gslb/hm_template.py new file mode 100644 index 0000000..1a16ecb --- /dev/null +++ b/nca47/objects/gslb/hm_template.py @@ -0,0 +1,70 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import HmTemplateInfo +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class HmTemplate(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'name': object_fields.StringField(), + 'types': object_fields.StringField(), + 'check_interval': object_fields.StringField(), + 'timeout': object_fields.StringField(), + 'max_retries': object_fields.StringField(), + 'sendstring': object_fields.StringField(), + 'recvstring': object_fields.StringField(), + 'hm_template_id': object_fields.StringField(), + 'refcnt': object_fields.StringField(), + 'username': object_fields.StringField(), + 'password': object_fields.StringField(), + 'tenant_id': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(HmTemplate, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_hm_template, db_dns_hm_template): + """Converts a database entity to a formal :class:`HmTemplate` object. + + :param dns_hm_template: An object of :class:`HmTemplate`. + :param db_dns_hm_template: A DB model of a HmTemplate. + :return: a :class:`HmTemplate` object. + """ + for field in dns_hm_template.fields: + dns_hm_template[field] = db_dns_hm_template[field] + + dns_hm_template.obj_reset_changes() + return dns_hm_template + + def create(self, context, values): + hm_template = self.db_api.create(HmTemplateInfo, values) + return hm_template + + def update(self, context, id, values): + hm_template = self.db_api.update_object(HmTemplateInfo, id, values) + return hm_template + + def delete(self, context, id): + hm_template = self.db_api.delete_object(HmTemplateInfo, id) + return hm_template + + def get_objects(self, context, **values): + hm_template = self.db_api.get_objects(HmTemplateInfo, **values) + return hm_template + + def get_object(self, context, **values): + hm_template = self.db_api.get_object(HmTemplateInfo, **values) + return hm_template + + def get_all_objects(self, str_sql): + hm_template = self.db_api.get_all_objects(HmTemplateInfo, str_sql) + return hm_template + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + hm_template = self.db_api.get_all_objects_by_conditions( + HmTemplateInfo, like_dic, search_dic) + return hm_template diff --git a/nca47/objects/gslb/region_info.py b/nca47/objects/gslb/region_info.py new file mode 100644 index 0000000..6c78073 --- /dev/null +++ b/nca47/objects/gslb/region_info.py @@ -0,0 +1,64 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Region as RegionModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class RegionInfo(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'tenant_id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'region_id': object_fields.StringField(), + 'refcnt': object_fields.StringField(), + 'region_user': object_fields.ListOfStringsField, + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(RegionInfo, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_region, db_dns_region): + """Converts a database entity to a formal :class:`RegionInfo` object. + + :param dns_region: An object of :class:`RegionInfo`. + :param db_dns_region: A DB model of a RegionInfo. + :return: a :class:`RegionInfo` object. + """ + for field in dns_region.fields: + dns_region[field] = db_dns_region[field] + + dns_region.obj_reset_changes() + return dns_region + + def create(self, context, values): + region = self.db_api.create(RegionModel, values) + return region + + def update(self, context, id, values): + region = self.db_api.update_object(RegionModel, id, values) + return region + + def get_object(self, context, **values): + region = self.db_api.get_object(RegionModel, **values) + return region + + def delete(self, context, id): + region = self.db_api.delete_object(RegionModel, id) + return region + + def get_objects(self, context, **values): + regions = self.db_api.get_objects(RegionModel, **values) + return regions + + def get_all_objects(self, context, values): + regions = self.db_api.get_all_objects(RegionModel, values) + return regions + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + regions = self.db_api.get_all_objects_by_conditions(RegionModel, + like_dic, + search_dic) + return regions diff --git a/nca47/objects/gslb/region_user_info.py b/nca47/objects/gslb/region_user_info.py new file mode 100644 index 0000000..7c438c7 --- /dev/null +++ b/nca47/objects/gslb/region_user_info.py @@ -0,0 +1,67 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import RegionUser as RegionUserModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class RegionUserInfo(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'tenant_id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'region_useruser_id': object_fields.StringField(), + 'region_id': object_fields.StringField(), + 'type': object_fields.StringField(), + 'data1': object_fields.StringField(), + 'data2': object_fields.StringField(), + 'data3': object_fields.StringField(), + 'data4': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(RegionUserInfo, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_region_user, db_dns_region_user): + """Converts a database entity to a formal :class:`RegionUser` object. + + :param dns_region_user: An object of :class:`RegionUser`. + :param db_dns_region_user: A DB model of a RegionUser. + :return: a :class:`RegionUser` object. + """ + for field in dns_region_user.fields: + dns_region_user[field] = db_dns_region_user[field] + + dns_region_user.obj_reset_changes() + return dns_region_user + + def create(self, context, values): + region_user = self.db_api.create(RegionUserModel, values) + return region_user + + def update(self, context, id, values): + region_user = self.db_api.update_object(RegionUserModel, id, values) + return region_user + + def get_object(self, context, **values): + region_user = self.db_api.get_object(RegionUserModel, **values) + return region_user + + def delete(self, context, id): + region_user = self.db_api.delete_object(RegionUserModel, id) + return region_user + + def get_objects(self, context, **values): + region_user = self.db_api.get_objects(RegionUserModel, **values) + return region_user + + def get_all_objects(self, context, values): + region_user = self.db_api.get_all_objects(RegionUserModel, values) + return region_user + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + region_user = self.db_api.get_all_objects_by_conditions( + RegionUserModel, like_dic, search_dic) + return region_user diff --git a/nca47/objects/gslb/sp_policy.py b/nca47/objects/gslb/sp_policy.py new file mode 100644 index 0000000..da090a9 --- /dev/null +++ b/nca47/objects/gslb/sp_policy.py @@ -0,0 +1,71 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Proximity as ProximityModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class SP_Policy(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'tenant_id': object_fields.StringField(), + 'sp_policy_id': object_fields.StringField(), + 'src_type': object_fields.StringField(), + 'src_logic': object_fields.StringField(), + 'src_data1': object_fields.StringField(), + 'src_data2': object_fields.StringField(), + 'src_data3': object_fields.StringField(), + 'src_data4': object_fields.StringField(), + 'dst_type': object_fields.StringField(), + 'dst_logic': object_fields.StringField(), + 'dst_data1': object_fields.StringField(), + 'dst_data2': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(SP_Policy, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(dns_proximity, db_dns_proximity): + """Converts a database entity to a formal :class:`Proximity` object. + + :param dns_proximity: An object of :class:`Proximity`. + :param db_dns_proximity: A DB model of a Proximity. + :return: a :class:`Proximity` object. + """ + for field in dns_proximity.fields: + dns_proximity[field] = db_dns_proximity[field] + + dns_proximity.obj_reset_changes() + return dns_proximity + + def create(self, context, values): + sp_policy = self.db_api.create(ProximityModel, values) + return sp_policy + + def update(self, context, id, values): + sp_policy = self.db_api.update_object(ProximityModel, id, values) + return sp_policy + + def get_object(self, context, **values): + sp_policy = self.db_api.get_object(ProximityModel, **values) + return sp_policy + + def delete(self, context, id): + sp_policy = self.db_api.delete_object(ProximityModel, id) + return sp_policy + + def get_objects(self, context, **values): + sp_policy = self.db_api.get_objects(ProximityModel, **values) + return sp_policy + + def get_all_objects(self, context, values): + sp_policy = self.db_api.get_all_objects(ProximityModel, values) + return sp_policy + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + sp_policy = self.db_api.get_all_objects_by_conditions(ProximityModel, + like_dic, + search_dic) + return sp_policy diff --git a/nca47/objects/gslb/syncgroup.py b/nca47/objects/gslb/syncgroup.py new file mode 100644 index 0000000..5a11d2b --- /dev/null +++ b/nca47/objects/gslb/syncgroup.py @@ -0,0 +1,62 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Syngroup as SyngroupModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class SynGroup(base.Nca47Object): + VERSION = '1.0' + fields = { + 'tenant_id': object_fields.StringField(), + 'name': object_fields.StringField(), + 'gslb_zone_names': object_fields.ListOfStringsField(), + 'probe_range': object_fields.StringField(), + 'syngroup_id': object_fields.StringField(), + 'pass_': object_fields.StringField() + } + + def __init__(self, context=None, **kwargs): + self.db_api = db_api.get_instance() + super(SynGroup, self).__init__(context=None, **kwargs) + + @staticmethod + def __from_db_object(dns_syngroup, db_dns_syngroup): + """ + :param dns_syngroup: + :param db_dns_syngroup: + :return: + """ + for field in dns_syngroup.fields: + dns_syngroup[field] = db_dns_syngroup + dns_syngroup.obj_reset_changes() + return dns_syngroup + + def create(self, context, values): + syngroup = self.db_api.create(SyngroupModel, values) + return syngroup + + def update(self, context, id, values): + syngroup = self.db_api.update_object(SyngroupModel, id, values) + return syngroup + + def get_object(self, context, **values): + syngroup = self.db_api.get_object(SyngroupModel, **values) + return syngroup + + def get_objects(self, context, **values): + syngroup = self.db_api.get_objects(SyngroupModel, **values) + return syngroup + + def delete(self, context, id): + syngroup = self.db_api.delete_object(SyngroupModel, id) + return syngroup + + def get_all_objects(self, context, str_sql): + syngroup = self.db_api.get_all_objects(SyngroupModel, str_sql) + return syngroup + + def get_all_objects_by_conditions(self, context, like_dic, search_dic): + syngroup = self.db_api.get_all_objects_by_conditions(SyngroupModel, + like_dic, + search_dic) + return syngroup diff --git a/nca47/objects/lb/__init__.py b/nca47/objects/lb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nca47/objects/lb/lb_group_info.py b/nca47/objects/lb/lb_group_info.py new file mode 100644 index 0000000..f74eb50 --- /dev/null +++ b/nca47/objects/lb/lb_group_info.py @@ -0,0 +1,51 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import lb_group as group +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class lb_group_object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'tenant_id': object_fields.StringField(), + 'vnetwork_name': object_fields.StringField(), + 'environment_name': object_fields.StringField(), + 'application': object_fields.StringField(), + 'node': object_fields.StringField(), + 'batch': object_fields.StringField(), + 'command_input': object_fields.ListOfStringsField(), + 'realservername': object_fields.ListOfStringsField(), + 'groupname': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(lb_group_object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(group, db_group): + """Converts a database entity to a formal :class:`lb_group_object` object. + + :param group: An object of :class:`lb_group_object`. + :param db_group: A DB model of a lb_group_object. + :return: a :class:`lb_group_object` object. + """ + for field in group.fields: + group[field] = db_group[field] + + group.obj_reset_changes() + return group + + def create(self, context, values): + group_obj = self.db_api.create(group, values) + return group_obj + + def get_objects(self, context, **values): + group_obj = self.db_api.get_objects(group, **values) + return group_obj + + def get_all_objects(self, context, **values): + sql = values["sql"] + group_obj = self.db_api.get_all_objects(group, sql) + return group_obj diff --git a/nca47/objects/lb/lb_realserver_info.py b/nca47/objects/lb/lb_realserver_info.py new file mode 100644 index 0000000..dc2a9d1 --- /dev/null +++ b/nca47/objects/lb/lb_realserver_info.py @@ -0,0 +1,46 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import realserver as rserver +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class lb_realServer_object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'tenant_id': object_fields.StringField(), + 'vnetwork_name': object_fields.StringField(), + 'environment_name': object_fields.StringField(), + 'application': object_fields.StringField(), + 'node': object_fields.StringField(), + 'realservername': object_fields.StringField(), + 'rip': object_fields.StringField(), + 'batch': object_fields.StringField(), + 'command_input': object_fields.ListOfStringsField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(lb_realServer_object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(real_server, db_real_server): + """Converts a database entity to a formal :class:`lb_realServer_object` object. + + :param real_server: An object of :class:`lb_realServer_object`. + :param db_real_server: A DB model of a lb_realServer_object. + :return: a :class:`lb_realServer_object` object. + """ + for field in real_server.fields: + real_server[field] = db_real_server[field] + + real_server.obj_reset_changes() + return real_server + + def create(self, context, values): + realServer = self.db_api.create(rserver, values) + return realServer + + def get_objects(self, context, **values): + realServer = self.db_api.get_objects(rserver, **values) + return realServer diff --git a/nca47/objects/lb/lb_service_info.py b/nca47/objects/lb/lb_service_info.py new file mode 100644 index 0000000..32d29bd --- /dev/null +++ b/nca47/objects/lb/lb_service_info.py @@ -0,0 +1,47 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import lb_service as lb_ser_obj +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class lb_server_object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'virtualservername': object_fields.StringField(), + 'groupname': object_fields.StringField(), + 'vport': object_fields.StringField(), + 'rport': object_fields.StringField(), + 'command_input': object_fields.ListOfStringsField(), + 'pbindtype': object_fields.StringField(), + 'dbindtype': object_fields.StringField(), + 'ptmouttime': object_fields.StringField(), + 'metrictype': object_fields.StringField(), + 'batch': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(lb_server_object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(lb_ser, db_lb_ser): + """Converts a database entity to a formal :class:`lb_server_object` object. + + :param lb_ser: An object of :class:`lb_server_object`. + :param db_lb_ser: A DB model of a lb_server_object. + :return: a :class:`lb_server_object` object. + """ + for field in lb_ser.fields: + lb_ser[field] = db_lb_ser[field] + + lb_ser.obj_reset_changes() + return lb_ser + + def create(self, context, values): + lb_server = self.db_api.create(lb_ser_obj, values) + return lb_server + + def get_objects(self, context, **values): + lb_server = self.db_api.get_objects(lb_ser_obj, **values) + return lb_server diff --git a/nca47/objects/lb/lb_vip_info.py b/nca47/objects/lb/lb_vip_info.py new file mode 100644 index 0000000..7e1b666 --- /dev/null +++ b/nca47/objects/lb/lb_vip_info.py @@ -0,0 +1,47 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import lb_vip as vip +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class lb_vip_object(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'tenant_id': object_fields.StringField(), + 'vnetwork_name': object_fields.StringField(), + 'environment_name': object_fields.StringField(), + 'application': object_fields.StringField(), + 'node': object_fields.StringField(), + 'batch': object_fields.StringField(), + 'command_input': object_fields.ListOfStringsField(), + 'virtualservername': object_fields.StringField(), + 'vip': object_fields.StringField(), + 'virtualname': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(lb_vip_object, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(lb_vip, db_lb_vip): + """Converts a database entity to a formal :class:`lb_vip_object` object. + + :param lb_vip: An object of :class:`lb_vip_object`. + :param db_lb_vip: A DB model of a lb_vip_object. + :return: a :class:`lb_vip_object` object. + """ + for field in lb_vip.fields: + lb_vip[field] = db_lb_vip[field] + + lb_vip.obj_reset_changes() + return lb_vip + + def create(self, context, values): + vip_out = self.db_api.create(vip, values) + return vip_out + + def get_objects(self, context, **values): + vip_get = self.db_api.get_objects(vip, **values) + return vip_get diff --git a/nca47/objects/nca_agents.py b/nca47/objects/nca_agents.py new file mode 100644 index 0000000..3c3f0b4 --- /dev/null +++ b/nca47/objects/nca_agents.py @@ -0,0 +1,56 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Agent as agentModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class Agent(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'agent_ip': object_fields.StringField(), + 'agent_nat_ip': object_fields.StringField(), + 'dc_name': object_fields.StringField(), + 'network_zone': object_fields.StringField(), + 'agent_type': object_fields.StringField(), + 'availiable': object_fields.BooleanField(), + 'update_time': object_fields.DateTimeField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(Agent, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(agent_zone, db_agent_zone): + """Converts a database entity to a formal :class:`nca_agent` object. + + :param agent_zone: An object of :class:`AgentZone`. + :param db_agent_zone: A DB model of a AgentZone. + :return: a :class:`NCA_agent` object. + """ + for field in agent_zone.fields: + agent_zone[field] = db_agent_zone[field] + + agent_zone.obj_reset_changes() + return agent_zone + + def create(self, context, values): + agent = self.db_api.create(agentModel, values) + return agent + + def update(self, context, id, values): + agent = self.db_api.update_object(agentModel, id, values) + return agent + + def get_object(self, context, **values): + agent = self.db_api.get_object(agentModel, **values) + return agent + + def delete(self, context, id): + agent = self.db_api.delete_object(agentModel, id) + return agent + + def get_objects(self, context, **values): + agent = self.db_api.get_objects(agentModel, **values) + return agent diff --git a/nca47/objects/operation_history.py b/nca47/objects/operation_history.py new file mode 100644 index 0000000..193b9c7 --- /dev/null +++ b/nca47/objects/operation_history.py @@ -0,0 +1,55 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import OperationHistory as HistoryModel +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class OperationHistory(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'config_id': object_fields.StringField(), + 'input': object_fields.StringField(), + 'operation_type': object_fields.ListOfStringsField(), + 'operation_time': object_fields.StringField(), + 'operation_status': object_fields.StringField(), + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + self.obj_set_defaults() + super(OperationHistory, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(opt_history, db_opt_history): + """Converts a database entity to a formal :class:`DnsZone` object. + + :param dns_zone: An object of :class:`DnsZone`. + :param db_dns_zone: A DB model of a DnsZone. + :return: a :class:`DnsZone` object. + """ + for field in opt_history.fields: + opt_history[field] = db_opt_history[field] + + opt_history.obj_reset_changes() + return opt_history + + def get_by_id(self, context, id): + history = self.db_api._safe_get_object(HistoryModel, id) + return history + + def create(self, context, values): + zone = self.db_api.create(HistoryModel, values) + return zone + + def update(self, context, id, values): + zone = self.db_api.update_object(HistoryModel, id, values) + return zone + + def update_byid(self, context, id, values): + zone = self.db_api.update_object(HistoryModel, id, values) + return zone + + def get_object(self, context, **values): + zone = self.db_api.get_object(HistoryModel, **values) + return zone diff --git a/nca47/objects/view_revs_agent.py b/nca47/objects/view_revs_agent.py new file mode 100644 index 0000000..a6d1419 --- /dev/null +++ b/nca47/objects/view_revs_agent.py @@ -0,0 +1,47 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Vres_Agent_View as vresView +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class Vres_Agent_View(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'agent_id': object_fields.StringField(), + 'agent_ip': object_fields.StringField(), + 'agent_nat_ip': object_fields.StringField(), + 'dc_name': object_fields.StringField(), + 'network_zone': object_fields.StringField(), + 'agent_type': object_fields.StringField(), + 'vres_id': object_fields.StringField(), + 'vres_name': object_fields.StringField(), + 'tenant_id': object_fields.StringField(), + + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(Vres_Agent_View, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(agent_zone, db_agent_zone): + """Converts a database entity to a formal :class:`vres_agent_view` object. + + :param agent_zone: An object of :class:`vres_agent_view`. + :param db_agent_zone: A DB model of a vres_agent_view. + :return: a :class:`NCA_agent` object. + """ + for field in agent_zone.fields: + agent_zone[field] = db_agent_zone[field] + + agent_zone.obj_reset_changes() + return agent_zone + + def get_objects(self, context, **values): + objects = self.db_api.get_objects(vresView, **values) + return objects + + def get_object(self, context, **values): + object = self.db_api.get_object(vresView, **values) + return object diff --git a/nca47/objects/view_vres_vfw_agent.py b/nca47/objects/view_vres_vfw_agent.py new file mode 100644 index 0000000..81d3d50 --- /dev/null +++ b/nca47/objects/view_vres_vfw_agent.py @@ -0,0 +1,51 @@ +from nca47.db import api as db_api +from nca47.db.sqlalchemy.models import Vres_Agent_Vfw_View as vfwView +from nca47.objects import base +from nca47.objects import fields as object_fields + + +class Vres_Agent_Vfw_View(base.Nca47Object): + VERSION = '1.0' + + fields = { + 'agent_id': object_fields.StringField(), + 'agent_ip': object_fields.StringField(), + 'agent_nat_ip': object_fields.StringField(), + 'dc_name': object_fields.StringField(), + 'network_zone': object_fields.StringField(), + 'agent_type': object_fields.StringField(), + 'vres_id': object_fields.StringField(), + 'vres_name': object_fields.StringField(), + 'tenant_id': object_fields.StringField(), + 'vfw_id': object_fields.StringField(), + 'vfw_name': object_fields.StringField(), + 'vfw_info': object_fields.ListOfStringsField(), + 'vfw_type': object_fields.StringField(), + 'network_zone_name': object_fields.StringField(), + 'network_zone_class': object_fields.StringField(), + 'protection_class': object_fields.StringField() + } + + def __init__(self, context=None, **kwarg): + self.db_api = db_api.get_instance() + super(Vres_Agent_Vfw_View, self).__init__(context=None, **kwarg) + + @staticmethod + def _from_db_object(agent_vfw_zone, db_agent_vfw_zone): + """Converts a database entity to a formal + :class:`Vres_Agent_Vfw_View` object. + :param agent_vfw_zone: An object of + class:`Vres_Agent_Vfw_View`. + :param db_agent_vfw_zone: A DB model of a + vres_Vres_Agent_Vfw_Viewagent_view. + :return: a :class:`NCA_agent` object. + """ + for field in agent_vfw_zone.fields: + agent_vfw_zone[field] = db_agent_vfw_zone[field] + + agent_vfw_zone.obj_reset_changes() + return agent_vfw_zone + + def get_objects(self, context, **values): + objects = self.db_api.get_objects(vfwView, **values) + return objects diff --git a/nca47/tests/agent_list.py b/nca47/tests/agent_list.py new file mode 100644 index 0000000..3f0709d --- /dev/null +++ b/nca47/tests/agent_list.py @@ -0,0 +1,97 @@ +import sys +from oslo_config import cfg +import cStringIO +import operator +from oslo_utils import timeutils +from nca47 import objects +from nca47.common.i18n import _ +from nca47.common import service as nca47_service + +sys.path.append('/vagrant/nca47/') +CONF = cfg.CONF +context = {} + +AGENT_OPTS = [ + cfg.IntOpt('agent_down_time', + default='120', + help=_('Seconds to regard the agent is down; should be at ' + 'least twice report_interval, to be sure the ' + 'agent is down for good.')), +] + +opt_group = cfg.OptGroup(name='agent', + title='Options for nca47 agent node info') +CONF.register_group(opt_group) +CONF.register_opts(AGENT_OPTS, opt_group) + + +def indent(rows, hasHeader=False, headerChar='-', delim=' | ', justify='left', + separateRows=False, prefix='', postfix='', wrapfunc=lambda x: x): + + def rowWrapper(row): + newRows = [wrapfunc(item).split('\n') for item in row] + return [[substr or '' for substr in item] for item in map(None, + *newRows)] + # break each logical row into one or more physical ones + logicalRows = [rowWrapper(row) for row in rows] + # columns of physical rows + columns = map(None, *reduce(operator.add, logicalRows)) + # get the maximum of each column by the string length of its items + maxWidths = [max([len(str(item)) for item in column]) for column in + columns] + rowSeparator = headerChar * (len(prefix) + len(postfix) + + sum(maxWidths) + + len(delim)*(len(maxWidths)-1)) + # select the appropriate justify method + mode_dict = {'center': str.center, 'right': str.rjust, 'left': str.ljust} + justify = mode_dict[justify.lower()] + output = cStringIO.StringIO() + if separateRows: + print >> output, rowSeparator + for physicalRows in logicalRows: + for row in physicalRows: + print >> output, \ + prefix \ + + delim.join([justify(str(item), width) for (item, width) in + zip(row, maxWidths)]) + postfix + if separateRows or hasHeader: + print >> output, rowSeparator + hasHeader = False + return output.getvalue() + + +def wrap_onspace(text, width): + """ + A word-wrap function that preserves existing line breaks + and most spaces in the text. Expects that existing line + breaks are posix newlines (\n). + """ + return reduce(lambda line, word, width=width: '%s%s%s' % + (line, ' \n'[(len(line[line.rfind('\n')+1:]) + + len(word.split('\n', 1)[0]) >= width)], word), + text.split(' ')) + + +if __name__ == '__main__': + nca47_service.prepare_service(sys.argv) + labels = ('id', 'agent_type', 'agent_ip', 'agent_nat_ip', 'status') + agents = objects.Agent(context) + agent_list = agents.get_objects(context) + print agent_list + rows = [] + for agent in agent_list: + row = [] + row.append(agent.id) + row.append(agent.agent_type) + row.append(agent.agent_ip) + row.append(agent.agent_nat_ip) + is_down = timeutils.is_older_than(agent.update_time, + CONF.agent.agent_down_time) + agent_status = "xxx" if is_down else ':-)' + row.append(agent_status) + rows.append(row) + width = 10 + + print indent([labels]+rows, hasHeader=True, separateRows=True, + prefix='| ', postfix=' |', + wrapfunc=lambda x: wrap_onspace(x, width)) diff --git a/requirements.txt b/requirements.txt index d367955..a3712fb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,3 +14,33 @@ oslo.concurrency>=2.3.0 # Apache-2.0 oslo.context>=0.2.0 # Apache-2.0 oslo.service>=1.0.0 # Apache-2.0 oslo.utils>=3.4.0 # Apache-2.0 +MySQL-python>=1.2.3 # Apache-2.0 +suds>=0.4 +paramiko>=1.16.0 +removals +wrapt>=1.10.6 +netaddr>=0.7.18 +babel +python-dateutil>=2.5.3 +oslo.serialization>=2.6.0 +iso8601>=0.1.11 +monotonic>=1.1 +funcsigs>=1.0.2 +enum34>=1.1.5 +stevedore>=1.13.0 +greenlet>=0.4.9 +eventlet>=0.19.0 +fasteners>=0.14.1 +Paste>=2.0.3 +PasteDeploy>=1.5.2 +Routes>=2.3.1 +repoze.lru>=0.6 +oslo.db>=4.7.0 +oslo.versionedobjects>=1.9.1 +amqp>=1.4.9 +anyjson>=0.3.3 +kombu>=3.0.35 +netifaces>=0.10.4 +cachetools>=1.1.6 +futurist>=0.14.0 +futures>=3.0.5