Source code for volttron.utils.rmq_config_params

# -*- coding: utf-8 -*- {{{
# vim: set fenc=utf-8 ft=python sw=4 ts=4 sts=4 et:
#
# Copyright 2019, Battelle Memorial Institute.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This material was prepared as an account of work sponsored by an agency of
# the United States Government. Neither the United States Government nor the
# United States Department of Energy, nor Battelle, nor any of their
# employees, nor any jurisdiction or organization that has cooperated in the
# development of these materials, makes any warranty, express or
# implied, or assumes any legal liability or responsibility for the accuracy,
# completeness, or usefulness or any information, apparatus, product,
# software, or process disclosed, or represents that its use would not infringe
# privately owned rights. Reference herein to any specific commercial product,
# process, or service by trade name, trademark, manufacturer, or otherwise
# does not necessarily constitute or imply its endorsement, recommendation, or
# favoring by the United States Government or any agency thereof, or
# Battelle Memorial Institute. The views and opinions of authors expressed
# herein do not necessarily state or reflect those of the
# United States Government or any agency thereof.
#
# PACIFIC NORTHWEST NATIONAL LABORATORY operated by
# BATTELLE for the UNITED STATES DEPARTMENT OF ENERGY
# under Contract DE-AC05-76RL01830
# }}}

import os
import logging


try:
    import yaml
except ImportError:
    raise RuntimeError('PyYAML must be installed before running this script ')

from volttron.platform import certs
from volttron.platform import get_home
from volttron.platform.agent.utils import get_platform_instance_name

_log = logging.getLogger(__name__)


[docs]class RMQConfig(object): """ Utility class to read/write RabbitMQ related configuration """ def __init__(self): self.instance_name = get_platform_instance_name() # This is written durn the bootstrap phase of the rabbitmq installation # however for docker we don't write this at all so we need to # use the default location for this rmq_home_file = os.path.expanduser("~/.volttron_rmq_home") if os.path.isfile(rmq_home_file): with open(os.path.expanduser("~/.volttron_rmq_home")) as f: self.rabbitmq_server = f.read().strip() else: self.rabbitmq_server = os.path.expanduser("~/rabbitmq_server/rabbitmq_server-3.7.7/") assert os.path.isdir(self.rabbitmq_server), "Missing rabbitmq server directory{}".format(self.rabbitmq_server) self.crts = certs.Certs() self.volttron_home = get_home() self.volttron_rmq_config = os.path.join(self.volttron_home, 'rabbitmq_config.yml') self.default_pass = "default_passwd" self.config_opts = None try: self.load_rmq_config() except (IOError, yaml.YAMLError) as exc: self.config_opts = {} self._set_default_config() def _set_default_config(self): """ init with default values :return: """ self.config_opts.setdefault('host', "localhost") self.config_opts.setdefault("ssl", "true") self.config_opts.setdefault('amqp-port', 5672) self.config_opts.setdefault('amqp-port-ssl', 5671) self.config_opts.setdefault('mgmt-port', 15672) self.config_opts.setdefault('mgmt-port-ssl', 15671) self.config_opts.setdefault('virtual-host', 'volttron') self.config_opts.setdefault('reconnect-delay', 30) self.config_opts.setdefault('user', self.instance_name + '-admin') rmq_home = os.path.join(os.path.expanduser("~"), "rabbitmq_server/rabbitmq_server-3.7.7") self.config_opts.setdefault("rmq-home", rmq_home)
[docs] def load_rmq_config(self, volttron_home=None): """ Load RabbitMQ config from VOLTTRON_HOME :param volttron_home: VOLTTRON_HOME path :return: """ """Loads the config file if the path exists.""" with open(self.volttron_rmq_config, 'r') as yaml_file: self.config_opts = yaml.safe_load(yaml_file) if self.config_opts.get('rmq-home'): self.config_opts['rmq-home'] = os.path.expanduser( self.config_opts['rmq-home'])
[docs] def write_rmq_config(self, volttron_home=None): """ Write new config options into $VOLTTRON_HOME/rabbitmq_config.yml :param volttron_home: VOLTTRON_HOME path :return: """ try: with open(self.volttron_rmq_config, 'w') as \ yaml_file: yaml.dump(self.config_opts, yaml_file, default_flow_style=False) # Explicitly give read access to group and others. RMQ user and # agents should be able to read this config file os.chmod(self.volttron_rmq_config, 0o744) except IOError as exc: _log.error("Error writing to rabbitmq_config.yml file. Please" "check VOLTTRON_HOME".format(self.volttron_home)) except yaml.YAMLError as exc: raise
@property def hostname(self): return self.config_opts.get('host') @property def amqp_port(self): return self.config_opts.get('amqp-port', 5672) @property def amqp_port_ssl(self): return self.config_opts.get('amqp-port-ssl', 5671) @property def mgmt_port(self): return self.config_opts.get('mgmt-port', 15672) @property def mgmt_port_ssl(self): return self.config_opts.get('mgmt-port-ssl', 15671) @property def virtual_host(self): return self.config_opts.get('virtual-host') @property def admin_user(self): return self.config_opts.get('user') @property def admin_pwd(self): return self.config_opts.get('pass', self.default_pass) @property def rmq_home(self): return self.config_opts.get('rmq-home') @property def is_ssl(self): ssl_auth = self.config_opts.get('ssl', 'true') return ssl_auth in ('true', 'True', 'TRUE', True) @property def use_existing_certs(self): use_existing = self.config_opts.get('use-existing-certs') if use_existing is not None: return use_existing in ('true', 'True', 'TRUE', True) return use_existing @property def certificate_data(self): return self.config_opts.get('certificate-data') @property def local_user(self): return "guest" @property def local_password(self): return "guest" @property def node_name(self): return self.config_opts.get('node-name', 'rabbit')
[docs] def reconnect_delay(self): return self.config_opts.get('reconnect-delay')
@hostname.setter def hostname(self, host): self.config_opts['host'] = host @amqp_port.setter def amqp_port(self, port): self.config_opts['amqp-port'] = port @amqp_port_ssl.setter def amqp_port_ssl(self, port): self.config_opts['amqp-port-ssl'] = port @mgmt_port_ssl.setter def mgmt_port_ssl(self, port): self.config_opts['mgmt-port-ssl'] = port @mgmt_port.setter def mgmt_port(self, port): self.config_opts['mgmt-port'] = port @virtual_host.setter def virtual_host(self, vhost): self.config_opts['virtual-host'] = vhost @admin_user.setter def admin_user(self, user): self.config_opts['user'] = user @admin_pwd.setter def admin_pwd(self, pwd): self.config_opts['pass'] = pwd @rmq_home.setter def rmq_home(self, rhome): self.config_opts['rmq-home'] = rhome @is_ssl.setter def is_ssl(self, ssl_flag): self.config_opts['ssl'] = ssl_flag @certificate_data.setter def certificate_data(self, data): self.config_opts['certificate-data'] = data @node_name.setter def node_name(self, name): self.config_opts['node-name'] = name