From c5d69764711752b1b5ad9fa1ccfd91af071c9dd9 Mon Sep 17 00:00:00 2001 From: Saggi Mizrahi Date: Mon, 13 Jul 2015 18:22:55 +0300 Subject: [PATCH] cascade_service framework This is the base implementation. It adds all the devstack boilerplate and connects to the network plugins' requests. Change-Id: Ibd61153e755e1c218503b0671c242ff50b5ebdc8 --- cmd/cascade_service.py | 41 ++ devstack/local.conf.sample | 3 + devstack/plugin.sh | 29 ++ devstack/settings | 8 + etc/cascade_service.conf | 482 ++++++++++++++++++ tricircle/cascade_service/__init__.py | 0 .../cascade_service/endpoints/__init__.py | 0 .../cascade_service/endpoints/networking.py | 52 ++ tricircle/cascade_service/service.py | 65 +++ tricircle/common/__init__.py | 0 10 files changed, 680 insertions(+) create mode 100644 cmd/cascade_service.py create mode 100644 etc/cascade_service.conf create mode 100644 tricircle/cascade_service/__init__.py create mode 100644 tricircle/cascade_service/endpoints/__init__.py create mode 100644 tricircle/cascade_service/endpoints/networking.py create mode 100644 tricircle/cascade_service/service.py create mode 100644 tricircle/common/__init__.py diff --git a/cmd/cascade_service.py b/cmd/cascade_service.py new file mode 100644 index 00000000..1160ce95 --- /dev/null +++ b/cmd/cascade_service.py @@ -0,0 +1,41 @@ +# Copyright 2015 Huawei Technologies Co., Ltd. +# +# 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. + + +import eventlet + +if __name__ == "__main__": + eventlet.monkey_patch() + +import sys + +from oslo_log import log as logging +from oslo_config import cfg + +import tricircle.cascade_service.service as service + + +def process_command_line_arguments(): + conf = cfg.ConfigOpts() + logging.register_options(conf) + logging.set_defaults() + conf(sys.argv[1:]) + logging.setup(conf, "cascade_service", version='0.1') + +if __name__ == "__main__": + process_command_line_arguments() + server = service.setup_server() + server.start() + server.wait() diff --git a/devstack/local.conf.sample b/devstack/local.conf.sample index c3356230..f02574bb 100644 --- a/devstack/local.conf.sample +++ b/devstack/local.conf.sample @@ -31,6 +31,9 @@ PUBLIC_NETWORK_GATEWAY=10.100.100.3 Q_ENABLE_TRICIRCLE=True enable_plugin tricircle https://git.openstack.org/cgit/stackforge/tricircle/ experiment +# Tricircle Services +enable_service t-svc + # Use Neutron instead of nova-network disable_service n-net enable_service q-svc diff --git a/devstack/plugin.sh b/devstack/plugin.sh index ca7d5152..e22b09e6 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -5,9 +5,24 @@ function configure_tricircle_plugin { if is_service_enabled q-svc ; then Q_PLUGIN_CLASS="tricircle.networking_tricircle.plugin.TricirclePlugin" + #NEUTRON_CONF=/etc/neutron/neutron.conf iniset $NEUTRON_CONF DEFAULT core_plugin "$Q_PLUGIN_CLASS" iniset $NEUTRON_CONF DEFAULT service_plugins "" fi + + if is_service_enabled t-svc ; then + echo "Configuring Neutron for Tricircle Cascade Service" + sudo install -d -o $STACK_USER -m 755 $TRICIRCLE_CONF_DIR + cp -p $TRICIRCLE_DIR/etc/cascade_service.conf $TRICIRCLE_CASCADE_CONF + + iniset $TRICIRCLE_CASCADE_CONF DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL + iniset $TRICIRCLE_CASCADE_CONF DEFAULT verbose true + setup_colorized_logging $TRICIRCLE_CASCADE_CONF DEFAULT + iniset $TRICIRCLE_CASCADE_CONF DEFAULT bind_host $TRICIRCLE_CASCADE_LISTEN_ADDRESS + iniset $TRICIRCLE_CASCADE_CONF DEFAULT use_syslog $SYSLOG + iniset_rpc_backend tricircle $TRICIRCLE_CASCADE_CONF + iniset $TRICIRCLE_CASCADE_CONF database connection `database_connection_url tricircle` + fi } @@ -24,5 +39,19 @@ if [[ "$Q_ENABLE_TRICIRCLE" == "True" ]]; then echo_summary "Configure Tricircle" configure_tricircle_plugin echo export PYTHONPATH=\$PYTHONPATH:$TRICIRCLE_DIR >> $RC_DIR/.localrc.auto + + elif [[ "$1" == "stack" && "$2" == "extra" ]]; then + echo_summary "Initializing Cascading Service" + + if is_service_enabled t-svc; then + run_process t-svc "python $TRICIRCLE_CASCADE_SERVICE --config-file $TRICIRCLE_CASCADE_CONF" + fi + fi + + if [[ "$1" == "unstack" ]]; then + + if is_service_enabled t-svc; then + stop_process t-svc + fi fi fi diff --git a/devstack/settings b/devstack/settings index 582a230c..035d54ea 100644 --- a/devstack/settings +++ b/devstack/settings @@ -3,4 +3,12 @@ TRICIRCLE_REPO=${TRICIRCLE_REPO:-https://git.openstack.org/cgit/stackforge/trici TRICIRCLE_DIR=$DEST/tricircle TRICIRCLE_BRANCH=${TRICIRCLE_BRANCH:-master} +# common variables +TRICIRCLE_CONF_DIR=${TRICIRCLE_CONF_DIR:-/etc/tricircle} + +# cascade service +TRICIRCLE_CASCADE_SERVICE=$TRICIRCLE_DIR/cmd/cascade_service.py +TRICIRCLE_CASCADE_CONF=$TRICIRCLE_CONF_DIR/cascade_service.conf +TRICIRCLE_CASCADE_LISTEN_ADDRESS=${TRICIRCLE_CASCADE_LISTEN_ADDRESS:-0.0.0.0} + export PYTHONPATH=$PYTHONPATH:$TRICIRCLE_DIR diff --git a/etc/cascade_service.conf b/etc/cascade_service.conf new file mode 100644 index 00000000..3a4dba71 --- /dev/null +++ b/etc/cascade_service.conf @@ -0,0 +1,482 @@ +[DEFAULT] +# Print more verbose output (set logging level to INFO instead of default WARNING level). +# verbose = True + +# Print debugging output (set logging level to DEBUG instead of default WARNING level). +# debug = True + +# log_format = %(asctime)s %(levelname)8s [%(name)s] %(message)s +# log_date_format = %Y-%m-%d %H:%M:%S + +# use_syslog -> syslog +# log_file and log_dir -> log_dir/log_file +# (not log_file) and log_dir -> log_dir/{binary_name}.log +# use_stderr -> stderr +# (not user_stderr) and (not log_file) -> stdout +# publish_errors -> notification system + +# use_syslog = False +# syslog_log_facility = LOG_USER + +# use_stderr = True +# log_file = +# log_dir = + +# publish_errors = False + +# Address to bind the API server to +# bind_host = 0.0.0.0 + +# Port the bind the API server to +# bind_port = 9696 + +# +# Options defined in oslo.messaging +# + +# Use durable queues in amqp. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_durable_queues +# amqp_durable_queues=false + +# Auto-delete queues in amqp. (boolean value) +# amqp_auto_delete=false + +# Size of RPC connection pool. (integer value) +# rpc_conn_pool_size=30 + +# Qpid broker hostname. (string value) +# qpid_hostname=localhost + +# Qpid broker port. (integer value) +# qpid_port=5672 + +# Qpid HA cluster host:port pairs. (list value) +# qpid_hosts=$qpid_hostname:$qpid_port + +# Username for Qpid connection. (string value) +# qpid_username= + +# Password for Qpid connection. (string value) +# qpid_password= + +# Space separated list of SASL mechanisms to use for auth. +# (string value) +# qpid_sasl_mechanisms= + +# Seconds between connection keepalive heartbeats. (integer +# value) +# qpid_heartbeat=60 + +# Transport to use, either 'tcp' or 'ssl'. (string value) +# qpid_protocol=tcp + +# Whether to disable the Nagle algorithm. (boolean value) +# qpid_tcp_nodelay=true + +# The qpid topology version to use. Version 1 is what was +# originally used by impl_qpid. Version 2 includes some +# backwards-incompatible changes that allow broker federation +# to work. Users should update to version 2 when they are +# able to take everything down, as it requires a clean break. +# (integer value) +# qpid_topology_version=1 + +# SSL version to use (valid only if SSL enabled). valid values +# are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some +# distributions. (string value) +# kombu_ssl_version= + +# SSL key file (valid only if SSL enabled). (string value) +# kombu_ssl_keyfile= + +# SSL cert file (valid only if SSL enabled). (string value) +# kombu_ssl_certfile= + +# SSL certification authority file (valid only if SSL +# enabled). (string value) +# kombu_ssl_ca_certs= + +# How long to wait before reconnecting in response to an AMQP +# consumer cancel notification. (floating point value) +# kombu_reconnect_delay=1.0 + +# The RabbitMQ broker address where a single node is used. +# (string value) +# rabbit_host=localhost + +# The RabbitMQ broker port where a single node is used. +# (integer value) +# rabbit_port=5672 + +# RabbitMQ HA cluster host:port pairs. (list value) +# rabbit_hosts=$rabbit_host:$rabbit_port + +# Connect over SSL for RabbitMQ. (boolean value) +# rabbit_use_ssl=false + +# The RabbitMQ userid. (string value) +# rabbit_userid=guest + +# The RabbitMQ password. (string value) +# rabbit_password=guest + +# the RabbitMQ login method (string value) +# rabbit_login_method=AMQPLAIN + +# The RabbitMQ virtual host. (string value) +# rabbit_virtual_host=/ + +# How frequently to retry connecting with RabbitMQ. (integer +# value) +# rabbit_retry_interval=1 + +# How long to backoff for between retries when connecting to +# RabbitMQ. (integer value) +# rabbit_retry_backoff=2 + +# Maximum number of RabbitMQ connection retries. Default is 0 +# (infinite retry count). (integer value) +# rabbit_max_retries=0 + +# Use HA queues in RabbitMQ (x-ha-policy: all). If you change +# this option, you must wipe the RabbitMQ database. (boolean +# value) +# rabbit_ha_queues=false + +# If passed, use a fake RabbitMQ provider. (boolean value) +# fake_rabbit=false + +# ZeroMQ bind address. Should be a wildcard (*), an ethernet +# interface, or IP. The "host" option should point or resolve +# to this address. (string value) +# rpc_zmq_bind_address=* + +# MatchMaker driver. (string value) +# rpc_zmq_matchmaker=oslo.messaging._drivers.matchmaker.MatchMakerLocalhost + +# ZeroMQ receiver listening port. (integer value) +# rpc_zmq_port=9501 + +# Number of ZeroMQ contexts, defaults to 1. (integer value) +# rpc_zmq_contexts=1 + +# Maximum number of ingress messages to locally buffer per +# topic. Default is unlimited. (integer value) +# rpc_zmq_topic_backlog= + +# Directory for holding IPC sockets. (string value) +# rpc_zmq_ipc_dir=/var/run/openstack + +# Name of this node. Must be a valid hostname, FQDN, or IP +# address. Must match "host" option, if running Nova. (string +# value) +# rpc_zmq_host=oslo + +# Seconds to wait before a cast expires (TTL). Only supported +# by impl_zmq. (integer value) +# rpc_cast_timeout=30 + +# Heartbeat frequency. (integer value) +# matchmaker_heartbeat_freq=300 + +# Heartbeat time-to-live. (integer value) +# matchmaker_heartbeat_ttl=600 + +# Size of RPC greenthread pool. (integer value) +# rpc_thread_pool_size=64 + +# Driver or drivers to handle sending notifications. (multi +# valued) +# notification_driver= + +# AMQP topic used for OpenStack notifications. (list value) +# Deprecated group/name - [rpc_notifier2]/topics +# notification_topics=notifications + +# Seconds to wait for a response from a call. (integer value) +# rpc_response_timeout=60 + +# A URL representing the messaging driver to use and its full +# configuration. If not set, we fall back to the rpc_backend +# option and driver specific configuration. (string value) +# transport_url= + +# The messaging driver to use, defaults to rabbit. Other +# drivers include qpid and zmq. (string value) +# rpc_backend=rabbit + +# The default exchange under which topics are scoped. May be +# overridden by an exchange name specified in the +# transport_url option. (string value) +# control_exchange=openstack + +[database] +# This line MUST be changed to actually run the plugin. +# Example: +# connection = mysql+pymysql://root:pass@127.0.0.1:3306/neutron +# Replace 127.0.0.1 above with the IP address of the database used by the +# main neutron server. (Leave it as is if the database runs on this host.) +# connection = sqlite:// +# NOTE: In deployment the [database] section and its connection attribute may +# be set in the corresponding core plugin '.ini' file. However, it is suggested +# to put the [database] section and its connection attribute in this +# configuration file. + +# Database engine for which script will be generated when using offline +# migration +# engine = + +# The SQLAlchemy connection string used to connect to the slave database +# slave_connection = + +# Database reconnection retry times - in event connectivity is lost +# set to -1 implies an infinite retry count +# max_retries = 10 + +# Database reconnection interval in seconds - if the initial connection to the +# database fails +# retry_interval = 10 + +# Minimum number of SQL connections to keep open in a pool +# min_pool_size = 1 + +# Maximum number of SQL connections to keep open in a pool +# max_pool_size = 10 + +# Timeout in seconds before idle sql connections are reaped +# idle_timeout = 3600 + +# If set, use this value for max_overflow with sqlalchemy +# max_overflow = 20 + +# Verbosity of SQL debugging information. 0=None, 100=Everything +# connection_debug = 0 + +# Add python stack traces to SQL as comment strings +# connection_trace = False + +# If set, use this value for pool_timeout with sqlalchemy +# pool_timeout = 10 + +[oslo_concurrency] + +# Directory to use for lock files. For security, the specified directory should +# only be writable by the user running the processes that need locking. +# Defaults to environment variable OSLO_LOCK_PATH. If external locks are used, +# a lock path must be set. +lock_path = $state_path/lock + +# Enables or disables inter-process locks. +# disable_process_locking = False + +[oslo_messaging_amqp] + +# +# From oslo.messaging +# + +# Address prefix used when sending to a specific server (string value) +# Deprecated group/name - [amqp1]/server_request_prefix +# server_request_prefix = exclusive + +# Address prefix used when broadcasting to all servers (string value) +# Deprecated group/name - [amqp1]/broadcast_prefix +# broadcast_prefix = broadcast + +# Address prefix when sending to any server in group (string value) +# Deprecated group/name - [amqp1]/group_request_prefix +# group_request_prefix = unicast + +# Name for the AMQP container (string value) +# Deprecated group/name - [amqp1]/container_name +# container_name = + +# Timeout for inactive connections (in seconds) (integer value) +# Deprecated group/name - [amqp1]/idle_timeout +# idle_timeout = 0 + +# Debug: dump AMQP frames to stdout (boolean value) +# Deprecated group/name - [amqp1]/trace +# trace = false + +# CA certificate PEM file for verifing server certificate (string value) +# Deprecated group/name - [amqp1]/ssl_ca_file +# ssl_ca_file = + +# Identifying certificate PEM file to present to clients (string value) +# Deprecated group/name - [amqp1]/ssl_cert_file +# ssl_cert_file = + +# Private key PEM file used to sign cert_file certificate (string value) +# Deprecated group/name - [amqp1]/ssl_key_file +# ssl_key_file = + +# Password for decrypting ssl_key_file (if encrypted) (string value) +# Deprecated group/name - [amqp1]/ssl_key_password +# ssl_key_password = + +# Accept clients using either SSL or plain TCP (boolean value) +# Deprecated group/name - [amqp1]/allow_insecure_clients +# allow_insecure_clients = false + + +[oslo_messaging_qpid] + +# +# From oslo.messaging +# + +# Use durable queues in AMQP. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_durable_queues +# amqp_durable_queues = false + +# Auto-delete queues in AMQP. (boolean value) +# Deprecated group/name - [DEFAULT]/amqp_auto_delete +# amqp_auto_delete = false + +# Size of RPC connection pool. (integer value) +# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size +# rpc_conn_pool_size = 30 + +# Qpid broker hostname. (string value) +# Deprecated group/name - [DEFAULT]/qpid_hostname +# qpid_hostname = localhost + +# Qpid broker port. (integer value) +# Deprecated group/name - [DEFAULT]/qpid_port +# qpid_port = 5672 + +# Qpid HA cluster host:port pairs. (list value) +# Deprecated group/name - [DEFAULT]/qpid_hosts +# qpid_hosts = $qpid_hostname:$qpid_port + +# Username for Qpid connection. (string value) +# Deprecated group/name - [DEFAULT]/qpid_username +# qpid_username = + +# Password for Qpid connection. (string value) +# Deprecated group/name - [DEFAULT]/qpid_password +# qpid_password = + +# Space separated list of SASL mechanisms to use for auth. (string value) +# Deprecated group/name - [DEFAULT]/qpid_sasl_mechanisms +# qpid_sasl_mechanisms = + +# Seconds between connection keepalive heartbeats. (integer value) +# Deprecated group/name - [DEFAULT]/qpid_heartbeat +# qpid_heartbeat = 60 + +# Transport to use, either 'tcp' or 'ssl'. (string value) +# Deprecated group/name - [DEFAULT]/qpid_protocol +# qpid_protocol = tcp + +# Whether to disable the Nagle algorithm. (boolean value) +# Deprecated group/name - [DEFAULT]/qpid_tcp_nodelay +# qpid_tcp_nodelay = true + +# The number of prefetched messages held by receiver. (integer value) +# Deprecated group/name - [DEFAULT]/qpid_receiver_capacity +# qpid_receiver_capacity = 1 + +# The qpid topology version to use. Version 1 is what was originally used by +# impl_qpid. Version 2 includes some backwards-incompatible changes that allow +# broker federation to work. Users should update to version 2 when they are +# able to take everything down, as it requires a clean break. (integer value) +# Deprecated group/name - [DEFAULT]/qpid_topology_version +# qpid_topology_version = 1 + + +[oslo_messaging_rabbit] + +# +# From oslo.messaging +# + +# Use durable queues in AMQP. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_durable_queues +# amqp_durable_queues = false + +# Auto-delete queues in AMQP. (boolean value) +# Deprecated group/name - [DEFAULT]/amqp_auto_delete +# amqp_auto_delete = false + +# Size of RPC connection pool. (integer value) +# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size +# rpc_conn_pool_size = 30 + +# SSL version to use (valid only if SSL enabled). Valid values are TLSv1 and +# SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be available on some +# distributions. (string value) +# Deprecated group/name - [DEFAULT]/kombu_ssl_version +# kombu_ssl_version = + +# SSL key file (valid only if SSL enabled). (string value) +# Deprecated group/name - [DEFAULT]/kombu_ssl_keyfile +# kombu_ssl_keyfile = + +# SSL cert file (valid only if SSL enabled). (string value) +# Deprecated group/name - [DEFAULT]/kombu_ssl_certfile +# kombu_ssl_certfile = + +# SSL certification authority file (valid only if SSL enabled). (string value) +# Deprecated group/name - [DEFAULT]/kombu_ssl_ca_certs +# kombu_ssl_ca_certs = + +# How long to wait before reconnecting in response to an AMQP consumer cancel +# notification. (floating point value) +# Deprecated group/name - [DEFAULT]/kombu_reconnect_delay +# kombu_reconnect_delay = 1.0 + +# The RabbitMQ broker address where a single node is used. (string value) +# Deprecated group/name - [DEFAULT]/rabbit_host +# rabbit_host = localhost + +# The RabbitMQ broker port where a single node is used. (integer value) +# Deprecated group/name - [DEFAULT]/rabbit_port +# rabbit_port = 5672 + +# RabbitMQ HA cluster host:port pairs. (list value) +# Deprecated group/name - [DEFAULT]/rabbit_hosts +# rabbit_hosts = $rabbit_host:$rabbit_port + +# Connect over SSL for RabbitMQ. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_use_ssl +# rabbit_use_ssl = false + +# The RabbitMQ userid. (string value) +# Deprecated group/name - [DEFAULT]/rabbit_userid +# rabbit_userid = guest + +# The RabbitMQ password. (string value) +# Deprecated group/name - [DEFAULT]/rabbit_password +# rabbit_password = guest + +# The RabbitMQ login method. (string value) +# Deprecated group/name - [DEFAULT]/rabbit_login_method +# rabbit_login_method = AMQPLAIN + +# The RabbitMQ virtual host. (string value) +# Deprecated group/name - [DEFAULT]/rabbit_virtual_host +# rabbit_virtual_host = / + +# How frequently to retry connecting with RabbitMQ. (integer value) +# rabbit_retry_interval = 1 + +# How long to backoff for between retries when connecting to RabbitMQ. (integer +# value) +# Deprecated group/name - [DEFAULT]/rabbit_retry_backoff +# rabbit_retry_backoff = 2 + +# Maximum number of RabbitMQ connection retries. Default is 0 (infinite retry +# count). (integer value) +# Deprecated group/name - [DEFAULT]/rabbit_max_retries +# rabbit_max_retries = 0 + +# Use HA queues in RabbitMQ (x-ha-policy: all). If you change this option, you +# must wipe the RabbitMQ database. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_ha_queues +# rabbit_ha_queues = false + +# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake (boolean value) +# Deprecated group/name - [DEFAULT]/fake_rabbit +# fake_rabbit = false diff --git a/tricircle/cascade_service/__init__.py b/tricircle/cascade_service/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tricircle/cascade_service/endpoints/__init__.py b/tricircle/cascade_service/endpoints/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tricircle/cascade_service/endpoints/networking.py b/tricircle/cascade_service/endpoints/networking.py new file mode 100644 index 00000000..0bf5cd15 --- /dev/null +++ b/tricircle/cascade_service/endpoints/networking.py @@ -0,0 +1,52 @@ +# Copyright 2015 Huawei Technologies Co., Ltd. +# +# 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. + + +import oslo_messaging + +from oslo_log import log as logging + +LOG = logging.getLogger(__name__) + + +class CascadeNetworkingServiceEndpoint(object): + + target = oslo_messaging.Target(namespace="networking", + version='1.0') + + def create_network(self, ctx, payload): + # TODO(gamepl, saggi): STUB + LOG.info("(create_network) payload: %s", payload) + return True + + def delete_network(self, ctx, payload): + # TODO(gampel, saggi): STUB + LOG.info("(delete_network) payload: %s", payload) + return True + + def update_network(self, ctx, payload): + # TODO(gampel, saggi): STUB + LOG.info("(update_network) payload: %s", payload) + return True + + def create_port(self, ctx, payload): + # TODO(gampel, saggi): STUB + LOG.info("(create_port) payload: %s", payload) + return True + + def delete_port(self, ctx, payload): + # TODO(gampel, saggi): STUB + LOG.info("(delete_port) payload: %s", payload) + return True diff --git a/tricircle/cascade_service/service.py b/tricircle/cascade_service/service.py new file mode 100644 index 00000000..ce1a184d --- /dev/null +++ b/tricircle/cascade_service/service.py @@ -0,0 +1,65 @@ +# Copyright 2015 Huawei Technologies Co., Ltd. +# +# 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. + + +from socket import gethostname + +from oslo_config import cfg +from oslo_log import log as logging +import oslo_messaging + +from tricircle.common import topics +from tricircle.common.serializer import CascadeSerializer as Serializer + +# import endpoints here +from tricircle.cascade_service.endpoints.networking import ( + CascadeNetworkingServiceEndpoint) + +LOG = logging.getLogger(__name__) + + +class ServerControlEndpoint(object): + target = oslo_messaging.Target(namespace='control', + version='1.0') + + def __init__(self, server): + self.server = server + + def stop(self, ctx): + if self.server: + self.server.stop() + + +def setup_server(): + transport = oslo_messaging.get_transport(cfg.CONF) + target = oslo_messaging.Target( + exchange="tricircle", + topic=topics.CASCADING_SERVICE, + server=gethostname(), + ) + server_control_endpoint = ServerControlEndpoint(None) + endpoints = [ + server_control_endpoint, + CascadeNetworkingServiceEndpoint(), + ] + server = oslo_messaging.get_rpc_server( + transport, + target, + endpoints, + executor='eventlet', + serializer=Serializer(), + ) + server_control_endpoint.server = server + return server diff --git a/tricircle/common/__init__.py b/tricircle/common/__init__.py new file mode 100644 index 00000000..e69de29b