Merge "Move metadata_service deployment out of DF code"

This commit is contained in:
Zuul 2018-07-26 09:52:40 +00:00 committed by Gerrit Code Review
commit 04e6e76363
4 changed files with 49 additions and 93 deletions

View File

@ -184,6 +184,10 @@ function configure_df_metadata_service {
iniset $DRAGONFLOW_CONF df_metadata ip "$DF_METADATA_SERVICE_IP"
iniset $DRAGONFLOW_CONF df_metadata port "$DF_METADATA_SERVICE_PORT"
iniset $DRAGONFLOW_CONF df_metadata metadata_interface "$DF_METADATA_SERVICE_INTERFACE"
pushd $DRAGONFLOW_DIR
# TODO(snapiri) When we add more switch backends, this should be conditional
tools/ovs_metadata_service_deployment.sh install $INTEGRATION_BRIDGE $DF_METADATA_SERVICE_INTERFACE $DF_METADATA_SERVICE_IP
popd
fi
}
@ -503,7 +507,10 @@ function stop_df_metadata_agent {
if is_service_enabled df-metadata ; then
echo "Stopping Dragonflow metadata service"
stop_process df-metadata
sudo ovs-vsctl del-port br-int $DF_METADATA_SERVICE_INTERFACE
pushd $DRAGONFLOW_DIR
# TODO(snapiri) When we add more switch backends, this should be conditional
tools/ovs_metadata_service_deployment.sh remove $INTEGRATION_BRIDGE $DF_METADATA_SERVICE_INTERFACE
popd
fi
}

View File

@ -12,8 +12,6 @@
from oslo_log import log
from neutron.agent.common import utils
from neutron.agent.linux import ip_lib
from neutron.common import config
from neutron.conf.agent.metadata import config as metadata_conf
from neutron import wsgi
@ -28,59 +26,12 @@ import sys
LOG = log.getLogger(__name__)
METADATA_ROUTE_TABLE_ID = '2'
def environment_setup():
bridge = cfg.CONF.df.integration_bridge
interface = cfg.CONF.df_metadata.metadata_interface
port = cfg.CONF.df_metadata.port
if ip_lib.device_exists(interface):
LOG.info("Device %s already exists", interface)
# Destroy the environment when the device exists.
# We can re-initialize the environment correctly.
environment_destroy()
cmd = ["ovs-vsctl", "add-port", bridge, interface,
"--", "set", "Interface", interface, "type=internal"]
utils.execute(cmd, run_as_root=True)
ip = cfg.CONF.df_metadata.ip
cmd = ["ip", "addr", "add", "dev", interface, "{}/0".format(ip)]
utils.execute(cmd, run_as_root=True)
cmd = ["ip", "link", "set", "dev", interface, "up"]
utils.execute(cmd, run_as_root=True)
cmd = ["ip", "route", "add", "0.0.0.0/0", "dev", interface,
"table", METADATA_ROUTE_TABLE_ID]
utils.execute(cmd, run_as_root=True)
cmd = ["ip", "rule", "add", "from", ip, "table", METADATA_ROUTE_TABLE_ID]
utils.execute(cmd, run_as_root=True)
cmd = ["iptables", '-I', 'INPUT', '-i', interface, '-p', 'tcp', '--dport',
str(port), '-j', 'ACCEPT']
utils.execute(cmd, run_as_root=True)
def environment_destroy():
bridge = cfg.CONF.df.integration_bridge
interface = cfg.CONF.df_metadata.metadata_interface
cmd = ["ovs-vsctl", "del-port", bridge, interface]
utils.execute(cmd, run_as_root=True, check_exit_code=[0])
ip = cfg.CONF.df_metadata.ip
cmd = ["ip", "rule", "del", "from", ip, "table", METADATA_ROUTE_TABLE_ID]
utils.execute(cmd, run_as_root=True)
def main():
metadata_conf.register_meta_conf_opts(
metadata_conf.METADATA_PROXY_HANDLER_OPTS)
config.init(sys.argv[1:])
config.setup_logging()
environment_setup()
nb_api = api_nb.NbApi.get_instance()
service_instance = metadata_service.DFMetadataProxyHandler(
cfg.CONF, nb_api)
@ -92,4 +43,3 @@ def main():
port=cfg.CONF.df_metadata.port,
)
service.wait()
environment_destroy()

View File

@ -10,12 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron.agent.common import utils
from neutron.agent.linux import ip_lib
from oslo_config import cfg
from oslo_log import log
from dragonflow.cmd.eventlet import df_metadata_service
from dragonflow.conf import df_metadata_service as df_metadata_service_conf
from dragonflow.tests.fullstack import test_base
@ -28,42 +24,5 @@ class TestMetadataService(test_base.DFTestBase):
def setUp(self):
super(TestMetadataService, self).setUp()
df_metadata_service_conf.register_opts()
# Override defaults to avoid collision with existing metadata service
cfg.CONF.df_metadata.ip = '1.1.1.1'
cfg.CONF.df_metadata.metadata_interface = 'tap-md-test'
df_metadata_service.METADATA_ROUTE_TABLE_ID = '3'
self.metadata_ip = cfg.CONF.df_metadata.ip
self.isTornDown = False
def test_metadata_proxy_exit_clear_ip_rule(self):
df_metadata_service.environment_setup()
ip_rule = ip_lib.IPRule().rule
rules = ip_rule.list_rules(4)
rules_source = [r['from'] for r in rules if 'from' in r]
self.assertIn(self.metadata_ip, rules_source)
df_metadata_service.environment_destroy()
self.isTornDown = True
rules = ip_rule.list_rules(4)
rules_source = [r['from'] for r in rules if 'from' in r]
self.assertNotIn(self.metadata_ip, rules_source)
def tearDown(self):
if not self.isTornDown:
bridge = cfg.CONF.df.integration_bridge
interface = cfg.CONF.df_metadata.metadata_interface
cmd = ["ovs-vsctl", "del-port", bridge, interface]
try:
utils.execute(cmd, run_as_root=True, check_exit_code=[0])
except Exception:
LOG.exception("Failed to delete metadata test port")
ip = cfg.CONF.df_metadata.ip
cmd = ["ip", "rule", "del", "from", ip, "table",
df_metadata_service.METADATA_ROUTE_TABLE_ID]
try:
utils.execute(cmd, run_as_root=True)
except Exception:
LOG.exception(
"Failed to delete metadata test routing rule")
super(TestMetadataService, self).tearDown()
# TODO(snapiri) Add some tests for the actual metadata service logic

View File

@ -0,0 +1,40 @@
#!/bin/bash
ACTION=$1; shift
INTEGRATION_BRIDGE=${1:-"br-int"}; shift
DF_METADATA_SERVICE_INTERFACE=${1:-"tap-metadata"}; shift
function usage {
cat>&2<<EOF
USAGE: $0 <action> [<integration-bridge>] [<interface>] [<IP>]
action - install / remove
integration-bridge - name of the integration bridge (br-int)
interface - name of the interface to add to the bridge (tap-metadata)
IP - address to assign to the interface (169.254.169.254)
EOF
}
if [ -z "$ACTION" ]; then
usage
exit 1
fi
case $ACTION in
install)
DF_METADATA_SERVICE_IP=${1:-"169.254.169.254"}; shift
sudo ovs-vsctl add-port $INTEGRATION_BRIDGE $DF_METADATA_SERVICE_INTERFACE -- set Interface $DF_METADATA_SERVICE_INTERFACE type=internal
sudo ip addr add dev $DF_METADATA_SERVICE_INTERFACE $DF_METADATA_SERVICE_IP/0
sudo ip link set dev $DF_METADATA_SERVICE_INTERFACE up
sudo ip route add 0.0.0.0/0 dev $DF_METADATA_SERVICE_INTERFACE table 2
sudo ip rule add from $DF_METADATA_SERVICE_IP table 2
;;
remove)
sudo ovs-vsctl del-port $INTEGRATION_BRIDGE $DF_METADATA_SERVICE_INTERFACE
;;
*)
usage
exit 1
;;
esac