From 28839c6db99a7af448b707432fc82375cb94f257 Mon Sep 17 00:00:00 2001 From: Ashutosh Mishra Date: Tue, 28 Jun 2016 17:41:43 +0530 Subject: [PATCH 001/157] Add support to build oc-vyos agent deb package --- .../vyos/build_oc_vyos_deb.sh | 120 ++++ .../vyos/oc-vyos/DEBIAN/changelog | 5 + .../vyos/oc-vyos/DEBIAN/control | 8 + .../vyos/oc-vyos/DEBIAN/postinst | 13 + .../vyos/oc-vyos/DEBIAN/postrm | 3 + .../oc-vyos/deb-packages/oc-vyos-2-31.deb | Bin 0 -> 32616 bytes .../oc-vyos-2-31/DEBIAN/changelog | 5 + .../deb-packages/oc-vyos-2-31/DEBIAN/control | 8 + .../deb-packages/oc-vyos-2-31/DEBIAN/postinst | 13 + .../deb-packages/oc-vyos-2-31/DEBIAN/postrm | 3 + .../oc-vyos-2-31/config/scripts/restart_vpn | 3 + .../dhclient-exit-hooks.d/management_pbr | 11 + .../oc-vyos-2-31/etc/init.d/oc-vyos | 130 ++++ .../etc/network/interface-post-up | 2 + .../oc-vyos-2-31/etc/network/interfaces | 59 ++ .../deb-packages/oc-vyos-2-31/etc/sc-version | 1 + .../oc-vyos-2-31/usr/share/oc-pbr/README | 14 + .../usr/share/oc-pbr/controller_route | 0 .../usr/share/oc-pbr/dhclient-script | 327 ++++++++++ .../usr/share/oc-pbr/interface-post-up | 2 + .../oc-vyos-2-31/usr/share/oc-pbr/interfaces | 59 ++ .../usr/share/oc-pbr/management_pbr | 11 + .../usr/share/oc-pbr/no-default-route | 12 + .../oc-vyos-2-31/usr/share/oc-pbr/pbr | 2 + .../oc-vyos-2-31/usr/share/oc-pbr/pbr_init | 98 +++ .../oc-vyos-2-31/usr/share/oc-pbr/rc.local | 19 + .../usr/share/vyos-oc/LICENSE README | 2 + .../usr/share/vyos-oc/__init__.py | 0 .../usr/share/vyos-oc/auth_pam.pl | 285 +++++++++ .../share/vyos-oc/auth_pam_domain_verify.pl | 273 +++++++++ .../usr/share/vyos-oc/auth_server.conf | 6 + .../usr/share/vyos-oc/execformat/__init__.py | 0 .../usr/share/vyos-oc/execformat/executor.py | 157 +++++ .../usr/share/vyos-oc/execformat/formator.py | 38 ++ .../usr/share/vyos-oc/init_script/oc-vyos | 130 ++++ .../usr/share/vyos-oc/init_script/restart_vpn | 3 + .../usr/share/vyos-oc/oc-vyos.conf | 8 + .../vyos-oc/oc_config_server/__init__.py | 1 + .../oc_config_server/edit_persistent_rule.py | 88 +++ .../vyos-oc/oc_config_server/fw_constants.py | 17 + .../vyos-oc/oc_config_server/fw_handler.py | 66 +++ .../vyos-oc/oc_config_server/ha_config.py | 367 ++++++++++++ .../oc_config_server/interface_monitor.sh | 11 + .../vyos-oc/oc_config_server/log_forwarder.py | 55 ++ .../vyos-oc/oc_config_server/oc_fw_module.py | 357 +++++++++++ .../vyos-oc/oc_config_server/operations.py | 65 ++ .../oc_config_server/routes_config_handler.py | 211 +++++++ .../share/vyos-oc/oc_config_server/server.py | 57 ++ .../share/vyos-oc/oc_config_server/server2.py | 560 ++++++++++++++++++ .../vyos-oc/oc_config_server/static_ip.py | 149 +++++ .../vyos-oc/oc_config_server/stats_parser.py | 336 +++++++++++ .../oc_config_server/vpn_api_server.py | 461 ++++++++++++++ .../vyos-oc/oc_config_server/vyos-oc-log | 24 + .../vyos-oc/oc_config_server/vyos_dhc.py | 16 + .../oc_config_server/vyos_exception.py | 17 + .../vyos_policy_based_routes.py | 248 ++++++++ .../usr/share/vyos-oc/op_commands.sh | 6 + .../usr/share/vyos-oc/vpn_op_commands.pl | 66 +++ .../share/vyos-oc/vyos_init_script/oc-vyos | 130 ++++ .../vyos-oc/vyos_init_script/restart_vpn | 3 + .../share/vyos-oc/vyos_session/__init__.py | 1 + .../vyos-oc/vyos_session/configsession.py | 146 +++++ .../usr/share/vyos-oc/vyos_session/utils.py | 173 ++++++ .../vyos/oc-vyos/etc/init.d/oc-vyos | 130 ++++ .../vyos/oc-vyos/src/LICENSE README | 2 + .../vyos/oc-vyos/src/__init__.py | 0 .../vyos/oc-vyos/src/auth_pam.pl | 285 +++++++++ .../oc-vyos/src/auth_pam_domain_verify.pl | 273 +++++++++ .../vyos/oc-vyos/src/auth_server.conf | 6 + .../vyos/oc-vyos/src/execformat/__init__.py | 0 .../vyos/oc-vyos/src/execformat/executor.py | 157 +++++ .../vyos/oc-vyos/src/execformat/formator.py | 38 ++ .../vyos/oc-vyos/src/init_script/oc-vyos | 130 ++++ .../vyos/oc-vyos/src/init_script/restart_vpn | 3 + .../vyos/oc-vyos/src/oc-pbr/README | 14 + .../vyos/oc-vyos/src/oc-pbr/controller_route | 0 .../vyos/oc-vyos/src/oc-pbr/dhclient-script | 327 ++++++++++ .../vyos/oc-vyos/src/oc-pbr/interface-post-up | 2 + .../vyos/oc-vyos/src/oc-pbr/interfaces | 59 ++ .../vyos/oc-vyos/src/oc-pbr/management_pbr | 11 + .../vyos/oc-vyos/src/oc-pbr/no-default-route | 12 + .../vyos/oc-vyos/src/oc-pbr/pbr | 2 + .../vyos/oc-vyos/src/oc-pbr/pbr_init | 98 +++ .../vyos/oc-vyos/src/oc-pbr/rc.local | 19 + .../vyos/oc-vyos/src/oc-vyos.conf | 8 + .../oc-vyos/src/oc_config_server/__init__.py | 1 + .../oc_config_server/edit_persistent_rule.py | 88 +++ .../src/oc_config_server/fw_constants.py | 17 + .../src/oc_config_server/fw_handler.py | 66 +++ .../oc-vyos/src/oc_config_server/ha_config.py | 367 ++++++++++++ .../src/oc_config_server/interface_monitor.sh | 11 + .../src/oc_config_server/log_forwarder.py | 55 ++ .../src/oc_config_server/oc_fw_module.py | 357 +++++++++++ .../src/oc_config_server/operations.py | 65 ++ .../oc_config_server/routes_config_handler.py | 211 +++++++ .../oc-vyos/src/oc_config_server/server.py | 57 ++ .../oc-vyos/src/oc_config_server/server2.py | 560 ++++++++++++++++++ .../oc-vyos/src/oc_config_server/static_ip.py | 149 +++++ .../src/oc_config_server/stats_parser.py | 336 +++++++++++ .../src/oc_config_server/vpn_api_server.py | 461 ++++++++++++++ .../oc-vyos/src/oc_config_server/vyos-oc-log | 24 + .../oc-vyos/src/oc_config_server/vyos_dhc.py | 16 + .../src/oc_config_server/vyos_exception.py | 17 + .../vyos_policy_based_routes.py | 248 ++++++++ .../vyos/oc-vyos/src/op_commands.sh | 6 + .../vyos/oc-vyos/src/vpn_op_commands.pl | 66 +++ .../vyos/oc-vyos/src/vyos_init_script/oc-vyos | 130 ++++ .../oc-vyos/src/vyos_init_script/restart_vpn | 3 + .../vyos/oc-vyos/src/vyos_session/__init__.py | 1 + .../oc-vyos/src/vyos_session/configsession.py | 146 +++++ .../vyos/oc-vyos/src/vyos_session/utils.py | 173 ++++++ 111 files changed, 10668 insertions(+) create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/build_oc_vyos_deb.sh create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postrm create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31.deb create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/controller_route create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/__init__.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/__init__.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/LICENSE README create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/__init__.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_server.conf create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/__init__.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/restart_vpn create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/README create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/controller_route create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/dhclient-script create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interface-post-up create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interfaces create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/management_pbr create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/no-default-route create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr_init create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/rc.local create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/__init__.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_constants.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/interface_monitor.sh create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_dhc.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/op_commands.sh create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vpn_op_commands.pl create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/restart_vpn create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/__init__.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/build_oc_vyos_deb.sh b/gbpservice/nfp/service_vendor_agents/vyos/build_oc_vyos_deb.sh new file mode 100644 index 0000000000..0df9dc6bf4 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/build_oc_vyos_deb.sh @@ -0,0 +1,120 @@ +#! /bin/bash + +set -e + +SOURCE_CODE_DIR=$1 +DEB_PACKAGE_DIR=$1/deb-packages +version=$2 +release=$3 +DEBIAN_PATH=$DEB_PACKAGE_DIR/oc-vyos-$version-$release + +print_usage () { + + echo "Usage: " + echo " $0 "; + +} + +validate_nob_dev_dir () { + + if [ "x$SOURCE_CODE_DIR" == "x" ]; then + echo "Error: vyos code dir not specified"; + print_usage; + exit 0; + elif [ ! -d $SOURCE_CODE_DIR ]; then + echo "Error: $SOURCE_CODE_DIR does not exist"; + print_usage; + exit 0; + fi; +} + +validate_package_version_release () { + + if [ "x$version" == "x" ]; then + echo "Error: Package version not specified"; + print_usage; + exit 0; + elif [ "x$release" == "x" ]; then + echo "Error: Package release not specified"; + print_usage; + exit 0; + fi + +} + +create_deb_package_dir () { + + if [ -d $DEB_PACKAGE_DIR ]; then + : + else + mkdir -p $DEB_PACKAGE_DIR + fi + +} + +create_dir_structure () { + + # creating base directory for package + if [ -d $DEBIAN_PATH ] ; then + rm -rf $DEBIAN_PATH/* + else + mkdir -p $DEBIAN_PATH + fi + + mkdir -p $DEBIAN_PATH/config/auth + mkdir -p $DEBIAN_PATH/usr/bin + mkdir -p $DEBIAN_PATH/usr/share + mkdir -p $DEBIAN_PATH/etc/network/ + mkdir -p $DEBIAN_PATH/config/scripts + mkdir -p $DEBIAN_PATH/etc/dhcp3/dhclient-exit-hooks.d/ +} + + +copy_source_code () { + + commit_id=`git log | head -1` + branch_name=`git rev-parse --abbrev-ref HEAD` + echo "Version: $version-$release" > $DEBIAN_PATH/etc/sc-version + #echo "Branch: $branch_name" >> $DEBIAN_PATH/etc/sc-version + #echo $commit_id >> $DEBIAN_PATH/etc/sc-version + + #cp -r $SOURCE_CODE_DIR/packages/debian/oc-vyos/* $DEBIAN_PATH/. + #cp -r $SOURCE_CODE_DIR/* $DEBIAN_PATH/. + cp -r $SOURCE_CODE_DIR/DEBIAN $DEBIAN_PATH/. + cp -r $SOURCE_CODE_DIR/etc $DEBIAN_PATH/. + #cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/. + + cp -r $SOURCE_CODE_DIR/bin/oc-vyos $DEBIAN_PATH/usr/bin/. + cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/usr/share/vyos-oc + + cp -r $SOURCE_CODE_DIR/src/oc-pbr/interfaces $DEBIAN_PATH/etc/network/. + cp -r $SOURCE_CODE_DIR/src/oc-pbr/interface-post-up $DEBIAN_PATH/etc/network/. + cp -r $SOURCE_CODE_DIR/src/oc-pbr/management_pbr $DEBIAN_PATH/etc/dhcp3/dhclient-exit-hooks.d/. + # TODO: Do we need this + #cp -r $SOURCE_CODE_DIR/vendor_certs/Sungard/sungard_certs/server/* $DEBIAN_PATH/config/auth/. + cp -r $SOURCE_CODE_DIR/src/vyos_init_script/restart_vpn $DEBIAN_PATH/config/scripts/. + mv $DEBIAN_PATH/usr/share/vyos-oc/oc-pbr $DEBIAN_PATH/usr/share/ + sed -i "s/oc-vyos ([0-9]*.[0-9]*-*[0-9]*)/oc-vyos ($version-$release)/g" $DEBIAN_PATH/DEBIAN/changelog + sed -i "/^Source:/c Source: oc-vyos-$version-$release" $DEBIAN_PATH/DEBIAN/control + sed -i "s/^Version:.*/Version: $version-$release/g" $DEBIAN_PATH/DEBIAN/control +} + +build_deb_package () { + + CURDIR=${PWD} + cd $DEB_PACKAGE_DIR + dpkg-deb --build oc-vyos-$version-$release + cd $CURDIR + + echo "OC Vyos package will be available in : $DEB_PACKAGE_DIR/oc-vyos-$version-$release.deb " +} + + + +validate_nob_dev_dir +validate_package_version_release +create_deb_package_dir +create_dir_structure +copy_source_code +build_deb_package + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog new file mode 100644 index 0000000000..2f1cf59cbc --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog @@ -0,0 +1,5 @@ +oc-vyos (2.5) UNRELEASED; urgency=low + + * Initial release. (Closes: #XXXXXX) + + -- root Wed, 13 May 2015 10:13:46 +0530 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control new file mode 100644 index 0000000000..f67107c412 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control @@ -0,0 +1,8 @@ +Package: oc-vyos +Source: oc-vyos +Version: 2.5 +Architecture: all +Maintainer: Mahesh Kurund +Section: devel +Priority: optional +Description: oc vyos package diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst new file mode 100755 index 0000000000..746e9467e1 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst @@ -0,0 +1,13 @@ +#!/bin/bash + +#sed -i '/pbr_init/d' /etc/rc.local +#sed -i '/exit 0/i sudo bash /usr/share/oc-pbr/pbr_init &' /etc/rc.local +sudo chown -R root:vyattacfg /config/auth/ +sudo chown -R root:vyattacfg /config/scripts/ +sudo update-rc.d oc-vyos defaults +sudo mkdir -p /var/log/oc +touch /var/log/oc/oc-vyos.log +echo "" > /var/log/oc/vyos_monitor +sudo chown vyos:users -R /var/log/oc /usr/share/vyos-oc /usr/share/oc-pbr +cp /usr/share/oc-pbr/dhclient-script /sbin/dhclient-script +sudo cp /usr/share/vyos-oc/oc_config_server/vyos-oc-log /etc/logrotate.d/vyos-oc-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postrm new file mode 100755 index 0000000000..4b88c70985 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postrm @@ -0,0 +1,3 @@ +#!/bin/bash +echo "" +#sed -i '/pbr_init/d' /etc/rc.local diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31.deb b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31.deb new file mode 100644 index 0000000000000000000000000000000000000000..e3023502d0e86ce4a9e9c68562b342ae775153c2 GIT binary patch literal 32616 zcmafYL$EMB5ahFMeb2US+qP}nwr$(CZQHhu{a3Ze?W8ivA*obN_hF_9xD6bQ%z2@V zO$;pzY-tQFYz-Ve@bU2(m|58v7+6@@8SwGx|2zNRm4Tj~m6;hI|G)Wvpby1JOAlpa zXY1@}XHDyD;7Duc`TxJq%Km>}(1*f{f&loR00O>A)3RHlM;Uv{mUCDqZUwAxvMB~Y zM&1GrEU-XMYnycH9?nD;>vewKIwGbCZj9(@20qS9&iZNdF}%t)l8bM15R}R_+hLk) zvj5gT5OK&YzF>}78iy_-&m6@y-bJIAG=khWFlm;5>FMNK`74r^r%E=BS&VD_RY)JP zy23m2I2Jfx^*g%e6-cWVNK;?w?W;0}1PtO?)}6$(N*6uB#jk`+G#&&U@GdUcOAke0 zkS|4@-3d98%PbLc;&~8m-t~kP5od|O`h^l3>PvkG z&b6bw$>XoiK}iAo0B`Q^$a&^3i9RCd&n{?X*SzoP8u7x37Y~9Axr^GL0woPLH58SouuIDqbBd~c%~@#?`iMRFSGr-@8!RZ`%}JA{u55v z(1ATW4&46>?_D2oQ$5PC0OSAw#sq#K6Y08{!IgpGA_!v?bCPn~x-gVmgn4%#5D zeDnl+i4_MowQ?0j&1tG&2HpbilVozud`Kj!-AjAA_i5Csvti}2)W`Y_kUj5X*Z$Ix z7gqxJIZ?9~v#dvXIH$R8Q}Ko;XYwrza7Rzr1<`6 z&mhLPEl``H{9PB@G01c8`GLN*ZNGvw@hH^snbJC>G){O87@G3*E#TOku--WNa9g-T zkOO{xULw!;yJSG|ega24b)C14`TGMqUlJ@^R7Ab%pJO8dD|j--4Z3xyVjS!dpxX>L z2eo~k*$w7G5<}%`0Z?r;Bbq@N(Rbm&7zeB?0SN3qwAZ2FfG(N;GnCkRHUV zK(a4IAQWRT%eIhc?BOg&jk7Mk|4?MdESSV78|Uf%Unb{n1Nr@p7dRaYlRQQRjnHDy$!PPZy_7RW6N1UrSvJ0&MqZ~Q zN(l|8;$7=bDc$a~UWJoZDS$G@%uX4r)$rdGXXp>y5d(tO2t3l8!OY%F6@?R$CKCj zj4kl)F6Q?9{8*mVA-SE~5TiyYg$PHT=y( zB&_jp9+1PbkrVPxz#c8EV;dskzp@0L?*Ah~&!8p~5GP4}VA6^>C@NAza~^fx0dG)h z;@{-gYRq=^8~cjPVSR&5!1ON$)zWd!`VQjFwrOx>3|icMoKCyD?Kk}!yhEzYbwmrg z!nbeww2g);^C0dvzy2yw7J$B*9xyC=-EZpCE z1by(V0+TR4FLrl<1|CMmr&%9gM?fOPLBSa21wbe7NJ z=hBx>qZdn3jX5V!@%EO$cO&$FEVsunAR--0#(Ld|8W*>{wc_iBU=dx7M0YjF#u58? zlx#0vkOs0^J|c=IT=7|h28(xC1~?$FIdZD^FWTWVv1XxDrH>D(a|Y{JL=+BArsmD7 z!FfVERA7&ON@ET4T8RorcaB@8kov|Iw`(@9ZsforNv+x#SH2_aX;pHN+0a96L<_?~ z)pBn8mm#xEc~^Bd#&DRs-+jeAXbKMO1)t) zG1_nHRId=~sz!KAAC(4dycpdBT4ldyjc zTcmkRMX!Wj+ZDCfthoM1VV&RulIG!KsCOP)HMSB`KvTKhle{)Qeb%sENy9~dOM5OamEtyZZYF{LSUWJ@D*~5 zjCI~dv#MWb^l46BzY>O`zVFG6FGocMKsD$!+x*SRH?nBmy+uI(5-Ol8UH_~h2#5Q`lT@gt=^e$Rm(I#O|7AO!=x@ixYq+==r6R}6cU+xrSXLaP7?EY9D7h`ko8eASe z`BT~b%YukksqQgR=mX-hCoS9(6y3hY*%jsPB1k>{TY!A0U4(rinI}pbt_Ugg{R5>* zs)qEYp;_k8hBLYnC~Uom-Rt~N&^Tv)xfag#>t<8O^suc-XFRpV%-$&vWoN)Oyy;-KXJ@<@+Bg z63ymUjp5Fs$%S{^Pn?mt#N#_Ez{{oe~#+HOG*N8WQ8a=2|YG2RJe9*am)9zTNo1!4Y9vE!L5li=Z6 ztKZ4)UGm*9zr2Ie!J9EX3kwx|2lVT-v#c^206j6CoU{kdBeubx!wbbi_2xL0ak0KK zy+ZHoA$QUBSwJ+WSkwRL@)r9wyc{aLH!wiIN#%m7=Lp9yndzQxcpzU$34dO_dzElh z+zte~-$;FLhZe`?W+_Rbzl=HY;He%TEY*XySAN%N(2*bpo^m<7?4Jpwi4w4Ar|Q`} zgc39v$hvJkNh9eltW`1n1nO`N0xa&5^xC>z--natwmt+h#n1fJ=&2b)j0MxNBpQk$ z_4TFN;`DM!Yoo)pgZm~wk=&`8o#Bf*265Z%(s`^62*Ks z-DL}*YjDnF-_;E&+RhxQsi?~}A_Q5Y!U(95)`GoLN|fg?3n5>!?sj+6Oqyqj?q}{k zF)R{NI+*H)v@&IPM_)DN;9H>_pN{tskJ7If?_)V1+0I_SzNccAJcAZ3(MvQ!uEjHF znFziWbB_^;z^wmBJoVSC`Gy$5p(<2v?5#xeu4meV4^)$B;Ytv^V_s?X3FWpJTJS zDE}p19x+uUP!b+~w5v+6>^9B11SXn*-xp8zw97Ed{a)=F5NyRZ8<8Q{!*mZ$U ze>z@jL)nzaM8reLV7r8>`7QY*uMmBk8{kcmDMnIjSQ=HvM3;Xx=)l3!2*Op|&s~2< znLtR;W#y5aGfIJ%{B{$(E$vwRUaf$XPJvJdzA)F0BLF%^s+{k|BWb2l2^N2(Pmv0% zl6i6-#GaxN)0>TLbbBfR_P!;wceBZFRZg^cMQ_H{`P{UExIdazs~kz)cu z#^E&VS_QI8HI$@*mOHC906{pN$pEOIHNfHyt-C{xXGXkwzdCzhRf^5TVb}3q%2Id(pf}tR*aWJOZx?KURz%-Hz;sz$Jk?3^tQaJ5yNRsDX3;(@3*kgNn; z)F)B#>DsO<(tWl0Y8~v@f?Nn|k41yQftwOIM6uD~FSn-#-87fiR>pNm2E*3zvScuN zk_!_I=C1(fx#@I?NsMH0Jh; z&Z%^jwEDEj-Bo}GFJYRO;dhR^?FvtzhQqLeKruYwKTll-xf^`^Xil>a7q z)Hzc-P|f&30DHlrw5}}&w8lb5jLS)#6(T=)0-+0$a(;0`flgWSjE#Y?D5H5Xs@BOC zcHO>_uOSRScq?zo|+7Tzo_O6{V~SnU}R_aFHn&G+Cs}l!1=>g6SK6ZGzsHES`9;cr$0e zOyE$Pi9zwTlRZVl*M?b(6#8F9(!`JD=|i33S=9hvy7^N5s*u-&DnXwUoZ=Zl&w{m}cI2?U8q5=ngsj!=l`R{;#h7#lJ+2RNb3RNT| zSkya{k|tA`mB)I5wbD~70SlXad_!|TB)(8?+7e%+H@)(w@&2IhmbMEBn^=X@3Fn0` z13jSHzaH>P+Hzdx8}?Pw+k}+$FM8CYcpv+ua+w*;9E*0-sLop)4J`Aixv;|#wxwBq z9UK+9M>^bgEE8kdS*LduDgti&jsz$ZIR-rfOdh`@iz4~U&uWORKu@&f;)YUn%s>k(?&YJTK{*_f669-fsmc zi;EN|N9OV-hk>(NdWOVdaEs!7{lO5(HO#N3G1>ARcC$KdO1$BK{Bgi@yYLaN<~svv zjRQxfEOir*(>(&ysYS`^z$yXy{q~Y95#gN2d@6ZXRrrvIvsjPG)b^C^k>>n{lGh0@ zR`9}8VN@3++NkoYx9B6Ht~@xn*#Dr{(eULkcQ@;YgH~nMd>-X;qkCT6+0v4C38@(| zzI#QroY2h4kzI9%4B8dOi)*ve?>B|#(y7(tofUVTjo+^WONCa z%l|qJ$?AWf`m~*|GM|JGKz2?Eyxy>GleT?;2hZ1L%cd$GvkcvW@YqXNK7e~nS69mh zuhwAQJoHUWbhfbH^;5T^9|LgcR8e_cu{!a^=7r(+`|~)EL4p+oH2Y0n8N)D(;Ud`A%JXMa)c&+=ET3yha6{riZ++TST`{dsv!fu2EDkg#@i%$wZ{MfF(>|fpJ z6~JOmDeBKmZBvW*Eg4V4K*);{d4Yp6Ho9cb;Qh3Ng#K#|X+JpBE~2D{*ImXxxXZ`c zCaC{D(oqmd2=-g2S70mcx)(w6n-MunZ_U&}$0IwWy6I(PRgMC1x7dx*&$?ir^)*|1 zAY`W0*+BJ^vp?FIFyYdIobzMp0(+vi1)Jk;y;-rLE0an9>sCiK`Zc>ZsQd{Cg8(5UwXgR|wCf zr%XVcV7B(h%{nZ13d%O5XHTYeRS62MqT^o|5L{`5i0IJ((=P1F9JjNskBGr!eMN$vv~ z^(A=|ny845z|sS#n!24CR-X<@Tl>_a?AR#WX%+gNb8RhiXW-PA+eCc9yb(zu_66j4 zv-5>94o)4ZJvU{ja;pVwp@xUG>Ojv(odO_z?1XXEC^er#`J(!UH5I2VQu$H^!pxNB zJa0|}AOA|TibUh))k?~}nZe7Bt3Ar8<#Ltj_{Mk!QOQbIkFKS8DU*79Ls_dsY+uD- z7a{LYjN7R@MY`|V9=)$a`$vS3SPp-L~14^~C6C2GfZsve4MK zty{0PA^@W?mi}*yf2vN!=HrIpa{v(HWyLX&viB7(CR=$&Gq=rn`F(-Fbohk)SxKam z`Oae7GxUK*C`hBikkT1fh9aIJ_t=Cx{ae3|#xE%+e`EbXT4T7*W-)pZEfIk{h=wxT z8mTcuB8p!dv1~?w{rjK;>*J|YO$maoj5 zD)W070c_~+_&q^Cd_7L(kTlL8pwJn1{94&qy9k+5@<6jG%@HAIl`1e{2|R(69Z;8G z{^XtFwvF7gtXu7EfuK;r9SPMZH~s0jkK{89h5UQZVj^A|s!GxsK?;&iZj=71=&-8_ zJ5)}_rmCj-$qq1H5F)Kh|G)|U^P{?N;4UT=JDlG~g82B!w>l|Nx&{MeS0v0nvzKtU zQ9D5_ZYnD%V|}heCnHSLm5@#aWY=dDo@QGVazrGg!$wGdX}1m)U`%6=z$ICrqT@gJ zfDAb>1<2ArC2QncYWtlFyYPzlo0UiR<<>b^J!w{2_xG{A1$pt`Hz|ru)eq_q=!eMX1kZy)80J_6eX$ zUJupzxY6&5xp0#tU3Gv9fRa#suR$^t3p_W$94%nhHQ>EfFcRh@n-Qoijz@7qrJF9Z z;nLoZk-c-Tv|?VOPzs5@*oe3(ClC?T?PQff_r$(<30D%FfWW3;h`QS2QGP?dv+Snh-@N!qT z5eoi>&YR~s`H2lamoXjhilS-Z7Zftjh}aCWznW#CbeBrU2@&5OPYJ9>7f5} zKzuX8`>$NIeiP(ACzNkm$9hY>0u=5;lF|_y!&IN0;w1$qC7tAb<}?;vQNCa#3%0NHjb6d(elk-ce+?8`6dX~75e9l z544DZ6mw^pq;6%p`RlK1pBvkj*w=#oWpQ^%Ac^GC6W1Jr(#ubs|xjJC7wsBQQ9M< zT_M}S$$B#T^_jV##dsH?t}qV@|MPX>dC!PjcY=6H4E7B+BU>JQ)~Yo^jHK(rQ0hW= zbOD9AOTeOxjmn5xZcWRl)GO46@@-CI-25a07qNz8qm*$&Nv;5Kn;;HI@^Ut+2d!`_ z*2;7ieD(!KX*RoFY)?;6YO-bn0ACjIYR#~R1u=koD;APBq>QJCXIjS+X~-f7;JJ6w z@ynFm{3t#?KTrEUj9#8S31@J;)YpqN&=Z$wt3Gd@d$#JvrLHR_|KOV?EVGNF4WteI z2ufAhT~5PiLYZ+S4K^{+rd~S(n3mq0o70qJVsK((+=jtkFaUNlYq-$;7;3Jd`^__%(x1r&lH*hJ>5M1TG0`sk; z$2q>9>n`Z%(^_%Lnt&0dSJY{x?@nqr*2Aa$M}inmFq~?@6yXiMRtXX_PhhEzUtWH7 z0(2-gJy*!g3`UV6eFueiV}vyqH<%$ByNT=0!HR);_D4c#@UM=+ zrS*p1&XTXQS%I$99i3;~Un;SZDxac7yj<`c0x$1b@0a@i!as-abM%K2zbgQD1Mkt3 z)n)ulod#^TTo{FTP&!}taS_BUgYjAD8e0%8H%t_HzPxs1a2@$4qc+@^&z0@@toTkc zr2d$e7SW_~P*D|((z#DjsXkExv&-U8QS-&AdOECV>s@nL$Rjc8hU%84CtbA9-njv> zB<4mAhqa)Af3%P4D(0pRgaYw(cz!-ly-#}~`pg@VDne!FeXwCl8B#fCxmEOrwyoXDinv+0Ldkfp`Fnn2_Gx_a?}DzvvMvI z>EP2o>=_SXu7@N9`|~nlcmN3=`f+KfOWet*7oeL}M7_&BCEPP(7V7+jM99vE{yce} zH%VnL`16W$+r@^%{i^jhT~(}A%3aXX=|LW;-S8b;HUOXEj?r-&pK+fe3_8EjcaznR zZuvrBO^}C6D^eDc@T>Dobcg`T6{y;luS`GnB9GwI-jey<34iyHEdCmQ*TV(=8GUHg z*t8vB$O8PyEOrS;z`B0Y&i{xzJm!#tm^^k77lbXDf=szXd!r=fLl;P#YyHgSuLD|0 zF;98ViK;^|1V5U>o8J0a;cfz_N>VmU)4Cn=Dq1$PJV|Qz8A8~mzl>`)SRsg&t@NfR`4M=}csM~@I z3EflA+36?&N*h=?RmVp;ggCItz8%yF31o(OnK=AP|7WuEl1~W)#^IqJJogMYQLJX>h8cBd zD7R9{HZme)*)8QlWL?fzSLCb-$2UX74Wx6ELpz!ynU|78&3R46{%$&>&Bg~w2>Q&o z-o<%VD5gSL6X^5QW2bu^!ZW@y^y5(%nE?FHXXe9m^52>zkyiFpBbUR(P0M}Xgk6cw z+$id`DOgj9Qenpx6fue=TH+@7z|Kl#zt>~OnZ9CJzwmLEUERjkPW%byh($wp?Fl#p z3PhjBzEB2fS=s&s)uYvW$*#1vYcToYmNcWEK>h)m?M$6nuhTOlhlrehyV25pEkTJw z`vZ9rpvNLGD*sW8nm2>$zp0-g4pR>|Cy62Kn*&!H)#?YVg10vv5)i&abx3$KpCR>(u8afl8n0|se4fFPRu!%`zKfbr7(9U>g-vUI0 zCyS;cNekqr{_W_(#Fl&TRC-G?6erL%C!-u$i+)O|aHLl%TNBx7&8W`ZDdZ%4?|EJi8o*|3TmI^c zyQML|xB1?aVxBI`!6S0Srw>b^Bi}p=e=`593ro!yzrnqhcyI6dM@ODruv&*d6yr-e zPEco<-y*Y25w5o6rp4AgYpz6J&~x6YvOG+A^Cj6S;iV3q>U;oHZ-8K~8R7(yUDxPI zBEY(L?vp{L4*lrr9nm1+--ho1;sDxq#>-mnsc#4leJqZ_Ey>-3%&*emb zPa8F2sqW{qE18vbW<`;n7$Z?Cx0AOni7NQlemPii+>e>P$NKvPPyE>2nc3HmEFOxtMg|VAOR)0nF4epTuuH1Vs#*bdb>g*v9pad7rmy%&1PX%JE!&?PpAckEqvc2X8h zs@ZJ1i56^m$@C3(f~6GKB4)h^iN&oqFDUZpyDHTyx`C`7I~csa$6wnQwRSVgK*rN; z8Z%x6d0iLae}pJ1pXOyxt7pHvF=j|`_}m#ny^2^>v>bwuROY=_A{h7enY$}(5emw^ z`;sAc0iJlm>Klrz6^HWPx4-FSvYD-&-5!ayjk!Qa7S1U=^mAvMANMI|uL71?cAYDE z_3;3s-P*IV>-$C{=sQD#)*2gAksv)20OU=PeNrDwiUln>*%orO3uverMkGx}k9(3N2HzM`b@c_AGQdbrmB)QP616cluj#k{ zy>n(d(a3U~CZxPM4Bk~7Id0g7IsAFcZBQXSm(3Vu2}o%@K_-9F_#=ytkR1UX_508D zx`DlMm@+VNn{z;XEp(GmdOj|nXzB=Hl2gO_Be`sqJ@7^`JHuZ*w}w?(1XsE&*l-vR zIiR0+WMu!rQh!GE)YjqPnO2|2#1$7G0*L*>4qAlbR05b6G@e#RYco^yd~H!wMNw3W zBinCy2HA>B25*M1ni z8hGHpo76T?FmcvzWvWo4=s+C`$28XJuRH=5dK^3}02vYoNB_>PaJoM77;8M!+$OQK z=7kC!M?p|=hIN^nAzjFnbWxFakgF59scEVv(i4ZBzi_!iOlW?LLI%GL__@ON(_-Za zNMGsujTDSr4n2C>?fT_56g)z(iFu#VAs{1X0Xk>>4GypmBy38ognf0rtvTi|9-+)} z_7{_QT!1(nTyxG+O+e8)E@GDxDYIFH>sK+ljhV;u*+fK|+LV+H-!99U$j?gLX89+h zaxOO{vMv@W2Y6^i*b2%}EDBJ(Z<8p*Ue{NND0`&MNIUTI;XM zrnzc-YtT6q1nJI_nXcMbgLKRb3+I_WhSmZU<`ia@W2Ov=l86oU@+m$Dqf zn*8!3QPolt!CSUi5_q=SvZI*tyeExnu5+j;wklNGB9y8QJJLXAlxluiXU1r0?wp%@ zAz+;5g4`bwlRkbBvOab|9AEu&G1~68e7}WnId?h2^-f%FL$EatSUJ2OHbA}~TW2Hp(d|Trg{s%=S<>zy@{Jyy(sqebg8p7j**3`3l zx7wY8?*%dMKwsRZ%uMn6-x)U(1`S&?#G85@FeEsS)e5Mq!Dg+aRyxa!2B<~ebABEm z=h!UV%rit~baj0df+{tyK%<#&Q>Rg`KS)KC9lqf=;F z-8^l*k6`tv(2?=m4-*obMTs|yiL6CPQPj3VlolEbNq4Q&EZ#(hbRe}M9ZUj5>gLI( z@3$k}Xl4k|OeN#R6fH0;M;1Q4g00-=Etbzu-o}dVF|is>VpN4x=A?5}f9=$0!=$CDO=7ve7ZI(giHda@pm( zrH>gWL$lY98X{hRNDGy`_-$lCJvZRvX`OK$P~=DLI^CIk{TslR`qu%iiz0HEL-EwU zkaIpmTpS(R0-6o-IwkG%b0^*uJ3@*jiO~un>7_s7$Io?GZcjY5)TEqi5)gd$rRIiBis#w_Y3lC z(OD1B=IhDdmX&5JI?x9;yvo&CEsAVLk20ptE5tivP!{Q!fdd%PT1$`{Z|FZEGX&FN zPkCp;pe#z|0P40U5dib!x&39#r#~Jz#3#2Oh(ip~4X{~nkX3}ab*`H9SinWz_QR}} zLxQfg#8M`M@(Y`0u_zX2h*{@gRY35C%L_kKz)}uoSl0IBx=FouY+=Y>lWZ~yQzL=L z-cOXV_MGN-Kd_)^SPQ*Dzg^hvnucL80_gbT^htDKio0*Xo!;Jr4*h`-{y3Sh|FqptQHf! zBObFK$8dT=0+O((M}eX@b><4{j`hZh*g3{eNR60#I3j}C(ZZxX6P=AA zu$6*@>jP&-wf#OAaz7_u$=W=96X*on!7aA46%PELm09%;6w#kYYw(atw<@es$i)wt z19dn`d3v$B-5G#WzW$f%;ly@%_%qtbL*gp68Ss=C7B19?MOb5m+5La@CxCVybH~-C z*7wB}T!tj7}hQ)9fBcIA<#0{#ZC2&_)Ga#o_np@(d= zi;$sgfPgczugv_hq>uG@T}xEHp;c)gkwq;ds_B8&k`BWIpSUBeKQOO%2#4Z4^khMK zWi!e~)ZIXiq|cS>9T(4fF20Is|FjWEp7qWgr`wkkB(u9w&8Ukl6u7@TwDuJr zRR%`;T(1Cq#P=-yfqq0LAY@=h>irOzh_M(0o56PGC;S@Cc4ezhcu}@Ia|Ca7xR#P z8}>7_r4L{(p=ut^xjwJR`x3FsWNyE?gNz*6HJrGDJtSRn(*Kn zhS_Y2U%-J9_7sfq1E*~t-<|&yRt-RiBMc5ce&d1%Rx|>%AwjOl#tlP(Q|_2<82wAR z%#D8=E-{q5*yMvF!ObFEkoKSCD}%5^#7W&fI6g355>n?yUywOe@6@#At->-X12wS` zL8>rpC?4XW{0S~8&!Yuj=qPOjOlZsBEXIb@ zKCInkh-X8N`Q=!K^QG8ns(;(?2OP6{9Gn(E*Hp8xG&NL>d#9DbP}(BM4pjv$=BQGe zCyReD)<+V#qyR)K9`587!xEs99$CY{OQje^rR+wt+-wFt zsbjXdAu)8fmg~`9L@Z>6=DS^Lz?^2OzfMx%HtLq-3z9}zvQyRtN(uyv7L6dmB?fv= zd=}qDu;42j{z+RVRrP-D$y#{YisBtj@tlmi@fsSXI)GJrK7$L6!}KupsENh1OH}4!#*nA2x_M&%m~(3Q@jROIu)}2H!(n zma;Cs_0mcU5!XKZcCIae&o6k;UQ)#qYohmWzpP_J^pD`3i*I%G)Md;5Wf`+X`GESu zfd_%(LMyWgy^+nJQ)o5(+oS_m5dbt}g3yq$q;Pyj-m2iZEB=_XmnLc$$3HBdQ*3Zz zE@qVDh)k7jDjwc1->zzqQ6n#Rr5sX9Nsp;vd<_yrcGI<(cnldByW(Plz?_@5SEDYb z6-@l9)AZra%tIA9khIS+98$1`Zw2GAHOzf|RfFNuL9QWT=rzM*pQdiVXY$Gq7FY2W zZOO4`%LSVhOBG$U@b58g=t;B|CQW-$XsBOX;;f-LdVqeJy{WpRw1pQqwnxw~b^7Tw z|GU*rc|Nvmssz&6sFzs@#N!PAo?U3I3=_Z4)3K6I1XO8a`f({NwAz*Aj!%?79}KaB zhkn03Tl8uqBfdIM;W%NQDx_ZOakYOjBolW4-(7ZahmVB_t;v{~_WNA@DSbE6fm?dK z6ktTJ#+8CcLERkWqiRPDAS|K;2hek?AHp%XmqpMI>KsXR=+BlS`BIU3p0`Rv&=r z!+`;Q2km1YP}zI4Q49lZJT0dROKN{~`Bxw&r=JIscGfxyk482W)W?Wx_-Dd7-Wpah z3pC!qkY;@9xn&B|JF9950%WD-!uF>2xO-sb-%S%vAD{4-(af>`o2bFlGRlWyZp1da zq0!V`we;!=&oyEF1!I$RcA{h(VXi9@+Kj9kSzzxYHd;B=X^$lNrfgXW-N(u}#SdnX0`LTv)%7 z!jb(FtX$#xI>7+p*8bP|j0w+b4Oy+zz%&Dxp=RS?w43u~rlSHTG@L^-VZNTz2BTx8 z&%Lg9Ql2A-SN!I-OzzE| zv#1aFxeFBEEEW9gR({hOx~rYN!XaXHhJQuvdFpebZ3t#lwactFnu}qM3GOXAkz-7cY?{)s+EJR3Mz`n3wTlPoPKUz>2|S{31rlcwI5O#BR4e`v zv?{6jFL$-{XDYm4)qiI5xHSL$F~G~eRbJCK4~c4eRQvWd9$KT65M5rxR0rqN?LJyW zK}6%_lwYMGgXDVbALiX4eIoNRRk(5n(@nF9_;zzZcot0{W&*-Bo&H0s4qsVRmJcK% zhGK9NSMo{TmzeTFU++*FLKj>Fb8B*QE4bH43#qEK-ycz#Lpc)D)CIN|i`4dxfY1d7 zMP|DPw5_{u@43JBXU~I}DjH4VoMir6<`f(V7-^m&aU{+;LAcpTg(}a9YF*k|4jRTZbS9F*ZIoVN!XYtC zV54#ykwVRE=Zz6baK9NFB}z(lB;sRo^IQ5}Ah~a?TZ3zB9GnoB-~~Lt*_dHnk|1@t zpmF3LDJ4T}A_9vy13bd&&-e+L121s!7peesH71Sl#8QggVA|g#9JWWx0hu$xnj{oN z^{p0PlJCpCzKHgGlr&Y|=Wme}ZV2?kGPJf)W{pnYK*vi^wIK>R!sClz<<;=dfoshj1J;k~XK=oYqN0Q$&!)hJk% znpsErguCa-5228A)vio5ns~8V&JlTT_Pz5%-N=+Fs^&b z`|LfIz=}6NiP&$HLz(0v6tjCsvoHW!d{yI#m#xkyI{Fd)&CiC|3eK|&i!^LQ z3G2EXDe(O~6UEypdXhBg)oiWA3K6o`lVvY#D`ZLXJdQhPX%a3mKayN#E1=Hce%Ag- z1J&+42nota;Zu~$PtBvVOMVM=^Rc`t}VH}T789g>y=-BS) zOB9{S`p5hElH{85aUOP@+H3hnJT6P!&(UH!yVXreABSRdyQwp5J7oz)*^vLWYrRrx zbyF!^;v?Srgxl$ek|S)4T?_Oyq|6QI=gWWL#ZvDik`Mu-K z`oUE}U9m)MRqyfvLn_%rSD$bMTDMGlC-^W!J8slBYb2iG&x{+NzAux_%&z$%RR=jd zwLkKKE*>T5?wz1Dm~X(1`tbZJSO%xuA-+<#NI=F%LFr=D1Qz{NM^rP)lN@X2{T&%F z!b!u}{+1YT>HmzqMD<%TLxa44XfFH{iml7LpdJPW>i?=?fR*#jwAV(M)u{$Tz461o z2^&%oA)S39K7W@QIL(rs{SEK#yb07o9NO6m%Skw;uS=ibO~yHy9P3QpH8f%#?LU2? zuDtL`-UAhzGJ-0yjnoZEPV3D1TlRB@>JgihJ>1e)9tOIH?ViO%n6;7=Utl#DuF4B@ zqgIvuxpqD|^tYtb4LP-?m011B!}Hk zdo)cX@1>Q2Z6aAnJI{NQ?H8Hb zHEmjPfDv#&v+_|GA_5QK7yA=esD=vyf|JQU=%*6r5fmkh;*;Imqe$ko01>QZnR6+pJ0CNazY(ow3*Um0p3?gT*!QW!8g zpf=XFhaT6(Y9$H3Mfw)Y8A8(qA=Xd^ihf%MW7HN&j^#Z*+Vo+Iu?;#ezg6tTZWZt* zD3gP0l0ws_Xet$v2YVc>@-!ok-B*|%Eq1(|>EJ1=i=fcE9uRCrB_YtsLKUnN-a?cl zX#CS(Og2;4g`nQXB|7w(ge0LB;A1uXK=<1H=aa+T%m@HsMhty;uou$igr_6lJ;PCL zZ6v;+!FEY1koEV^U7U?TOX?QTFLso68<8ZR%%~__$JaqVXvoD3JUfgB!I%HFw!NhF zL(OQR1@~8)elPH`>LD3)+Q5|4x!>h6_{>}uDz27Pn9VG31_k?JFaMqWcc}|VOY*|Dt3H2a*0oZ%LsZB`TtKDH?xvaOUb<5;&szXqS2*iC|_qk$L2RX#l!GI?u zJX5X;ROQmDKCH)?&KnKV@;+ZSWj&hk(2OfsM37L?X7n^O@cm>I$lL&d_BL^sQHc8p`^7rDr%55*hp)#xJ_NdW zxFO{SZsX3Ual7#NO=k)#dy58coL<7^>x^3aQ@^Gy?wkHbLbUlfM7jg1W?!G+yAqti z_4tSH41abIr3XvbXz1FHC$ zHP1n?822S-E{i6lEq#m`#ocYORh|pvhes*CPzfLI#5|y67z+MdwU(snR6lP{Eet%g)`oKHV}1%c#Ua`^Rot5M@LEO zraLbzO7gwOcLo(#z06ATZ)Hea{UIUBm=)CWo%@(Sl`#(R;?`*i0*xUlYG<}U_oIrc zjhLPAIKc?cS?BRpxg(!|G!j@jC%NnWBkzB0{Xiu4-%VuSr)-+@CBqfU z@Ylt-D|c>kfBvrVr$BJFnHW_uVdCrC+$&w^!Qc`k<^4|&tLhrz5%YVt4UIATU_Sn3 zbrR?is;v2n4n51nOVR4kk)<7EMfQ+OgE5IUV2|rwq0-(|wo~tdBVQ+DXBc~wpJDT! z*G`H4cstZWDQRcEKb<-inT$Z!3HQ0xe$vl~VsSEXuw(xt<~|w0SU`@1l{AL+#G2C) zxaoY81~89Ng;ag=R=Cus;}DOUQalI`P^B|DMkSdF(@MBCq1H!HP6S6Zp7zIVO86c{ zfcVO+VsL>I-msNJt&Ja;OAd}5=Zx6qBxkG(L8zOsZlk}8$Cy93z_aaY`Ku{(>p=ev zk51OBXJU1X!EBnkH=L+<6(tVMnovTSD+x&W_QQINCUUgbk4mL9aVAL!P z(+?CHIu@kP&DuvAh*;>UTP~(phU&vl+pfI0)Fb~xg-blHB*H>!&@!WCet=ZK*7p~g z1O{ItIm4KIkg2>SGZC}F_)O(HgP~y6+?L8_OW&e z-^qoS0e`6t>)+$x6ULTc!=vOygL-R_Fwy%oh%so-U@kM$$(#{3KHmDEb@Fz-4NKWy zL8Y(#3Q6h`Qk>8cpdPdOfPV3Tv0vnh0nF#AL=Z(e1=WlD|H{~nZI>4mgtY!~&O*O2 zbeNu=0w|s9i=%r6RozWnbee$VWqt_NsAcuF@}1ff7*#JsA!*O4`dGI;-{4{n;|QD? zy(0B|5-ls@b-ahKy9R_f$+mw=7SCsE4g?vly%TlM1#7ch0vrDP#c0ipYoc6yjes_A zw)GM>x~^R}tk=l?#EVO0+qczw%3#T;e%a|0Q*QylrUPr7RY71j(+Lw!Bm&=0p$WZ) z#J!E(!CC#Jm+$VW$PDWYB(|4`#5#?zC66e`uMsbhsW)vN`et=qN&;FD;&OrM=i#td zXlw1%1IM|sNwPs_UHk&^4LS@fW1KIPhk<_~78eb5m-HoID`(ub-K*WI_7kH~1F(EJ zwa%0Gx%4{XX@^~Alj%-_28)=NPOL;y9Xa&klYT%Jq0l_UvCjNll6$|0cz27yX)#vR z{Ndgax}OF(W?JJTqt0kTS}TfB%Ak3O76xu}leYwYy#}?8YH__Ayw5oMVw@5lp}^W1 z8nI8nSt)fR3Ujn|5*EW2r#QMe#hmQP)UH&TrE7Jkp7>n$(y)~6b?HyPj8|%DEwC2Y zwf*aHiB?b>AZ3y5VS!`L8oFQ8Kz<@`=D>sa|efC^#lM(v~B_yq;19C>+n z-er`{cA*YLO39G6Genjx? zuea-W`z-uGkc@ZP^Ekg_+!faDWJYeJ)Z2KA<{AVI!kSHPL29+_jPp}^Z*kVbP5>Gy zN2$EAGBOW4N|JX4_M8z1+eHhL=35OA$k+x%Z04~PE-Z)5s(?fwiv$Yy1a@@ zk?T|~9xgkqu^|ls&_4W}aV;?aA;`S+Wyxe;y1YN`0A@VsH7;KX%<{?= zqH9%pN2MW0Q^)MfLHwy-sRY^*AMxPY`K(jnJno9eVN76iR~9#lw{cB~3y1G`E74;) zLYU_Y_!amfX|~k6QhIif>2)FXhSg;RY14%ESfLXX@u2gbk#+m3! zIX=Jo#$u)Ug)JVG9yhf-Zt zi-NR1=LjxCrldzpuw;xj*Vktk6tD({n#wArY=0fUUX^E!g8X~wZ-z2K;TSt|Lu7|A zgbC~n_}OdEMVI(_K#|n;I31TCCZTP+SYSdNO4vaqE=tQ1P>BnU(U`iU9dxDOqXCAZ z;#vaUgJ#lt(Qkx2@H~;?1Q7#5Pu4Z$WDms$Q*s3OAFj#kt>gix zy>~_U`wfp8+dl7en9ZMkxdskSOsh1AbP|4&W^HRxgNJ~;+Fv6QJMs+eS#xz$T!|}4 z;Mli{G`~c-iFlRNOUTlNPKh<=yz<}!vbq}`R_vrkIbZG5Ktiw z?GT)OF6v1QbfcglX@>Y7MVwgGjCJOTLk~@`c3}6uQG&U=>Hb;OgyeKI-EYVUDlQzB z%FWoQk`NiVQm0FEpCWgSZmA+2RIYR6K5=Lj>Z6xS4eVu0xp|e}rAp8R$6zwvD-RGw}p8N zEb8aYknS-Gp?W^uPX)yg;#NOhoOQwJz5LPk;EFNy#O|Q_y!3Y`IwVsVJJD65|2G0 z(FLxm`X^(Hu1^t|!J(6=zI}T9${+Ohse=4K#@t`4&_VD#PEf{98o*%*;U^TJwHJ4O zV%@sihlwF6<>@QvRleP}6eN7SaM*JhluumpfHE)U>9W;hcm6q|EHpF5!e6ofPCvx)m79BH2=yVVs0==6CabK3&k?o#9+l&e}6zYAsZc7Rnd|GGs=ME$HFH^5wP9yoNIJU--kP+qJ_A81eQ*%4&{O~bN%QjVZi!@8 z7aMzxOcF@R^L)mZk5qd1E6s?fs7elax!rp!etpws_MP(PfwCAN zrEF)b{FVCfM5f1swOT5$ZC+C&d;bWm)Oz3T{twh_5~cKv*?zD$o@ebi?_c8XrNeJ4 zOG45~4)OM19%2E4g~u?Tu4or0R%!suIu0Fem0maI+{7QHbM?`Sk~=X7=jCdB+qi-V;2!9{o#+xs6cdOtn++yis{Ny3YjbYX8oR_el; zi*g}htx3LqeKrAvZg1dm{-j2J>wBGlDxi=BIFHJoUY(O4^6;|;sf+;8lHxk|-s8@x+!X(aaa zg5Y^2M#UipM1&0~O(Z=7$Wm$jO25m$7uI{4iM%pDp%Z4KdqnjNP)>S|+sHOEUjq%) zQ<@VKN7D9_pzm5k?`A`;L#`iu@Eop)0x~T=|t7-*!>0 zJ{=QxAblRS2T9kyRKyaS#G!1g_pTIJR#W`HDxptgxIKGkRelQtg&Y&Xtci5x#&Tov zNV)OQ4y53I7Qk-W$?z?@Sjs}*VIUb-R?b;rWl$fsJ!HC}`f`GW^UUD@Qrfp!EGL7K z!2)8LyA$wGM3)WjtuM;U_6_8H-DnoPBD>D5P6pBUdMdZluxmDNIQuLia;}X>iI?eK zTZkc^3z9xJX>3ePyFs>N2jv}M=gT0>kbu2z&Nn$ zhZ}0>P#E-9am)!?-S@Ps=2a65H|rCg7t{UD?(RWz;cxE^sbZAd4$5$Z`WNyXj4y95 zls%=0kq>gh##zp6lwY63yUSw{J_z7#Z|@(?YV@OZWdYF~pDX9@D`ta|*RPb77|eg3 zagoj1rB-sKj{rKFpvZIfCoBTTtbqcP!9mqp(bq;N9Y88t*xp($`wj?RZD45 zww-sdmIBzOu2vXl^(^xjKXNPr;K*pE+>s<>;!3t4|K(Ksjs9*7d=0IczOsWgxSpiv ziSDn44glQ%O?MIK3i<~?hS@O=$IY3652`q@EB4QMt@EUD*XOUS)eI+L)V@X#DCje# zt<9mEzBT_1(Ggp;#uv*^pYRv)W2UL$lGGJb`@^=&u-^Eo!QXVVc3=izc*dhm7)md? z)T9=j6iLX|1kvQ3RVdBGk&x2$>V-JXVJe>bjR75WV>18YlqP0Jo*Z*krWretM|Z5T8% zfuAC-I#F1-C+k_TgDHk?8@^)tFOeP{kCoqA59dPMQ*t}lUtekwCV}u8(%fcyuy~;z z%nE2vSA^A)UDBchy_Ji`WH1)MgI_FvH`)4}+y13?GEUQ3kqq3|`J@t;d}lzs_XSfI zB{8v#2NpzVZWmINX9yh~gNo2^RL)I?8BmaEOgpH@)5;5U;^mz8PCm}Dt#+if=)5|( z0`yGDS=Mo2rBzvWH*3w{!HgN^fezqtDC~rTWP?vUax6LqU?Q5&j-Y&6O406vi>10) zCcJV_y&;VpMX&Qo5eQS;zK7D@52KVKD;S(G3<=2;>`a3vL9=+nBbO%SOv)bAry;RZ zK*S>UJfpa%zFiS+7aalG6viqmUtx?H8s^n9S!(B{fN$aWL(W8N>U-l>*02kFfTSme zEvVRzeLW;wd7j*~pgL@VA{hOeI-iGT8Q^z7``dm0X+?yDv?;r>y72Dwk<}CgK*ed# z4mrAxfx`O%hK++n!vO)-&0e1Xw8gu|c1- zSb@LlO`lc#KOvaK$Wt0C`guMta&RH9_~CT>JYeP;O#uNrkY*Ta9F&9N0Vw5tuha4^ znw%1*9eXL#lB!%X#eC_83b=ctBJDs;X)h+6HfOc|@^Lu3_0&)~<;N}MCn)y-T%&Hw ziSo;~>hC~55U!CP*Cj6hn52MGAZG7Fox?(Umq(GHT54~sTj6X3_Za5cHZY`PwZaaB zOP5gkuUvjscA`86q5N_>lSBYuDp|G4S8|K+vj8WnEagK7&bt;amEO6ytuXYEPMem1I596Qj z`=qII7JDAc7&M9?S6~pD0hG$VbCOGG!DoK#uyO8@A#2dB9FrCQz1ea;lIOs=(;#Wi!kXSu=MTgV= z{msIcXgXTKfR9CW{V*qmH=s0eE0vv*^8;>!eQ82(RKrjDOdB}C2(^(e;OfKfW3gcP z*z|Zf|--{p{e#(7ZcB5S!qB(nN8R zgDRRC-cW|s9$a^qf(*9n+B>O>3oR6=PSA(5S#k!(ROmG(K3#C@4wYSGf2#aq6@sg| z$A9E?gcdCBy8AxHzgJYy$e#eq!nic50DBs8mv=230q`!XN+5YRh7Q!4Y5=dAF513K zL8zEi3Ai7-lfzlh2S^XD%^zy55RL=yxO8|2x{=R5k58FTB00=~k0K;ijP;uzT%msW zmhH^LsfzkqWXzMofc&nKe*QUGZqiZSjLBi)5`d#d2{=YzsXKY0#w}}T7S9x^uq@WM8x0<Zr-lTMrm8;p`Zh3b$;=&Q?;-0hD;nQL zS-+2_T6O^|^w^kZWp&tcxe!ZF{37o)78?4HhEqm7}!CLpdRxOTI{`k#?aWffvrZB1+SyHWF1Yfw#x|1YBdilp)Po* znLTN5koRui?M26fc5Hn?_U6V(N&ATH>L=HfuYG$_a%A5kZh)|bzqwdV>;3+8`X^S8 z>eK#JH1T46BY2;x(4&5ueyon85Oma_+Gs2~(e`N<7PRDR4g)-awJcg2NnM9^Uzz8H zbuQ&igB98eVi+j*60VDtkE*TYO0P4Hzx3M&e}7yjV}vispqm-$=pLIUIK|S$(%K2U zI9hjj(-n{(&IaZ+m_H$QQs)NC{Pro>d+n|gT!t#@?genAcqpU(>BcINL0Fk5Pk*5t z55~IOJkdk*6(b1_y?EWa=d;h2;=+po4`F0nmH4U59oXhcml#fCL@bS_+dNOuo7@$l zfr--M@^8S0bAC!?g(%o&__gkOVL~C-={hb8fx)*G_W=gb<{;F$_&*8?r%V3&l6g+I zB~;LoUiL7GI5FGu4?2nfXbkh+F>IP6PS^u^oA_=OV1VR6&$jKOmK}3BjCMs_n|uGc zB!>F9SI#PSv{`%6Fox2Ms}2nJsw!5axONtap0BtcQBcC(4Nt%Q?fxv#0xl458Pr+y7cihhcf>i zS4<*^SH80qOP@puh0%G;SLaQ!`V9P8qI?bggCwN@Xuv$?@Q%KqvniBKPP*|cGHy1& z&C;eT3C%L|kUYvoIang=$^gyDfFP{W5-Un#+$U{{pG>s``fRS!&RXmvVQy7p1uDOa zOdc1O4DcK9Yt~k*^K5;hA&83j*c&$vt&Pym_GffHa<-rEv=Q6?j zVinPEE)vo3lW|2sF>ECD0Mmh>E|eO8C=gW;kpO^vA5IIRl5{|)Ne6l>GHPiZ96Hc} zbOnon*4sTwOGJ}>+!QV$i*$$EYh6f0KiSMADczUgXjp_>+?l^>@>s!hdnq_p4LpvL z2-1C|8Rl)q(ccsSazEg%e-Wsem_n9x5NNm@O;YPyz$VT0er^*!0KW@vjHBA9m^Wgf zW5A{bZoDT?2AR_@i)M9VY?FS1$8!CI#Lo{nl)z14yD7q`XNY2VYL%7KLFinf3(8gJF# zDly!K+4UqJp2jnzY*krJ9+VQ$v?Ex~PV@cT4mGX;kk_tL!fY~c0*Pg{fdRUNCO(7( zVC4pY?vIjHh+aO6)6Bw&u21V)ui_N?^Z7l9SZ-@}s@AW~t`;0&ReDAeEGh2QYC8HD z$`Jls;)Mh8fgQ?_ympH(#5{7AC*)8L)Fp29i(!>wGR>B?A6yv|X#P|WEfi1gh4u5) zG$7E8G1~I46CjP2WK_$Z^auWVCz5U@!@9{%aY+U6-;^I}xyQin6BP-u zb^$mys!+9L@BG}?jxOD$T~W>Ba2+6d`HiU&dN{#RxE(|MPwxs*~gm)z{cd!0^gt60NSrQEZu z+e=W+P4SOJ!9G7?-<8cMxggm8GxNF{@zy$Y-fbqc;3*LBD-IO~16!6HZ%TUClwDL;@wAkAW*OhfFzsT5O4B3+MomLNjQv3%8CQNs5)D#- z%37e9DM#%zGK%k@K3{nbd+|^_$NVf64pRYEWkN4TWoXUze9!;*8+oCn7&!SS47IWBncB9VDJQ3T92A zxso}_jZxmvPhmlFEsgK}v`wy57I0PN8JbsQAfPwg5jnyNE>0{k7E6ah^7+?3Sc}l} zQJP1NMX#=sOOYM5MyNfj3Grecp^eCXU|_AYwiWH?J7n~)HX1cR>~x=qm|dNBV@@m< z1h^Y|L8RN3%vj5aT9LQPcQ`|qOPVt^xz9E*fQ`^QVapc2l zu5=QIfuxK>Lc_=|wB~u%%_1bKBKi?~hF_va1>+LIc*C`sLIV`vE}rBB>AQHgU7dFw zIZQM%48SL{A5HEe!!}yf5Op1#x#n#F@U3n?v-WWA(1M|D`tGJ;QMCg**l~A$=3+Fk zdq?Q53svL$&VdInkaj!yk5Ne!b~v=jDqNEf_+{)vgY$IL#MKM49L__xwz^1fSv^(Q z;uTx#qT^e9TD+UdbO0Ja1gy-oC~VhMv#Da5`~}WBT&Lu{WI>_`@0OOCo}Cf8qxOyl zTo_R?cx0L!h8cj=EB(KEX>F$-H96{xFw zEJqjC{0Ko4Ml|GQwrPD2NO^(pb|gaTBx1#&qr=zi3tQdYhpkdNiXR`#%>981&I_L0 zM%e7Vs>#88vIx06GHMJGwBOnzQZ~KPUGOr8n8Iam6}4TJbgs7QE5_6t=K;@eT*NY* zM!qwn_j7G1iwtlZuZZulmN0)q>A9dgA(*+`c~czKy~M%Qxze-gBBTB{fYf!AD>%ov zXIhk!OF)6?Xn-R-lF%gk^ZFfI1w@Rvl#L_K4Q+78aFE0trrBz}A3mt6mg8g5`ydyv zggtpVlV$Pd*ONX?}gI~aAq%2I4~49mTIBS*yk)<+QNxH^tg{_c+AemG^g4_=5MOd>TnD80)e zd@sJuG|;gGMk-QwNLC8g`%ND4tm;UD*&k*;vYaTC-#n4-mS#EE4aATC03i;QyjkI; zFnTN&8mkFe$P#{EyBcpx~l^OI-n60j{Xvu)nKk zLH&~_G*+bq5lrrBLZxmVb&R})Qe^(imGf@#rl~+fi+y_ln)6}H@@c-FS!bOH`#zrt zALyM`l1nzqNZMS?GALjP;E(niF$j5{Qbt-*kXXEZn}v5*9%x~k&0mLiK~@usyD@)k z0PQvO)s=U;Mw}~HiT;*DOF7?Srgi}eln%C;H6Z1F%Kw$7-pL`k!mKvMu^)EK`q)n7 zZLtOJJY^#oxYaE$E1qWr70sj_1=1Q?-#rp}a&>sxCUslMX3<=dIVy~VjlNY%P!@#~ z@s@UhYdnH1u3%{|o$)IpBwAOyr+_}X?}U*W`P-0=rbvj%weCb35FSBsnds{y%{sX3 zkfvYCh5m}izq;@>wAmh3wM#lSHs`M_=m_~j2md(PZLu{SW8-FSZt9ZDO)^vz7>l+_ z-#q~?x4q(rs)SNI`KMZdlH*O-Rzw{>oKN;)2{aSW*S@2Ti?PW=OiH|X*={p50lxzA ztsW_o&gil4c-;0;o?i=m|3!4|2# z9QO|BKH?i(*afvm3a;Pw3&o;RnmQ2m9a8gf=0NB+mn;?)OI#oxR#YgLSaifA__FLgaOHzX++Az^47TUnr5w}Rce)PB^$w?WcQv6hB-|9cu5M$s8 zK=q?DJ})G01bi*?{A%eT_)@A^BO(FWhGruiQfBkz0T09g4w$xf5nGvLeLIg>(H)_kX57Yt`{*VEg=J+OV(O5wxm-gt@-hh<UGfB4REA!fm`Tvm$OyO6_l>Y=n*9d93_r3P;+gUF|i zh=vDMI3PxlHhs?J^p~^hsNh&F?%h4dDV~%YZ~GMtW*rw!80$Emol>p_9QdgE>v8<9 zgh&qHwexL;a2Q%moR=0M%8W2Y{(8_l`xG&D*8Q05{jL@l#0cm^$!UB* z)$3cAb*~rGRQi8ouU)>O6Rzo+ghBVdYj4|38L>I{B!&&`~c>`Kv`Z=`|&;^yk4*3j)@MT=6UF z=q0~tNO5r@cE2R?fM?TC(hC5OD58px%Q`kOwr8p1**KthoA_Ico^wRh7;mTT+K0|?)D z&JE_mMiv>AUrEX;4-N0dX_B2PU3#M|y7)==n zZrHma)%m#&*>z#+{Zb>52&|mwLB*T7^|bh~R;LE=rd@x%F zt+Si8H(VyD;A`v$&fDs7p~4%vv$B!caJbi&3%7u=Ty9wwmrcO66mxM8N29L5(EFkq z0R3Y6h1!WmQNAgM8@~uy$}2KsPr3?glOom4YLN$)D*)rIKK4E|F#ND}6}G4-cwL8> ztd{R_i@=<|y0C$tsqF*n!N;iYBJ< z@4-Jd5Z^)8GTmF_EL|oZ#CAO=W^CbF>j2ePDXoo%>gIJcJ(A9Ee3d2^`^F4p+!7Nu zJ6X!6n=g#qjBY9VeDsYU51tI`nqg_``%sdMIMnz4*IJW5`i=&KHtO!sPr~S@-&2@% z5YACKiFfq;`b`qMzFP8(I5{%3j)BSw7R22oQCzlCssn6<3UMYf z$LxKTk0Z>4!Nj0l`e9m?^r9rzWkeJpl4-@VAPm#8nGcYa)JdJpuK^Oz>t3K#Vv5@7 zx(=OxQu#G4+u^ylrT=$gi?2mhZILtd)!uS#Vr*@!jqgfGZ}QBvQ#E92KxTV1(M5U|Fq0wBZOXU z#9ug=ts6}HK@O0#UJG~O;ZuLpSuBwjTCo=+atQxbJ1T^<`yO1;pILuSA7=&Catb)X z7)pBQXAk|32~PlUHBDLCtqEnMrze@brok%4z9nY*YmtV`jy~ zLY39h_4Ekr*KN1Rb_oXbpn+z6A-6D|mhOcCeXX&pU%#AhYtULjp>qc$BgMnDe@g)+ z;7k2Gv)`XoWs{bsb`af}8Fk=QTx@&fds7QwTESZ)M2#;EPo^9us3P;{VQycK8*X@N z&6pb8VQXcp*^3~Be<{W5QZqjG)SXQTeR}~GTwT`ncW617T79q$acHzQkCx72&WGX- zF7Y$VCqqNDtq=PLt&Lxj!)Y8Y&&um}@#-IApX4{V0S+VTD|jnxMVuBcx-=CC7TJHq zhf!%4RyrEg+C}?|k?`JhTt3p|OoONHb&p$yRU1 zQYfUfBgxP?n`Hq~qq! z^_Z46(Mt3sDbnsO|6GfBU5qKmE`GdP;IJB7(8mDO+ z|5ild#tuZ>=F{({X6)EJC8usPQ7&p4wVD<|UV{UWK{s=d5q{S7L{mApoKw&FTw}K9 zknYO@f=W%B0P{>kM+UtBU{t68T0jK=k%+fx&*iZZV(aAiY9BW z<30X@C5cBD3*4LK&zHt(Ei zae?A#Rzv(DK%=GQV8z}mbPlFsIvPr35Z}%8lYy*jITLG@{AFq+k4%)@H?`DGdjdbJ^|bzNs5mIAA}CDkhD!7yh7l1z$^} z62)>5O^W2-F#5;M2p9(8j6t*KrvVSBeKZR0Lzt%@4Jb))&s$j?*M zKKV}K1?bA?txh6gQ_?7sM&r9&7vH`e!+*yb+kQ!PKyH^Sxt*K=ySt$Ya%^ELF0sgz zDxJ6d_nyeYo_b58sacsRlOTasDN)jNRD4aswU z3A`HHYLFB^K(pc1=`QBh=5jXP(gGgwn#DE@EP4rGsM;=_p{oTKaG^P-YoKrLMfj`m z{eKO8_5P=&aff6yFlIH6h{r6;LzfeJCm-MVpT!Z=)}^hqNxh=ntS&}&kJSd$gvic9 zn?8m%qT?VHXiTyje!%3~!?V%E0msl$qGuQs`_*qv#_C*oH)-KOQ0^GfJF3RxMC+tO zW+(0T_^5FD_`EK$;3^_IxgiI2iJ7NMcvRw!5MNr26rS!%D-}JAvND2)Nb2HpKjqiJ6 z1?mdFCTkBH)(sG&*N|SvMJ6(pe{b5P4j^i$BEJxEweueu(32+SK9cYqv^peXhbCBT zpxPtQYK-7hT5T|D_9Vin<>cZx-NrrLBu2A!v41!v?S`2^(Dx$!Y_H2*nbb$5^XV<-k51l2MoS zR^~5-=U2BK6yh`CG9a6epd+XaXn|`ndV}xPZ1Vp%ZK@Kg zPVL6WCcsi0^CVuMN@zA#+;y03um0uYK$b))v93?u;nz-OW{%U+9y}|A>WhKLCRe7x zWr4Jvj?s|EPnSSXQ{>GQ#Mt|W_}|ZxC=S(}w4uhB*Q{V+wVU?bL`CdN>9%aV^6ESzEhcoFHTlZ9a4AVEq* zxFbymEx7tM;wbypJ$qKKxKY`86c1SwBsuS>Tj|Xv`hz;~e@XePW}_B+H)s|ovS9hn zjZKj|5!$A}w56hAcp_n^a1mx0PKPCfQFAC#uH{u~Y3r6DQR!kBOp?iIs>0*r0|-Dp zl=Z117RSj$zE%h)oiUP8N;2H&whYWgFm4Laku8~RZJKv6SXY|1F%mi}-pF54p^a_% z>M@9%KUPA6>txa2tdHt3tLCbfy^njQ?%cM|4SNAImFV0STvJnG)sr%C!%Vc5ev5!ljr{G)$&ruWaZv>FBV1Q77<1G?g^Y_Qdaim!a$_wyQ=yQlh89 z+>^Id>x8>k1AFggBu5p;UoB~Irx{-m8KJ7ji6D5+X|vc_H2zhzIY&#h0RUnL)S6Ou3SRu?w$b;(>f25A-1jnt|aW7$M5d>bQvu_rMQD*$ADr_Olxc^ z-ntBWnSsM)_OSV6eBEH@W=e;cAriH+D(JPY+IkXaE7UF4$oc$5E2+Y-Vez(7 z5+q}J`@|Pyv)R9H;qGy^cb0fs=-Y}7zEfrl{IHF}S}KzDnzZHEgIqK##gHg>r1=^^ zdXC$Bc6fkCR=@6n?=uy&VZWe3zD=hXO(vRuQZ70Tp6d@-)%{k@GcHN^t60k7E$9l&J*)8a*{w z>&6eO@|aQ>Vl93n%uKQP))ul_zf_A_WMHo)KH!nT5TPkhQZ{S#LcDBN zZ_BH7#!lQAJW`=uhJ8LYb?Hhm?1_dd_6GKV-$q;~7M~G?VAIv5q|;|teXVo(^@c^264GdM2RsUWX1VdQTMV^kq#POk{v*u6J(ezXzYDoZG zm8YEA7f-j|2HuRyBE8GLWA6J~B9cn-br*^q^2lV+lJS1~LTBSYu$_{wixSX&a`N7J zdy*g^jj4N|(Bt;^v^%01we51wb5B=wWuW9hUS~I)8k^kd3tx(?Q0DDyeE5jHW2(7k ziW3-9r$ZMYJ-Zy`?LGjxmbT%d6ugJ+{utmXC^bz@QgEV#8V3q(^l0)X6r<$gHzVZ= zQIn$Jyvdj0Mu{Rdy`g{GxPbu;Lcf|48FFCJmV`y!(pPnHO<`k0sWnCnny4F`=*GCv zF~6#MfJ^?8`*Jm3>0VDzhf+F{#@hQ-D->#_iZXl$O1jMe-2YDMF%yg{Vo^~6`}Q4u4|Hjn;p&sD zdg=Dp@i_nw={kJeoJez`UJ#dR)5}Uk)38g%8mZk+>YfbM`*YAISGeR(6#DbG6Kf(w z?4pQes86N8%nEpMjsAKK5-x&9>>~F^_?^0CQ}~R#s8Hf< z$JYEfEP?pZHzM7_FH8BEA;vofvYdpzKme*$;%b0o#6H}IrigQ;Vbu_6$ZeGq0iG}? zM7y@^pQ`z}1iHQem3!T6cUE1NcWSqI#-)2Ryy&F`?=&a~`UoSiwgnZeL}fo%<}=LM znq0%749CoHhOa#|LD-A<$?AjzjT72G)84Ly(SQGo>sVN`J~Ljf7arPW)hM^R1>b7- zCMG2z+7|Nh4o8U(dyAgUlNObuSIR3ZM5QZre|C4S&s*Razyg{tp_;8V&2|c)MVq)u zDHvQb$04ouotv_Q!|Uxq9&o{A`6H_VWjCZHXV z2^K@r*oaAxJ=zALNK|^+w9DXp^G@?+$J0$yPWY$LkP^JsDY&MZ0w&-JT2y9K5q(Im z%lZPykfVp54`AA%Sxb~bf=gVRbxeyVAj2kp{8M)Cp(G9=L>hM4Y75sAj@7o~B1$L6 z1LKl<<``Dwk9Yvzj`0t59iPZ$s!ryHp|i1&)kd`g7IU+})r!=kw2n-o2y$G<0>T66 z-V1Vnh3|dS^KxR=?WtgH$7v3>aIZH+j@}qFbj>bp-eurP#3QD$V9XRPtYFVrVeUEI zm{iU{l^K_LP3_#cXcP9fgGJTdK}am2mP!!Ya;gl^1T|Y*Pua~b=fYy#m-7CJ4fufh zA_e%Vg#gq~7NX5HNJ%;TOBmSyj{;>e%D$1#jm|CHKf7=_Ewr7B8L`bEbEws9X0>Nn zIvLHhdg$x92jplC%b%T9CSS(`5=X+b4zt<`A_+LDpa{{o6hsyb%#>%LieX@=-RCLd zF$8YgS_$^rEu&R&ai5?L*Y%4pZDIa3{2@6EjI8ALUpHa8FqA3~zZdALq>8=|rT(s} z?a*k-CCLJmmpyEfVICZwLON1uDrV4{+h!_#&*7Lq;@#O3sSoTL? zIyrs-wDngY>S0`SRD65`Vz=OM;H&fXMWq*W38&dUXDGaRC3o2*xz1O^wIBqfz6xeTnYzGd5lgxX^8TrCq=&dp-F&lLaK zQfRbIzK0pNy~x#a!yz7PXVxW(gv0$)V;48aLzpIU_M^q;#eXw_~ag zTR&wEbeNub`gn|sX_J&7SoejO`7BV#_E%k!@0{cKz5k@tWq9rpbF+oJeWz>}1%?JB z)oJ=Rdykbaj4S7-_Y&PX)lK(IN6<4SzJM<|oj5>NW)tNm0AUWvS z8Xd7x1Trc8^lNP6cJhK)_SQyAObt_ah#duykT_FkHYt&X@TtUn9s(v@&J$DYUcoyTlsq#`F=1>+BLMNz+x zBdt2o-cySUEa;Y&JiBX{;%;9R3oA)pV-++Fp%7Q6R@>_TCe`D5&bd+5K;u04k(?yV zn@)MyndWC&<&Gb_pDeC9PE7CPLcdjHS*-`;uFTL zw2{w)I!)9x(25B-OA<_Wh#`HaGXerIxbJ7M&RL6#9fj076-_%vzKQ>qCXs*BTEgB*1sI>I}wbwn*KGUvTW$zZaS3CC7_-Aks$45L2e(|)0GM- zCk{CZ>n`jY?CVSIEXLHog_=p;D@FqLMds#YH}6Q^R&Y!a+R>mrw5;tDNW z*EOq|UKu5h<86!dKpf_9&GFUYZ*e+j?>=30+|sJxP09Hg#T5Z~9@p$m3cb__ESrYz z{>qo@028ju%>In%1Y>kN|5-HXv+I@C?+Aqb#2GVtAje4Uh)8X008;!7WDuD Z*Y^Q{fDbs0&%{134T}N*00001Sz0B-Ew=yw literal 0 HcmV?d00001 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog new file mode 100644 index 0000000000..881840828b --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog @@ -0,0 +1,5 @@ +oc-vyos (2-31) UNRELEASED; urgency=low + + * Initial release. (Closes: #XXXXXX) + + -- root Wed, 13 May 2015 10:13:46 +0530 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control new file mode 100644 index 0000000000..6ca9a9df3d --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control @@ -0,0 +1,8 @@ +Package: oc-vyos +Source: oc-vyos-2-31 +Version: 2-31 +Architecture: all +Maintainer: Mahesh Kurund +Section: devel +Priority: optional +Description: oc vyos package diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst new file mode 100755 index 0000000000..746e9467e1 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst @@ -0,0 +1,13 @@ +#!/bin/bash + +#sed -i '/pbr_init/d' /etc/rc.local +#sed -i '/exit 0/i sudo bash /usr/share/oc-pbr/pbr_init &' /etc/rc.local +sudo chown -R root:vyattacfg /config/auth/ +sudo chown -R root:vyattacfg /config/scripts/ +sudo update-rc.d oc-vyos defaults +sudo mkdir -p /var/log/oc +touch /var/log/oc/oc-vyos.log +echo "" > /var/log/oc/vyos_monitor +sudo chown vyos:users -R /var/log/oc /usr/share/vyos-oc /usr/share/oc-pbr +cp /usr/share/oc-pbr/dhclient-script /sbin/dhclient-script +sudo cp /usr/share/vyos-oc/oc_config_server/vyos-oc-log /etc/logrotate.d/vyos-oc-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm new file mode 100755 index 0000000000..4b88c70985 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm @@ -0,0 +1,3 @@ +#!/bin/bash +echo "" +#sed -i '/pbr_init/d' /etc/rc.local diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn new file mode 100644 index 0000000000..2cb8fe4762 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn @@ -0,0 +1,3 @@ +#!/bin/vbash +sudo rm /var/run/pluto.pid +vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr new file mode 100755 index 0000000000..ed5776260b --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr @@ -0,0 +1,11 @@ +#!/bin/bash +echo "dhclient: $reason" +case $reason in + BOUND|RENEW|REBIND|REBOOT) + if [ "eth0" == $interface ]; then + sudo bash /usr/share/oc-pbr/pbr_init & + echo "Management pbr is set" + fi + ;; +esac + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos new file mode 100755 index 0000000000..850a85e5ed --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos @@ -0,0 +1,130 @@ +#! /bin/sh +# +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2014, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA +# +### BEGIN INIT INFO +# Provides: oc-vyos +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: OC vyos service +# Description: Provides the oc-vyos service +### END INIT INFO +set -e +PIDFILE=/var/run/elastic_services/oc-vyos.pid +LOGFILE=/var/log/elastic_services/oc-vyos.log +DAEMON=/usr/bin/oc-vyos +DAEMON_ARGS="--log-file=$LOGFILE" +DAEMON_DIR=/var/run/elastic_services +ENABLED=true +if test -f /etc/default/oc-vyos; then +. /etc/default/oc-vyos +fi +mkdir -p /var/run/elastic_services +mkdir -p /var/log/elastic_services +. /lib/lsb/init-functions +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" +export TMPDIR=/var/lib/elastic_services/tmp +if [ ! -x ${DAEMON} ] ; then +exit 0 +fi +case "$1" in +start) +test "$ENABLED" = "true" || exit 0 +start=1 +## check if pidfile is there +if [ -f $PIDFILE ]; then +pid=`cat $PIDFILE` +## check if pid is there +if [ "1$pid" -ne "1" ]; then +## check if process with pid not running +set +e +kill -0 $pid > /dev/null 2>&1 +[ $? -eq 0 ] && start=0 +set -e +fi +fi +if [ $start -eq 1 ]; then +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +log_daemon_msg "Starting oc vyos" +# We have completely messed up the rc level scripts +sudo chown vyos:users -R /var/run/elastic_services +sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS +log_end_msg $? +else +echo "oc-vyos[$pid] is already running" +fi +;; +stop) +test "$ENABLED" = "true" || exit 0 +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Stopping oc vyos" +start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +rm $PIDFILE +else +echo "PID file not existing" +fi +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +;; +restart|force-reload) +test "$ENABLED" = "true" || exit 1 +$0 stop +sleep 2 +$0 start +;; +reload) +test "$ENABLED" = "true" || exit 0 +## check if pidfile is there +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Reloading oc vyos" +start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +else +echo "oc vyos is not running or PID file not existing" +fi +;; +status) +test "$ENABLED" = "true" || exit 0 +status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +;; +*) +log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +exit 1 +;; +esac +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up new file mode 100755 index 0000000000..56862e7f18 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up @@ -0,0 +1,2 @@ +/sbin/route del default dev $IFACE +echo 1 > /proc/sys/net/ipv4/conf/$IFACE/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces new file mode 100644 index 0000000000..72cf17c415 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces @@ -0,0 +1,59 @@ +# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or +# /usr/share/doc/ifupdown/examples for more information. + +# The loopback network interface +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth1 +iface eth1 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth2 +iface eth2 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth3 +iface eth3 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth4 +iface eth4 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth5 +iface eth5 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth6 +iface eth6 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth7 +iface eth7 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth8 +iface eth8 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth9 +iface eth9 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth10 +iface eth10 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth11 +iface eth11 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth12 +iface eth12 inet dhcp +post-up /etc/network/interface-post-up + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version new file mode 100644 index 0000000000..6ffbf58707 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version @@ -0,0 +1 @@ +Version: 2-31 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README new file mode 100644 index 0000000000..9a29ea0b1f --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README @@ -0,0 +1,14 @@ +1) Add the following line in /etc/rc.local file as give in sample rc.local file + sudo bash /usr/share/oc-pbr/pbr_init & +2) Modify the interfaces file to looks like given sample interfaces file + +3) mkdir -p /usr/share/oc-pbr + +4) copy pbr_init and pbr to /usr/share/oc-pbr + + +vyos agent (server2.py) adds route to the controller node received from pushed +configuration, and also writes a route in the +/usr/share/oc-pbr/controller_route file. This is to make the added route +persistent even if the instance is rebooted. +controller_route is called from pbr_init file. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/controller_route b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/controller_route new file mode 100755 index 0000000000..e69de29bb2 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script new file mode 100755 index 0000000000..a1a2423149 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script @@ -0,0 +1,327 @@ +#!/bin/vbash + +# dhclient-script for Linux. Dan Halbert, March, 1997. +# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. +# Modified for Debian. Matt Zimmerman and Eloy Paris, December 2003 +# Modified to remove useless tests for antiquated kernel versions that +# this doesn't even work with anyway, and introduces a dependency on /usr +# being mounted, which causes cosmetic errors on hosts that NFS mount /usr +# Andrew Pollock, February 2005 +# Modified to work on point-to-point links. Andrew Pollock, June 2005 +# Modified to support passing the parameters called with to the hooks. Andrew Pollock, November 2005 + +# 'ip' just looks too weird. /sbin/ip looks less weird. +ip=/sbin/ip + + +# modified make_resolv_conf () for Vyatta system below +make_resolv_conf() { + local new_resolv_conf="/etc/resolv.conf.dhclient-new-$interface" + local old_resolv_conf="/etc/resolv.conf.dhclient-old-$interface" + mv -f $new_resolv_conf $old_resolv_conf + if [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then + if [ -n "$new_domain_name" ]; then + echo search $new_domain_name >>$new_resolv_conf + fi + if [ -n "$new_domain_name_servers" ]; then + for nameserver in $new_domain_name_servers; do + echo nameserver $nameserver >>$new_resolv_conf + done + fi + elif [ "x${new_dhcp6_name_servers}" != x ] ; then + if [ "x${new_dhcp6_domain_search}" != x ] ; then + echo search ${new_dhcp6_domain_search} >> $new_resolv_conf + fi + for nameserver in ${new_dhcp6_name_servers} ; do + echo nameserver ${nameserver} >> $new_resolv_conf + done + else + echo " " > $new_resolv_conf + fi + + /opt/vyatta/sbin/vyatta_update_resolv.pl --dhclient-script 1 + if ! diff -q $old_resolv_conf $new_resolv_conf >&/dev/null; then + if [ -d /opt/vyatta/config/active/service/dns/forwarding ]; then + /opt/vyatta/sbin/vyatta-dns-forwarding.pl --update-dnsforwarding --outside-cli >&/dev/null + fi + fi + rm -f $old_resolv_conf +} + +run_hook() { + local script="$1" + local exit_status + shift # discard the first argument, then the rest are the script's + + if [ -f $script ]; then + . $script "$@" + fi + + + if [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; then + logger -p daemon.err "$script returned non-zero exit status $exit_status" + save_exit_status=$exit_status + fi + + return $exit_status +} + +run_hookdir() { + local dir="$1" + local exit_status + shift # See run_hook + + if [ -d "$dir" ]; then + for script in $(run-parts --list $dir); do + run_hook $script "$@" || true + exit_status=$? + done + fi + + return $exit_status +} + +# Must be used on exit. Invokes the local dhcp client exit hooks, if any. +exit_with_hooks() { + exit_status=$1 + + # Source the documented exit-hook script, if it exists + if ! run_hook /etc/dhcp3/dhclient-exit-hooks "$@"; then + exit_status=$? + fi + + # Now run scripts in the Debian-specific directory. + if ! run_hookdir /etc/dhcp3/dhclient-exit-hooks.d "$@"; then + exit_status=$? + fi + + exit $exit_status +} + +get_prefix() { + # use existing perl module to compute prefix + # one line don't bother with script + perl -MNetAddr::IP \ + -e '$ip = new NetAddr::IP(@ARGV); print $ip->masklen(), "\n"' $* +} + +set_hostname() { + local current_hostname=$(hostname) + if [ -z "$current_hostname" -o "$current_hostname" = "(none)" ]; then + hostname "$new_host_name" + fi +} + +set_address() { + if [ -n "$old_ip_address" ] && + [ "$old_ip_address" != "$new_ip_address" -o "$old_prefix" != "$new_prefix" ] ; then + # Clear out route cache and ARP tables and all addresses and routes + ip -family inet addr flush dev $interface + fi + + if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ] || + [ -z "$old_ip_address" -o "$old_ip_address" != "$new_ip_address" ] || + [ -z "$old_prefix" -o "$old_prefix" != "$new_prefix" ] ; then + ip -family inet addr add $new_ip_address/$new_prefix \ + broadcast $new_broadcast_address dev $interface + fi + + if [ -n "$new_interface_mtu" ] && + [ ! "$old_interface_mtu" = "$new_interface_mtu" ]; then + ip link set $interface mtu $new_interface_mtu + fi +} + +# Administrative for DHCP routes. Should be configurable +ZEBRA_ROUTE_DHCP=210 + +update_routers() { + if [ -n "$old_routers" ]; then + # No change just renewing + if [ "$reason" = "RENEW" -a "$old_routers" = "$new_routers" ]; then + return 0 + fi + + for router in $old_routers; do + if [ "$old_subnet_mask" == "255.255.255.255" ]; then + vtysh -c "conf t" -c "no ip route $router $interface $ZEBRA_ROUTE_DHCP" + fi + if [ "eth0" == "$interface" ]; then + vtysh -c "conf t" -c "no ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" + fi + done + fi + + for router in $new_routers; do + # point to point + if [ "$new_subnet_mask" == "255.255.255.255" ]; then + vtysh -c "conf t" -c "ip route $router $interface $ZEBRA_ROUTE_DHCP" + fi + if [ "eth0" == "$interface" ]; then + vtysh -c "conf t" -c "ip route 0.0.0.0/0 $router 2" + fi + done + # Making vrrp interface down and up adds back our static route + intf=`ip ad | grep $interface'v' | awk '{print $2}' | grep '@' |cut -f1 -d'@'` + if [ 'x'$intf != x ]; then + sudo ifconfig $intf down + sudo ifconfig $intf up + fi +} + +if [ -n "$new_subnet_mask" ]; then + new_prefix=$(get_prefix $new_ip_address $new_subnet_mask) +fi +if [ -n "$old_subnet_mask" ]; then + old_prefix=$(get_prefix $old_ip_address $old_subnet_mask) +fi +if [ -n "$new_interface_mtu" ]; then + # Vyatta configuration overrides response from server to allow user + # to work around broken ISP's + mtu_path=$(/opt/vyatta/sbin/vyatta-interfaces.pl --dev=$interface --path) + if [ -r $mtu_path ]; then + read new_interface_mtu < $mtu_path + fi + + # The 576 MTU is only used for X.25 and dialup connections + # where the admin wants low latency. Such a low MTU can cause + # problems with UDP traffic, among other things. As such, + # disallow MTUs from 576 and below by default, so that broken + # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc). + if [ $new_interface_mtu -le 576 ]; then + new_interface_mtu= + fi +fi + +# The action starts here + +# Invoke the local dhcp client enter hooks, if they exist. +run_hook /etc/dhcp3/dhclient-enter-hooks +run_hookdir /etc/dhcp3/dhclient-enter-hooks.d + +# Execute the operation +case "$reason" in + MEDIUM) + # Do nothing + ;; + + PREINIT) + ip -family inet addr flush dev $interface + ip link set $interface up + + if [ -n "$DHCLIENT_DELAY" ] && [ $DHCLIENT_DELAY -gt 0 ]; then + sleep $DHCLIENT_DELAY + fi + ;; + + ARPCHECK|ARPSEND) + if [ -z "$new_ip_address" ] || [ -z "$interface" ] || + arping -q -f -c 2 -w 3 -D -I $interface $new_ip_address; then + exit_with_hooks 0 + else + exit_with_hooks 1 + fi + ;; + + BOUND|RENEW|REBIND|REBOOT) + set_hostname + + make_resolv_conf + set_address + update_routers + + exit_with_hooks 0 + ;; + + EXPIRE|FAIL|RELEASE|STOP) + new_routers=""; update_routers + + if [ -n "$old_ip_address" ]; then + ip -family inet addr flush dev ${interface} + fi + if [ "$reason" = "STOP" ]; then + ip link set ${interface} down + fi + + make_resolv_conf + ;; + + TIMEOUT) + if [ -n "$new_routers" ]; then + ip -family inet addr add $new_ip_address/$new_prefix \ + broadcast $new_broadcast_address dev $interface + + set -- $new_routers + first_router="$1" + + if ping -q -c 1 -I $interface $first_router ; then + make_resolv_conf + set_address + update_routers + + exit_with_hooks 0 + fi + ip -family inet addr flush dev $interface + # Note: this exits with interface still up + # see Debian bug #144666 + fi + exit_with_hooks 2 "$@" + ;; + + PREINIT6) + # Ensure interface is up. + ${ip} link set ${interface} up + + exit_with_hooks 0 + ;; + + BOUND6) + if [ x${new_ip6_address} != x ] && [ x${new_ip6_prefixlen} != x ] ; then + ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ + dev ${interface} scope global + fi + + # Check for nameserver options. + make_resolv_conf + + exit_with_hooks 0 + ;; + + RENEW6|REBIND6) + # Make sure nothing has moved around on us. + + # Nameservers/domains/etc. + if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || + [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then + make_resolv_conf + fi + + exit_with_hooks 0 + ;; + + DEPREF6) + if [ x${new_ip6_prefixlen} = x ] ; then + exit_with_hooks 2; + fi + + ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ + dev ${interface} scope global preferred_lft 0 + + exit_with_hooks 0 + ;; + + EXPIRE6|RELEASE6|STOP6) + if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then + exit_with_hooks 2; + fi + + ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ + dev ${interface} + + make_resolv_conf + exit_with_hooks 0 + ;; + +esac + +exit_with_hooks 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up new file mode 100755 index 0000000000..56862e7f18 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up @@ -0,0 +1,2 @@ +/sbin/route del default dev $IFACE +echo 1 > /proc/sys/net/ipv4/conf/$IFACE/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces new file mode 100644 index 0000000000..72cf17c415 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces @@ -0,0 +1,59 @@ +# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or +# /usr/share/doc/ifupdown/examples for more information. + +# The loopback network interface +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth1 +iface eth1 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth2 +iface eth2 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth3 +iface eth3 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth4 +iface eth4 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth5 +iface eth5 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth6 +iface eth6 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth7 +iface eth7 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth8 +iface eth8 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth9 +iface eth9 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth10 +iface eth10 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth11 +iface eth11 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth12 +iface eth12 inet dhcp +post-up /etc/network/interface-post-up + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr new file mode 100755 index 0000000000..ed5776260b --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr @@ -0,0 +1,11 @@ +#!/bin/bash +echo "dhclient: $reason" +case $reason in + BOUND|RENEW|REBIND|REBOOT) + if [ "eth0" == $interface ]; then + sudo bash /usr/share/oc-pbr/pbr_init & + echo "Management pbr is set" + fi + ;; +esac + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route new file mode 100755 index 0000000000..885672d274 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route @@ -0,0 +1,12 @@ +#!/bin/bash +case $reason in + BOUND|RENEW|REBIND|REBOOT) + if [ "eth0" == $interface ]; then + echo $new_routers > /usr/share/oc-pbr/eth0_route + #unset new_routers + else + unset new_routers + fi + echo "Default gateway has been cleared" + ;; +esac diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr new file mode 100755 index 0000000000..90e91c1464 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr @@ -0,0 +1,2 @@ +#!/bin/vbash +sudo ip route add default via $@ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init new file mode 100755 index 0000000000..e3fe31c7ce --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init @@ -0,0 +1,98 @@ +#!/bin/bash + +#Converts decimal to ip address +function dec2ip () { + local ip dec=$1 + for e in {3..0} + do + ((octet = dec / (256 ** e) )) + ((dec -= octet * 256 ** e)) + ip+=$delim$octet + delim=. + done + echo $ip +} + +#Converts ip notation to decimal +function ip2dec () { + local a b c d ip=$1 + IFS=. read -r a b c d <<< "$ip" + echo $((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d)) +} + + +#sleep 20 +flag=0 +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +all_interfaces=`/sbin/ifconfig | grep "Link encap" | grep -v "127.0.0.1" |cut -d: -d " " -f 1` +index=0 +for i in $all_interfaces; do + if [ "$i" == "eth0" ] || [ "$i" == "eth1" ] + then + while true + do + ip_addr=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $4 }'` + if [ $ip_addr ] + then + #echo "GOT IP for interface $i" + #flag=1 + break + fi + done + bcast_ip=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $6 }'`; + mask=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $8 }'`; + dec_bcast_ip=$(ip2dec $bcast_ip) + dec_mask=$(ip2dec $mask) + dec_net_ip=$(($dec_bcast_ip & $dec_mask)) + net_ip=$(dec2ip $dec_net_ip) + interfaces[$index]=$i + ip_addresses[$index]=$ip_addr + network_id[$index]=$net_ip + filename="/var/lib/dhcp3/dhclient_"$i"_lease" + #route=`grep "option routers" $filename |tail -1| cut -d: -d " " -f5` + route=`grep "new_routers" $filename |tail -1| cut -d: -d "=" -f2| tr -d "'"` + default_route[$index]=$route + #echo "$index ${default_route[$index]}" + if [ "$i" == "eth0" ] && [ $flag == 0 ] + then + table_name=$i"_table" + table_id=`expr $index + 5` + is_present=`grep "$table_name" /etc/iproute2/rt_tables` + if [ "$is_present" == "" ] + then + echo $table_id $table_name >> /etc/iproute2/rt_tables + fi + `ip route add default via ${default_route[$index]} table $table_name` + `ip rule del from ${ip_addresses[$index]} table $table_name` + `ip rule add from ${ip_addresses[$index]} table $table_name` + echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route + #echo "configured pbr for interface $i" + fi + #index=`expr $index + 1` + ((index++)) + fi +done + +index=0 +for interface in ${interfaces[*]}; do + #echo "$index ${default_route[$index]}" + if [ "$interface" == "eth1" ] && [ $flag == 0 ] + then + #echo "Set default route on $interface ${default_route[$index]} $index" + cmd="bash /usr/share/oc-pbr/pbr ${default_route[$index]}" + #sudo su - vyos -c "$cmd" + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]} + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper end + #source /opt/vyatta/etc/functions/script-template + #eval "set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]}" + #eval "commit" + #eval "exit" + fi + #index=`expr $index + 1` + ((index++)) +done + +#bash /usr/share/oc-pbr/controller_route +echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local new file mode 100755 index 0000000000..2a68541436 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local @@ -0,0 +1,19 @@ +#!/bin/sh -e +# +# rc.local +# +# This script is executed at the end of each multiuser runlevel. +# value on error. +# +# In order to enable or disable this script just change the execution +# bits. +# +# By default this script does nothing. + +# Do not remove the following call to vyatta-postconfig-bootup.script. +# Any boot time workarounds should be put in script below so that they +# get preserved for the new image during image upgrade. +POSTCONFIG=/opt/vyatta/etc/config/scripts/vyatta-postconfig-bootup.script +[ -x $POSTCONFIG ] && $POSTCONFIG +sudo bash /usr/share/oc-pbr/pbr_init & +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README new file mode 100644 index 0000000000..81526a2dc4 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README @@ -0,0 +1,2 @@ +configsession.py and utils.py are opens source files and originally taken from +"https://github.com/abessifi/pyatta". \ No newline at end of file diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl new file mode 100755 index 0000000000..3cf31fa4cb --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl @@ -0,0 +1,285 @@ +#!/usr/bin/perl + +use Data::Dumper; +local $Data::Dumper::Terse =1; +use JSON; +use LWP::UserAgent; + +#Constants +my $httpclient = LWP::UserAgent->new; + + +my $get_admin_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "name"=> "Default" + }, + "name"=> "", + "password"=> "" + } + } + }, + "scope" => + {"domain" => { + "name" => "Default" + } + } + } +}; + +my $get_user_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "id"=> "" + }, + "name"=> "", + "password"=> "" + } + } + }, + "scope" => { + "project" => { + "domain" => { + "id" => "" + }, + "name" => "" + } + } + } +}; + +#Global variables +my $admin_token_id; +my $user_token_id; +my $domain_id; +my $user_role; +my $cloud_admin_projname; +my $cloud_admin_username; +my $cloud_admin_password; +my $KEYSTONE_AUTH_URL; +my $REMOTE_VPN_ROLE_NAME; +my $SERVICE_PROJECT_ID; +my $username; +my $password; +my $user_id; +my $user_role_id; +my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; +my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + + + +sub read_auth_server_conf { + # Get auth server conf from file + my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; + + if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { + print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; + exit 1; + } + $KEYSTONE_AUTH_URL = ; + $cloud_admin_projname = ; + $cloud_admin_username = ; + $cloud_admin_password = ; + $REMOTE_VPN_ROLE_NAME = ; + $SERVICE_PROJECT_ID = ; + + chomp $KEYSTONE_AUTH_URL; + chomp $cloud_admin_projname; + chomp $cloud_admin_username; + chomp $cloud_admin_password; + chomp $REMOTE_VPN_ROLE_NAME; + chomp $SERVICE_PROJECT_ID; + + #$DB::single = 1; + + close(AUTHFILE); +} + + +sub read_username_passwd { + # Get username/password from file + + if ($ARG = shift @ARGV) { + if (!open (UPFILE, "<$ARG")) { + print "Could not open username/password file: $ARG\n"; + exit 1; + } + } else { + print "No username/password file specified on command line\n"; + exit 1; + } + + $username = ; + $password = ; + + if (!$username || !$password) { + print "Username/password not found in file: $ARG\n"; + exit 1; + } + + chomp $username; + chomp $password; + + close (UPFILE); +} + + + + + +sub get_cloud_admin_token { + #$DB::single = 1; + + my $http_req = HTTP::Request->new(POST => $url_get_admin_token); + $http_req->header('content-type' => 'application/json'); + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; + #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; + $json_string = to_json($get_admin_token_data); + $http_req->content($json_string); + #$http_req->content($get_admin_token_data); + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $admin_token_id = $http_resp->headers->{'x-subject-token'}; + print "Admin token id: ", $admin_token_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting cloud admin token failed \n"; + } +} + +sub get_domain_id { + my $http_req = HTTP::Request->new(GET => $url_get_domain); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $domain_id = $decoded_resp->{'project'}->{'domain_id'}; + $project_name = $decoded_resp->{'project'}->{'name'}; + print "Domain id: ", $domain_id, "\n"; + print "Project name: ", $project_name, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting domain id failed \n"; + } +} + +sub get_role_id { + my $http_req = HTTP::Request->new(GET => $url_get_role_id); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; + print "Role id: ", $user_role_id, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting role id failed \n"; + } +} + + + + +sub user_authenticate { + my $http_req = HTTP::Request->new(POST => $url_user_authenticate); + $http_req->header('content-type' => 'application/json'); + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; + $get_user_token_data->{"auth"}{"scope"}{"project"}{"domain"}{"id"} = $domain_id; + $get_user_token_data->{"auth"}{"scope"}{"project"}{"name"} = $project_name; + $json_string = to_json($get_user_token_data); + $http_req->content($json_string); + my $http_resp = $httpclient->request($http_req); + + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + #$DB::single = 1; + my $decoded_resp = decode_json($message); + $user_token_id = $http_resp->headers->{'x-subject-token'}; + $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; + print "User token id: ", $user_token_id, "\n"; + print "User id: ", $user_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting user token failed \n"; + } +} + +sub get_user_roles { + $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + #$DB::single = 1; + my $user_roles = $decoded_resp->{'role_assignments'}; + my $len = @{$user_roles}; + if ($len) { + $user_role = $REMOTE_VPN_ROLE_NAME; + } else { + $user_role = ""; + } + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting user roles failed \n"; + } +} + + +read_auth_server_conf(); +read_username_passwd(); + +$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; +$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + +get_cloud_admin_token(); +get_domain_id(); +get_role_id(); +user_authenticate(); +get_user_roles(); + +if ($user_role eq $REMOTE_VPN_ROLE_NAME) { + exit 0; +} +exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl new file mode 100755 index 0000000000..d5d32c58f7 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl @@ -0,0 +1,273 @@ +#!/usr/bin/perl + +use Data::Dumper; +local $Data::Dumper::Terse =1; +use JSON; +use LWP::UserAgent; + +#Constants +my $httpclient = LWP::UserAgent->new; + + +my $get_admin_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "name"=> "Default" + }, + "name"=> "", + "password"=> "" + } + } + }, + "scope" => + {"domain" => { + "name" => "Default" + } + } + } +}; + +my $get_user_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "id"=> "" + }, + "name"=> "", + "password"=> "" + } + } + } + } +}; + +#Global variables +my $admin_token_id; +my $user_token_id; +my $domain_id; +my $user_role; +my $cloud_admin_projname; +my $cloud_admin_username; +my $cloud_admin_password; +my $KEYSTONE_AUTH_URL; +my $REMOTE_VPN_ROLE_NAME; +my $PROJECT_ID; +my $username; +my $password; +my $user_id; +my $user_role_id; +my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; +my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + + + +sub read_auth_server_conf { + # Get auth server conf from file + my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; + + if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { + print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; + exit 1; + } + $KEYSTONE_AUTH_URL = ; + $cloud_admin_projname = ; + $cloud_admin_username = ; + $cloud_admin_password = ; + $REMOTE_VPN_ROLE_NAME = ; + $PROJECT_ID = ; + + chomp $KEYSTONE_AUTH_URL; + chomp $cloud_admin_projname; + chomp $cloud_admin_username; + chomp $cloud_admin_password; + chomp $REMOTE_VPN_ROLE_NAME; + chomp $PROJECT_ID; + + #$DB::single = 1; + + close(AUTHFILE); +} + + +sub read_username_passwd { + # Get username/password from file + + if ($ARG = shift @ARGV) { + if (!open (UPFILE, "<$ARG")) { + print "Could not open username/password file: $ARG\n"; + exit 1; + } + } else { + print "No username/password file specified on command line\n"; + exit 1; + } + + $username = ; + $password = ; + + if (!$username || !$password) { + print "Username/password not found in file: $ARG\n"; + exit 1; + } + + chomp $username; + chomp $password; + + close (UPFILE); +} + + + + + +sub get_cloud_admin_token { + #$DB::single = 1; + + my $http_req = HTTP::Request->new(POST => $url_get_admin_token); + $http_req->header('content-type' => 'application/json'); + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; + #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; + $json_string = to_json($get_admin_token_data); + $http_req->content($json_string); + #$http_req->content($get_admin_token_data); + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $admin_token_id = $http_resp->headers->{'x-subject-token'}; + print "Admin token id: ", $admin_token_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting cloud admin token failed \n"; + } +} + +sub get_domain_id { + my $http_req = HTTP::Request->new(GET => $url_get_domain); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $domain_id = $decoded_resp->{'project'}->{'domain_id'}; + print "Domain id: ", $domain_id, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting domain id failed \n"; + } +} + +sub get_role_id { + my $http_req = HTTP::Request->new(GET => $url_get_role_id); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; + print "Role id: ", $user_role_id, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting role id failed \n"; + } +} + + + + +sub user_authenticate { + my $http_req = HTTP::Request->new(POST => $url_user_authenticate); + $http_req->header('content-type' => 'application/json'); + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; + $json_string = to_json($get_user_token_data); + $http_req->content($json_string); + my $http_resp = $httpclient->request($http_req); + + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + #$DB::single = 1; + my $decoded_resp = decode_json($message); + $user_token_id = $http_resp->headers->{'x-subject-token'}; + $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; + print "User token id: ", $user_token_id, "\n"; + print "User id: ", $user_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting user token failed \n"; + } +} + +sub get_user_roles { + $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + #$DB::single = 1; + my $user_roles = $decoded_resp->{'role_assignments'}; + my $len = @{$user_roles}; + if ($len) { + $user_role = $REMOTE_VPN_ROLE_NAME; + } else { + $user_role = ""; + } + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting user roles failed \n"; + } +} + + +read_auth_server_conf(); +read_username_passwd(); + +$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; +$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + +get_cloud_admin_token(); +get_domain_id(); +get_role_id(); +user_authenticate(); +get_user_roles(); + +if ($user_role eq $REMOTE_VPN_ROLE_NAME) { + exit 0; +} +exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf new file mode 100755 index 0000000000..ef768a8728 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf @@ -0,0 +1,6 @@ +http://10.30.120.97:5000/ +services +neutron +noir0123 +vpn +45fe9bb731054eb4acdae8e15d48a562 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/__init__.py new file mode 100755 index 0000000000..e69de29bb2 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py new file mode 100755 index 0000000000..f7b2b39b0a --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python +import sys +import subprocess +import os + +#sys.path.append('/home/vyos/vyos-api/project/') +from vyos_session.configsession import ConfigSession, SessionNotExists, \ + SetupSessionFailed +from vyos_session import utils +import logging +import shlex + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +try: + session = ConfigSession() +except Exception as err: + logger.error('A session exist already !') + +VYOS_SBIN_DIR = utils.get_config_params('bin','vyos_sbin_dir') +VYOS_SHELL_API = utils.get_config_params('bin', 'shell_api_path') + +class OperationFailed(Exception): pass +class OperationNameError(Exception): pass +class ConfigPathNotCorrect(Exception): pass + +def check_operation_name(args): + """ Check if operation/command name is correct. """ + if len(args) == 0: + logger.error('Operation name required') + raise OperationNameError('Operation name required.') + elif args[0] not in ['show','set','delete', 'edit']: + logger.error('Operation name "%s" not correct' % args[0]) + raise OperationNameError('Operation name not correct.') + return True + +def _runner(command): + """ + Run shell commands via subprocess.Popen() + """ + # NOTE: + # if Popen(self.args, shell=True, ...) => Execution fails + # if Popen(self.args, ...) => OSError: [Errno 2] No such file or directory + # if self.args = ['/bin/cli-shell-api','showCfg', ...] and Popen(self.args, ...) that works but actually we keep using ' '.join(self.args). + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # wait for the process to terminate and get stdout/stderr outputs + out, err = proc.communicate() + return out, err, proc.returncode + +def _op_command(command=None): + command = './op_commands.sh' + command += " " + "\"run show vpn ipsec sa\"" + + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out,err = proc.communicate() + return out + +class execUtils: + """ Executes possible operations in a Vyos configure session.""" + def __init__(self, args): + self.args = args + + def execmd(self, nonsession=False): + """ + Performs execution of allowed config operations ['show','set','delete'] + """ + if check_operation_name(self.args): + # prepare executable file to be called + operation_name = self.args[0] + logger.info('Perform operation "%s"' % operation_name) + + if not nonsession: + if self.args[0] == 'show': self.args[0] = '{0} showCfg'.format( + VYOS_SHELL_API) + else: self.args[0] = os.path.join(VYOS_SBIN_DIR, + 'my_{0}'.format(self.args[0])) + logger.debug('exec command: "%s"' % ' '.join(self.args)) + + if not nonsession and not session.session_exists(): + raise SessionNotExists('Configure session do not exists') + + if not nonsession: + result = _runner(' '.join(self.args)) # result = (stdout, stderr, errcode) + else: + result = _op_command() + return (True, result) + + logger.debug('command return code: %s' % result[2]) + + if result[2]: + logger.info('command output: %s' % ' '.join(result[0].splitlines())) + logger.error('Failed executing operation "%s"' % operation_name) + raise OperationFailed('Operation failed !') + logger.debug('%s' % ' '.join(result[0].splitlines())) + logger.info('Executing "%s" operation OK' % operation_name) + return (True, result[0]) + + def check_cmd_args(self): + """ + Check that config path is correct before performing execmd() + """ + logger.info('Check specified configuration path existance') + config_path = ' '.join(self.args[1:]) + logger.info('config path: "%s"' % config_path) + cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) + logger.debug('exec command: "%s"' % cmd) + result = _runner(cmd) # result = (stdout, stderr, errcode) + logger.debug('command return code: %s' % result[2]) + if result[2]: + logger.error('Configuration path is not correct') + raise ConfigPathNotCorrect('Configuration path is not correct') + logger.info('Configuration path is correct') + return True + + def check_cmd_args(self): + """ + Check that config path is correct before performing execmd() + """ + logger.info('Check specified configuration path existance') + config_path = ' '.join(self.args[1:]) + logger.info('config path: "%s"' % config_path) + cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) + logger.debug('exec command: "%s"' % cmd) + proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + errcode = proc.returncode + logger.debug('command return code: %s' % errcode) + if errcode: + logger.error('Configuration path is not correct') + raise ConfigPathNotCorrect('Configuration path is not correct') + logger.info('Configuration path is correct') + return True + + def get_possible_options(self): + """ + Returns list of nodes under specified configuration path + """ + out = [] + try: + self.check_cmd_args() # check config path validation + except ConfigPathNotCorrect: + return False, out # config path is not correct + + config_path = ' '.join(self.args[1:]) + logger.info('Get possible options of config path "%s"' % config_path) + cmd = '{0} listNodes {1}'.format(VYOS_SHELL_API, config_path) + logger.debug('exec command: "%s"' % cmd) + result = _runner(cmd) # rst = (stdout, stderr, errcode) + logger.debug('command return code: %s' % result[2]) + if not result[0]: + logger.info('No more options for the specified config path') + return True, result[0] + options = shlex.split(result[0]) + logger.debug('List of options : "%s"' % options) + return True, options diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py new file mode 100755 index 0000000000..55c41a0518 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +import sys +import os +topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." +topdir = os.path.realpath(topdir) +sys.path.insert(0, topdir) +from executor import OperationFailed, execUtils as executor +from vyos_session.utils import logger +from vyosparser import vyos_parser as vparser + +class ServiceError(Exception): pass + +class showConfig(): + def formator(self,options): + args=['show'] + service = options[0] + logger.debug("=====>>>>>> args before executor call = %s"%args) + if service in ['protocols','nat','interfaces','firewall']: + args.extend(options) + elif service in ['dns','dhcp-server','ssh','webproxy']: + options.insert(0,'service') + args.extend(options) + else: + raise ServiceError('unknown such service!') + exe=executor(list(args)) + try: + #if not exe.checkcmd(' '.join(args)): + # logger.error("%s: given args does not match with existing configs!"%args) + # return False + execstate,output=exe.execmd() + logger.debug("=====>>>>>> args after executor call = %s"%args) + except OperationFailed, e: + logger.error(e.message) + return False + if execstate==True: + return vparser.decode_string(output) + + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos new file mode 100755 index 0000000000..850a85e5ed --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos @@ -0,0 +1,130 @@ +#! /bin/sh +# +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2014, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA +# +### BEGIN INIT INFO +# Provides: oc-vyos +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: OC vyos service +# Description: Provides the oc-vyos service +### END INIT INFO +set -e +PIDFILE=/var/run/elastic_services/oc-vyos.pid +LOGFILE=/var/log/elastic_services/oc-vyos.log +DAEMON=/usr/bin/oc-vyos +DAEMON_ARGS="--log-file=$LOGFILE" +DAEMON_DIR=/var/run/elastic_services +ENABLED=true +if test -f /etc/default/oc-vyos; then +. /etc/default/oc-vyos +fi +mkdir -p /var/run/elastic_services +mkdir -p /var/log/elastic_services +. /lib/lsb/init-functions +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" +export TMPDIR=/var/lib/elastic_services/tmp +if [ ! -x ${DAEMON} ] ; then +exit 0 +fi +case "$1" in +start) +test "$ENABLED" = "true" || exit 0 +start=1 +## check if pidfile is there +if [ -f $PIDFILE ]; then +pid=`cat $PIDFILE` +## check if pid is there +if [ "1$pid" -ne "1" ]; then +## check if process with pid not running +set +e +kill -0 $pid > /dev/null 2>&1 +[ $? -eq 0 ] && start=0 +set -e +fi +fi +if [ $start -eq 1 ]; then +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +log_daemon_msg "Starting oc vyos" +# We have completely messed up the rc level scripts +sudo chown vyos:users -R /var/run/elastic_services +sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS +log_end_msg $? +else +echo "oc-vyos[$pid] is already running" +fi +;; +stop) +test "$ENABLED" = "true" || exit 0 +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Stopping oc vyos" +start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +rm $PIDFILE +else +echo "PID file not existing" +fi +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +;; +restart|force-reload) +test "$ENABLED" = "true" || exit 1 +$0 stop +sleep 2 +$0 start +;; +reload) +test "$ENABLED" = "true" || exit 0 +## check if pidfile is there +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Reloading oc vyos" +start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +else +echo "oc vyos is not running or PID file not existing" +fi +;; +status) +test "$ENABLED" = "true" || exit 0 +status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +;; +*) +log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +exit 1 +;; +esac +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn new file mode 100755 index 0000000000..2cb8fe4762 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn @@ -0,0 +1,3 @@ +#!/bin/vbash +sudo rm /var/run/pluto.pid +vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf new file mode 100644 index 0000000000..1ae8510480 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf @@ -0,0 +1,8 @@ +[bin] +vyos_sbin_dir = /opt/vyatta/sbin +shell_api_path = /bin/cli-shell-api + +[log] +logdir=/var/log/oc +logfile=oc-vyos.log +level=ERROR diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py new file mode 100644 index 0000000000..3ed9fd0f30 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py @@ -0,0 +1 @@ +__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py new file mode 100644 index 0000000000..db45c0e8ea --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py @@ -0,0 +1,88 @@ +from subprocess import call +import netifaces +import logging +from vyos_dhc import initiate_dhclient +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +INTERFACE_RULE_FILE = "/etc/udev/rules.d/70-persistent-cd.rules" +ADD_RULE = 'SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="%s", NAME="%s"' + + +class EditPersistentRule(object): + def __init__(self): + pass + + def add(self, mac_info): + provider_rule, stitching_rule, interface_list = self.get_rule(mac_info) + self.clean_stale_rules(interface_list) + # line = ADD_RULE % (mac, interface) + # initiate_dhclient() + self.delete(mac_info) + try: + call("sudo chown vyos: " + "/etc/udev/rules.d/70-persistent-cd.rules".split() + ) + with open(INTERFACE_RULE_FILE, "a") as myfile: + myfile.write(provider_rule + "\n") + myfile.write(stitching_rule + "\n") + except Exception as err: + logger.error("Failed to add persistent rule for macs -%r " % + mac_info) + raise Exception(err) + finally: + call("sudo chown root:root " + "/etc/udev/rules.d/70-persistent-cd.rules".split() + ) + + def delete(self, mac_info): + pro_cmd = 'sudo sed -i /%s/d %s' % (mac_info['provider_mac'], + INTERFACE_RULE_FILE) + stitch_cmd = 'sudo sed -i /%s/d %s' % (mac_info['stitching_mac'], + INTERFACE_RULE_FILE) + try: + call(pro_cmd.split()) + call(stitch_cmd.split()) + except Exception as err: + logger.error("Failed to delete persistent rule for macs -%r " % + mac_info) + raise Exception(err) + + def get_rule(self, mac_info): + interfaces = netifaces.interfaces() + provider_rule = '' + stitching_rule = '' + interface_list = list() + for interface in interfaces: + physical_interface = netifaces.ifaddresses(interface).get( + netifaces.AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses(interface)[netifaces.AF_LINK][0][ + 'addr'] + + if mac_addr == mac_info['provider_mac']: + interface_list.append(interface) + provider_rule = ADD_RULE % (mac_addr, interface) + elif mac_addr == mac_info['stitching_mac']: + interface_list.append(interface) + stitching_rule = ADD_RULE % (mac_addr, interface) + + return provider_rule, stitching_rule, interface_list + + def clean_stale_rules(self, interface_list): + try: + for interface in interface_list: + cmd = 'sudo sed -i /%s/d %s' % ( + interface, INTERFACE_RULE_FILE) + call(cmd.split()) + except Exception, err: + logger.error("ERROR deleting stale persistent rule. Interfaces: " + "%r . Details: %r" % (interface_list, str(err))) + + + + + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py new file mode 100644 index 0000000000..5e417c91e8 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py @@ -0,0 +1,17 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +actions = ["drop", "reject", "accept", "inspect"] +state = ["established", "invalid", "related"] +availability = ["enable", "disable"] +intercloud = False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py new file mode 100755 index 0000000000..9ffe9581ab --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +from operations import configOpts + +FWN = "firewall name" +ZPZ = "zone-policy zone" +class fwHandler(configOpts): + actions=["drop","reject","accept","inspect"] + state=["established","invalid","related"] + availability=["enable","disable"] + + def firewall_config(self,name,suffix): + firewall=[FWN,name,"rule"] + firewall.extend(suffix) + self.set(firewall) + + def zone_config(self,suffix): + zone=[ZPZ] + zone.extend(suffix) + self.set(zone) + + def set_zone_desc(self,zone_name,desc): + description = [zone_name,"description",desc] + self.zone_config(description) + + def set_zone_interface(self,zone_name,iface): + interface = [zone_name,"interface",iface] + self.zone_config(interface) + + def setup_fw_on_zone(self,zone_src,zone_dst,firewall): + fw_on_zone=[zone_src,"from",zone_dst,"name",firewall] + self.zone_config(fw_on_zone) + + def set_default_action(self,name,rule_num,action): + if action in self.actions: + self.set_action[rule_num,"action",action] + self.firewall_config(name,set_action) + + def set_rule_state(self,name,rule_num,state,allow): + if state in self.states and allow in self.availability: + self.set_state[rule_num,"state",state,allow] + self.firewall_config(name,set_state) + + def set_protocol(self,name,rule_num,prot): + protocol=[rule_num,"protocol",prot] + self.firewall_config(name,protocol) + + def set_dest_port(self,name,rule_num,portlist,orient="destination"): + port=[rule_num,orient,"port",portlist] + self.firewall_config(name,port) + + + def set_dest_addr(self,name,rule_num,addr_subnet,orient="destination"): + addr=[rule_num,orient,"address",addr_subnet] + self.firewall_config(name,addr) + + def set_src_port(self,name,rule_num,portlist): + self.set_dest_port(name,rule_num,portlist,"source") + + def set_src_addr(self,name,rule_num,addr_subnet): + self.set_dest_addr(name,rule_num,addr_subnet,"source") + + def rule_state(self,name,rule_num,status): + if status in availability: + rule_status=[rule_num,status] + self.firewall_config(name,rule_status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py new file mode 100644 index 0000000000..bd1017c22c --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py @@ -0,0 +1,367 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +#!/usr/bin/env python +import json +import netifaces +import time +import logging +from netifaces import AF_INET, AF_LINK + +from execformat.executor import session + +from operations import configOpts +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class VYOSHAConfig(configOpts): + """ + Class to configure HA for VYOS. + """ + def __init__(self): + super(VYOSHAConfig, self).__init__() + pass + + def configure_conntrack_sync(self, ha_config): + """ + :param ha_config: + :return: + """ + ha_config = json.loads(ha_config) + monitoring_info, data_info = self.get_conntrack_request_data( + ha_config) + event_queue_size = monitoring_info["event_queue_size"] + cluster_name = monitoring_info["cluster_name"] + mcast_group = monitoring_info["mcast_group"] + sync_queue_size = monitoring_info["sync_queue_size"] + monitoring_mac = monitoring_info["monitoring_mac"] + + monitoring_interface, monitoring_ip = self._get_interface_name( + dict(monitoring_mac=monitoring_mac), + interface_type='monitoring') + + if not monitoring_interface: + # return {'status': 500, + # 'message': 'Failed to get monitoring interface name'} + logger.error("Failed to configure conntrack for CLUSTER- %r" % + cluster_name) + raise Exception("Conntrack sync configuration failed. Reason - " + "No monitoring interface information found.", + 400, dict(ha_config=ha_config)) + + conntrack_commands = self._set_conntrack( + cluster_name, event_queue_size, mcast_group, + monitoring_interface, sync_queue_size) + interface_vrrp_commands = self.set_vrrp_for_interface(data_info) + + all_commands = conntrack_commands + interface_vrrp_commands + + self._execute_commands(all_commands, ha_config['tenant_id']) + logger.debug("VRRP configured succesfully - %r " % all_commands) + return {'status': 200, 'message': 'VRRP configured succesfully'} + + def set_interface_ha(self, interface_config): + ha_config = json.loads(interface_config) + try: + cluster_name = ha_config["cluster_name"] + vrrp_group = ha_config["vrrp_group"] + data_macs = ha_config["data_macs"] + preempt_delay = ha_config["preempt_delay"] + priority = ha_config["priority"] + vip = ha_config["vip"] + tenant_id = ha_config["tenant_id"] + advertised_interval = ha_config["advertised_interval"] + except KeyError, err: + raise Exception("HA configuration for interface failed. Value " + "not found. %r" % str(err), + 400, dict(interface_config=ha_config)) + interface_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, + vip=vip, preempt_delay=preempt_delay, + priority=priority, cluster_name=cluster_name, + advertised_interval=advertised_interval, + tenant_id=tenant_id) + + interface_vrrp_commands = self.set_vrrp_for_interface(interface_info) + + self._execute_commands(interface_vrrp_commands, interface_info[ + 'tenant_id']) + logger.debug("VRRP succesfully configured for interfaces.") + return {'status': 200, 'message': 'VRRP succesfully configured for ' + 'interfaces'} + + def delete_vrrp(self, vrrp_config): + """ + :param self: + :param vrrp_config: + :return: + This method makes an assumption that detach of an interface will + finally clean the vrrp entry. That's why doesn't raise any + exception, as was observed that even though it succeeds but raises an + exception. Investigation will continue. Also this methods doesn't + clean conntrack explicitly, instead it goes with VM delete. + Exception code will be incorporated once the exception established + case. + """ + vrrp_config = json.loads(vrrp_config) + data_macs = vrrp_config["data_macs"] + # cluster_name = vrrp_config.get("cluster_name", "CLUSTER-1") + + data_interface, data_ip = self._get_interface_name( + dict(data_mac=data_macs['provider_mac']), interface_type='data') + + provider_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface + + data_interface, data_ip = self._get_interface_name( + dict(data_mac=data_macs['stitching_mac']), interface_type='data') + stitching_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface + + session.setup_config_session() + # delete_conntrack_cluster = ("service conntrack-sync " + # "failover-mechanism vrrp sync-group %s" % + # cluster_name) + # try: + # self.delete(group_delete.split()) + # except Exception, err: + # session.discard() + # session.teardown_config_session() + # raise Exception(err) + + try: + self.delete(provider_vrrp_delete.split()) + except Exception, err: + # session.discard() + logger.error("Error deleting provider vrrp %r " % err) + # raise Exception(err) + + try: + self.delete(stitching_vrrp_delete.split()) + except Exception, err: + # session.discard() + logger.error("Error deleting stitching vrrp %r " % err) + # raise Exception(err) + + # try: + # self.delete(delete_conntrack_cluster.split()) + # except Exception, err: + # session.discard() + # session.teardown_config_session() + # raise Exception(err) + # logger.error("Error deleting conntrack - %r " % err) + + session.commit() + time.sleep(5) + session.save() + # REVISIT (VK) This sleep need to get invoked if we see any issue + # with session teardown. + # time.sleep(5) + session.teardown_config_session() + logger.debug("VRRP succesfully deleted for interfaces") + return {'status': 200, 'message': 'VRRP succesfully deleted for ' + 'interfaces'} + + def set_vrrp_for_interface(self, data_info): + interface_commands = list() + direct_call = False + if isinstance(data_info, str): + direct_call = True + data_info = json.loads(data_info) + data_macs = data_info.get("data_macs", {}) + vips = data_info.get("vip", {}) + vrrp_groups = data_info["vrrp_group"] + + for mac_type, mac in data_macs.iteritems(): + # mac_type - provider_mac, stitching_mac + data_mac = dict(data_mac=str(mac)) + vip_type = mac_type.split("_")[0] + "_vip" + vip_ip = vips.get(vip_type) + if mac_type == "provider_mac": + vrrp_group = vrrp_groups["provider_vrrp_group"] + if mac_type == "stitching_mac": + vrrp_group = vrrp_groups["stitching_vrrp_group"] + + interface_name, ip = self._get_interface_name( + data_mac, interface_type='data') + + if not interface_name: + logger.error("Failed to configure VRRP, as unable to get " + "interface name.") + raise Exception('VRRP config failed.Failed to get interface' + ' name to configure vrrp', 400, + dict(data_info=data_info)) + + common_command = "interfaces ethernet %s vrrp vrrp-group %s " % ( + interface_name, vrrp_group) + + interface_address_set = "interfaces ethernet %s address %s " % ( + interface_name, ip) + + advt_interval_set = common_command + "advertise-interval %s " % ( + data_info["advertised_interval"]) + + preempt_set = common_command + "preempt true" + # preempt_set = common_command + "preempt %s" % data_info[ + # "preempt"] + preempt_delay_set = common_command + "preempt-delay %s" % \ + data_info["preempt_delay"] + priority_set = common_command + "priority %s" % data_info[ + "priority"] + rfc_set = common_command + "rfc3768-compatibility" + sync_group_set = common_command + "sync-group %s " % data_info[ + "cluster_name"] + virtual_address_set = common_command + "virtual-address %s" % \ + vip_ip + + interface_commands += [interface_address_set, advt_interval_set, + preempt_set, preempt_delay_set, + priority_set, rfc_set, sync_group_set, + virtual_address_set] + + logger.debug("Interface commands - %r ", interface_commands) + if not direct_call: + return interface_commands + else: + self._execute_commands(interface_commands, data_info.get( + 'tenant_id')) + return dict(message='Interface configured succesfully') + + @staticmethod + def _set_conntrack(cluster_name, event_queue_size, mcast_group, + monitoring_interface, sync_queue_size): + peer_link_set = "interfaces ethernet %s description PEER-LINK" % \ + monitoring_interface + event_queue_set = "service conntrack-sync event-listen-queue-size " \ + "%s" % str(event_queue_size) + cluster_set = "service conntrack-sync failover-mechanism vrrp " \ + "sync-group " + cluster_name + interface_set = "service conntrack-sync interface %s" % \ + monitoring_interface + mcast_set = "service conntrack-sync mcast-group %s " % mcast_group + sync_queue_set = "service conntrack-sync sync-queue-size %s " % \ + str(sync_queue_size) + commands = [peer_link_set, event_queue_set, cluster_set, + interface_set, mcast_set, sync_queue_set] + + logger.debug("Conntrack commands - %r " % commands) + return commands + + @staticmethod + def _get_interface_name(ha_config, interface_type=None): + """ + :param ha_config: + :param interface_type: + :return: + """ + interfaces = netifaces.interfaces() + for interface in interfaces: + physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) + if not physical_interface: + continue + if AF_INET not in netifaces.ifaddresses(interface).keys(): + continue + mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] + ip_addr = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] + netmask = netifaces.ifaddresses(interface)[AF_INET][0]['netmask'] + if mac_addr == ha_config.get('monitoring_mac', None) and \ + interface_type.lower() == 'monitoring': + return interface, ip_addr + elif (mac_addr == ha_config.get('data_mac', None) and + interface_type.lower() == 'data'): + mlen = sum([bin(int(x)).count('1') for x in + netmask.split('.')]) + ip_addr += ("/" + str(mlen)) + return interface, ip_addr + + logger.error("interface name none, ha_config: %s" % ha_config) + return None, None + + def get_conntrack_request_data(self, ha_config): + try: + monitoring_mac = ha_config["monitoring_mac"] + queue_size = ha_config.get("queue_size", 8) + cluster_name = ha_config["cluster_name"] + mcast_group = ha_config["mcast_group"] + sync_queue_size = ha_config.get("sync_queue_size", 1) + vrrp_group = ha_config["vrrp_group"] + data_macs = ha_config["data_macs"] + preempt_delay = ha_config["preempt_delay"] + priority = ha_config["priority"] + vip = ha_config["vip"] + advertised_interval = ha_config["advertised_interval"] + except KeyError, err: + raise Exception("Parameters missing for conntrack configuration " + "%r" % str(err), 400, {"ha_config": ha_config}) + + monitoring_info = dict(monitoring_mac=monitoring_mac, + event_queue_size=queue_size, + cluster_name=cluster_name, + mcast_group=mcast_group, + sync_queue_size=sync_queue_size) + + data_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, + vip=vip, preempt_delay=preempt_delay, + priority=priority, cluster_name=cluster_name, + advertised_interval=advertised_interval) + + return monitoring_info, data_info + + def get_interface_data(self, interface_config): + try: + data_macs = interface_config["data_macs"] + advertised_interval = interface_config["advertised_interval"] + vrrp_group = interface_config["vrrp_group"] + preempt_delay = interface_config["preempt_delay"] + priority = interface_config["priority"] + vip = interface_config["vip"] + except KeyError: + pass + + data_info = dict(data_macs=data_macs, + advertised_interval=advertised_interval, + vrrp_group=vrrp_group, preempt_delay=preempt_delay, + priority=priority, vip=vip) + + return data_info + + def _execute_commands(self, all_commands, tenant_id=None): + session.setup_config_session() + for command in all_commands: + try: + self.set(command.split()) + except: + logger.error("Failed to configure HA. Tenant - %r" % tenant_id) + session.teardown_config_session() + raise Exception("Failed to configure HA for tenant %s" % + tenant_id, 400, {"commands": all_commands, + "failed_command": command}) + try: + session.commit() + except: + logger.error("Failed to commit HA configuration. Tenant - %r" + % tenant_id) + session.discard() + time.sleep(2) + session.teardown_config_session() + raise Exception("Failed to configure HA for tenant %s" % tenant_id, + 400, {"commands": all_commands, + "failed_command": command}) + time.sleep(5) + session.save() + time.sleep(5) + session.teardown_config_session() + + + + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh new file mode 100755 index 0000000000..f2ebd12247 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + + function enumerate_net_interfaces { + + echo `date` `ip addr` >> /var/log/oc/vyos_monitor + echo "\n" + echo `date` `sudo netstat -pantl | grep 8888` >>/var/log/oc/vyos_monitor + } + + enumerate_net_interfaces + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py new file mode 100644 index 0000000000..b40135d752 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py @@ -0,0 +1,55 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import logging +import subprocess + +from vyos_session import utils + +OP_SUCCESS = True +OP_FAILED = False + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +class APIHandler(object): + def __init__(self): + pass + + def run_command(self, command): + proc = subprocess.Popen(command, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + out, err = proc.communicate() + if err: + logger.error("Unable to run command %s, ERROR- %s" % + (command, err)) + return None + return out + + def configure_rsyslog_as_client(self, config): + command = """ + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system syslog host %s facility all level %s + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save + """ %(config['server_ip'], config['log_level']) + + try: + out = self.run_command(command) + return OP_SUCCESS + except Exception as ex: + logger.error("Error while configuring rsyslog as client. %s" % ex) + return OP_FAILED diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py new file mode 100644 index 0000000000..b2963430a0 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py @@ -0,0 +1,357 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +#!/usr/bin/env python +import logging +import json +import netifaces +import time +import fw_constants +import ast +from operations import configOpts +from vyos_session import utils +from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE +from execformat.executor import session + +FWN = 'firewall name' +# oc_fw_identifier = 'oc_fw' +rule = 'rule' +firewall_rules = { + 'protocol': '%s protocol %s', + 'source_ip_address': '%s source address %s', + 'destination_ip_address': '%s destination address %s', + 'source_port': '%s source port %s', + 'destination_port': '%s destination port %s' + } + +firewall_action = {'allow': 'accept', 'deny': 'drop'} + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class OCFWConfigClass(configOpts): + + def __init__(self): + super(OCFWConfigClass, self).__init__() + self.oc_fw_identifier = 'oc_fw' + self.provider_ptg_interfaces = list() + self.rules = list() + + def set_up_rule_on_interfaces(self, firewall): + """ + firewall = {'status': u'PENDING_CREATE', 'name': u'', 'shared': None, + 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', + 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', + 'admin_state_up': True, 'id': u'e9b5ca2f-a721-41b9-be9b-7a6189ddbec5' + , 'firewall_rule_list': [{'protocol': u'tcp', 'description': u'', + 'source_port': None, 'source_ip_address': None, + 'destination_ip_address': None, + 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', + 'position': 1L, 'destination_port': '80', + 'id': u'b98296cb-335a-4314-83f9-aa5654f296fa', 'name': u'', + 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', 'enabled': True, + 'action': u'allow', 'ip_version': 4L, 'shared': False}], + 'description': u''} + + :param firewall: Firewall object + """ + sorted_rule_list, self.provider_ptg_interfaces = list(), list() + + firewall = json.loads(firewall) + fw_rule_list = firewall['firewall_rule_list'] + logger.info("Initiating firewall - %s build. of Tenant: %s" % ( + firewall['id'], firewall['tenant_id'])) + sorted_rule_list = self.sort_rule_list(fw_rule_list, firewall['id']) + try: + self.set_provider_interface(firewall) + except Exception as e: + msg = ("Firewall - %s configuration failed. Tenant : %s Error " + "retrieving PTG's interface %r" % + (firewall['id'], firewall['tenant_id'], str(e))) + logger.error(msg) + raise Exception(msg, 400, dict(config_success=False)) + else: + if not self.provider_ptg_interfaces: + msg = ("No interface was found to configure firewall - %s . " + "Tenant: %s" % + (firewall['id'], firewall['tenant_id'])) + logger.error(msg) + raise Exception(msg, 400, dict(config_success=False)) + + session.setup_config_session() + # FIXME (VK): This will log error also when there is no firewall + # before on the interface. Need to evaluate side effect of this method. + try: + self._ensure_clean_interface() + except: + pass + self.rules = list() + self.add_common_rule() + try: + for fw_rule in sorted_rule_list: + self.create_vyos_fw_rule(fw_rule) + self.configure_interfaces() + for _rule in self.rules: + self.set(_rule.split()) + session.commit() + except Exception as e: + msg = ("Firewall - %s configuration failed. Error: %s " % + (firewall['id'], str(e))) + logger.error(msg) + session.discard() + session.teardown_config_session() + raise Exception(msg, 400, dict(config_success=False)) + else: + msg = "Firewall - %s rules created successfully on %r" % ( + firewall['id'], self.provider_ptg_interfaces) + logger.info(msg) + return {'status': 200, 'config_success': True, 'message': msg} + finally: + session.save() + time.sleep(4) + session.teardown_config_session() + + def add_common_rule(self): + self.oc_fw_identifier = ('oc_fw' + '_' + + self.provider_ptg_interfaces[0]) + default_action = (FWN + ' ' + self.oc_fw_identifier + + ' default-action drop' + ) + common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + + rule + ' 10') + accept_action = (common_fw_rule_prefix + ' action accept') + established_action = (common_fw_rule_prefix + + ' state established enable') + related_action = (common_fw_rule_prefix + + ' state related enable') + self.rules += [default_action, accept_action, established_action, + related_action] + + def create_vyos_fw_rule(self, fw_rule): + if not fw_rule.get('enabled'): + return + + position = str(int(fw_rule.get('position', '100')) + 10) + if position < 1: + position *= 10 + common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + + rule + ' ' + position) + self.rules.append(common_fw_rule_prefix) + self.rules.append(''.join([common_fw_rule_prefix, ' action %s' % + firewall_action[fw_rule['action'.lower()]]]) + ) + try: + self.rules.extend( + [firewall_rules[k] % + (common_fw_rule_prefix, fw_rule[k] + if k not in ['source_port', 'destination_port'] + else fw_rule[k].replace(':', '-')) + for k, v in fw_rule.iteritems() + if fw_rule[k] and k in firewall_rules] + ) + + except Exception as err: + logger.error("Firewall rule retrieval failed . Error - %s" % + str(err)) + raise Exception(err) + + def configure_interfaces(self): + if fw_constants.intercloud: + # TODO(Vikash) Its not always the bridge will have same name every + # time. Its only for intercloud + interface_conf = ("interfaces bridge br0 firewall in name " + + self.oc_fw_identifier) + self.rules += [interface_conf] + else: + # It would be always 1 for now. + for interface in self.provider_ptg_interfaces: + if interface.lower() == 'lo': + continue + interface_conf = ('interfaces ethernet ' + interface + ' ' + + 'firewall out name ' + self.oc_fw_identifier) + self.rules += [interface_conf] + + def reset_firewall(self, firewall): + fw_data = json.loads(firewall) + try: + self.set_provider_interface(fw_data) + except Exception as err: + msg = ("Firewall %s reset failed. Error retrieving PTG's " + "interface- %r" % (fw_data['id'], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + if not self.provider_ptg_interfaces: + msg = ("No interface was found for - %r " % fw_data[ + 'id']) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False, + message="INTERFACE NOT FOUND")) + + session.setup_config_session() + + if fw_constants.intercloud: + bridge_rule = ("interfaces bridge br0 firewall in name " + + self.oc_fw_identifier) + try: + self.delete(bridge_rule.split()) + except Exception as err: + msg = (" Rule deletion on bridge failed - %s " % str( + err)) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + del_interface_rule = ( + 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + + ' ' + 'firewall') + try: + self.delete(del_interface_rule.split()) + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Rule deletion on interface %s failed. ERROR: %s " % + (self.provider_ptg_interfaces[0], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + try: + session.commit() + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Rule deletion commit operation failed for firewall - %s. " + "Error - %s" % (fw_data['id'], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + + # sleep for 2 sec. Got removed in last merge. + time.sleep(2) + self.oc_fw_identifier = ('oc_fw' + '_' + + self.provider_ptg_interfaces[0]) + del_firewall = FWN + ' ' + self.oc_fw_identifier + try: + self.delete(del_firewall.split()) + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Firewall - %s deletion failed on interface: %r .ERROR %s" + % (fw_data['id'], self.provider_ptg_interfaces[0], + str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + try: + session.commit() + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Session commit failed for firewall deletion : %s. " + "Error - %r " % + (fw_data['id'], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + logger.info("Firewall -%r deleted succesfully" % fw_data[ + 'id']) + + session.save() + # Can be removed if we don't see any issue. + time.sleep(1) + session.teardown_config_session() + + return {'status': 200, 'message': 'Firewall - %s deleted ' + 'succesfully' % fw_data['id'], + 'delete_success': True} + + def sort_rule_list(self, fw_rule_list, fw_id): + fw_rule_list_len = len(fw_rule_list) + rule_list = [-1] * fw_rule_list_len + for rule in fw_rule_list: + ind = rule['position'] - 1 + rule_list[ind] = rule + + if -1 in rule_list: + # raise Exception("Something went wrong") + rule_list = list() + logger.warn("Adding only DROP rule as not received any rules for " + "firewall %s" % fw_id) + return rule_list + + def set_provider_interface(self, firewall): + description = ast.literal_eval(firewall["description"]) + if not description.get('provider_ptg_info'): + raise + provider_ptg_info = description["provider_ptg_info"] + # consumer_ptg_ips = description.get('consumer_ptg_ips', []) + interfaces = netifaces.interfaces() + self.provider_ptg_interfaces = list() + for interface in interfaces: + # IPV4 support only + # (Fixme) what in the case of aliasing? + # ip = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] + # TODO (Vikash) Not reqd for L2 , need to revisit for L3 + # vpn tunnel interface for ssl vpn does not have a mac address + physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] + + if mac_addr in provider_ptg_info: + self.provider_ptg_interfaces.append(interface) + + def get_out_and_in_rule(self, fw_rule_list): + in_rule_list = out_rule_list = list() + + for rule in fw_rule_list: + if rule['direction'] == 'in': + in_rule_list.append(rule) + elif rule['direction'] == 'out': + out_rule_list.append(rule) + else: + raise Exception("Not valid direction") + + return in_rule_list, out_rule_list + + def _ensure_clean_interface(self): + del_interface_rule = ( + 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + + ' ' + 'firewall') + self.oc_fw_identifier = ('oc_fw' + '_' + + self.provider_ptg_interfaces[0]) + del_firewall = FWN + ' ' + self.oc_fw_identifier + try: + self.delete(del_interface_rule.split()) + # delete firewall + self.delete(del_firewall.split()) + except Exception as err: + logger.info("Stale firewall rule deletion on interface %s failed. " + "This method is called with every firewall create to " + "avoid previous stale firewall rule. This message can " + "be ignored." % self.provider_ptg_interfaces[0]) + raise Exception(err) + + def run_sshd_on_mgmt_ip(self, mgmt_ip): + command = "service ssh listen-address %s" % mgmt_ip + session.setup_config_session() + self.set(command.split()) + try: + session.commit() + except: + logger.error("Failed to update sshd listen-address to %s" % + mgmt_ip) + session.discard() + session.teardown_config_session() + return + session.save() + session.teardown_config_session() + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py new file mode 100755 index 0000000000..849124a9a2 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py @@ -0,0 +1,65 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +#!/usr/bin/env python + +import sys +import os +import logging +topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." +topdir = os.path.realpath(topdir) +sys.path.insert(0, topdir) +from execformat.executor import execUtils, OperationFailed +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class configOpts(object): + + def __init__(self): + pass + + def set_1(self, args): + exe=execUtils(list(args)) + exe.execmd() + + def delete_1(self, args): + exe=execUtils(list(args)) + exe.execmd() + + def show(self, args): + exe=execUtils(list(args)) + res,output=exe.execmd(nonsession=True) + return res,output + + def set(self, args): + args.insert(0, 'set') + exe=execUtils(list(args)) + try: + exe.execmd() + return True + except OperationFailed, e: + logger.error(e.message) + return False + + def delete(self, args): + args.insert(0, 'delete') + exe=execUtils(list(args)) + try: + exe.execmd() + return True + except OperationFailed, e: + logger.error(e.message) + return False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py new file mode 100644 index 0000000000..28155768fb --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py @@ -0,0 +1,211 @@ +import json +import logging +import netifaces +import subprocess +import netaddr +import time + +from vyos_session import utils + +ROUTING_TABLE_BASE = 10 + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class RoutesConfigHandler(object): + def __init__(self): + super(RoutesConfigHandler, self).__init__() + + def add_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + gateway_ip = route_info['gateway_ip'] + source_interface = self._get_if_name_by_cidr(source_cidr) + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for configuring " + "routes" %(source_interface)) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + ip_rule_command = "ip rule add from %s table %s" %( + source_cidr, routing_table_number) + out1 = subprocess.Popen(ip_rule_command, shell=True, + stdout=subprocess.PIPE).stdout.read() + ip_rule_command = "ip rule add to %s table main" %(source_cidr) + out2 = subprocess.Popen(ip_rule_command, shell=True, + stdout=subprocess.PIPE).stdout.read() + ip_route_command = "ip route add table %s default via %s" %( + routing_table_number, gateway_ip) + out3 = self._add_default_route_in_table(ip_route_command, + routing_table_number) + output = "%s\n%s\n%s" %(out1, out2, out3) + logger.info("Static route configuration result: %s" %(output)) + return json.dumps(dict(status=True)) + + def _del_default_route_in_table(self, table): + route_del_command = "ip route del table %s default" %(table) + command_pipe = subprocess.Popen(route_del_command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Deleting default route failed: %s" %(err)) + + def _add_default_route_in_table(self, route_cmd, table): + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0: + if "File exists" in err: + self._del_default_route_in_table(table) + else: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + def _delete_ip_rule(self, cidr): + count = 0 + for direction in ["from", "to"]: + ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + while True: + command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0 and "No such file" in err: + break + else: + count = count + 1 + if count >= 10: + logger.error("Deleting policy based routing for CIDR: " + "%s not completed even after 10 attempts" + %(cidr)) + break + + def _del_default_route_in_table(self, table): + route_del_command = "ip route del table %s default" %(table) + command_pipe = subprocess.Popen(route_del_command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Deleting default route failed: %s" %(err)) + + def _add_default_route_in_table(self, route_cmd, table): + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0: + if "File exists" in err: + self._del_default_route_in_table(table) + else: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + def _delete_ip_rule(self, cidr): + count = 0 + for direction in ["from", "to"]: + ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + while True: + command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0 and "No such file" in err: + break + else: + count = count + 1 + if count >= 10: + logger.error("Deleting policy based routing for CIDR: " + "%s not completed even after 10 attempts" + %(cidr)) + break + + # REVISIT(Magesh): There may be a chance that there are duplicate rules + # May have to do a list and cleanup multiple entries + def delete_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + source_interface = self._get_if_name_by_cidr(source_cidr) + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for deleting routes" + %(source_interface)) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + self._delete_ip_rule(source_cidr) + ip_route_command = "ip route del table %s default" %( + routing_table_number) + out = subprocess.Popen(ip_route_command, shell=True, + stdout=subprocess.PIPE).stdout.read() + logger.info("Static route delete result: %s" %(out)) + return json.dumps(dict(status=True)) + + def _get_if_name_by_cidr(self, cidr): + interfaces = netifaces.interfaces() + retry_count = 0 + while True: + all_interfaces_have_ip = True + for interface in interfaces: + inet_list = netifaces.ifaddresses(interface).get( + netifaces.AF_INET) + if not inet_list: + all_interfaces_have_ip = False + for inet_info in inet_list or []: + netmask = inet_info.get('netmask') + ip_address = inet_info.get('addr') + subnet_prefix = cidr.split("/") + if (ip_address == subnet_prefix[0] and + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + return interface + ip_address_netmask = '%s/%s' %(ip_address, netmask) + interface_cidr = netaddr.IPNetwork(ip_address_netmask) + if str(interface_cidr.cidr) == cidr: + return interface + # Sometimes the hotplugged interface takes time to get IP + if not all_interfaces_have_ip: + if retry_count < 10: + time.sleep(3) + retry_count = retry_count + 1 + continue + else: + raise Exception("Some of the interfaces do not have " + "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py new file mode 100644 index 0000000000..d9cd383db8 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py @@ -0,0 +1,57 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import signal +import logging +import sys +from vyos_session.utils import init_logger + + +logger = logging.getlogger(__name__) +init_logger(logger) + + +class OCVyOSServer(object): + def __init__(self): + pass + + + +def handler(signum, frame): + if signum in [2, 3, 11, 15]: + logger.info(" Recieved signal: %r. Thus exiting " % signum) + sys.exit() + else: + logger.info(" Caught singal: %r. Ignoring " % signum) + + +def main(argv): + vyos_server = OCVyOSServer() + host = '' + port = 0 + if len(argv) != 5: + print "server.py -h -p " + sys.exit(2) + + # Review - OSM: We should accept -h -p in any order. + if argv[1] == '-h': + host = argv[2] + if argv[3] == '-p': + port = int(argv[4]) + signal.signal(signal.SIGTERM, handler) + signal.signal(signal.SIGINT, handler) + vyos_server.start(vyos_server.server, host, port) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py new file mode 100644 index 0000000000..53b0fdeff5 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py @@ -0,0 +1,560 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import sys +import os +import json +import signal +import logging +import ast +import time +from os.path import abspath, dirname + +import netifaces + +sys.path.insert(0, dirname(dirname(abspath(__file__)))) +from vyos_session.utils import init_logger +from oc_fw_module import OCFWConfigClass +from edit_persistent_rule import EditPersistentRule +from static_ip import StaticIp +from flask import Flask, request +from os.path import abspath, dirname +from vpn_api_server import VPNHandler as vpnhandler +from vyos_policy_based_routes import RoutesConfigHandler as routes_handler +from ha_config import VYOSHAConfig +from vyos_exception import OCException +from flask import jsonify +from log_forwarder import APIHandler as apihandler +from stats_parser import APIHandler as stats_apihandler +# sys.path.insert(0, dirname(dirname(abspath(__file__)))) +# sys.path.insert(0, (abspath(__file__))) + +logger = logging.getLogger(__name__) +init_logger(logger) + +app = Flask(__name__) + +oc_fw_module = None +e = EditPersistentRule() + +error_msgs = { + 'unexpected': 'Unexpected VYOS ERROR occurred while %s %s ' +} + + +@app.route('/auth-server-config', methods=['POST']) +def auth_server_config(): + data = json.loads(request.data) + f = open("/usr/share/vyos-oc/auth_server.conf", 'w') + f.write(data['auth_uri']) + f.write('\n') + f.write(data['admin_tenant_name']) + f.write('\n') + f.write(data['admin_user']) + f.write('\n') + f.write(data['admin_password']) + f.write('\n') + f.write(data['remote_vpn_role_name']) + f.write("\n") + f.write(data['project_id']) + f.write("\n") + + try: + host_ip = data['host_mapping'].split()[0]+"/32" + command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + gateway_ip = os.popen(command).read().strip().strip("'") + status = vpnhandler().configure_static_route("set", host_ip, gateway_ip) + + except Exception as ex: + err = ("Error in adding rvpn route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + try: + if data['host_mapping'].split()[1]: + os.system("sudo chown vyos:users /etc/hosts") + os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) + os.system("sudo chown root:root /etc/hosts") + #with open('/etc/hosts', 'a') as hosts: + # hosts.write(data['host_mapping']) + except Exception as e: + logger.error("Error in writing host mapping in /etc/hosts - %s" % e) + + return json.dumps(dict(status=True)) + + +@app.route('/create-ipsec-site-conn', methods=['POST']) +def create_ipsec_site_conn(): + """ + Open a "configure" session with vyos + "Set" all the parameters + "commit" the changes + """ + try: + data = json.loads(request.data) + status = vpnhandler().create_ipsec_site_conn(data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = "Error in configuring ipsec_site_conection. Reason: %s" % ex + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/create-ipsec-site-tunnel', methods=['POST']) +def create_ipsec_site_tunnel(): + """ + Open a "configure" session with vyos + "Set" all the parameters + "commit" the changes + """ + try: + tunnel = json.loads(request.data) + pcidrs = tunnel['peer_cidrs'] + for pcidr in pcidrs: + tunnel['peer_cidr'] = pcidr + status = vpnhandler().create_ipsec_site_tunnel(tunnel) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in configuring ipsec_site_tunnel. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ipsec-site-tunnel', methods=['DELETE']) +def delete_ipsec_site_tunnel(): + try: + pcidrs = request.args.get('peer_cidrs') + peer_address = request.args.get('peer_address') + local_cidr = request.args.get('local_cidr') + pcidrs = ast.literal_eval(pcidrs) + for pcidr in pcidrs: + tunnel = {} + tunnel['peer_address'] = peer_address + tunnel['local_cidr'] = local_cidr + tunnel['peer_cidr'] = pcidr + status = vpnhandler().delete_ipsec_site_tunnel(tunnel) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in deleting ipsec_site_tunnel. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ipsec-site-conn', methods=['DELETE']) +def delete_ipsec_site_conn(): + try: + peer_address = request.args.get('peer_address') + status = vpnhandler().delete_ipsec_site_conn(peer_address) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in deleting ipsec_site_connection. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/get-ipsec-site-tunnel-state', methods=['GET']) +def get_ipsec_site_tunnel_state(): + try: + peer_address = request.args.get('peer_address') + lcidr = request.args.get('local_cidr') + pcidr = request.args.get('peer_cidr') + tunnel = {} + tunnel['peer_address'] = peer_address + tunnel['local_cidr'] = lcidr + tunnel['peer_cidr'] = pcidr + status, state = vpnhandler().get_ipsec_site_tunnel_state(tunnel) + return json.dumps(dict(state=state)) + except Exception as ex: + err = ("Error in get_ipsec_site_tunnel_state. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/create-ssl-vpn-conn', methods=['POST']) +def create_ssl_vpn_conn(): + try: + data = json.loads(request.data) + status = vpnhandler().create_ssl_vpn_conn(data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in create_ssl_vpn_connection. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/ssl-vpn-push-route', methods=['POST']) +def ssl_vpn_push_route(): + try: + data = json.loads(request.data) + status = vpnhandler().ssl_vpn_push_route(data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in ssl_vpn_push_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ssl-vpn-conn', methods=['DELETE']) +def delete_ssl_vpn_conn(): + try: + tunnel_name = request.args.get('tunnel') + status = vpnhandler().delete_ssl_vpn_conn(tunnel_name) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_ssl_vpn_conn. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ssl-vpn-route', methods=['DELETE']) +def delete_ssl_vpn_route(): + try: + route = request.args.get('route') + status = vpnhandler().delete_ssl_vpn_route(route) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_ssl_vpn_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/get-ssl-vpn-conn-state', methods=['GET']) +def get_ssl_vpn_conn_state(): + try: + tunnel_name = request.args.get('tunnel') + status, state = vpnhandler().get_ssl_vpn_conn_state(tunnel_name) + return json.dumps(dict(status=status, state=state)) + except Exception as ex: + err = ("Error in get_ssl_vpn_conn_state. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/configure-firewall-rule', methods=['POST']) +def configure_firewall_rule(): + global oc_fw_module + firewall_data = request.data + try: + response = oc_fw_module.set_up_rule_on_interfaces(firewall_data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'configuring', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/delete-firewall-rule', methods=['DELETE']) +def delete_firewall_rule(): + global oc_fw_module + try: + response = oc_fw_module.reset_firewall(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'deleting', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/update-firewall-rule', methods=['PUT']) +def update_firewall_rule(): + global oc_fw_module + try: + oc_fw_module.reset_firewall(request.data) + response = oc_fw_module.set_up_rule_on_interfaces(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'updating', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/add-source-route', methods=['POST']) +def add_source_route(): + try: + return routes_handler().add_source_route(request.data) + except Exception as ex: + err = ("Exception in adding source route. %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-source-route', methods=['DELETE']) +def delete_source_route(): + try: + return routes_handler().delete_source_route(request.data) + except Exception as ex: + err = ("Exception in deleting source route. %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/add-stitching-route', methods=['POST']) +def add_stitching_route(): + try: + gateway_ip = json.loads(request.data).get('gateway_ip') + status = vpnhandler().configure_static_route("set", "0.0.0.0/0", gateway_ip) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in add_stitching_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-stitching-route', methods=['DELETE']) +def delete_stitching_route(): + try: + gateway_ip = request.args.get('gateway_ip') + status = vpnhandler().configure_static_route( + "delete", "0.0.0.0/0", gateway_ip) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_stitching_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/configure_conntrack_sync', methods=['POST']) +def configure_conntrack_sync(): + global vyos_ha_config + try: + response = vyos_ha_config.configure_conntrack_sync(request.data) + except Exception as err: + # This flask version has issue in implicit way of registering + # error handler. + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'configuring', 'conntrack sync')))) + else: + return jsonify(**response) + + +@app.route('/configure_interface_ha', methods=['POST']) +def configure_interface_ha(): + global vyos_ha_config + try: + response = vyos_ha_config.set_vrrp_for_interface(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict( + err=error_msgs['unexpected'] % ( + 'configuring', 'HA for the interface')))) + else: + return jsonify(**response) + + +@app.route('/delete_vrrp', methods=['DELETE']) +def delete_vrrp(): + global vyos_ha_config + try: + response = vyos_ha_config.delete_vrrp(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'deleting', 'VRRP')))) + else: + return jsonify(**response) + + +# @app.errorhandler(OCException) +def send_error_response(error): + response = jsonify(error.to_dict()) + response.status_code = error.status_code + return response + + +@app.route('/add_static_ip', methods=['POST']) +def add_static_ip(): + try: + static_ip_obj = StaticIp() + data = json.loads(request.data) + static_ip_obj.configure(data) + except Exception as err: + msg = ("Error adding static IPs for hotplugged interfaces. " + "Data: %r. Error: %r" % (data, str(err))) + logger.error(msg) + return json.dumps(dict(status=False, reason=msg)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/del_static_ip', methods=['DELETE']) +def del_static_ip(): + try: + static_ip_obj = StaticIp() + data = json.loads(request.data) + static_ip_obj.clear(data) + except Exception as err: + msg = ("Error clearing static IPs for hotplugged interfaces. " + "Data: %r. Error: %r" % (data, str(err))) + logger.error(msg) + return json.dumps(dict(status=False, reason=msg)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/add_rule', methods=['POST']) +def add_rule(): + # configuring sshd to listen on management ip address + ip_addr = get_interface_to_bind() + oc_fw_module.run_sshd_on_mgmt_ip(ip_addr) + + data = json.loads(request.data) + try: + EditPersistentRule.add(e, data) + except Exception as err: + logger.error("Error adding persistent rule %r" % str(err)) + return json.dumps(dict(status=False)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/delete_rule', methods=['DELETE']) +def del_rule(): + data = json.loads(request.data) + try: + EditPersistentRule.delete(e, data) + except Exception as err: + logger.error("Error deleting persistent rule %r" % str(err)) + return json.dumps(dict(status=False)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/configure-rsyslog-as-client', methods=['POST']) +def configure_rsyslog_as_client(): + try: + config_data = json.loads(request.data) + status = apihandler().configure_rsyslog_as_client(config_data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error while conifiguring rsyslog client. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + +@app.route('/get-fw-stats', methods=['GET']) +def get_fw_stats(): + try: + mac_address = request.args.get('mac_address') + fw_stats = stats_apihandler().get_fw_stats(mac_address) + return json.dumps(dict(stats=fw_stats)) + except Exception as ex: + err = ("Error while getting firewall stats. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + +@app.route('/get-vpn-stats', methods=['GET']) +def get_vpn_stats(): + try: + vpn_stats = stats_apihandler().get_vpn_stats() + return json.dumps(dict(stats=vpn_stats)) + except Exception as ex: + err = ("Error while getting vpn stats. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +def handler(signum, frame): + if signum in [2, 3, 9, 11, 15]: + sys.exit(0) + else: + pass + + +def add_management_pbr(): + command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + gateway_ip = os.popen(command).read().strip().strip("'") + command = 'grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + src_ip = os.popen(command).read().strip().strip("'") + routes_info = [{'source_cidr': src_ip, 'gateway_ip': gateway_ip}] + routes_handler().add_source_route(json.dumps(routes_info)) + + +def getipaddr(): + # This is an assumption that service management will always gets + # configured on eth0 interface. + return netifaces.ifaddresses('eth0')[2][0]['addr'] + + +def get_interface_to_bind(): + while True: + try: + ip_addr = getipaddr() + logger.info("Management interface up on - %r " % + ''.join([netifaces.ifaddresses('eth0')[17][0][ + 'addr'][:2], + netifaces.ifaddresses('eth0')[17][0][ + 'addr'][-2:], + netifaces.ifaddresses('eth0')[2][0][ + 'addr'].split('.')[-1] + ])) + except ValueError: + logger.error("Management Interface not UP") + time.sleep(5) + except KeyError: + logger.error("Management Interface not FOUND") + time.sleep(5) + else: + break + return ip_addr + + +def main(): + """ + + :type ip_addr: Server listen address + """ + global oc_fw_module, vyos_ha_config + oc_fw_module = OCFWConfigClass() + vyos_ha_config = VYOSHAConfig() + ip_addr = get_interface_to_bind() + signal.signal(signal.SIGTERM, handler) + signal.signal(signal.SIGINT, handler) + app.run(ip_addr, 8888) + logger.info("VYOS Agent started ..... ") + + +if __name__ == '__main__': + main() + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py new file mode 100644 index 0000000000..223f55407a --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py @@ -0,0 +1,149 @@ + +import logging +import netifaces +import time + +from netifaces import AF_LINK +from operations import configOpts +from execformat.executor import session +from vyos_session.utils import init_logger + +logger = logging.getLogger(__name__) +init_logger(logger) + +COMMAND = "interfaces ethernet %s address %s/%s" + +""" Implements attachment and detachment of fixed IPs to + hot-plugged interfaces based on IP and MAC binding. + +""" + + +class StaticIp(configOpts): + def __init__(self): + self.hotplug_timeout = 25 + + def save(self): + retries = 100 + while retries: + try: + session.commit() + session.save() + time.sleep(3) + session.teardown_config_session() + return + except Exception: + time.sleep(0.1) + retries -= 1 + + def discard(self): + session.discard() + time.sleep(3) + session.teardown_config_session() + + def check_if_interface_is_up(self, pip, sip): + start_time = time.time() + while time.time() - start_time < self.hotplug_timeout: + interfaces = netifaces.interfaces() + if (pip in interfaces and sip in interfaces): + return True + time.sleep(2) + return False + + def _get_interface_name(self, interface_mac): + interfaces = netifaces.interfaces() + + for interface in interfaces: + if netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] == interface_mac: + return interface + + + def configure(self, data): + try: + session.setup_config_session() + ip_mac_map = {} + provider_ip = data['provider_ip'] + provider_mac = data['provider_mac'] + provider_cidr = data['provider_cidr'].split('/')[1] + provider_interface = self._get_interface_name(provider_mac) + + stitching_ip = data['stitching_ip'] + stitching_mac = data['stitching_mac'] + stitching_cidr = data['stitching_cidr'].split('/')[1] + stitching_interface = self._get_interface_name(stitching_mac) + + if not self.check_if_interface_is_up(provider_interface, + stitching_interface): + msg = ("Interfaces are not hotplugged even after waiting " + "for %s seconds." % self.hotplug_timeout) + raise Exception(msg) + + interfaces = netifaces.interfaces() + self.provider_ptg_interfaces = list() + for interface in interfaces: + physical_interface = netifaces.ifaddresses( + interface).get(AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses( + interface)[AF_LINK][0]['addr'] + if 'eth' in interface: + ip_mac_map.update({interface: mac_addr}) + + for (interface, mac_addr) in ip_mac_map.iteritems(): + if provider_mac == mac_addr: + set_ip = COMMAND % (interface, provider_ip, provider_cidr) + elif stitching_mac == mac_addr: + set_ip = COMMAND % (interface, + stitching_ip, stitching_cidr) + else: + continue + result = self.set(set_ip.split()) + logger.debug("Result of add static ip is %s." % result) + self.save() + except Exception as err: + msg = ("Failed to set static IP. Error: %s" % err) + logger.error(msg) + self.discard() + raise Exception(err) + + def clear(self, data): + try: + session.setup_config_session() + ip_mac_map = {} + provider_ip = data['provider_ip'] + provider_mac = data['provider_mac'] + provider_cidr = data['provider_cidr'].split('/')[1] + + stitching_ip = data['stitching_ip'] + stitching_mac = data['stitching_mac'] + stitching_cidr = data['stitching_cidr'].split('/')[1] + + interfaces = netifaces.interfaces() + self.provider_ptg_interfaces = list() + for interface in interfaces: + physical_interface = netifaces.ifaddresses( + interface).get(AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses( + interface)[AF_LINK][0]['addr'] + if 'eth' in interface: + ip_mac_map.update({interface: mac_addr}) + + for (interface, mac_addr) in ip_mac_map.iteritems(): + if provider_mac == mac_addr: + del_ip = COMMAND % (interface, provider_ip, provider_cidr) + elif stitching_mac == mac_addr: + del_ip = COMMAND % (interface, + stitching_ip, stitching_cidr) + else: + continue + result = self.delete(del_ip.split()) + logger.debug("Result of delete static IP is %s." % result) + self.save() + except Exception as err: + msg = ("Failed to delete static IP. Error: %s." % err) + logger.error(msg) + self.discard() + raise Exception(msg) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py new file mode 100644 index 0000000000..4272ce4d91 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py @@ -0,0 +1,336 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import logging +import subprocess +import netifaces + +from netifaces import AF_LINK +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +class APIHandler(object): + def __init__(self): + pass + + def run_command(self, command): + proc = subprocess.Popen(command, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + out, err = proc.communicate() + if err: + logger.error("Unable to run command %s, ERROR- %s" % + (command, err)) + return None + return out + + def _get_interface_name(self, interface_mac): + interfaces = netifaces.interfaces() + + for interface in interfaces: + try: + mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] + if mac_addr == interface_mac: + return interface + + except KeyError as keyerr: + logger.error('Unable to Parse Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + return None + + def parse_firewall_stats(self, interface, raw_stats): + """ + sample data for command show_firewall_detail.xsl : + + IPv4 Firewall "oc_fw_eth1": + + Active on (eth1,OUT) + + rule action proto packets bytes + ---- ------ ----- ------- ----- + 11 accept tcp 476405 24805598 + condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:22 + + 12 accept icmp 1222414 101692572 + condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 + + 13 drop udp 150770055788 DROP + condition - saddr 11.0.2.0/24 daddr /* + + 14 accept tcp 3589762 238449000 + condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:80 + + 10000 drop all 0 0 + condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 + + """ + firewall = {} + firewalls = [] + firewall_start = False + table = False + status = None + rule_keys = ['rulepriority', 'packets', 'bytes', 'action', + 'source', 'destination'] + + try: + for line in raw_stats.split('\n'): + words = line.split() + if 'IPv4 Firewall' in line: + firewall_start = True + if 'Active on' in line and interface in line and firewall_start: + status = "Active" + (interface, direction) = words[2][1:-1].split(',') + firewall['interface'] = interface + firewall['dir'] = direction + firewall['rules'] = [] + elif len(words) >= 4: + if words[3] in ['ACCEPT', 'DROP'] and status == "Active": + table = True + rule = dict(zip(rule_keys, words)) + firewall['rules'].append(rule) + elif table and status == "Active": + command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + + '/opt/vyatta/share/xsl/show_firewall_detail.xsl') + show_fw_data = self.run_command(command) + firewall = self.add_protocol_and_dest_port_info(firewall, show_fw_data) + logger.info("packed firewall \n %s" % firewall) + firewalls.append(firewall) + break + + except KeyError as keyerr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return firewalls + + def add_protocol_and_dest_port_info(self, firewall, show_fw_data): + firewall_started = False + firewall_info_started = False + firewall_matcher = "Active on (" + firewall['interface'] + firewall_info_end = "-------------" + firewall_info = [] + for line in show_fw_data.split('\n'): + if "IPv4 Firewall" in line: + firewall_started = True + if firewall_matcher in line: + firewall_info_started = True + if firewall_started and firewall_info_started: + firewall_info.append(line) + if firewall_started and firewall_info_started and firewall_info_end in line: + break + try: + for rule in firewall.get('rules', []): + for index, stats in enumerate(firewall_info): + if stats is not '': + extract_stats = stats.split() + if rule['rulepriority'] in extract_stats[0]: + rule['protocol'] = extract_stats[2] + for key in firewall_info[index + 1].split(): + if "dpt:" in key: + rule['dest_port'] = key.split(':')[1] + break + break + + except KeyError as keyerr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return firewall + + def parse_vpn_s2s(self, raw_stats): + """ + sample data for command show-ipsec-sa-detail : + + Peer IP: 192.168.20.194 + Peer ID: 120.0.0.2 + Local IP: 91.0.0.11 + Local ID: 91.0.0.11 + NAT Traversal: no + NAT Source Port: n/a + NAT Dest Port: n/a + + Tunnel 1: + State: up + Inbound SPI: c6621bd8 + Outbound SPI: cbf2ab18 + Encryption: aes128 + Hash: sha1 + PFS Group: 5 + + Local Net: 90.0.0.0/24 + Local Protocol: all + Local Port: all + + Remote Net: 120.0.0.0/24 + Remote Protocol: all + Remote Port: all + + Inbound Bytes: 654.0 + Outbound Bytes: 504.0 + Active Time (s): 289 + Lifetime (s): 1800 + + """ + s2s_connection = {} + s2s_connections = [] + + try: + for line in raw_stats.split('\n'): + key = '' + value = '' + if ':' in line: + key,value = line.split(":") + + if 'Peer IP' in key: + s2s_connection['peerip'] = value.strip(" \t\n\r") + + elif 'Local IP' in key: + s2s_connection['localip'] = value.strip(" \t\n\r") + + elif "Tunnel" in key: + s2s_connection['tunnels'] = [] + tunnel_info = { 'tunnel' : + key.strip(" \t\n\r").split(" ")[-1] } + + elif "Inbound Bytes" in key: + tunnel_info['in'] = value.strip(" \t\n\r") + + elif "Outbound Bytes" in key: + tunnel_info['out'] = value.strip(" \t\n\r") + s2s_connection['tunnels'].append(tunnel_info) + s2s_connections.append(s2s_connection) + s2s_connection = {} + + except KeyError as keyerr: + logger.error('Unable to Parse IPSec VPN Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse IPSec VPN Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return s2s_connections + + def parse_vpn_remote(self, raw_stats): + """ + sample data for command vyatta-show-ovpn.pl --mode=server : + + OpenVPN server status on vtun0 [] + + Client CN Remote IP Tunnel IP TX byte RX byte Connected Since + --------- --------- --------- ------- ------- --------------- + UNDEF 192.168.2.81 192.168.200.4 8.0K 2.7K Tue Mar 8 09:01:05 2016 + """ + table = False + remote_connection = {} + remote_connections = [] + keys = ['clientCN', 'remoteip', 'tunnelip', 'in', 'out', 'connected_since'] + + try: + for line in raw_stats.split('\n'): + if "Client CN" in line: + table = True + elif len(line.split()) >= 5 and table and "---" not in line: + value_list = line.split()[:-5] + connected_since = " ".join(line.split()[5:]) + clients = filter(lambda value: value.strip(), value_list) + clients.append(connected_since) + remote_connection = dict(zip(keys, clients)) + remote_connections.append(remote_connection) + + except KeyError as keyerr: + logger.error('Unable to Parse Remote VPN Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse Remote VPN Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return remote_connections + + def get_fw_stats(self, mac_address): + """ + sample data for command show_firewall_statistics.xsl : + + IPv4 Firewall "oc_fw_eth1": + + Active on (eth1,OUT) + + rule packets bytes action source destination + ---- ------- ----- ------ ------ ----------- + 11 476.22K 24.80M ACCEPT 11.0.1.0/24 11.0.2.0/24 + 12 1.22M 101.66M ACCEPT 11.0.1.0/24 11.0.2.0/24 + 13 3.43G 150.73G DROP 11.0.1.0/24 11.0.2.0/24 + 14 3.59M 238.39M ACCEPT 11.0.1.0/24 11.0.2.0/24 + 10000 0 0 DROP 0.0.0.0/0 0.0.0.0/0 + + """ + interface = None + parsed_stats = {} + + command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + + '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') + + raw_stats = self.run_command(command) + interface = self._get_interface_name(mac_address) + if not interface: + logger.error('No interface available for mac address: %s' % + mac_address) + return parsed_stats + parsed_stats = self.parse_firewall_stats(interface, raw_stats) + + logger.info("Firewall stats Data, \n %s" % parsed_stats) + return parsed_stats + + def get_vpn_stats(self): + vpn_parsed_data = {} + command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-op-vpn.pl ' + + '--show-ipsec-sa-detail') + + raw_ipsec_stats = self.run_command(command) + if raw_ipsec_stats: + ipsec_parsed_data = self.parse_vpn_s2s(raw_ipsec_stats) + if ipsec_parsed_data: + vpn_parsed_data['ipsec'] = ipsec_parsed_data + else: + logger.warning("Empty IPSec VPN Stats") + else: + logger.warning("Empty IPSec VPN Stats") + + command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-show-ovpn.pl ' + + '--mode=server') + + raw_remote_stats = self.run_command(command) + if raw_remote_stats: + remote_parsed_data = self.parse_vpn_remote(raw_remote_stats) + if remote_parsed_data: + vpn_parsed_data['remote'] = remote_parsed_data + else: + logger.warning("Empty Remote VPN Stats") + else: + logger.warning("Empty Remote VPN Stats") + + logger.info("VPN stats Data, \n %s" % vpn_parsed_data) + return vpn_parsed_data diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py new file mode 100644 index 0000000000..e4f7c28c18 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py @@ -0,0 +1,461 @@ +#!/usr/bin/env python +import logging +import json +import netifaces +import netaddr +import socket +import fcntl +import struct +import array +import time +import ast +import copy +import subprocess +import os +from netaddr import IPNetwork, IPAddress +from operations import configOpts +from vyos_session import utils +from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE +#from vyos_session.configsession import ConfigSession as session +from execformat.executor import session + +OP_SUCCESS = True +OP_FAILED = False + +OP_COMMAND_SCRIPT = "/usr/share/vyos-oc/vpn_op_commands.pl" + +IPSEC_SITE2SITE_COMMANDS = { + 'ike': [ + 'set vpn ipsec ike-group %s proposal 1', + 'set vpn ipsec ike-group %s proposal 1 encryption %s', + 'set vpn ipsec ike-group %s proposal 1 hash %s', + 'set vpn ipsec ike-group %s proposal 2 encryption %s', + 'set vpn ipsec ike-group %s proposal 2 hash %s', + 'set vpn ipsec ike-group %s lifetime %d', + 'set vpn ipsec ike-group %s dead-peer-detection action restart', + 'set vpn ipsec ike-group %s dead-peer-detection interval %s', + 'set vpn ipsec ike-group %s dead-peer-detection timeout %s'], + 'esp': [ + 'set vpn ipsec esp-group %s proposal 1', + 'set vpn ipsec esp-group %s proposal 1 encryption %s', + 'set vpn ipsec esp-group %s proposal 1 hash %s', + 'set vpn ipsec esp-group %s proposal 2 encryption %s', + 'set vpn ipsec esp-group %s proposal 2 hash %s', + 'set vpn ipsec esp-group %s lifetime %d', + 'set vpn ipsec auto-update 60'], + 'conn': [ + 'set vpn ipsec ipsec-interfaces interface %s', + 'set vpn ipsec site-to-site peer %s \ + authentication mode pre-shared-secret', + 'set vpn ipsec site-to-site peer %s \ + authentication pre-shared-secret %s', + 'set vpn ipsec site-to-site peer %s default-esp-group %s', + 'set vpn ipsec site-to-site peer %s ike-group %s', + 'set vpn ipsec site-to-site peer %s local-address %s', + 'set vpn ipsec site-to-site peer %s authentication remote-id %s', + 'set vpn ipsec site-to-site peer %s tunnel %d local prefix %s', + 'set vpn ipsec site-to-site peer %s tunnel %d remote prefix %s', + 'set vpn ipsec site-to-site peer %s authentication id %s'], + 'delete': [ + 'delete vpn ipsec site-to-site peer %s', + 'delete vpn ipsec site-to-site peer %s tunnel %s', + 'delete vpn ipsec'], + 'show': [ + 'show vpn ipsec sa peer %s']} + +SSL_VPN_COMMANDS = { + 'create': [ + 'set interfaces openvpn %s', + 'set interfaces openvpn %s mode server', + 'set interfaces openvpn %s server subnet %s', + 'set interfaces openvpn %s tls ca-cert-file /config/auth/ca.crt', + 'set interfaces openvpn %s tls cert-file /config/auth/server.crt', + 'set interfaces openvpn %s tls dh-file /config/auth/dh.pem', + 'set interfaces openvpn %s tls key-file /config/auth/server.key', + 'set interfaces openvpn %s server push-route %s', + 'set interfaces openvpn %s openvpn-option \ + "--client-cert-not-required --script-security 3 \ + --auth-user-pass-verify /usr/share/vyos-oc/auth_pam.pl via-file"'], + #'set interfaces openvpn %s local-host %s'], + 'delete': [ + 'delete interfaces openvpn %s', + 'delete interfaces openvpn vtun0 server push-route %s']} + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class NoInterfaceOnCidr(Exception): + def __init__(self, **kwargs): + self.message = _("No interface in the network '%(cidr)s'") % kwargs + + +class VPNHandler(configOpts): + def __init__(self): + super(VPNHandler, self).__init__() + + def create_ipsec_site_conn(self, ctx): + session.setup_config_session() + siteconn = ctx['siteconns'][0] + self._create_ike_group(siteconn['ikepolicy'], + siteconn['connection']['dpd']) + self._create_esp_group(siteconn['ipsecpolicy']) + self._create_ipsec_site_conn(ctx) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def create_ipsec_site_tunnel(self, tunnel): + session.setup_config_session() + self._create_ipsec_site_tunnel(tunnel) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def _ipsec_get_tunnel_idx(self, tunnel): + command = 'perl' + command += " " + OP_COMMAND_SCRIPT + command += " " + 'get_ipsec_tunnel_idx' + command += " " + tunnel['peer_address'] + command += " " + tunnel['local_cidr'] + command += " " + tunnel['peer_cidr'] + proc = subprocess.Popen( + command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + tunidx = out.split('=')[1] + return int(tunidx) + + def _ipsec_get_tunnel_count(self, tunnel): + command = 'perl' + command += " " + OP_COMMAND_SCRIPT + command += " " + 'get_ipsec_tunnel_count' + command += " " + tunnel['peer_address'] + proc = subprocess.Popen( + command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + tuncount = out.split('=')[1] + return int(tuncount) + + def delete_ipsec_site_tunnel(self, tunnel): + try: + session.setup_config_session() + self._delete_ipsec_site_tunnel(tunnel) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + except Exception as ex: + logger.error("Error in deleting ipsec site tunnel. %s" % ex) + return OP_FAILED + + def delete_ipsec_site_conn(self, peer_address): + try: + session.setup_config_session() + self._delete_ipsec_site_conn(peer_address) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + except Exception as ex: + logger.error("Error in deleting ipsec site connection. %s" % ex) + return OP_FAILED + + def create_ssl_vpn_conn(self, ctx): + session.setup_config_session() + self._create_ssl_vpn_conn(ctx) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def ssl_vpn_push_route(self, route): + session.setup_config_session() + self._ssl_vpn_push_route(route) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def delete_ssl_vpn_conn(self, tunnel): + session.setup_config_session() + self._delete_ssl_vpn_conn(tunnel) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def delete_ssl_vpn_route(self, route): + session.setup_config_session() + self._delete_ssl_vpn_route(route) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def get_ssl_vpn_conn_state(self, peer_address): + return OP_SUCCESS, 'UP' + + def get_ipsec_site_tunnel_state(self, tunnel): + tunidx = self._ipsec_get_tunnel_idx(tunnel) + command = 'perl' + command += " " + OP_COMMAND_SCRIPT + command += " " + 'get_ipsec_tunnel_state' + command += " " + tunnel['peer_address'] + command += " " + str(tunidx) + proc = subprocess.Popen( + command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + state = out.split('=')[1] + state = state[:-1] + return OP_SUCCESS, state + + def _delete_ipsec_site_tunnel(self, tunnel): + tunidx = self._ipsec_get_tunnel_idx(tunnel) + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + cmd = cmds['delete'][1] + + cmd = cmd % (tunnel['peer_address'], tunidx) + + self._set_commands([cmd]) + + def _delete_ipsec_site_conn(self, peer_address): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + #cmd = cmds['delete'][0] + + #cmd = cmd % peer_address + cmd = cmds['delete'][2] + + self._set_commands([cmd]) + + def _delete_ssl_vpn_conn(self, tunnel): + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + cmd = cmds['delete'][0] + + cmd = cmd % tunnel + + self._set_commands([cmd]) + + def _delete_ssl_vpn_route(self, route): + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + cmd = cmds['delete'][1] + cmd = cmd % route + self._set_commands([cmd]) + + def _set_commands(self, cmds): + for cmd in cmds: + print cmd + self.set_1(cmd.split(' ')) + + def _create_ike_group(self, ike, dpd): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + ike_cmds = cmds['ike'] + + ike_cmds[0] = ike_cmds[0] % (ike['name']) + ike_cmds[1] = ike_cmds[1] % (ike['name'], ike['encryption_algorithm']) + ike_cmds[2] = ike_cmds[2] % (ike['name'], ike['auth_algorithm']) + ike_cmds[3] = ike_cmds[3] % (ike['name'], ike['encryption_algorithm']) + ike_cmds[4] = ike_cmds[4] % (ike['name'], ike['auth_algorithm']) + ike_cmds[5] = ike_cmds[5] % (ike['name'], ike['lifetime']['value']) + ike_cmds[6] = ike_cmds[6] % ike['name'] + ike_cmds[7] = ike_cmds[7] % (ike['name'], dpd['interval']) + ike_cmds[8] = ike_cmds[8] % (ike['name'], dpd['timeout']) + self._set_commands(ike_cmds) + + def _create_esp_group(self, esp): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + esp_cmds = cmds['esp'] + + esp_cmds[0] = esp_cmds[0] % (esp['name']) + esp_cmds[1] = esp_cmds[1] % (esp['name'], esp['encryption_algorithm']) + esp_cmds[2] = esp_cmds[2] % (esp['name'], esp['auth_algorithm']) + esp_cmds[3] = esp_cmds[3] % (esp['name'], esp['encryption_algorithm']) + esp_cmds[4] = esp_cmds[4] % (esp['name'], esp['auth_algorithm']) + esp_cmds[5] = esp_cmds[5] % (esp['name'], esp['lifetime']['value']) + + self._set_commands(esp_cmds) + + def _create_ipsec_site_tunnel(self, tunnel): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + conn_cmds = cmds['conn'] + tun_cmds = ['', ''] + + tunidx = self._ipsec_get_tunnel_count(tunnel) + 1 + """ + Neutron + GBP model supports only one local subnet. + For now also assuming only one peer cidr. + """ + tun_cmds[0] = conn_cmds[7] % ( + tunnel['peer_address'], tunidx, tunnel['local_cidr']) + tun_cmds[1] = conn_cmds[8] % ( + tunnel['peer_address'], tunidx, tunnel['peer_cidrs'][0]) + + self._set_commands(tun_cmds) + + def _get_vrrp_group(self, ifname): + command = ("vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) + #vrrp_ifname = ifname + "v" + os.popen(command).read().strip() + return os.popen(command).read().strip() + + def _create_ipsec_site_conn(self, ctx): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + conn_cmds = cmds['conn'] + + """ + Get the name of the interface which has ipaddr from + the local cidr on which vpn service is launched. + Also get the ip addr assigned to it + """ + ifname, ip = self._get_if_details_by_cidr(ctx['service']['cidr']) + + conn = ctx['siteconns'][0]['connection'] + esp = ctx['siteconns'][0]['ipsecpolicy'] + ike = ctx['siteconns'][0]['ikepolicy'] + + vrrp_cmd = None + if conn['stitching_fixed_ip'] and conn.get('standby_fip', None): + logger.debug("Get vrrp group number for interface %s" % ifname) + group_no = self._get_vrrp_group(ifname) + ip = conn['stitching_fixed_ip'] + vrrp_cmd = ('set interfaces ethernet %s vrrp vrrp-group %s ' + 'run-transition-scripts master /config/scripts/restart_vpn') % ( + ifname, group_no) + ifname = ifname + "v" + str(group_no) + logger.info("vrrp interface name: %s" % ifname) + + conn_cmds[0] = conn_cmds[0] % (ifname) + conn_cmds[1] = conn_cmds[1] % (conn['peer_address']) + conn_cmds[2] = conn_cmds[2] % (conn['peer_address'], conn['psk']) + conn_cmds[3] = conn_cmds[3] % (conn['peer_address'], esp['name']) + conn_cmds[4] = conn_cmds[4] % (conn['peer_address'], ike['name']) + conn_cmds[5] = conn_cmds[5] % (conn['peer_address'], ip) + conn_cmds[6] = conn_cmds[6] % (conn['peer_address'], conn['peer_id']) + + """ + Neutron + GBP model supports only one local subnet. + For now also assuming only one peer cidr. + """ + conn_cmds[7] = conn_cmds[7] % ( + conn['peer_address'], 1, conn['tunnel_local_cidr']) + conn_cmds[8] = conn_cmds[8] % ( + conn['peer_address'], 1, conn['peer_cidrs'][0]) + conn_cmds[9] = conn_cmds[9] % (conn['peer_address'], conn['access_ip']) + if vrrp_cmd: + conn_cmds.append(vrrp_cmd) + + self._set_commands(conn_cmds) + + def _create_ssl_vpn_conn(self, ctx): + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + conn = ctx['sslvpnconns'][0]['connection'] + cidr = ctx['service']['cidr'] + + conn_cmds = cmds['create'] + + conn_cmds[0] = conn_cmds[0] % ('vtun0') + conn_cmds[1] = conn_cmds[1] % ('vtun0') + conn_cmds[2] = conn_cmds[2] % ( + 'vtun0', conn['client_address_pool_cidr']) + conn_cmds[3] = conn_cmds[3] % ('vtun0') + conn_cmds[4] = conn_cmds[4] % ('vtun0') + conn_cmds[5] = conn_cmds[5] % ('vtun0') + conn_cmds[6] = conn_cmds[6] % ('vtun0') + conn_cmds[7] = conn_cmds[7] % ('vtun0', cidr) + conn_cmds[8] = conn_cmds[8] % ('vtun0') + #conn_cmds[9] = conn_cmds[9] % ('vtun0', conn['stitching_fixed_ip']) + + self._set_commands(conn_cmds) + + def _ssl_vpn_push_route(self, route): + + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + conn_cmds = cmds['create'] + route_cmds = [''] + + route_cmds[0] = conn_cmds[7] % ('vtun0', route['route']) + self._set_commands(route_cmds) + + def configure_static_route(self, action, cidr, gateway_ip): + if action == "set": + route_cmd = ("%s protocols static route %s next-hop" + " %s distance 1" % (action, cidr, gateway_ip)) + else: + route_cmd = "%s protocols static route %s" %(action, cidr) + # The config module we use everywhere else is not used here + # because of the issue mentioned here: + # http://vyatta38.rssing.com/chan-10627532/all_p7.html + # Note: The issue is inconsistent, but not seen anymore with this + # new approach of setting configuration + utils._alternate_set_and_commit(route_cmd) + #session.setup_config_session() + #self._set_commands([route_cmd]) + #session.commit() + #time.sleep(2) + #session.teardown_config_session() + return OP_SUCCESS + + def _get_all_ifs(self): + max_possible = 128 # arbitrary. raise if needed. + bytes = max_possible * 32 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + names = array.array('B', '\0' * bytes) + outbytes = struct.unpack('iL', fcntl.ioctl( + s.fileno(), + 0x8912, # SIOCGIFCONF + struct.pack('iL', bytes, names.buffer_info()[0]) + ))[0] + namestr = names.tostring() + lst = [] + for i in range(0, outbytes, 40): + name = namestr[i:i+16].split('\0', 1)[0] + ip = namestr[i+20:i+24] + lst.append((name, ip)) + return lst + + def _format_ip(self, addr): + return str(ord(addr[0])) + '.' + \ + str(ord(addr[1])) + '.' + \ + str(ord(addr[2])) + '.' + \ + str(ord(addr[3])) + + def _get_if_details_by_cidr(self, cidr): + """ + Get interface name and ip address which is in the + given cidr + """ + # It is observed sometimes that infs take time to get ip address + logger.info("IPSec: get interface ip and name for cidr %s." % cidr) + retry_count = 0 + while True: + ifs = self._get_all_ifs() + for inf in ifs: + ifname = inf[0] + if 'v' in ifname: + continue + ip = self._format_ip(inf[1]) + if IPAddress(ip) in IPNetwork(cidr): + logger.info("Found interface %s for cidr %s" % (ifname, + cidr)) + return ifname, ip + if retry_count < 10: + time.sleep(1) + retry_count += 1 + continue + break + + raise NoInterfaceOnCidr(cidr=cidr) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log new file mode 100644 index 0000000000..25c48e9e1a --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log @@ -0,0 +1,24 @@ +/var/log/oc/vyos_monitor { + weekly + rotate 12 + size 10M + compress + delaycompress + missingok + notifempty + create 644 vyos users +} +/var/log/oc/oc-vyos.log { + monthly + rotate 12 + size 10M + compress + delaycompress + missingok + notifempty + create 644 vyos users + postrotate + sudo /etc/init.d/oc-vyos restart + endscript +} + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py new file mode 100644 index 0000000000..3cf064c37b --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py @@ -0,0 +1,16 @@ +import netifaces +import shlex +import subprocess + + +def initiate_dhclient(): + interfaces = netifaces.interfaces() + for interface in interfaces: + cmd = "sudo dhclient %s" % interface + args = shlex.split(cmd) + if not netifaces.ifaddresses(interface).get(netifaces.AF_INET): + output, error = subprocess.Popen( + args, stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate() + if error: + raise diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py new file mode 100644 index 0000000000..3ffa2486ad --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py @@ -0,0 +1,17 @@ +class OCException(Exception): + """ + """ + status_code = 400 + + def __init__(self, message, status_code=None, payload=None): + Exception.__init__(self) + self.message = message + if status_code: + self.status_code = status_code + self.payload = payload + + def to_dict(self): + rv = dict(self.payload or ()) + rv["message"] = self.message + return rv + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py new file mode 100644 index 0000000000..3bbdaabb2f --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py @@ -0,0 +1,248 @@ +import copy +import json +import logging +import netifaces +import subprocess +import netaddr +import time + +from execformat.executor import session +from operations import configOpts +from vyos_session import utils + + +ROUTING_TABLE_BASE = 10 + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +VYOS_PBR_COMMANDS = { + 'policy_route': [ + 'set policy route %s rule %s protocol all', + 'set policy route %s rule %s set table %s', + 'set policy route %s rule %s source address %s'], + 'table_route': [ + 'set protocols static table %s route %s next-hop %s'], + 'interface_pbr': [ + 'set interfaces ethernet %s policy route %s'], + 'delete': [ + 'delete interfaces ethernet %s policy route %s', + 'delete policy route %s', + 'delete protocols static table %s'], + 'show': [ + 'show policy route %s', + 'show protocols static table %s', + 'show interfaces ethernet %s policy route']} + + +class RoutesConfigHandler(configOpts): + def __init__(self): + super(RoutesConfigHandler, self).__init__() + self.vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" + + def _run_command(self, command): + try: + exec_pipe = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except Exception as err: + message = 'Executing command %s failed with error %s' %(command, err) + logger.error(message) + return False + + cmd_output, cmd_error = exec_pipe.communicate() + if exec_pipe.returncode != 0: + message = 'Executing command %s failed with error %s' %(command, cmd_error) + logger.error(message) + return False + else: + logger.debug('command output: %s', cmd_output) + return True + + def _begin_command(self): + begin_cmd = "%s begin" %(self.vyos_wrapper) + if self._run_command(begin_cmd): + return True + else: + return False + + def _discard_changes(self): + discard_cmd = "%s discard" %(self.vyos_wrapper) + if self._run_command(discard_cmd): + return True + else: + return False + + def _set_commands(self, cmds): + for cmd in cmds: + set_cmd = "%s %s" %(self.vyos_wrapper, cmd) + if not self._run_command(set_cmd): + return False + return True + + def _commit_command(self): + commit_cmd = "%s commit" %(self.vyos_wrapper) + if self._run_command(commit_cmd): + return True + else: + return False + + def _save_command(self): + save_cmd = "%s save" % (self.vyos_wrapper) + if self._run_command(save_cmd): + return True + else: + return False + + def _configure_vyos(self, configure_commands): + if not self._begin_command(): + logger.error("Starting a vyos session failed") + return False + + if not self._set_commands(configure_commands): + logger.error("Executing commands %s failed" %(configure_commands)) + self._discard_changes() + return False + + if not self._commit_command(): + logger.error("Committing %s failed" %(configure_commands)) + self._discard_changes() + return False + + if not self._save_command(): + logger.error("Saving %s failed" %(configure_commands)) + self._discard_changes() + return False + + return True + + def _configure_policy_route(self, source_cidr, gateway_ip, + source_interface): + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for configuring " + "routes" %(source_interface)) + msg = "Wrong interface %s retrieved for source %s" %( + source_interface, source_cidr) + raise Exception(msg) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + pbr_name = "%s_%s" %("pbr", source_interface) + cmds = copy.deepcopy(VYOS_PBR_COMMANDS) + pbr_commands = [] + pbr_commands.append(cmds['policy_route'][0] % (pbr_name, "1")) + pbr_commands.append(cmds['policy_route'][1] % ( + pbr_name, "1", routing_table_number)) + pbr_commands.append( + cmds['policy_route'][2] % (pbr_name, "1", source_cidr)) + + pbr_commands.append(cmds['table_route'][0] %( + routing_table_number, "0.0.0.0/0", gateway_ip)) + + pbr_commands.append( + cmds['interface_pbr'][0] %(source_interface, pbr_name)) + + if not self._configure_vyos(pbr_commands): + logger.error("Configuring Policy Based Routing failed") + raise Exception("Pbr failed %s" % pbr_commands) + else: + return True + + def add_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + gateway_ip = route_info['gateway_ip'] + source_interface = self._get_if_name_by_cidr(source_cidr) + try: + self._delete_policy_route(source_cidr, source_interface) + except Exception as err: + logger.debug("Trying to clear any existing routes before " + "setting source routing failed with error: %s" + %(err)) + try: + self._configure_policy_route( + source_cidr, gateway_ip, source_interface) + except Exception as err: + message = ("Configuring Policy based route failed. " + "Error: %s" %(err)) + raise Exception(message) + return json.dumps(dict(status=True)) + + # FIXME: When invoked on delete path we have to propagate the error + def _delete_policy_route(self, source_cidr, source_interface): + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for configuring " + "routes" %(source_interface)) + msg = "Wrong interface %s retrieved for source %s" %( + source_interface, source_cidr) + raise Exception(msg) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + pbr_name = "%s_%s" %("pbr", source_interface) + cmds = copy.deepcopy(VYOS_PBR_COMMANDS) + + delete_pbr_commands = [] + delete_pbr_commands.append(cmds['delete'][0] % ( + source_interface, pbr_name)) + if not self._configure_vyos(delete_pbr_commands): + logger.warn("Deleting PBR failed") + + delete_pbr_commands = [] + delete_pbr_commands.append(cmds['delete'][1] % (pbr_name)) + if not self._configure_vyos(delete_pbr_commands): + logger.warn("Deleting PBR failed") + + delete_pbr_commands = [] + delete_pbr_commands.append(cmds['delete'][2] % (routing_table_number)) + if not self._configure_vyos(delete_pbr_commands): + logger.warn("Deleting PBR failed") + + return + + def delete_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + source_interface = self._get_if_name_by_cidr(source_cidr, + delete=True) + if source_interface: + self._delete_policy_route(source_cidr, source_interface) + return json.dumps(dict(status=True)) + + def _get_if_name_by_cidr(self, cidr, delete=False): + interfaces = netifaces.interfaces() + retry_count = 0 + while True: + all_interfaces_have_ip = True + for interface in interfaces: + inet_list = netifaces.ifaddresses(interface).get( + netifaces.AF_INET) + if not inet_list: + all_interfaces_have_ip = False + for inet_info in inet_list or []: + netmask = inet_info.get('netmask') + ip_address = inet_info.get('addr') + subnet_prefix = cidr.split("/") + if (ip_address == subnet_prefix[0] and + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + return interface + ip_address_netmask = '%s/%s' %(ip_address, netmask) + interface_cidr = netaddr.IPNetwork(ip_address_netmask) + if str(interface_cidr.cidr) == cidr: + return interface + # Sometimes the hotplugged interface takes time to get IP + if not all_interfaces_have_ip: + if retry_count < 15: + if delete: + return None + time.sleep(2) + retry_count = retry_count + 1 + continue + else: + raise Exception("Some of the interfaces do not have " + "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh new file mode 100755 index 0000000000..a3aab4d1f1 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh @@ -0,0 +1,6 @@ +#!/bin/vbash +cmd1="$1" +source /opt/vyatta/etc/functions/script-template +eval "$cmd1" +echo $? +#run show vpn ipsec sa diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl new file mode 100644 index 0000000000..5c6317a604 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl @@ -0,0 +1,66 @@ +#!/usr/bin/perl + +#Usage: sudo perl op_commands.pl get_tunnel_state peer_ip tunnel-id + + +use lib "/opt/vyatta/share/perl5/"; +use Vyatta::VPN::OPMode; +use Data::Dumper qw(Dumper); + +sub get_ipsec_tunnel_count { + my @args = @_; + + my $peer = $args[1]; + my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); + $DB::single = 1; + my $count = $#tunnel_hash; + $count = ($count + 1)/2; + print "tunnels=$count"; + return $count; +} + +sub get_ipsec_tunnel_idx { + my @args = @_; + + my $peer = $args[1]; + my $lcidr = $args[2]; + my $pcidr = $args[3]; + + my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); + my $count = ($#tunnel_hash + 1)/2; + $DB::single = 1; + for my $i (0..$count) { + my $tun = $tunnel_hash[$i+1]; + my $lsnet = $tun->{_lsnet}; + my $rsnet = $tun->{_rsnet}; + if ($lcidr == $lsnet && $pcidr == $rsnet) { + print "tunnel=$tun->{_tunnelnum} \n"; + return $tun->{_tunnelnum}; + } + } + print "tunnel=-1"; + return -1; +} + +sub get_ipsec_tunnel_state { + my @args = @_; + + #args[0] will be subroutine name + + my $peer = $args[1]; + my $tunnel = $args[2]; + + my $tunidx = $tunnel + $tunnel - 1; + my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); + + my $state = $tunnel_hash[$tunidx]->{_state}; + + print "state=$state\n"; + + return $state +} + +#print Dumper \@ARGV; + +my $call=$ARGV[0]; +$call->(@ARGV); diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos new file mode 100755 index 0000000000..850a85e5ed --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos @@ -0,0 +1,130 @@ +#! /bin/sh +# +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2014, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA +# +### BEGIN INIT INFO +# Provides: oc-vyos +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: OC vyos service +# Description: Provides the oc-vyos service +### END INIT INFO +set -e +PIDFILE=/var/run/elastic_services/oc-vyos.pid +LOGFILE=/var/log/elastic_services/oc-vyos.log +DAEMON=/usr/bin/oc-vyos +DAEMON_ARGS="--log-file=$LOGFILE" +DAEMON_DIR=/var/run/elastic_services +ENABLED=true +if test -f /etc/default/oc-vyos; then +. /etc/default/oc-vyos +fi +mkdir -p /var/run/elastic_services +mkdir -p /var/log/elastic_services +. /lib/lsb/init-functions +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" +export TMPDIR=/var/lib/elastic_services/tmp +if [ ! -x ${DAEMON} ] ; then +exit 0 +fi +case "$1" in +start) +test "$ENABLED" = "true" || exit 0 +start=1 +## check if pidfile is there +if [ -f $PIDFILE ]; then +pid=`cat $PIDFILE` +## check if pid is there +if [ "1$pid" -ne "1" ]; then +## check if process with pid not running +set +e +kill -0 $pid > /dev/null 2>&1 +[ $? -eq 0 ] && start=0 +set -e +fi +fi +if [ $start -eq 1 ]; then +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +log_daemon_msg "Starting oc vyos" +# We have completely messed up the rc level scripts +sudo chown vyos:users -R /var/run/elastic_services +sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS +log_end_msg $? +else +echo "oc-vyos[$pid] is already running" +fi +;; +stop) +test "$ENABLED" = "true" || exit 0 +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Stopping oc vyos" +start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +rm $PIDFILE +else +echo "PID file not existing" +fi +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +;; +restart|force-reload) +test "$ENABLED" = "true" || exit 1 +$0 stop +sleep 2 +$0 start +;; +reload) +test "$ENABLED" = "true" || exit 0 +## check if pidfile is there +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Reloading oc vyos" +start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +else +echo "oc vyos is not running or PID file not existing" +fi +;; +status) +test "$ENABLED" = "true" || exit 0 +status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +;; +*) +log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +exit 1 +;; +esac +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn new file mode 100644 index 0000000000..2cb8fe4762 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn @@ -0,0 +1,3 @@ +#!/bin/vbash +sudo rm /var/run/pluto.pid +vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py new file mode 100644 index 0000000000..3ed9fd0f30 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py @@ -0,0 +1 @@ +__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py new file mode 100644 index 0000000000..9b0e666e66 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py @@ -0,0 +1,146 @@ +import os +from uuid import uuid4 +from utils import get_config_params, _run, clean_environ, init_logger +import logging + +logger = logging.getLogger(__name__) +init_logger(logger) + +VYOS_SHELL_API = get_config_params('bin', 'shell_api_path') +VYOS_SBIN_DIR = get_config_params('bin', 'vyos_sbin_dir') +VYOS_SAVE_SCRIPT = 'vyatta-save-config.pl' + +# Create/Get the logger object +# logger = init_logger() + + +class SessionAlreadyExists(Exception): pass +class SetupSessionFailed(Exception): pass +class OperationFailed(Exception): pass +class SessionNotExists(Exception): pass + + +class Session(object): + """ + Return the session instance if exists. Else, create new one. + SessionAlreadyExists exception raised on the second instantiation. + """ + _ref = None + + def __new__(cls, *args, **kw): + if cls._ref is not None: + raise SessionAlreadyExists('A session exist already !') + cls._ref = super(Session, cls).__new__(cls, *args, **kw) + return cls._ref + + +class ConfigSession(Session): + """ + Create and manage a Vyos config session. + This is a singleton subclass of Session class which ensures that one and + one config session only is opened. + To create instance you have to call setup_config_session() method. + """ + + def setup_config_session(self): + """ + Setup vyos session. A random uuid is generated as a sesssion identifier + ($PPID -Shell PID- could be used as well). + """ + + identifier = uuid4() + env = dict() + env['VYATTA_CHANGES_ONLY_DIR'] = \ + '/opt/vyatta/config/tmp/changes_only_{0}'.format(identifier) + env['VYATTA_CONFIG_TEMPLATE'] = '/opt/vyatta/share/vyatta-cfg/templates' + env['VYATTA_ACTIVE_CONFIGURATION_DIR'] = '/opt/vyatta/config/active' + env['VYATTA_EDIT_LEVEL'] = '/' + env['VYATTA_TEMP_CONFIG_DIR'] = '/opt/vyatta/config/tmp/new_config_{' \ + '0}'.format(identifier) + env['VYATTA_TEMPLATE_LEVEL'] = '/' + env['VYATTA_CONFIG_TMP'] = '/opt/vyatta/config/tmp/tmp_{0}'.format( + identifier) + # Add vyos session environment to system environment. + # This is not good but actually it seems that is the only way to + # handle a persistant vyos session after spawning a shell. + os.environ.update(env) + logger.info('Setting up a configuration session for Vyos') + # Spawn shell and setup vyos config session + if _run('{0} setupSession'.format(VYOS_SHELL_API)): + # Unset vyos session environment and raise an exception + logger.error('Could not create configuration session') + logger.info('Cleaning up session environment variables') + clean_environ(env) + raise SetupSessionFailed('Could not create session !') + self.session_id = identifier + self.session_envs = env + logger.debug('Session identifier is %s', identifier) + logger.debug('Session environment variables: %s', env) + logger.info('Configuration session is set up') + return True + + def session_exists(self): + """ + Test if a vyos config session is set up + """ + return False if _run('{0} inSession'.format(VYOS_SHELL_API)) else True + + def teardown_config_session(self): + """ + End current configuration session. + """ + if not self.session_exists(): + logger.warn('Teardown failed. No session available !') + return False + + if not _run('{0} teardownSession'.format(VYOS_SHELL_API)): + logger.info('Cleaning up session environment variables') + logger.info('Closing Vyos config session') + clean_environ(self.session_envs) + return True + + logger.error('Failed to teardown current config session') + logger.warn('The Vyos config session may still open !') + return False + + def session_changed(self): + """ + Returns if Vyos configuration was changed from current session + """ + if _run('{0} sessionChanged'.format(VYOS_SHELL_API)): + return False + logger.warn('Vyos configuration was changed from current session') + return True + + def commit(self): + """ + Returns True if commit action succeed. False otherwise. + """ + out = _run(os.path.join(VYOS_SBIN_DIR ,'my_commit -l'), output=True) + if not out: + logger.error('Commit changes failed') + raise OperationFailed('[ERROR] Commit changes failed !') + logger.info('Changes successfully commited') + return True + + def discard(self): + """ + Undo config modifications + """ + out = _run(os.path.join(VYOS_SBIN_DIR ,'my_discard'), output=True) + if not out: + raise OperationFailed('[ERROR] Discard changes failed !') + # return out.splitlines()[0] + return out + + def save(self): + """ + Save applied modifications. Changes still persistent even after + system reboot. + """ + out = _run(os.path.join(VYOS_SBIN_DIR, VYOS_SAVE_SCRIPT), output=True) + if not out: + logger.error('Saving changes failed') + raise OperationFailed('[ERROR] Save changes failed !') + logger.info('%s', out) + return True diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py new file mode 100644 index 0000000000..6dc579aae2 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py @@ -0,0 +1,173 @@ +import ConfigParser +import subprocess +import os +import logging +import logging.handlers as handlers + +# In production environment CONFIG_DIR should be /etc/pyatta/ +CONFIG_DIR = "/usr/share/vyos-oc" +CONFIG_FILE_NAME = "oc-vyos.conf" +AVAILABLE_LOG_LEVELS = ['DEBUG','INFO','WARN','ERROR','CRITICAL'] +DEFAULT_LOG_LEVEL = 'INFO' + +logger = logging.getLogger(__name__) + + +def get_config_params(section, key): + """ + To get specific parameters valuers from config file + """ + config = ConfigParser.SafeConfigParser() + config.readfp(open(os.path.join(CONFIG_DIR, CONFIG_FILE_NAME))) + return config.get(section, key) + + +def get_log_level(): + """ + Get and check log level value from pyatta.conf file. + """ + log_level = get_config_params('log', 'level') + if log_level not in AVAILABLE_LOG_LEVELS: + print('[ERROR] Unknown log level !') + return DEFAULT_LOG_LEVEL + return log_level + + +def get_log_filehandler(): + """ + Create file handler which logs messages. + """ + log_dir = get_config_params('log', 'logdir') + log_file = get_config_params('log', 'logfile') + log_file_path = os.path.join(log_dir, log_file) + if not os.path.exists(log_dir) or not os.path.exists(log_file_path): + try: + os.makedirs(log_dir) + open(log_file_path, 'a').close() + except OSError as exception: + print exception + return False + print "[INFO] Create log file %s" % log_file_path + # create file handler + fh = logging.FileHandler(log_file_path,'a') + fh.setLevel(eval('logging.{0}'.format(get_log_level()))) + return fh + + +def init_logger(logger): + """ + Initialize logger object for logging application's activities to a + specific file. + """ + # create logger + logger.setLevel(eval('logging.{0}'.format(get_log_level()))) + # create formatter and add it to the handlers + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - ' + '%(message)s') + file_handler = get_log_filehandler() + file_handler.setFormatter(formatter) + # add the handlers to the logger + logger.addHandler(file_handler) + + formatter = logging.Formatter('vyos %(name)s %(funcName)s() %(levelname)s ' + '%(message)s') + sys_handler = handlers.SysLogHandler(address=('localhost', 514)) + sys_handler.setFormatter(formatter) + sys_handler.setLevel(logging.DEBUG) + logger.addHandler(sys_handler) + + +def _run(cmd, output=False): + """ + To run command easier + """ + # FIXME: This whole code taken from someones personal github implementation + # is really messy !!!! + if output: + try: + logger.debug('exec command: "%s"', cmd) + exec_pipe = subprocess.Popen(cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except Exception as err: + message = 'Executing command %s failed with error %s' %(cmd, err) + logger.error(message) + return False + + cmd_output, cmd_error = exec_pipe.communicate() + # VPN commits succeed but we are getting perl locale warnings on stderr + if exec_pipe.returncode != 0: + message = 'Executing command %s failed with error %s. Output is: %s'%(cmd, cmd_error, cmd_output) + logger.error(message) + return False + else: + logger.debug('command output: %s', cmd_output) + return True + else: + try: + logger.debug('exec command: "%s"', cmd) + out = subprocess.check_call(cmd, shell=True) # returns 0 for True + except subprocess.CalledProcessError as err: + logger.error('command execution failed with Error: %s', err) + out = 1 # returns 1 for False + logger.debug('command return code: %s', out) + return out + +# Alternate implementation for configuring vyos - The whole pyatta module +# is replaced with this one method. This was required top fix the following +# issue :http://vyatta38.rssing.com/chan-10627532/all_p7.html +# Not sure if the other commands also may fails or if there is an issue with +# the way the config module does things +def _alternate_set_and_commit(cmd): + try: + vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" + begin_cmd = "%s begin" %(vyos_wrapper) + set_cmd = "%s %s" %(vyos_wrapper, cmd) + commit_cmd = "%s commit" %(vyos_wrapper) + save_cmd = "%s save" % (vyos_wrapper) + end_cmd = "%s end" %(vyos_wrapper) + command = "%s;%s;%s;%s;%s" % (begin_cmd, set_cmd, commit_cmd, save_cmd, + end_cmd) + logger.debug('exec command: "%s"', command) + exec_pipe = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except Exception as err: + message = 'Executing command %s failed with error %s' %(command, err) + logger.error(message) + return False + + cmd_output, cmd_error = exec_pipe.communicate() + # VPN commits succeed but we are getting perl locale warnings on stderr + if exec_pipe.returncode != 0: + message = 'Executing command %s failed with error %s' %(command, cmd_error) + logger.error(message) + return False + else: + logger.debug('command output: %s', cmd_output) + return True + +def clean_environ(env): + """ + Delete some envionment variables from system. + """ + for key in env.keys(): + if os.environ.get('key'): del os.environ[key] + + +def ip2network(ip): + quads = ip.split('.') + netw = 0 + for i in range(4): + netw = (netw << 8) | int(len(quads) > i and quads[i] or 0) + return netw + + +def get_ip_address_with_netmask(ip, netmask): + prefix = bin(ip2network(netmask)).count('1') + ip_addr = ip + "/" + str(prefix) + return ip_addr + + +# initilize the logger for this module +init_logger(logger) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos new file mode 100755 index 0000000000..850a85e5ed --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos @@ -0,0 +1,130 @@ +#! /bin/sh +# +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2014, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA +# +### BEGIN INIT INFO +# Provides: oc-vyos +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: OC vyos service +# Description: Provides the oc-vyos service +### END INIT INFO +set -e +PIDFILE=/var/run/elastic_services/oc-vyos.pid +LOGFILE=/var/log/elastic_services/oc-vyos.log +DAEMON=/usr/bin/oc-vyos +DAEMON_ARGS="--log-file=$LOGFILE" +DAEMON_DIR=/var/run/elastic_services +ENABLED=true +if test -f /etc/default/oc-vyos; then +. /etc/default/oc-vyos +fi +mkdir -p /var/run/elastic_services +mkdir -p /var/log/elastic_services +. /lib/lsb/init-functions +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" +export TMPDIR=/var/lib/elastic_services/tmp +if [ ! -x ${DAEMON} ] ; then +exit 0 +fi +case "$1" in +start) +test "$ENABLED" = "true" || exit 0 +start=1 +## check if pidfile is there +if [ -f $PIDFILE ]; then +pid=`cat $PIDFILE` +## check if pid is there +if [ "1$pid" -ne "1" ]; then +## check if process with pid not running +set +e +kill -0 $pid > /dev/null 2>&1 +[ $? -eq 0 ] && start=0 +set -e +fi +fi +if [ $start -eq 1 ]; then +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +log_daemon_msg "Starting oc vyos" +# We have completely messed up the rc level scripts +sudo chown vyos:users -R /var/run/elastic_services +sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS +log_end_msg $? +else +echo "oc-vyos[$pid] is already running" +fi +;; +stop) +test "$ENABLED" = "true" || exit 0 +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Stopping oc vyos" +start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +rm $PIDFILE +else +echo "PID file not existing" +fi +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +;; +restart|force-reload) +test "$ENABLED" = "true" || exit 1 +$0 stop +sleep 2 +$0 start +;; +reload) +test "$ENABLED" = "true" || exit 0 +## check if pidfile is there +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Reloading oc vyos" +start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +else +echo "oc vyos is not running or PID file not existing" +fi +;; +status) +test "$ENABLED" = "true" || exit 0 +status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +;; +*) +log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +exit 1 +;; +esac +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/LICENSE README b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/LICENSE README new file mode 100644 index 0000000000..81526a2dc4 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/LICENSE README @@ -0,0 +1,2 @@ +configsession.py and utils.py are opens source files and originally taken from +"https://github.com/abessifi/pyatta". \ No newline at end of file diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl new file mode 100755 index 0000000000..3cf31fa4cb --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl @@ -0,0 +1,285 @@ +#!/usr/bin/perl + +use Data::Dumper; +local $Data::Dumper::Terse =1; +use JSON; +use LWP::UserAgent; + +#Constants +my $httpclient = LWP::UserAgent->new; + + +my $get_admin_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "name"=> "Default" + }, + "name"=> "", + "password"=> "" + } + } + }, + "scope" => + {"domain" => { + "name" => "Default" + } + } + } +}; + +my $get_user_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "id"=> "" + }, + "name"=> "", + "password"=> "" + } + } + }, + "scope" => { + "project" => { + "domain" => { + "id" => "" + }, + "name" => "" + } + } + } +}; + +#Global variables +my $admin_token_id; +my $user_token_id; +my $domain_id; +my $user_role; +my $cloud_admin_projname; +my $cloud_admin_username; +my $cloud_admin_password; +my $KEYSTONE_AUTH_URL; +my $REMOTE_VPN_ROLE_NAME; +my $SERVICE_PROJECT_ID; +my $username; +my $password; +my $user_id; +my $user_role_id; +my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; +my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + + + +sub read_auth_server_conf { + # Get auth server conf from file + my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; + + if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { + print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; + exit 1; + } + $KEYSTONE_AUTH_URL = ; + $cloud_admin_projname = ; + $cloud_admin_username = ; + $cloud_admin_password = ; + $REMOTE_VPN_ROLE_NAME = ; + $SERVICE_PROJECT_ID = ; + + chomp $KEYSTONE_AUTH_URL; + chomp $cloud_admin_projname; + chomp $cloud_admin_username; + chomp $cloud_admin_password; + chomp $REMOTE_VPN_ROLE_NAME; + chomp $SERVICE_PROJECT_ID; + + #$DB::single = 1; + + close(AUTHFILE); +} + + +sub read_username_passwd { + # Get username/password from file + + if ($ARG = shift @ARGV) { + if (!open (UPFILE, "<$ARG")) { + print "Could not open username/password file: $ARG\n"; + exit 1; + } + } else { + print "No username/password file specified on command line\n"; + exit 1; + } + + $username = ; + $password = ; + + if (!$username || !$password) { + print "Username/password not found in file: $ARG\n"; + exit 1; + } + + chomp $username; + chomp $password; + + close (UPFILE); +} + + + + + +sub get_cloud_admin_token { + #$DB::single = 1; + + my $http_req = HTTP::Request->new(POST => $url_get_admin_token); + $http_req->header('content-type' => 'application/json'); + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; + #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; + $json_string = to_json($get_admin_token_data); + $http_req->content($json_string); + #$http_req->content($get_admin_token_data); + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $admin_token_id = $http_resp->headers->{'x-subject-token'}; + print "Admin token id: ", $admin_token_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting cloud admin token failed \n"; + } +} + +sub get_domain_id { + my $http_req = HTTP::Request->new(GET => $url_get_domain); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $domain_id = $decoded_resp->{'project'}->{'domain_id'}; + $project_name = $decoded_resp->{'project'}->{'name'}; + print "Domain id: ", $domain_id, "\n"; + print "Project name: ", $project_name, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting domain id failed \n"; + } +} + +sub get_role_id { + my $http_req = HTTP::Request->new(GET => $url_get_role_id); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; + print "Role id: ", $user_role_id, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting role id failed \n"; + } +} + + + + +sub user_authenticate { + my $http_req = HTTP::Request->new(POST => $url_user_authenticate); + $http_req->header('content-type' => 'application/json'); + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; + $get_user_token_data->{"auth"}{"scope"}{"project"}{"domain"}{"id"} = $domain_id; + $get_user_token_data->{"auth"}{"scope"}{"project"}{"name"} = $project_name; + $json_string = to_json($get_user_token_data); + $http_req->content($json_string); + my $http_resp = $httpclient->request($http_req); + + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + #$DB::single = 1; + my $decoded_resp = decode_json($message); + $user_token_id = $http_resp->headers->{'x-subject-token'}; + $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; + print "User token id: ", $user_token_id, "\n"; + print "User id: ", $user_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting user token failed \n"; + } +} + +sub get_user_roles { + $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + #$DB::single = 1; + my $user_roles = $decoded_resp->{'role_assignments'}; + my $len = @{$user_roles}; + if ($len) { + $user_role = $REMOTE_VPN_ROLE_NAME; + } else { + $user_role = ""; + } + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting user roles failed \n"; + } +} + + +read_auth_server_conf(); +read_username_passwd(); + +$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; +$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + +get_cloud_admin_token(); +get_domain_id(); +get_role_id(); +user_authenticate(); +get_user_roles(); + +if ($user_role eq $REMOTE_VPN_ROLE_NAME) { + exit 0; +} +exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl new file mode 100755 index 0000000000..d5d32c58f7 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl @@ -0,0 +1,273 @@ +#!/usr/bin/perl + +use Data::Dumper; +local $Data::Dumper::Terse =1; +use JSON; +use LWP::UserAgent; + +#Constants +my $httpclient = LWP::UserAgent->new; + + +my $get_admin_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "name"=> "Default" + }, + "name"=> "", + "password"=> "" + } + } + }, + "scope" => + {"domain" => { + "name" => "Default" + } + } + } +}; + +my $get_user_token_data = +{"auth" => + {"identity" => + {"methods" => ["password"], + "password"=> { + "user" => { + "domain"=> { + "id"=> "" + }, + "name"=> "", + "password"=> "" + } + } + } + } +}; + +#Global variables +my $admin_token_id; +my $user_token_id; +my $domain_id; +my $user_role; +my $cloud_admin_projname; +my $cloud_admin_username; +my $cloud_admin_password; +my $KEYSTONE_AUTH_URL; +my $REMOTE_VPN_ROLE_NAME; +my $PROJECT_ID; +my $username; +my $password; +my $user_id; +my $user_role_id; +my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; +my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + + + +sub read_auth_server_conf { + # Get auth server conf from file + my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; + + if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { + print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; + exit 1; + } + $KEYSTONE_AUTH_URL = ; + $cloud_admin_projname = ; + $cloud_admin_username = ; + $cloud_admin_password = ; + $REMOTE_VPN_ROLE_NAME = ; + $PROJECT_ID = ; + + chomp $KEYSTONE_AUTH_URL; + chomp $cloud_admin_projname; + chomp $cloud_admin_username; + chomp $cloud_admin_password; + chomp $REMOTE_VPN_ROLE_NAME; + chomp $PROJECT_ID; + + #$DB::single = 1; + + close(AUTHFILE); +} + + +sub read_username_passwd { + # Get username/password from file + + if ($ARG = shift @ARGV) { + if (!open (UPFILE, "<$ARG")) { + print "Could not open username/password file: $ARG\n"; + exit 1; + } + } else { + print "No username/password file specified on command line\n"; + exit 1; + } + + $username = ; + $password = ; + + if (!$username || !$password) { + print "Username/password not found in file: $ARG\n"; + exit 1; + } + + chomp $username; + chomp $password; + + close (UPFILE); +} + + + + + +sub get_cloud_admin_token { + #$DB::single = 1; + + my $http_req = HTTP::Request->new(POST => $url_get_admin_token); + $http_req->header('content-type' => 'application/json'); + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; + $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; + #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; + $json_string = to_json($get_admin_token_data); + $http_req->content($json_string); + #$http_req->content($get_admin_token_data); + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $admin_token_id = $http_resp->headers->{'x-subject-token'}; + print "Admin token id: ", $admin_token_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting cloud admin token failed \n"; + } +} + +sub get_domain_id { + my $http_req = HTTP::Request->new(GET => $url_get_domain); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $domain_id = $decoded_resp->{'project'}->{'domain_id'}; + print "Domain id: ", $domain_id, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting domain id failed \n"; + } +} + +sub get_role_id { + my $http_req = HTTP::Request->new(GET => $url_get_role_id); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; + print "Role id: ", $user_role_id, "\n"; + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting role id failed \n"; + } +} + + + + +sub user_authenticate { + my $http_req = HTTP::Request->new(POST => $url_user_authenticate); + $http_req->header('content-type' => 'application/json'); + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; + $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; + $json_string = to_json($get_user_token_data); + $http_req->content($json_string); + my $http_resp = $httpclient->request($http_req); + + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + #$DB::single = 1; + my $decoded_resp = decode_json($message); + $user_token_id = $http_resp->headers->{'x-subject-token'}; + $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; + print "User token id: ", $user_token_id, "\n"; + print "User id: ", $user_id, "\n"; + } + else { + print "HTTP POST error code: ", $http_resp->code, "\n"; + print "HTTP POST error message: ", $http_resp->message, "\n"; + die "Getting user token failed \n"; + } +} + +sub get_user_roles { + $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); + #$DB::single = 1; + $http_req->header('content-type' => 'application/json'); + $http_req->header('x-auth-token' => $admin_token_id); + + my $http_resp = $httpclient->request($http_req); + if ($http_resp->is_success) { + my $message = $http_resp->decoded_content; + my $decoded_resp = decode_json($message); + #$DB::single = 1; + my $user_roles = $decoded_resp->{'role_assignments'}; + my $len = @{$user_roles}; + if ($len) { + $user_role = $REMOTE_VPN_ROLE_NAME; + } else { + $user_role = ""; + } + } + else { + print "HTTP GET error code: ", $http_resp->code, "\n"; + print "HTTP GET error message: ", $http_resp->message, "\n"; + die "Getting user roles failed \n"; + } +} + + +read_auth_server_conf(); +read_username_passwd(); + +$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; +$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; +$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; +$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; + +get_cloud_admin_token(); +get_domain_id(); +get_role_id(); +user_authenticate(); +get_user_roles(); + +if ($user_role eq $REMOTE_VPN_ROLE_NAME) { + exit 0; +} +exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_server.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_server.conf new file mode 100755 index 0000000000..ef768a8728 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_server.conf @@ -0,0 +1,6 @@ +http://10.30.120.97:5000/ +services +neutron +noir0123 +vpn +45fe9bb731054eb4acdae8e15d48a562 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/__init__.py new file mode 100755 index 0000000000..e69de29bb2 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py new file mode 100755 index 0000000000..f7b2b39b0a --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python +import sys +import subprocess +import os + +#sys.path.append('/home/vyos/vyos-api/project/') +from vyos_session.configsession import ConfigSession, SessionNotExists, \ + SetupSessionFailed +from vyos_session import utils +import logging +import shlex + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +try: + session = ConfigSession() +except Exception as err: + logger.error('A session exist already !') + +VYOS_SBIN_DIR = utils.get_config_params('bin','vyos_sbin_dir') +VYOS_SHELL_API = utils.get_config_params('bin', 'shell_api_path') + +class OperationFailed(Exception): pass +class OperationNameError(Exception): pass +class ConfigPathNotCorrect(Exception): pass + +def check_operation_name(args): + """ Check if operation/command name is correct. """ + if len(args) == 0: + logger.error('Operation name required') + raise OperationNameError('Operation name required.') + elif args[0] not in ['show','set','delete', 'edit']: + logger.error('Operation name "%s" not correct' % args[0]) + raise OperationNameError('Operation name not correct.') + return True + +def _runner(command): + """ + Run shell commands via subprocess.Popen() + """ + # NOTE: + # if Popen(self.args, shell=True, ...) => Execution fails + # if Popen(self.args, ...) => OSError: [Errno 2] No such file or directory + # if self.args = ['/bin/cli-shell-api','showCfg', ...] and Popen(self.args, ...) that works but actually we keep using ' '.join(self.args). + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # wait for the process to terminate and get stdout/stderr outputs + out, err = proc.communicate() + return out, err, proc.returncode + +def _op_command(command=None): + command = './op_commands.sh' + command += " " + "\"run show vpn ipsec sa\"" + + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out,err = proc.communicate() + return out + +class execUtils: + """ Executes possible operations in a Vyos configure session.""" + def __init__(self, args): + self.args = args + + def execmd(self, nonsession=False): + """ + Performs execution of allowed config operations ['show','set','delete'] + """ + if check_operation_name(self.args): + # prepare executable file to be called + operation_name = self.args[0] + logger.info('Perform operation "%s"' % operation_name) + + if not nonsession: + if self.args[0] == 'show': self.args[0] = '{0} showCfg'.format( + VYOS_SHELL_API) + else: self.args[0] = os.path.join(VYOS_SBIN_DIR, + 'my_{0}'.format(self.args[0])) + logger.debug('exec command: "%s"' % ' '.join(self.args)) + + if not nonsession and not session.session_exists(): + raise SessionNotExists('Configure session do not exists') + + if not nonsession: + result = _runner(' '.join(self.args)) # result = (stdout, stderr, errcode) + else: + result = _op_command() + return (True, result) + + logger.debug('command return code: %s' % result[2]) + + if result[2]: + logger.info('command output: %s' % ' '.join(result[0].splitlines())) + logger.error('Failed executing operation "%s"' % operation_name) + raise OperationFailed('Operation failed !') + logger.debug('%s' % ' '.join(result[0].splitlines())) + logger.info('Executing "%s" operation OK' % operation_name) + return (True, result[0]) + + def check_cmd_args(self): + """ + Check that config path is correct before performing execmd() + """ + logger.info('Check specified configuration path existance') + config_path = ' '.join(self.args[1:]) + logger.info('config path: "%s"' % config_path) + cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) + logger.debug('exec command: "%s"' % cmd) + result = _runner(cmd) # result = (stdout, stderr, errcode) + logger.debug('command return code: %s' % result[2]) + if result[2]: + logger.error('Configuration path is not correct') + raise ConfigPathNotCorrect('Configuration path is not correct') + logger.info('Configuration path is correct') + return True + + def check_cmd_args(self): + """ + Check that config path is correct before performing execmd() + """ + logger.info('Check specified configuration path existance') + config_path = ' '.join(self.args[1:]) + logger.info('config path: "%s"' % config_path) + cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) + logger.debug('exec command: "%s"' % cmd) + proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + errcode = proc.returncode + logger.debug('command return code: %s' % errcode) + if errcode: + logger.error('Configuration path is not correct') + raise ConfigPathNotCorrect('Configuration path is not correct') + logger.info('Configuration path is correct') + return True + + def get_possible_options(self): + """ + Returns list of nodes under specified configuration path + """ + out = [] + try: + self.check_cmd_args() # check config path validation + except ConfigPathNotCorrect: + return False, out # config path is not correct + + config_path = ' '.join(self.args[1:]) + logger.info('Get possible options of config path "%s"' % config_path) + cmd = '{0} listNodes {1}'.format(VYOS_SHELL_API, config_path) + logger.debug('exec command: "%s"' % cmd) + result = _runner(cmd) # rst = (stdout, stderr, errcode) + logger.debug('command return code: %s' % result[2]) + if not result[0]: + logger.info('No more options for the specified config path') + return True, result[0] + options = shlex.split(result[0]) + logger.debug('List of options : "%s"' % options) + return True, options diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py new file mode 100755 index 0000000000..55c41a0518 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +import sys +import os +topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." +topdir = os.path.realpath(topdir) +sys.path.insert(0, topdir) +from executor import OperationFailed, execUtils as executor +from vyos_session.utils import logger +from vyosparser import vyos_parser as vparser + +class ServiceError(Exception): pass + +class showConfig(): + def formator(self,options): + args=['show'] + service = options[0] + logger.debug("=====>>>>>> args before executor call = %s"%args) + if service in ['protocols','nat','interfaces','firewall']: + args.extend(options) + elif service in ['dns','dhcp-server','ssh','webproxy']: + options.insert(0,'service') + args.extend(options) + else: + raise ServiceError('unknown such service!') + exe=executor(list(args)) + try: + #if not exe.checkcmd(' '.join(args)): + # logger.error("%s: given args does not match with existing configs!"%args) + # return False + execstate,output=exe.execmd() + logger.debug("=====>>>>>> args after executor call = %s"%args) + except OperationFailed, e: + logger.error(e.message) + return False + if execstate==True: + return vparser.decode_string(output) + + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos new file mode 100755 index 0000000000..850a85e5ed --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos @@ -0,0 +1,130 @@ +#! /bin/sh +# +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2014, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA +# +### BEGIN INIT INFO +# Provides: oc-vyos +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: OC vyos service +# Description: Provides the oc-vyos service +### END INIT INFO +set -e +PIDFILE=/var/run/elastic_services/oc-vyos.pid +LOGFILE=/var/log/elastic_services/oc-vyos.log +DAEMON=/usr/bin/oc-vyos +DAEMON_ARGS="--log-file=$LOGFILE" +DAEMON_DIR=/var/run/elastic_services +ENABLED=true +if test -f /etc/default/oc-vyos; then +. /etc/default/oc-vyos +fi +mkdir -p /var/run/elastic_services +mkdir -p /var/log/elastic_services +. /lib/lsb/init-functions +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" +export TMPDIR=/var/lib/elastic_services/tmp +if [ ! -x ${DAEMON} ] ; then +exit 0 +fi +case "$1" in +start) +test "$ENABLED" = "true" || exit 0 +start=1 +## check if pidfile is there +if [ -f $PIDFILE ]; then +pid=`cat $PIDFILE` +## check if pid is there +if [ "1$pid" -ne "1" ]; then +## check if process with pid not running +set +e +kill -0 $pid > /dev/null 2>&1 +[ $? -eq 0 ] && start=0 +set -e +fi +fi +if [ $start -eq 1 ]; then +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +log_daemon_msg "Starting oc vyos" +# We have completely messed up the rc level scripts +sudo chown vyos:users -R /var/run/elastic_services +sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS +log_end_msg $? +else +echo "oc-vyos[$pid] is already running" +fi +;; +stop) +test "$ENABLED" = "true" || exit 0 +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Stopping oc vyos" +start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +rm $PIDFILE +else +echo "PID file not existing" +fi +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +;; +restart|force-reload) +test "$ENABLED" = "true" || exit 1 +$0 stop +sleep 2 +$0 start +;; +reload) +test "$ENABLED" = "true" || exit 0 +## check if pidfile is there +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Reloading oc vyos" +start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +else +echo "oc vyos is not running or PID file not existing" +fi +;; +status) +test "$ENABLED" = "true" || exit 0 +status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +;; +*) +log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +exit 1 +;; +esac +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/restart_vpn new file mode 100755 index 0000000000..2cb8fe4762 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/restart_vpn @@ -0,0 +1,3 @@ +#!/bin/vbash +sudo rm /var/run/pluto.pid +vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/README new file mode 100644 index 0000000000..9a29ea0b1f --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/README @@ -0,0 +1,14 @@ +1) Add the following line in /etc/rc.local file as give in sample rc.local file + sudo bash /usr/share/oc-pbr/pbr_init & +2) Modify the interfaces file to looks like given sample interfaces file + +3) mkdir -p /usr/share/oc-pbr + +4) copy pbr_init and pbr to /usr/share/oc-pbr + + +vyos agent (server2.py) adds route to the controller node received from pushed +configuration, and also writes a route in the +/usr/share/oc-pbr/controller_route file. This is to make the added route +persistent even if the instance is rebooted. +controller_route is called from pbr_init file. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/controller_route b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/controller_route new file mode 100755 index 0000000000..e69de29bb2 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/dhclient-script b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/dhclient-script new file mode 100755 index 0000000000..a1a2423149 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/dhclient-script @@ -0,0 +1,327 @@ +#!/bin/vbash + +# dhclient-script for Linux. Dan Halbert, March, 1997. +# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. +# Modified for Debian. Matt Zimmerman and Eloy Paris, December 2003 +# Modified to remove useless tests for antiquated kernel versions that +# this doesn't even work with anyway, and introduces a dependency on /usr +# being mounted, which causes cosmetic errors on hosts that NFS mount /usr +# Andrew Pollock, February 2005 +# Modified to work on point-to-point links. Andrew Pollock, June 2005 +# Modified to support passing the parameters called with to the hooks. Andrew Pollock, November 2005 + +# 'ip' just looks too weird. /sbin/ip looks less weird. +ip=/sbin/ip + + +# modified make_resolv_conf () for Vyatta system below +make_resolv_conf() { + local new_resolv_conf="/etc/resolv.conf.dhclient-new-$interface" + local old_resolv_conf="/etc/resolv.conf.dhclient-old-$interface" + mv -f $new_resolv_conf $old_resolv_conf + if [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then + if [ -n "$new_domain_name" ]; then + echo search $new_domain_name >>$new_resolv_conf + fi + if [ -n "$new_domain_name_servers" ]; then + for nameserver in $new_domain_name_servers; do + echo nameserver $nameserver >>$new_resolv_conf + done + fi + elif [ "x${new_dhcp6_name_servers}" != x ] ; then + if [ "x${new_dhcp6_domain_search}" != x ] ; then + echo search ${new_dhcp6_domain_search} >> $new_resolv_conf + fi + for nameserver in ${new_dhcp6_name_servers} ; do + echo nameserver ${nameserver} >> $new_resolv_conf + done + else + echo " " > $new_resolv_conf + fi + + /opt/vyatta/sbin/vyatta_update_resolv.pl --dhclient-script 1 + if ! diff -q $old_resolv_conf $new_resolv_conf >&/dev/null; then + if [ -d /opt/vyatta/config/active/service/dns/forwarding ]; then + /opt/vyatta/sbin/vyatta-dns-forwarding.pl --update-dnsforwarding --outside-cli >&/dev/null + fi + fi + rm -f $old_resolv_conf +} + +run_hook() { + local script="$1" + local exit_status + shift # discard the first argument, then the rest are the script's + + if [ -f $script ]; then + . $script "$@" + fi + + + if [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; then + logger -p daemon.err "$script returned non-zero exit status $exit_status" + save_exit_status=$exit_status + fi + + return $exit_status +} + +run_hookdir() { + local dir="$1" + local exit_status + shift # See run_hook + + if [ -d "$dir" ]; then + for script in $(run-parts --list $dir); do + run_hook $script "$@" || true + exit_status=$? + done + fi + + return $exit_status +} + +# Must be used on exit. Invokes the local dhcp client exit hooks, if any. +exit_with_hooks() { + exit_status=$1 + + # Source the documented exit-hook script, if it exists + if ! run_hook /etc/dhcp3/dhclient-exit-hooks "$@"; then + exit_status=$? + fi + + # Now run scripts in the Debian-specific directory. + if ! run_hookdir /etc/dhcp3/dhclient-exit-hooks.d "$@"; then + exit_status=$? + fi + + exit $exit_status +} + +get_prefix() { + # use existing perl module to compute prefix + # one line don't bother with script + perl -MNetAddr::IP \ + -e '$ip = new NetAddr::IP(@ARGV); print $ip->masklen(), "\n"' $* +} + +set_hostname() { + local current_hostname=$(hostname) + if [ -z "$current_hostname" -o "$current_hostname" = "(none)" ]; then + hostname "$new_host_name" + fi +} + +set_address() { + if [ -n "$old_ip_address" ] && + [ "$old_ip_address" != "$new_ip_address" -o "$old_prefix" != "$new_prefix" ] ; then + # Clear out route cache and ARP tables and all addresses and routes + ip -family inet addr flush dev $interface + fi + + if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ] || + [ -z "$old_ip_address" -o "$old_ip_address" != "$new_ip_address" ] || + [ -z "$old_prefix" -o "$old_prefix" != "$new_prefix" ] ; then + ip -family inet addr add $new_ip_address/$new_prefix \ + broadcast $new_broadcast_address dev $interface + fi + + if [ -n "$new_interface_mtu" ] && + [ ! "$old_interface_mtu" = "$new_interface_mtu" ]; then + ip link set $interface mtu $new_interface_mtu + fi +} + +# Administrative for DHCP routes. Should be configurable +ZEBRA_ROUTE_DHCP=210 + +update_routers() { + if [ -n "$old_routers" ]; then + # No change just renewing + if [ "$reason" = "RENEW" -a "$old_routers" = "$new_routers" ]; then + return 0 + fi + + for router in $old_routers; do + if [ "$old_subnet_mask" == "255.255.255.255" ]; then + vtysh -c "conf t" -c "no ip route $router $interface $ZEBRA_ROUTE_DHCP" + fi + if [ "eth0" == "$interface" ]; then + vtysh -c "conf t" -c "no ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" + fi + done + fi + + for router in $new_routers; do + # point to point + if [ "$new_subnet_mask" == "255.255.255.255" ]; then + vtysh -c "conf t" -c "ip route $router $interface $ZEBRA_ROUTE_DHCP" + fi + if [ "eth0" == "$interface" ]; then + vtysh -c "conf t" -c "ip route 0.0.0.0/0 $router 2" + fi + done + # Making vrrp interface down and up adds back our static route + intf=`ip ad | grep $interface'v' | awk '{print $2}' | grep '@' |cut -f1 -d'@'` + if [ 'x'$intf != x ]; then + sudo ifconfig $intf down + sudo ifconfig $intf up + fi +} + +if [ -n "$new_subnet_mask" ]; then + new_prefix=$(get_prefix $new_ip_address $new_subnet_mask) +fi +if [ -n "$old_subnet_mask" ]; then + old_prefix=$(get_prefix $old_ip_address $old_subnet_mask) +fi +if [ -n "$new_interface_mtu" ]; then + # Vyatta configuration overrides response from server to allow user + # to work around broken ISP's + mtu_path=$(/opt/vyatta/sbin/vyatta-interfaces.pl --dev=$interface --path) + if [ -r $mtu_path ]; then + read new_interface_mtu < $mtu_path + fi + + # The 576 MTU is only used for X.25 and dialup connections + # where the admin wants low latency. Such a low MTU can cause + # problems with UDP traffic, among other things. As such, + # disallow MTUs from 576 and below by default, so that broken + # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc). + if [ $new_interface_mtu -le 576 ]; then + new_interface_mtu= + fi +fi + +# The action starts here + +# Invoke the local dhcp client enter hooks, if they exist. +run_hook /etc/dhcp3/dhclient-enter-hooks +run_hookdir /etc/dhcp3/dhclient-enter-hooks.d + +# Execute the operation +case "$reason" in + MEDIUM) + # Do nothing + ;; + + PREINIT) + ip -family inet addr flush dev $interface + ip link set $interface up + + if [ -n "$DHCLIENT_DELAY" ] && [ $DHCLIENT_DELAY -gt 0 ]; then + sleep $DHCLIENT_DELAY + fi + ;; + + ARPCHECK|ARPSEND) + if [ -z "$new_ip_address" ] || [ -z "$interface" ] || + arping -q -f -c 2 -w 3 -D -I $interface $new_ip_address; then + exit_with_hooks 0 + else + exit_with_hooks 1 + fi + ;; + + BOUND|RENEW|REBIND|REBOOT) + set_hostname + + make_resolv_conf + set_address + update_routers + + exit_with_hooks 0 + ;; + + EXPIRE|FAIL|RELEASE|STOP) + new_routers=""; update_routers + + if [ -n "$old_ip_address" ]; then + ip -family inet addr flush dev ${interface} + fi + if [ "$reason" = "STOP" ]; then + ip link set ${interface} down + fi + + make_resolv_conf + ;; + + TIMEOUT) + if [ -n "$new_routers" ]; then + ip -family inet addr add $new_ip_address/$new_prefix \ + broadcast $new_broadcast_address dev $interface + + set -- $new_routers + first_router="$1" + + if ping -q -c 1 -I $interface $first_router ; then + make_resolv_conf + set_address + update_routers + + exit_with_hooks 0 + fi + ip -family inet addr flush dev $interface + # Note: this exits with interface still up + # see Debian bug #144666 + fi + exit_with_hooks 2 "$@" + ;; + + PREINIT6) + # Ensure interface is up. + ${ip} link set ${interface} up + + exit_with_hooks 0 + ;; + + BOUND6) + if [ x${new_ip6_address} != x ] && [ x${new_ip6_prefixlen} != x ] ; then + ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ + dev ${interface} scope global + fi + + # Check for nameserver options. + make_resolv_conf + + exit_with_hooks 0 + ;; + + RENEW6|REBIND6) + # Make sure nothing has moved around on us. + + # Nameservers/domains/etc. + if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || + [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then + make_resolv_conf + fi + + exit_with_hooks 0 + ;; + + DEPREF6) + if [ x${new_ip6_prefixlen} = x ] ; then + exit_with_hooks 2; + fi + + ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ + dev ${interface} scope global preferred_lft 0 + + exit_with_hooks 0 + ;; + + EXPIRE6|RELEASE6|STOP6) + if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then + exit_with_hooks 2; + fi + + ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ + dev ${interface} + + make_resolv_conf + exit_with_hooks 0 + ;; + +esac + +exit_with_hooks 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interface-post-up new file mode 100755 index 0000000000..56862e7f18 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interface-post-up @@ -0,0 +1,2 @@ +/sbin/route del default dev $IFACE +echo 1 > /proc/sys/net/ipv4/conf/$IFACE/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interfaces new file mode 100644 index 0000000000..72cf17c415 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interfaces @@ -0,0 +1,59 @@ +# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or +# /usr/share/doc/ifupdown/examples for more information. + +# The loopback network interface +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth1 +iface eth1 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth2 +iface eth2 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth3 +iface eth3 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth4 +iface eth4 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth5 +iface eth5 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth6 +iface eth6 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth7 +iface eth7 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth8 +iface eth8 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth9 +iface eth9 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth10 +iface eth10 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth11 +iface eth11 inet dhcp +post-up /etc/network/interface-post-up + +allow-hotplug eth12 +iface eth12 inet dhcp +post-up /etc/network/interface-post-up + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/management_pbr new file mode 100755 index 0000000000..ed5776260b --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/management_pbr @@ -0,0 +1,11 @@ +#!/bin/bash +echo "dhclient: $reason" +case $reason in + BOUND|RENEW|REBIND|REBOOT) + if [ "eth0" == $interface ]; then + sudo bash /usr/share/oc-pbr/pbr_init & + echo "Management pbr is set" + fi + ;; +esac + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/no-default-route new file mode 100755 index 0000000000..885672d274 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/no-default-route @@ -0,0 +1,12 @@ +#!/bin/bash +case $reason in + BOUND|RENEW|REBIND|REBOOT) + if [ "eth0" == $interface ]; then + echo $new_routers > /usr/share/oc-pbr/eth0_route + #unset new_routers + else + unset new_routers + fi + echo "Default gateway has been cleared" + ;; +esac diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr new file mode 100755 index 0000000000..90e91c1464 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr @@ -0,0 +1,2 @@ +#!/bin/vbash +sudo ip route add default via $@ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr_init new file mode 100755 index 0000000000..e3fe31c7ce --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr_init @@ -0,0 +1,98 @@ +#!/bin/bash + +#Converts decimal to ip address +function dec2ip () { + local ip dec=$1 + for e in {3..0} + do + ((octet = dec / (256 ** e) )) + ((dec -= octet * 256 ** e)) + ip+=$delim$octet + delim=. + done + echo $ip +} + +#Converts ip notation to decimal +function ip2dec () { + local a b c d ip=$1 + IFS=. read -r a b c d <<< "$ip" + echo $((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d)) +} + + +#sleep 20 +flag=0 +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +all_interfaces=`/sbin/ifconfig | grep "Link encap" | grep -v "127.0.0.1" |cut -d: -d " " -f 1` +index=0 +for i in $all_interfaces; do + if [ "$i" == "eth0" ] || [ "$i" == "eth1" ] + then + while true + do + ip_addr=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $4 }'` + if [ $ip_addr ] + then + #echo "GOT IP for interface $i" + #flag=1 + break + fi + done + bcast_ip=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $6 }'`; + mask=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $8 }'`; + dec_bcast_ip=$(ip2dec $bcast_ip) + dec_mask=$(ip2dec $mask) + dec_net_ip=$(($dec_bcast_ip & $dec_mask)) + net_ip=$(dec2ip $dec_net_ip) + interfaces[$index]=$i + ip_addresses[$index]=$ip_addr + network_id[$index]=$net_ip + filename="/var/lib/dhcp3/dhclient_"$i"_lease" + #route=`grep "option routers" $filename |tail -1| cut -d: -d " " -f5` + route=`grep "new_routers" $filename |tail -1| cut -d: -d "=" -f2| tr -d "'"` + default_route[$index]=$route + #echo "$index ${default_route[$index]}" + if [ "$i" == "eth0" ] && [ $flag == 0 ] + then + table_name=$i"_table" + table_id=`expr $index + 5` + is_present=`grep "$table_name" /etc/iproute2/rt_tables` + if [ "$is_present" == "" ] + then + echo $table_id $table_name >> /etc/iproute2/rt_tables + fi + `ip route add default via ${default_route[$index]} table $table_name` + `ip rule del from ${ip_addresses[$index]} table $table_name` + `ip rule add from ${ip_addresses[$index]} table $table_name` + echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route + #echo "configured pbr for interface $i" + fi + #index=`expr $index + 1` + ((index++)) + fi +done + +index=0 +for interface in ${interfaces[*]}; do + #echo "$index ${default_route[$index]}" + if [ "$interface" == "eth1" ] && [ $flag == 0 ] + then + #echo "Set default route on $interface ${default_route[$index]} $index" + cmd="bash /usr/share/oc-pbr/pbr ${default_route[$index]}" + #sudo su - vyos -c "$cmd" + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]} + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit + #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper end + #source /opt/vyatta/etc/functions/script-template + #eval "set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]}" + #eval "commit" + #eval "exit" + fi + #index=`expr $index + 1` + ((index++)) +done + +#bash /usr/share/oc-pbr/controller_route +echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/rc.local b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/rc.local new file mode 100755 index 0000000000..2a68541436 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/rc.local @@ -0,0 +1,19 @@ +#!/bin/sh -e +# +# rc.local +# +# This script is executed at the end of each multiuser runlevel. +# value on error. +# +# In order to enable or disable this script just change the execution +# bits. +# +# By default this script does nothing. + +# Do not remove the following call to vyatta-postconfig-bootup.script. +# Any boot time workarounds should be put in script below so that they +# get preserved for the new image during image upgrade. +POSTCONFIG=/opt/vyatta/etc/config/scripts/vyatta-postconfig-bootup.script +[ -x $POSTCONFIG ] && $POSTCONFIG +sudo bash /usr/share/oc-pbr/pbr_init & +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf new file mode 100644 index 0000000000..1ae8510480 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf @@ -0,0 +1,8 @@ +[bin] +vyos_sbin_dir = /opt/vyatta/sbin +shell_api_path = /bin/cli-shell-api + +[log] +logdir=/var/log/oc +logfile=oc-vyos.log +level=ERROR diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/__init__.py new file mode 100644 index 0000000000..3ed9fd0f30 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/__init__.py @@ -0,0 +1 @@ +__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py new file mode 100644 index 0000000000..db45c0e8ea --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py @@ -0,0 +1,88 @@ +from subprocess import call +import netifaces +import logging +from vyos_dhc import initiate_dhclient +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +INTERFACE_RULE_FILE = "/etc/udev/rules.d/70-persistent-cd.rules" +ADD_RULE = 'SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="%s", NAME="%s"' + + +class EditPersistentRule(object): + def __init__(self): + pass + + def add(self, mac_info): + provider_rule, stitching_rule, interface_list = self.get_rule(mac_info) + self.clean_stale_rules(interface_list) + # line = ADD_RULE % (mac, interface) + # initiate_dhclient() + self.delete(mac_info) + try: + call("sudo chown vyos: " + "/etc/udev/rules.d/70-persistent-cd.rules".split() + ) + with open(INTERFACE_RULE_FILE, "a") as myfile: + myfile.write(provider_rule + "\n") + myfile.write(stitching_rule + "\n") + except Exception as err: + logger.error("Failed to add persistent rule for macs -%r " % + mac_info) + raise Exception(err) + finally: + call("sudo chown root:root " + "/etc/udev/rules.d/70-persistent-cd.rules".split() + ) + + def delete(self, mac_info): + pro_cmd = 'sudo sed -i /%s/d %s' % (mac_info['provider_mac'], + INTERFACE_RULE_FILE) + stitch_cmd = 'sudo sed -i /%s/d %s' % (mac_info['stitching_mac'], + INTERFACE_RULE_FILE) + try: + call(pro_cmd.split()) + call(stitch_cmd.split()) + except Exception as err: + logger.error("Failed to delete persistent rule for macs -%r " % + mac_info) + raise Exception(err) + + def get_rule(self, mac_info): + interfaces = netifaces.interfaces() + provider_rule = '' + stitching_rule = '' + interface_list = list() + for interface in interfaces: + physical_interface = netifaces.ifaddresses(interface).get( + netifaces.AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses(interface)[netifaces.AF_LINK][0][ + 'addr'] + + if mac_addr == mac_info['provider_mac']: + interface_list.append(interface) + provider_rule = ADD_RULE % (mac_addr, interface) + elif mac_addr == mac_info['stitching_mac']: + interface_list.append(interface) + stitching_rule = ADD_RULE % (mac_addr, interface) + + return provider_rule, stitching_rule, interface_list + + def clean_stale_rules(self, interface_list): + try: + for interface in interface_list: + cmd = 'sudo sed -i /%s/d %s' % ( + interface, INTERFACE_RULE_FILE) + call(cmd.split()) + except Exception, err: + logger.error("ERROR deleting stale persistent rule. Interfaces: " + "%r . Details: %r" % (interface_list, str(err))) + + + + + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_constants.py new file mode 100644 index 0000000000..5e417c91e8 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_constants.py @@ -0,0 +1,17 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +actions = ["drop", "reject", "accept", "inspect"] +state = ["established", "invalid", "related"] +availability = ["enable", "disable"] +intercloud = False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py new file mode 100755 index 0000000000..9ffe9581ab --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +from operations import configOpts + +FWN = "firewall name" +ZPZ = "zone-policy zone" +class fwHandler(configOpts): + actions=["drop","reject","accept","inspect"] + state=["established","invalid","related"] + availability=["enable","disable"] + + def firewall_config(self,name,suffix): + firewall=[FWN,name,"rule"] + firewall.extend(suffix) + self.set(firewall) + + def zone_config(self,suffix): + zone=[ZPZ] + zone.extend(suffix) + self.set(zone) + + def set_zone_desc(self,zone_name,desc): + description = [zone_name,"description",desc] + self.zone_config(description) + + def set_zone_interface(self,zone_name,iface): + interface = [zone_name,"interface",iface] + self.zone_config(interface) + + def setup_fw_on_zone(self,zone_src,zone_dst,firewall): + fw_on_zone=[zone_src,"from",zone_dst,"name",firewall] + self.zone_config(fw_on_zone) + + def set_default_action(self,name,rule_num,action): + if action in self.actions: + self.set_action[rule_num,"action",action] + self.firewall_config(name,set_action) + + def set_rule_state(self,name,rule_num,state,allow): + if state in self.states and allow in self.availability: + self.set_state[rule_num,"state",state,allow] + self.firewall_config(name,set_state) + + def set_protocol(self,name,rule_num,prot): + protocol=[rule_num,"protocol",prot] + self.firewall_config(name,protocol) + + def set_dest_port(self,name,rule_num,portlist,orient="destination"): + port=[rule_num,orient,"port",portlist] + self.firewall_config(name,port) + + + def set_dest_addr(self,name,rule_num,addr_subnet,orient="destination"): + addr=[rule_num,orient,"address",addr_subnet] + self.firewall_config(name,addr) + + def set_src_port(self,name,rule_num,portlist): + self.set_dest_port(name,rule_num,portlist,"source") + + def set_src_addr(self,name,rule_num,addr_subnet): + self.set_dest_addr(name,rule_num,addr_subnet,"source") + + def rule_state(self,name,rule_num,status): + if status in availability: + rule_status=[rule_num,status] + self.firewall_config(name,rule_status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py new file mode 100644 index 0000000000..bd1017c22c --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py @@ -0,0 +1,367 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +#!/usr/bin/env python +import json +import netifaces +import time +import logging +from netifaces import AF_INET, AF_LINK + +from execformat.executor import session + +from operations import configOpts +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class VYOSHAConfig(configOpts): + """ + Class to configure HA for VYOS. + """ + def __init__(self): + super(VYOSHAConfig, self).__init__() + pass + + def configure_conntrack_sync(self, ha_config): + """ + :param ha_config: + :return: + """ + ha_config = json.loads(ha_config) + monitoring_info, data_info = self.get_conntrack_request_data( + ha_config) + event_queue_size = monitoring_info["event_queue_size"] + cluster_name = monitoring_info["cluster_name"] + mcast_group = monitoring_info["mcast_group"] + sync_queue_size = monitoring_info["sync_queue_size"] + monitoring_mac = monitoring_info["monitoring_mac"] + + monitoring_interface, monitoring_ip = self._get_interface_name( + dict(monitoring_mac=monitoring_mac), + interface_type='monitoring') + + if not monitoring_interface: + # return {'status': 500, + # 'message': 'Failed to get monitoring interface name'} + logger.error("Failed to configure conntrack for CLUSTER- %r" % + cluster_name) + raise Exception("Conntrack sync configuration failed. Reason - " + "No monitoring interface information found.", + 400, dict(ha_config=ha_config)) + + conntrack_commands = self._set_conntrack( + cluster_name, event_queue_size, mcast_group, + monitoring_interface, sync_queue_size) + interface_vrrp_commands = self.set_vrrp_for_interface(data_info) + + all_commands = conntrack_commands + interface_vrrp_commands + + self._execute_commands(all_commands, ha_config['tenant_id']) + logger.debug("VRRP configured succesfully - %r " % all_commands) + return {'status': 200, 'message': 'VRRP configured succesfully'} + + def set_interface_ha(self, interface_config): + ha_config = json.loads(interface_config) + try: + cluster_name = ha_config["cluster_name"] + vrrp_group = ha_config["vrrp_group"] + data_macs = ha_config["data_macs"] + preempt_delay = ha_config["preempt_delay"] + priority = ha_config["priority"] + vip = ha_config["vip"] + tenant_id = ha_config["tenant_id"] + advertised_interval = ha_config["advertised_interval"] + except KeyError, err: + raise Exception("HA configuration for interface failed. Value " + "not found. %r" % str(err), + 400, dict(interface_config=ha_config)) + interface_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, + vip=vip, preempt_delay=preempt_delay, + priority=priority, cluster_name=cluster_name, + advertised_interval=advertised_interval, + tenant_id=tenant_id) + + interface_vrrp_commands = self.set_vrrp_for_interface(interface_info) + + self._execute_commands(interface_vrrp_commands, interface_info[ + 'tenant_id']) + logger.debug("VRRP succesfully configured for interfaces.") + return {'status': 200, 'message': 'VRRP succesfully configured for ' + 'interfaces'} + + def delete_vrrp(self, vrrp_config): + """ + :param self: + :param vrrp_config: + :return: + This method makes an assumption that detach of an interface will + finally clean the vrrp entry. That's why doesn't raise any + exception, as was observed that even though it succeeds but raises an + exception. Investigation will continue. Also this methods doesn't + clean conntrack explicitly, instead it goes with VM delete. + Exception code will be incorporated once the exception established + case. + """ + vrrp_config = json.loads(vrrp_config) + data_macs = vrrp_config["data_macs"] + # cluster_name = vrrp_config.get("cluster_name", "CLUSTER-1") + + data_interface, data_ip = self._get_interface_name( + dict(data_mac=data_macs['provider_mac']), interface_type='data') + + provider_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface + + data_interface, data_ip = self._get_interface_name( + dict(data_mac=data_macs['stitching_mac']), interface_type='data') + stitching_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface + + session.setup_config_session() + # delete_conntrack_cluster = ("service conntrack-sync " + # "failover-mechanism vrrp sync-group %s" % + # cluster_name) + # try: + # self.delete(group_delete.split()) + # except Exception, err: + # session.discard() + # session.teardown_config_session() + # raise Exception(err) + + try: + self.delete(provider_vrrp_delete.split()) + except Exception, err: + # session.discard() + logger.error("Error deleting provider vrrp %r " % err) + # raise Exception(err) + + try: + self.delete(stitching_vrrp_delete.split()) + except Exception, err: + # session.discard() + logger.error("Error deleting stitching vrrp %r " % err) + # raise Exception(err) + + # try: + # self.delete(delete_conntrack_cluster.split()) + # except Exception, err: + # session.discard() + # session.teardown_config_session() + # raise Exception(err) + # logger.error("Error deleting conntrack - %r " % err) + + session.commit() + time.sleep(5) + session.save() + # REVISIT (VK) This sleep need to get invoked if we see any issue + # with session teardown. + # time.sleep(5) + session.teardown_config_session() + logger.debug("VRRP succesfully deleted for interfaces") + return {'status': 200, 'message': 'VRRP succesfully deleted for ' + 'interfaces'} + + def set_vrrp_for_interface(self, data_info): + interface_commands = list() + direct_call = False + if isinstance(data_info, str): + direct_call = True + data_info = json.loads(data_info) + data_macs = data_info.get("data_macs", {}) + vips = data_info.get("vip", {}) + vrrp_groups = data_info["vrrp_group"] + + for mac_type, mac in data_macs.iteritems(): + # mac_type - provider_mac, stitching_mac + data_mac = dict(data_mac=str(mac)) + vip_type = mac_type.split("_")[0] + "_vip" + vip_ip = vips.get(vip_type) + if mac_type == "provider_mac": + vrrp_group = vrrp_groups["provider_vrrp_group"] + if mac_type == "stitching_mac": + vrrp_group = vrrp_groups["stitching_vrrp_group"] + + interface_name, ip = self._get_interface_name( + data_mac, interface_type='data') + + if not interface_name: + logger.error("Failed to configure VRRP, as unable to get " + "interface name.") + raise Exception('VRRP config failed.Failed to get interface' + ' name to configure vrrp', 400, + dict(data_info=data_info)) + + common_command = "interfaces ethernet %s vrrp vrrp-group %s " % ( + interface_name, vrrp_group) + + interface_address_set = "interfaces ethernet %s address %s " % ( + interface_name, ip) + + advt_interval_set = common_command + "advertise-interval %s " % ( + data_info["advertised_interval"]) + + preempt_set = common_command + "preempt true" + # preempt_set = common_command + "preempt %s" % data_info[ + # "preempt"] + preempt_delay_set = common_command + "preempt-delay %s" % \ + data_info["preempt_delay"] + priority_set = common_command + "priority %s" % data_info[ + "priority"] + rfc_set = common_command + "rfc3768-compatibility" + sync_group_set = common_command + "sync-group %s " % data_info[ + "cluster_name"] + virtual_address_set = common_command + "virtual-address %s" % \ + vip_ip + + interface_commands += [interface_address_set, advt_interval_set, + preempt_set, preempt_delay_set, + priority_set, rfc_set, sync_group_set, + virtual_address_set] + + logger.debug("Interface commands - %r ", interface_commands) + if not direct_call: + return interface_commands + else: + self._execute_commands(interface_commands, data_info.get( + 'tenant_id')) + return dict(message='Interface configured succesfully') + + @staticmethod + def _set_conntrack(cluster_name, event_queue_size, mcast_group, + monitoring_interface, sync_queue_size): + peer_link_set = "interfaces ethernet %s description PEER-LINK" % \ + monitoring_interface + event_queue_set = "service conntrack-sync event-listen-queue-size " \ + "%s" % str(event_queue_size) + cluster_set = "service conntrack-sync failover-mechanism vrrp " \ + "sync-group " + cluster_name + interface_set = "service conntrack-sync interface %s" % \ + monitoring_interface + mcast_set = "service conntrack-sync mcast-group %s " % mcast_group + sync_queue_set = "service conntrack-sync sync-queue-size %s " % \ + str(sync_queue_size) + commands = [peer_link_set, event_queue_set, cluster_set, + interface_set, mcast_set, sync_queue_set] + + logger.debug("Conntrack commands - %r " % commands) + return commands + + @staticmethod + def _get_interface_name(ha_config, interface_type=None): + """ + :param ha_config: + :param interface_type: + :return: + """ + interfaces = netifaces.interfaces() + for interface in interfaces: + physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) + if not physical_interface: + continue + if AF_INET not in netifaces.ifaddresses(interface).keys(): + continue + mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] + ip_addr = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] + netmask = netifaces.ifaddresses(interface)[AF_INET][0]['netmask'] + if mac_addr == ha_config.get('monitoring_mac', None) and \ + interface_type.lower() == 'monitoring': + return interface, ip_addr + elif (mac_addr == ha_config.get('data_mac', None) and + interface_type.lower() == 'data'): + mlen = sum([bin(int(x)).count('1') for x in + netmask.split('.')]) + ip_addr += ("/" + str(mlen)) + return interface, ip_addr + + logger.error("interface name none, ha_config: %s" % ha_config) + return None, None + + def get_conntrack_request_data(self, ha_config): + try: + monitoring_mac = ha_config["monitoring_mac"] + queue_size = ha_config.get("queue_size", 8) + cluster_name = ha_config["cluster_name"] + mcast_group = ha_config["mcast_group"] + sync_queue_size = ha_config.get("sync_queue_size", 1) + vrrp_group = ha_config["vrrp_group"] + data_macs = ha_config["data_macs"] + preempt_delay = ha_config["preempt_delay"] + priority = ha_config["priority"] + vip = ha_config["vip"] + advertised_interval = ha_config["advertised_interval"] + except KeyError, err: + raise Exception("Parameters missing for conntrack configuration " + "%r" % str(err), 400, {"ha_config": ha_config}) + + monitoring_info = dict(monitoring_mac=monitoring_mac, + event_queue_size=queue_size, + cluster_name=cluster_name, + mcast_group=mcast_group, + sync_queue_size=sync_queue_size) + + data_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, + vip=vip, preempt_delay=preempt_delay, + priority=priority, cluster_name=cluster_name, + advertised_interval=advertised_interval) + + return monitoring_info, data_info + + def get_interface_data(self, interface_config): + try: + data_macs = interface_config["data_macs"] + advertised_interval = interface_config["advertised_interval"] + vrrp_group = interface_config["vrrp_group"] + preempt_delay = interface_config["preempt_delay"] + priority = interface_config["priority"] + vip = interface_config["vip"] + except KeyError: + pass + + data_info = dict(data_macs=data_macs, + advertised_interval=advertised_interval, + vrrp_group=vrrp_group, preempt_delay=preempt_delay, + priority=priority, vip=vip) + + return data_info + + def _execute_commands(self, all_commands, tenant_id=None): + session.setup_config_session() + for command in all_commands: + try: + self.set(command.split()) + except: + logger.error("Failed to configure HA. Tenant - %r" % tenant_id) + session.teardown_config_session() + raise Exception("Failed to configure HA for tenant %s" % + tenant_id, 400, {"commands": all_commands, + "failed_command": command}) + try: + session.commit() + except: + logger.error("Failed to commit HA configuration. Tenant - %r" + % tenant_id) + session.discard() + time.sleep(2) + session.teardown_config_session() + raise Exception("Failed to configure HA for tenant %s" % tenant_id, + 400, {"commands": all_commands, + "failed_command": command}) + time.sleep(5) + session.save() + time.sleep(5) + session.teardown_config_session() + + + + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/interface_monitor.sh new file mode 100755 index 0000000000..f2ebd12247 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/interface_monitor.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + + function enumerate_net_interfaces { + + echo `date` `ip addr` >> /var/log/oc/vyos_monitor + echo "\n" + echo `date` `sudo netstat -pantl | grep 8888` >>/var/log/oc/vyos_monitor + } + + enumerate_net_interfaces + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py new file mode 100644 index 0000000000..b40135d752 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py @@ -0,0 +1,55 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import logging +import subprocess + +from vyos_session import utils + +OP_SUCCESS = True +OP_FAILED = False + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +class APIHandler(object): + def __init__(self): + pass + + def run_command(self, command): + proc = subprocess.Popen(command, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + out, err = proc.communicate() + if err: + logger.error("Unable to run command %s, ERROR- %s" % + (command, err)) + return None + return out + + def configure_rsyslog_as_client(self, config): + command = """ + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system syslog host %s facility all level %s + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit + /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save + """ %(config['server_ip'], config['log_level']) + + try: + out = self.run_command(command) + return OP_SUCCESS + except Exception as ex: + logger.error("Error while configuring rsyslog as client. %s" % ex) + return OP_FAILED diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py new file mode 100644 index 0000000000..b2963430a0 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py @@ -0,0 +1,357 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +#!/usr/bin/env python +import logging +import json +import netifaces +import time +import fw_constants +import ast +from operations import configOpts +from vyos_session import utils +from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE +from execformat.executor import session + +FWN = 'firewall name' +# oc_fw_identifier = 'oc_fw' +rule = 'rule' +firewall_rules = { + 'protocol': '%s protocol %s', + 'source_ip_address': '%s source address %s', + 'destination_ip_address': '%s destination address %s', + 'source_port': '%s source port %s', + 'destination_port': '%s destination port %s' + } + +firewall_action = {'allow': 'accept', 'deny': 'drop'} + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class OCFWConfigClass(configOpts): + + def __init__(self): + super(OCFWConfigClass, self).__init__() + self.oc_fw_identifier = 'oc_fw' + self.provider_ptg_interfaces = list() + self.rules = list() + + def set_up_rule_on_interfaces(self, firewall): + """ + firewall = {'status': u'PENDING_CREATE', 'name': u'', 'shared': None, + 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', + 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', + 'admin_state_up': True, 'id': u'e9b5ca2f-a721-41b9-be9b-7a6189ddbec5' + , 'firewall_rule_list': [{'protocol': u'tcp', 'description': u'', + 'source_port': None, 'source_ip_address': None, + 'destination_ip_address': None, + 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', + 'position': 1L, 'destination_port': '80', + 'id': u'b98296cb-335a-4314-83f9-aa5654f296fa', 'name': u'', + 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', 'enabled': True, + 'action': u'allow', 'ip_version': 4L, 'shared': False}], + 'description': u''} + + :param firewall: Firewall object + """ + sorted_rule_list, self.provider_ptg_interfaces = list(), list() + + firewall = json.loads(firewall) + fw_rule_list = firewall['firewall_rule_list'] + logger.info("Initiating firewall - %s build. of Tenant: %s" % ( + firewall['id'], firewall['tenant_id'])) + sorted_rule_list = self.sort_rule_list(fw_rule_list, firewall['id']) + try: + self.set_provider_interface(firewall) + except Exception as e: + msg = ("Firewall - %s configuration failed. Tenant : %s Error " + "retrieving PTG's interface %r" % + (firewall['id'], firewall['tenant_id'], str(e))) + logger.error(msg) + raise Exception(msg, 400, dict(config_success=False)) + else: + if not self.provider_ptg_interfaces: + msg = ("No interface was found to configure firewall - %s . " + "Tenant: %s" % + (firewall['id'], firewall['tenant_id'])) + logger.error(msg) + raise Exception(msg, 400, dict(config_success=False)) + + session.setup_config_session() + # FIXME (VK): This will log error also when there is no firewall + # before on the interface. Need to evaluate side effect of this method. + try: + self._ensure_clean_interface() + except: + pass + self.rules = list() + self.add_common_rule() + try: + for fw_rule in sorted_rule_list: + self.create_vyos_fw_rule(fw_rule) + self.configure_interfaces() + for _rule in self.rules: + self.set(_rule.split()) + session.commit() + except Exception as e: + msg = ("Firewall - %s configuration failed. Error: %s " % + (firewall['id'], str(e))) + logger.error(msg) + session.discard() + session.teardown_config_session() + raise Exception(msg, 400, dict(config_success=False)) + else: + msg = "Firewall - %s rules created successfully on %r" % ( + firewall['id'], self.provider_ptg_interfaces) + logger.info(msg) + return {'status': 200, 'config_success': True, 'message': msg} + finally: + session.save() + time.sleep(4) + session.teardown_config_session() + + def add_common_rule(self): + self.oc_fw_identifier = ('oc_fw' + '_' + + self.provider_ptg_interfaces[0]) + default_action = (FWN + ' ' + self.oc_fw_identifier + + ' default-action drop' + ) + common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + + rule + ' 10') + accept_action = (common_fw_rule_prefix + ' action accept') + established_action = (common_fw_rule_prefix + + ' state established enable') + related_action = (common_fw_rule_prefix + + ' state related enable') + self.rules += [default_action, accept_action, established_action, + related_action] + + def create_vyos_fw_rule(self, fw_rule): + if not fw_rule.get('enabled'): + return + + position = str(int(fw_rule.get('position', '100')) + 10) + if position < 1: + position *= 10 + common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + + rule + ' ' + position) + self.rules.append(common_fw_rule_prefix) + self.rules.append(''.join([common_fw_rule_prefix, ' action %s' % + firewall_action[fw_rule['action'.lower()]]]) + ) + try: + self.rules.extend( + [firewall_rules[k] % + (common_fw_rule_prefix, fw_rule[k] + if k not in ['source_port', 'destination_port'] + else fw_rule[k].replace(':', '-')) + for k, v in fw_rule.iteritems() + if fw_rule[k] and k in firewall_rules] + ) + + except Exception as err: + logger.error("Firewall rule retrieval failed . Error - %s" % + str(err)) + raise Exception(err) + + def configure_interfaces(self): + if fw_constants.intercloud: + # TODO(Vikash) Its not always the bridge will have same name every + # time. Its only for intercloud + interface_conf = ("interfaces bridge br0 firewall in name " + + self.oc_fw_identifier) + self.rules += [interface_conf] + else: + # It would be always 1 for now. + for interface in self.provider_ptg_interfaces: + if interface.lower() == 'lo': + continue + interface_conf = ('interfaces ethernet ' + interface + ' ' + + 'firewall out name ' + self.oc_fw_identifier) + self.rules += [interface_conf] + + def reset_firewall(self, firewall): + fw_data = json.loads(firewall) + try: + self.set_provider_interface(fw_data) + except Exception as err: + msg = ("Firewall %s reset failed. Error retrieving PTG's " + "interface- %r" % (fw_data['id'], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + if not self.provider_ptg_interfaces: + msg = ("No interface was found for - %r " % fw_data[ + 'id']) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False, + message="INTERFACE NOT FOUND")) + + session.setup_config_session() + + if fw_constants.intercloud: + bridge_rule = ("interfaces bridge br0 firewall in name " + + self.oc_fw_identifier) + try: + self.delete(bridge_rule.split()) + except Exception as err: + msg = (" Rule deletion on bridge failed - %s " % str( + err)) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + del_interface_rule = ( + 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + + ' ' + 'firewall') + try: + self.delete(del_interface_rule.split()) + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Rule deletion on interface %s failed. ERROR: %s " % + (self.provider_ptg_interfaces[0], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + try: + session.commit() + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Rule deletion commit operation failed for firewall - %s. " + "Error - %s" % (fw_data['id'], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + + # sleep for 2 sec. Got removed in last merge. + time.sleep(2) + self.oc_fw_identifier = ('oc_fw' + '_' + + self.provider_ptg_interfaces[0]) + del_firewall = FWN + ' ' + self.oc_fw_identifier + try: + self.delete(del_firewall.split()) + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Firewall - %s deletion failed on interface: %r .ERROR %s" + % (fw_data['id'], self.provider_ptg_interfaces[0], + str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + try: + session.commit() + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Session commit failed for firewall deletion : %s. " + "Error - %r " % + (fw_data['id'], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + else: + logger.info("Firewall -%r deleted succesfully" % fw_data[ + 'id']) + + session.save() + # Can be removed if we don't see any issue. + time.sleep(1) + session.teardown_config_session() + + return {'status': 200, 'message': 'Firewall - %s deleted ' + 'succesfully' % fw_data['id'], + 'delete_success': True} + + def sort_rule_list(self, fw_rule_list, fw_id): + fw_rule_list_len = len(fw_rule_list) + rule_list = [-1] * fw_rule_list_len + for rule in fw_rule_list: + ind = rule['position'] - 1 + rule_list[ind] = rule + + if -1 in rule_list: + # raise Exception("Something went wrong") + rule_list = list() + logger.warn("Adding only DROP rule as not received any rules for " + "firewall %s" % fw_id) + return rule_list + + def set_provider_interface(self, firewall): + description = ast.literal_eval(firewall["description"]) + if not description.get('provider_ptg_info'): + raise + provider_ptg_info = description["provider_ptg_info"] + # consumer_ptg_ips = description.get('consumer_ptg_ips', []) + interfaces = netifaces.interfaces() + self.provider_ptg_interfaces = list() + for interface in interfaces: + # IPV4 support only + # (Fixme) what in the case of aliasing? + # ip = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] + # TODO (Vikash) Not reqd for L2 , need to revisit for L3 + # vpn tunnel interface for ssl vpn does not have a mac address + physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] + + if mac_addr in provider_ptg_info: + self.provider_ptg_interfaces.append(interface) + + def get_out_and_in_rule(self, fw_rule_list): + in_rule_list = out_rule_list = list() + + for rule in fw_rule_list: + if rule['direction'] == 'in': + in_rule_list.append(rule) + elif rule['direction'] == 'out': + out_rule_list.append(rule) + else: + raise Exception("Not valid direction") + + return in_rule_list, out_rule_list + + def _ensure_clean_interface(self): + del_interface_rule = ( + 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + + ' ' + 'firewall') + self.oc_fw_identifier = ('oc_fw' + '_' + + self.provider_ptg_interfaces[0]) + del_firewall = FWN + ' ' + self.oc_fw_identifier + try: + self.delete(del_interface_rule.split()) + # delete firewall + self.delete(del_firewall.split()) + except Exception as err: + logger.info("Stale firewall rule deletion on interface %s failed. " + "This method is called with every firewall create to " + "avoid previous stale firewall rule. This message can " + "be ignored." % self.provider_ptg_interfaces[0]) + raise Exception(err) + + def run_sshd_on_mgmt_ip(self, mgmt_ip): + command = "service ssh listen-address %s" % mgmt_ip + session.setup_config_session() + self.set(command.split()) + try: + session.commit() + except: + logger.error("Failed to update sshd listen-address to %s" % + mgmt_ip) + session.discard() + session.teardown_config_session() + return + session.save() + session.teardown_config_session() + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py new file mode 100755 index 0000000000..849124a9a2 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py @@ -0,0 +1,65 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +#!/usr/bin/env python + +import sys +import os +import logging +topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." +topdir = os.path.realpath(topdir) +sys.path.insert(0, topdir) +from execformat.executor import execUtils, OperationFailed +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class configOpts(object): + + def __init__(self): + pass + + def set_1(self, args): + exe=execUtils(list(args)) + exe.execmd() + + def delete_1(self, args): + exe=execUtils(list(args)) + exe.execmd() + + def show(self, args): + exe=execUtils(list(args)) + res,output=exe.execmd(nonsession=True) + return res,output + + def set(self, args): + args.insert(0, 'set') + exe=execUtils(list(args)) + try: + exe.execmd() + return True + except OperationFailed, e: + logger.error(e.message) + return False + + def delete(self, args): + args.insert(0, 'delete') + exe=execUtils(list(args)) + try: + exe.execmd() + return True + except OperationFailed, e: + logger.error(e.message) + return False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py new file mode 100644 index 0000000000..28155768fb --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py @@ -0,0 +1,211 @@ +import json +import logging +import netifaces +import subprocess +import netaddr +import time + +from vyos_session import utils + +ROUTING_TABLE_BASE = 10 + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class RoutesConfigHandler(object): + def __init__(self): + super(RoutesConfigHandler, self).__init__() + + def add_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + gateway_ip = route_info['gateway_ip'] + source_interface = self._get_if_name_by_cidr(source_cidr) + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for configuring " + "routes" %(source_interface)) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + ip_rule_command = "ip rule add from %s table %s" %( + source_cidr, routing_table_number) + out1 = subprocess.Popen(ip_rule_command, shell=True, + stdout=subprocess.PIPE).stdout.read() + ip_rule_command = "ip rule add to %s table main" %(source_cidr) + out2 = subprocess.Popen(ip_rule_command, shell=True, + stdout=subprocess.PIPE).stdout.read() + ip_route_command = "ip route add table %s default via %s" %( + routing_table_number, gateway_ip) + out3 = self._add_default_route_in_table(ip_route_command, + routing_table_number) + output = "%s\n%s\n%s" %(out1, out2, out3) + logger.info("Static route configuration result: %s" %(output)) + return json.dumps(dict(status=True)) + + def _del_default_route_in_table(self, table): + route_del_command = "ip route del table %s default" %(table) + command_pipe = subprocess.Popen(route_del_command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Deleting default route failed: %s" %(err)) + + def _add_default_route_in_table(self, route_cmd, table): + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0: + if "File exists" in err: + self._del_default_route_in_table(table) + else: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + def _delete_ip_rule(self, cidr): + count = 0 + for direction in ["from", "to"]: + ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + while True: + command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0 and "No such file" in err: + break + else: + count = count + 1 + if count >= 10: + logger.error("Deleting policy based routing for CIDR: " + "%s not completed even after 10 attempts" + %(cidr)) + break + + def _del_default_route_in_table(self, table): + route_del_command = "ip route del table %s default" %(table) + command_pipe = subprocess.Popen(route_del_command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Deleting default route failed: %s" %(err)) + + def _add_default_route_in_table(self, route_cmd, table): + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0: + if "File exists" in err: + self._del_default_route_in_table(table) + else: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + command_pipe = subprocess.Popen(route_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + if command_pipe.returncode != 0: + logger.error("Adding default route failed: %s" %(route_cmd)) + logger.error("Error: %s" %(err)) + raise Exception("Setting Default Table route failed") + else: + return out + + def _delete_ip_rule(self, cidr): + count = 0 + for direction in ["from", "to"]: + ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + while True: + command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = command_pipe.communicate() + # Delete the existing default route if any and retry + if command_pipe.returncode != 0 and "No such file" in err: + break + else: + count = count + 1 + if count >= 10: + logger.error("Deleting policy based routing for CIDR: " + "%s not completed even after 10 attempts" + %(cidr)) + break + + # REVISIT(Magesh): There may be a chance that there are duplicate rules + # May have to do a list and cleanup multiple entries + def delete_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + source_interface = self._get_if_name_by_cidr(source_cidr) + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for deleting routes" + %(source_interface)) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + self._delete_ip_rule(source_cidr) + ip_route_command = "ip route del table %s default" %( + routing_table_number) + out = subprocess.Popen(ip_route_command, shell=True, + stdout=subprocess.PIPE).stdout.read() + logger.info("Static route delete result: %s" %(out)) + return json.dumps(dict(status=True)) + + def _get_if_name_by_cidr(self, cidr): + interfaces = netifaces.interfaces() + retry_count = 0 + while True: + all_interfaces_have_ip = True + for interface in interfaces: + inet_list = netifaces.ifaddresses(interface).get( + netifaces.AF_INET) + if not inet_list: + all_interfaces_have_ip = False + for inet_info in inet_list or []: + netmask = inet_info.get('netmask') + ip_address = inet_info.get('addr') + subnet_prefix = cidr.split("/") + if (ip_address == subnet_prefix[0] and + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + return interface + ip_address_netmask = '%s/%s' %(ip_address, netmask) + interface_cidr = netaddr.IPNetwork(ip_address_netmask) + if str(interface_cidr.cidr) == cidr: + return interface + # Sometimes the hotplugged interface takes time to get IP + if not all_interfaces_have_ip: + if retry_count < 10: + time.sleep(3) + retry_count = retry_count + 1 + continue + else: + raise Exception("Some of the interfaces do not have " + "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py new file mode 100644 index 0000000000..d9cd383db8 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py @@ -0,0 +1,57 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import signal +import logging +import sys +from vyos_session.utils import init_logger + + +logger = logging.getlogger(__name__) +init_logger(logger) + + +class OCVyOSServer(object): + def __init__(self): + pass + + + +def handler(signum, frame): + if signum in [2, 3, 11, 15]: + logger.info(" Recieved signal: %r. Thus exiting " % signum) + sys.exit() + else: + logger.info(" Caught singal: %r. Ignoring " % signum) + + +def main(argv): + vyos_server = OCVyOSServer() + host = '' + port = 0 + if len(argv) != 5: + print "server.py -h -p " + sys.exit(2) + + # Review - OSM: We should accept -h -p in any order. + if argv[1] == '-h': + host = argv[2] + if argv[3] == '-p': + port = int(argv[4]) + signal.signal(signal.SIGTERM, handler) + signal.signal(signal.SIGINT, handler) + vyos_server.start(vyos_server.server, host, port) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py new file mode 100644 index 0000000000..53b0fdeff5 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py @@ -0,0 +1,560 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import sys +import os +import json +import signal +import logging +import ast +import time +from os.path import abspath, dirname + +import netifaces + +sys.path.insert(0, dirname(dirname(abspath(__file__)))) +from vyos_session.utils import init_logger +from oc_fw_module import OCFWConfigClass +from edit_persistent_rule import EditPersistentRule +from static_ip import StaticIp +from flask import Flask, request +from os.path import abspath, dirname +from vpn_api_server import VPNHandler as vpnhandler +from vyos_policy_based_routes import RoutesConfigHandler as routes_handler +from ha_config import VYOSHAConfig +from vyos_exception import OCException +from flask import jsonify +from log_forwarder import APIHandler as apihandler +from stats_parser import APIHandler as stats_apihandler +# sys.path.insert(0, dirname(dirname(abspath(__file__)))) +# sys.path.insert(0, (abspath(__file__))) + +logger = logging.getLogger(__name__) +init_logger(logger) + +app = Flask(__name__) + +oc_fw_module = None +e = EditPersistentRule() + +error_msgs = { + 'unexpected': 'Unexpected VYOS ERROR occurred while %s %s ' +} + + +@app.route('/auth-server-config', methods=['POST']) +def auth_server_config(): + data = json.loads(request.data) + f = open("/usr/share/vyos-oc/auth_server.conf", 'w') + f.write(data['auth_uri']) + f.write('\n') + f.write(data['admin_tenant_name']) + f.write('\n') + f.write(data['admin_user']) + f.write('\n') + f.write(data['admin_password']) + f.write('\n') + f.write(data['remote_vpn_role_name']) + f.write("\n") + f.write(data['project_id']) + f.write("\n") + + try: + host_ip = data['host_mapping'].split()[0]+"/32" + command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + gateway_ip = os.popen(command).read().strip().strip("'") + status = vpnhandler().configure_static_route("set", host_ip, gateway_ip) + + except Exception as ex: + err = ("Error in adding rvpn route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + try: + if data['host_mapping'].split()[1]: + os.system("sudo chown vyos:users /etc/hosts") + os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) + os.system("sudo chown root:root /etc/hosts") + #with open('/etc/hosts', 'a') as hosts: + # hosts.write(data['host_mapping']) + except Exception as e: + logger.error("Error in writing host mapping in /etc/hosts - %s" % e) + + return json.dumps(dict(status=True)) + + +@app.route('/create-ipsec-site-conn', methods=['POST']) +def create_ipsec_site_conn(): + """ + Open a "configure" session with vyos + "Set" all the parameters + "commit" the changes + """ + try: + data = json.loads(request.data) + status = vpnhandler().create_ipsec_site_conn(data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = "Error in configuring ipsec_site_conection. Reason: %s" % ex + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/create-ipsec-site-tunnel', methods=['POST']) +def create_ipsec_site_tunnel(): + """ + Open a "configure" session with vyos + "Set" all the parameters + "commit" the changes + """ + try: + tunnel = json.loads(request.data) + pcidrs = tunnel['peer_cidrs'] + for pcidr in pcidrs: + tunnel['peer_cidr'] = pcidr + status = vpnhandler().create_ipsec_site_tunnel(tunnel) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in configuring ipsec_site_tunnel. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ipsec-site-tunnel', methods=['DELETE']) +def delete_ipsec_site_tunnel(): + try: + pcidrs = request.args.get('peer_cidrs') + peer_address = request.args.get('peer_address') + local_cidr = request.args.get('local_cidr') + pcidrs = ast.literal_eval(pcidrs) + for pcidr in pcidrs: + tunnel = {} + tunnel['peer_address'] = peer_address + tunnel['local_cidr'] = local_cidr + tunnel['peer_cidr'] = pcidr + status = vpnhandler().delete_ipsec_site_tunnel(tunnel) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in deleting ipsec_site_tunnel. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ipsec-site-conn', methods=['DELETE']) +def delete_ipsec_site_conn(): + try: + peer_address = request.args.get('peer_address') + status = vpnhandler().delete_ipsec_site_conn(peer_address) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in deleting ipsec_site_connection. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/get-ipsec-site-tunnel-state', methods=['GET']) +def get_ipsec_site_tunnel_state(): + try: + peer_address = request.args.get('peer_address') + lcidr = request.args.get('local_cidr') + pcidr = request.args.get('peer_cidr') + tunnel = {} + tunnel['peer_address'] = peer_address + tunnel['local_cidr'] = lcidr + tunnel['peer_cidr'] = pcidr + status, state = vpnhandler().get_ipsec_site_tunnel_state(tunnel) + return json.dumps(dict(state=state)) + except Exception as ex: + err = ("Error in get_ipsec_site_tunnel_state. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/create-ssl-vpn-conn', methods=['POST']) +def create_ssl_vpn_conn(): + try: + data = json.loads(request.data) + status = vpnhandler().create_ssl_vpn_conn(data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in create_ssl_vpn_connection. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/ssl-vpn-push-route', methods=['POST']) +def ssl_vpn_push_route(): + try: + data = json.loads(request.data) + status = vpnhandler().ssl_vpn_push_route(data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in ssl_vpn_push_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ssl-vpn-conn', methods=['DELETE']) +def delete_ssl_vpn_conn(): + try: + tunnel_name = request.args.get('tunnel') + status = vpnhandler().delete_ssl_vpn_conn(tunnel_name) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_ssl_vpn_conn. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ssl-vpn-route', methods=['DELETE']) +def delete_ssl_vpn_route(): + try: + route = request.args.get('route') + status = vpnhandler().delete_ssl_vpn_route(route) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_ssl_vpn_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/get-ssl-vpn-conn-state', methods=['GET']) +def get_ssl_vpn_conn_state(): + try: + tunnel_name = request.args.get('tunnel') + status, state = vpnhandler().get_ssl_vpn_conn_state(tunnel_name) + return json.dumps(dict(status=status, state=state)) + except Exception as ex: + err = ("Error in get_ssl_vpn_conn_state. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/configure-firewall-rule', methods=['POST']) +def configure_firewall_rule(): + global oc_fw_module + firewall_data = request.data + try: + response = oc_fw_module.set_up_rule_on_interfaces(firewall_data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'configuring', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/delete-firewall-rule', methods=['DELETE']) +def delete_firewall_rule(): + global oc_fw_module + try: + response = oc_fw_module.reset_firewall(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'deleting', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/update-firewall-rule', methods=['PUT']) +def update_firewall_rule(): + global oc_fw_module + try: + oc_fw_module.reset_firewall(request.data) + response = oc_fw_module.set_up_rule_on_interfaces(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'updating', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/add-source-route', methods=['POST']) +def add_source_route(): + try: + return routes_handler().add_source_route(request.data) + except Exception as ex: + err = ("Exception in adding source route. %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-source-route', methods=['DELETE']) +def delete_source_route(): + try: + return routes_handler().delete_source_route(request.data) + except Exception as ex: + err = ("Exception in deleting source route. %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/add-stitching-route', methods=['POST']) +def add_stitching_route(): + try: + gateway_ip = json.loads(request.data).get('gateway_ip') + status = vpnhandler().configure_static_route("set", "0.0.0.0/0", gateway_ip) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in add_stitching_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-stitching-route', methods=['DELETE']) +def delete_stitching_route(): + try: + gateway_ip = request.args.get('gateway_ip') + status = vpnhandler().configure_static_route( + "delete", "0.0.0.0/0", gateway_ip) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_stitching_route. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +@app.route('/configure_conntrack_sync', methods=['POST']) +def configure_conntrack_sync(): + global vyos_ha_config + try: + response = vyos_ha_config.configure_conntrack_sync(request.data) + except Exception as err: + # This flask version has issue in implicit way of registering + # error handler. + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'configuring', 'conntrack sync')))) + else: + return jsonify(**response) + + +@app.route('/configure_interface_ha', methods=['POST']) +def configure_interface_ha(): + global vyos_ha_config + try: + response = vyos_ha_config.set_vrrp_for_interface(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict( + err=error_msgs['unexpected'] % ( + 'configuring', 'HA for the interface')))) + else: + return jsonify(**response) + + +@app.route('/delete_vrrp', methods=['DELETE']) +def delete_vrrp(): + global vyos_ha_config + try: + response = vyos_ha_config.delete_vrrp(request.data) + except Exception as err: + try: + return send_error_response(OCException(err[0], status_code=err[1], + payload=err[2])) + except IndexError: + return send_error_response( + OCException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'deleting', 'VRRP')))) + else: + return jsonify(**response) + + +# @app.errorhandler(OCException) +def send_error_response(error): + response = jsonify(error.to_dict()) + response.status_code = error.status_code + return response + + +@app.route('/add_static_ip', methods=['POST']) +def add_static_ip(): + try: + static_ip_obj = StaticIp() + data = json.loads(request.data) + static_ip_obj.configure(data) + except Exception as err: + msg = ("Error adding static IPs for hotplugged interfaces. " + "Data: %r. Error: %r" % (data, str(err))) + logger.error(msg) + return json.dumps(dict(status=False, reason=msg)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/del_static_ip', methods=['DELETE']) +def del_static_ip(): + try: + static_ip_obj = StaticIp() + data = json.loads(request.data) + static_ip_obj.clear(data) + except Exception as err: + msg = ("Error clearing static IPs for hotplugged interfaces. " + "Data: %r. Error: %r" % (data, str(err))) + logger.error(msg) + return json.dumps(dict(status=False, reason=msg)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/add_rule', methods=['POST']) +def add_rule(): + # configuring sshd to listen on management ip address + ip_addr = get_interface_to_bind() + oc_fw_module.run_sshd_on_mgmt_ip(ip_addr) + + data = json.loads(request.data) + try: + EditPersistentRule.add(e, data) + except Exception as err: + logger.error("Error adding persistent rule %r" % str(err)) + return json.dumps(dict(status=False)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/delete_rule', methods=['DELETE']) +def del_rule(): + data = json.loads(request.data) + try: + EditPersistentRule.delete(e, data) + except Exception as err: + logger.error("Error deleting persistent rule %r" % str(err)) + return json.dumps(dict(status=False)) + else: + return json.dumps(dict(status=True)) + + +@app.route('/configure-rsyslog-as-client', methods=['POST']) +def configure_rsyslog_as_client(): + try: + config_data = json.loads(request.data) + status = apihandler().configure_rsyslog_as_client(config_data) + return json.dumps(dict(status=status)) + except Exception as ex: + err = ("Error while conifiguring rsyslog client. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + +@app.route('/get-fw-stats', methods=['GET']) +def get_fw_stats(): + try: + mac_address = request.args.get('mac_address') + fw_stats = stats_apihandler().get_fw_stats(mac_address) + return json.dumps(dict(stats=fw_stats)) + except Exception as ex: + err = ("Error while getting firewall stats. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + +@app.route('/get-vpn-stats', methods=['GET']) +def get_vpn_stats(): + try: + vpn_stats = stats_apihandler().get_vpn_stats() + return json.dumps(dict(stats=vpn_stats)) + except Exception as ex: + err = ("Error while getting vpn stats. Reason: %s" % ex) + logger.error(err) + return json.dumps(dict(status=False, reason=err)) + + +def handler(signum, frame): + if signum in [2, 3, 9, 11, 15]: + sys.exit(0) + else: + pass + + +def add_management_pbr(): + command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + gateway_ip = os.popen(command).read().strip().strip("'") + command = 'grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + src_ip = os.popen(command).read().strip().strip("'") + routes_info = [{'source_cidr': src_ip, 'gateway_ip': gateway_ip}] + routes_handler().add_source_route(json.dumps(routes_info)) + + +def getipaddr(): + # This is an assumption that service management will always gets + # configured on eth0 interface. + return netifaces.ifaddresses('eth0')[2][0]['addr'] + + +def get_interface_to_bind(): + while True: + try: + ip_addr = getipaddr() + logger.info("Management interface up on - %r " % + ''.join([netifaces.ifaddresses('eth0')[17][0][ + 'addr'][:2], + netifaces.ifaddresses('eth0')[17][0][ + 'addr'][-2:], + netifaces.ifaddresses('eth0')[2][0][ + 'addr'].split('.')[-1] + ])) + except ValueError: + logger.error("Management Interface not UP") + time.sleep(5) + except KeyError: + logger.error("Management Interface not FOUND") + time.sleep(5) + else: + break + return ip_addr + + +def main(): + """ + + :type ip_addr: Server listen address + """ + global oc_fw_module, vyos_ha_config + oc_fw_module = OCFWConfigClass() + vyos_ha_config = VYOSHAConfig() + ip_addr = get_interface_to_bind() + signal.signal(signal.SIGTERM, handler) + signal.signal(signal.SIGINT, handler) + app.run(ip_addr, 8888) + logger.info("VYOS Agent started ..... ") + + +if __name__ == '__main__': + main() + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py new file mode 100644 index 0000000000..223f55407a --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py @@ -0,0 +1,149 @@ + +import logging +import netifaces +import time + +from netifaces import AF_LINK +from operations import configOpts +from execformat.executor import session +from vyos_session.utils import init_logger + +logger = logging.getLogger(__name__) +init_logger(logger) + +COMMAND = "interfaces ethernet %s address %s/%s" + +""" Implements attachment and detachment of fixed IPs to + hot-plugged interfaces based on IP and MAC binding. + +""" + + +class StaticIp(configOpts): + def __init__(self): + self.hotplug_timeout = 25 + + def save(self): + retries = 100 + while retries: + try: + session.commit() + session.save() + time.sleep(3) + session.teardown_config_session() + return + except Exception: + time.sleep(0.1) + retries -= 1 + + def discard(self): + session.discard() + time.sleep(3) + session.teardown_config_session() + + def check_if_interface_is_up(self, pip, sip): + start_time = time.time() + while time.time() - start_time < self.hotplug_timeout: + interfaces = netifaces.interfaces() + if (pip in interfaces and sip in interfaces): + return True + time.sleep(2) + return False + + def _get_interface_name(self, interface_mac): + interfaces = netifaces.interfaces() + + for interface in interfaces: + if netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] == interface_mac: + return interface + + + def configure(self, data): + try: + session.setup_config_session() + ip_mac_map = {} + provider_ip = data['provider_ip'] + provider_mac = data['provider_mac'] + provider_cidr = data['provider_cidr'].split('/')[1] + provider_interface = self._get_interface_name(provider_mac) + + stitching_ip = data['stitching_ip'] + stitching_mac = data['stitching_mac'] + stitching_cidr = data['stitching_cidr'].split('/')[1] + stitching_interface = self._get_interface_name(stitching_mac) + + if not self.check_if_interface_is_up(provider_interface, + stitching_interface): + msg = ("Interfaces are not hotplugged even after waiting " + "for %s seconds." % self.hotplug_timeout) + raise Exception(msg) + + interfaces = netifaces.interfaces() + self.provider_ptg_interfaces = list() + for interface in interfaces: + physical_interface = netifaces.ifaddresses( + interface).get(AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses( + interface)[AF_LINK][0]['addr'] + if 'eth' in interface: + ip_mac_map.update({interface: mac_addr}) + + for (interface, mac_addr) in ip_mac_map.iteritems(): + if provider_mac == mac_addr: + set_ip = COMMAND % (interface, provider_ip, provider_cidr) + elif stitching_mac == mac_addr: + set_ip = COMMAND % (interface, + stitching_ip, stitching_cidr) + else: + continue + result = self.set(set_ip.split()) + logger.debug("Result of add static ip is %s." % result) + self.save() + except Exception as err: + msg = ("Failed to set static IP. Error: %s" % err) + logger.error(msg) + self.discard() + raise Exception(err) + + def clear(self, data): + try: + session.setup_config_session() + ip_mac_map = {} + provider_ip = data['provider_ip'] + provider_mac = data['provider_mac'] + provider_cidr = data['provider_cidr'].split('/')[1] + + stitching_ip = data['stitching_ip'] + stitching_mac = data['stitching_mac'] + stitching_cidr = data['stitching_cidr'].split('/')[1] + + interfaces = netifaces.interfaces() + self.provider_ptg_interfaces = list() + for interface in interfaces: + physical_interface = netifaces.ifaddresses( + interface).get(AF_LINK) + if not physical_interface: + continue + mac_addr = netifaces.ifaddresses( + interface)[AF_LINK][0]['addr'] + if 'eth' in interface: + ip_mac_map.update({interface: mac_addr}) + + for (interface, mac_addr) in ip_mac_map.iteritems(): + if provider_mac == mac_addr: + del_ip = COMMAND % (interface, provider_ip, provider_cidr) + elif stitching_mac == mac_addr: + del_ip = COMMAND % (interface, + stitching_ip, stitching_cidr) + else: + continue + result = self.delete(del_ip.split()) + logger.debug("Result of delete static IP is %s." % result) + self.save() + except Exception as err: + msg = ("Failed to delete static IP. Error: %s." % err) + logger.error(msg) + self.discard() + raise Exception(msg) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py new file mode 100644 index 0000000000..4272ce4d91 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py @@ -0,0 +1,336 @@ +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2015, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA + +import logging +import subprocess +import netifaces + +from netifaces import AF_LINK +from vyos_session import utils + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + +class APIHandler(object): + def __init__(self): + pass + + def run_command(self, command): + proc = subprocess.Popen(command, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + out, err = proc.communicate() + if err: + logger.error("Unable to run command %s, ERROR- %s" % + (command, err)) + return None + return out + + def _get_interface_name(self, interface_mac): + interfaces = netifaces.interfaces() + + for interface in interfaces: + try: + mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] + if mac_addr == interface_mac: + return interface + + except KeyError as keyerr: + logger.error('Unable to Parse Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + return None + + def parse_firewall_stats(self, interface, raw_stats): + """ + sample data for command show_firewall_detail.xsl : + + IPv4 Firewall "oc_fw_eth1": + + Active on (eth1,OUT) + + rule action proto packets bytes + ---- ------ ----- ------- ----- + 11 accept tcp 476405 24805598 + condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:22 + + 12 accept icmp 1222414 101692572 + condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 + + 13 drop udp 150770055788 DROP + condition - saddr 11.0.2.0/24 daddr /* + + 14 accept tcp 3589762 238449000 + condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:80 + + 10000 drop all 0 0 + condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 + + """ + firewall = {} + firewalls = [] + firewall_start = False + table = False + status = None + rule_keys = ['rulepriority', 'packets', 'bytes', 'action', + 'source', 'destination'] + + try: + for line in raw_stats.split('\n'): + words = line.split() + if 'IPv4 Firewall' in line: + firewall_start = True + if 'Active on' in line and interface in line and firewall_start: + status = "Active" + (interface, direction) = words[2][1:-1].split(',') + firewall['interface'] = interface + firewall['dir'] = direction + firewall['rules'] = [] + elif len(words) >= 4: + if words[3] in ['ACCEPT', 'DROP'] and status == "Active": + table = True + rule = dict(zip(rule_keys, words)) + firewall['rules'].append(rule) + elif table and status == "Active": + command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + + '/opt/vyatta/share/xsl/show_firewall_detail.xsl') + show_fw_data = self.run_command(command) + firewall = self.add_protocol_and_dest_port_info(firewall, show_fw_data) + logger.info("packed firewall \n %s" % firewall) + firewalls.append(firewall) + break + + except KeyError as keyerr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return firewalls + + def add_protocol_and_dest_port_info(self, firewall, show_fw_data): + firewall_started = False + firewall_info_started = False + firewall_matcher = "Active on (" + firewall['interface'] + firewall_info_end = "-------------" + firewall_info = [] + for line in show_fw_data.split('\n'): + if "IPv4 Firewall" in line: + firewall_started = True + if firewall_matcher in line: + firewall_info_started = True + if firewall_started and firewall_info_started: + firewall_info.append(line) + if firewall_started and firewall_info_started and firewall_info_end in line: + break + try: + for rule in firewall.get('rules', []): + for index, stats in enumerate(firewall_info): + if stats is not '': + extract_stats = stats.split() + if rule['rulepriority'] in extract_stats[0]: + rule['protocol'] = extract_stats[2] + for key in firewall_info[index + 1].split(): + if "dpt:" in key: + rule['dest_port'] = key.split(':')[1] + break + break + + except KeyError as keyerr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse Firewall Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return firewall + + def parse_vpn_s2s(self, raw_stats): + """ + sample data for command show-ipsec-sa-detail : + + Peer IP: 192.168.20.194 + Peer ID: 120.0.0.2 + Local IP: 91.0.0.11 + Local ID: 91.0.0.11 + NAT Traversal: no + NAT Source Port: n/a + NAT Dest Port: n/a + + Tunnel 1: + State: up + Inbound SPI: c6621bd8 + Outbound SPI: cbf2ab18 + Encryption: aes128 + Hash: sha1 + PFS Group: 5 + + Local Net: 90.0.0.0/24 + Local Protocol: all + Local Port: all + + Remote Net: 120.0.0.0/24 + Remote Protocol: all + Remote Port: all + + Inbound Bytes: 654.0 + Outbound Bytes: 504.0 + Active Time (s): 289 + Lifetime (s): 1800 + + """ + s2s_connection = {} + s2s_connections = [] + + try: + for line in raw_stats.split('\n'): + key = '' + value = '' + if ':' in line: + key,value = line.split(":") + + if 'Peer IP' in key: + s2s_connection['peerip'] = value.strip(" \t\n\r") + + elif 'Local IP' in key: + s2s_connection['localip'] = value.strip(" \t\n\r") + + elif "Tunnel" in key: + s2s_connection['tunnels'] = [] + tunnel_info = { 'tunnel' : + key.strip(" \t\n\r").split(" ")[-1] } + + elif "Inbound Bytes" in key: + tunnel_info['in'] = value.strip(" \t\n\r") + + elif "Outbound Bytes" in key: + tunnel_info['out'] = value.strip(" \t\n\r") + s2s_connection['tunnels'].append(tunnel_info) + s2s_connections.append(s2s_connection) + s2s_connection = {} + + except KeyError as keyerr: + logger.error('Unable to Parse IPSec VPN Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse IPSec VPN Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return s2s_connections + + def parse_vpn_remote(self, raw_stats): + """ + sample data for command vyatta-show-ovpn.pl --mode=server : + + OpenVPN server status on vtun0 [] + + Client CN Remote IP Tunnel IP TX byte RX byte Connected Since + --------- --------- --------- ------- ------- --------------- + UNDEF 192.168.2.81 192.168.200.4 8.0K 2.7K Tue Mar 8 09:01:05 2016 + """ + table = False + remote_connection = {} + remote_connections = [] + keys = ['clientCN', 'remoteip', 'tunnelip', 'in', 'out', 'connected_since'] + + try: + for line in raw_stats.split('\n'): + if "Client CN" in line: + table = True + elif len(line.split()) >= 5 and table and "---" not in line: + value_list = line.split()[:-5] + connected_since = " ".join(line.split()[5:]) + clients = filter(lambda value: value.strip(), value_list) + clients.append(connected_since) + remote_connection = dict(zip(keys, clients)) + remote_connections.append(remote_connection) + + except KeyError as keyerr: + logger.error('Unable to Parse Remote VPN Stats Data, ' + + 'KeyError: {}'.format(keyerr)) + + except IndexError as inderr: + logger.error('Unable to Parse Remote VPN Stats Data, ' + + 'IndexError: {}'.format(inderr)) + + return remote_connections + + def get_fw_stats(self, mac_address): + """ + sample data for command show_firewall_statistics.xsl : + + IPv4 Firewall "oc_fw_eth1": + + Active on (eth1,OUT) + + rule packets bytes action source destination + ---- ------- ----- ------ ------ ----------- + 11 476.22K 24.80M ACCEPT 11.0.1.0/24 11.0.2.0/24 + 12 1.22M 101.66M ACCEPT 11.0.1.0/24 11.0.2.0/24 + 13 3.43G 150.73G DROP 11.0.1.0/24 11.0.2.0/24 + 14 3.59M 238.39M ACCEPT 11.0.1.0/24 11.0.2.0/24 + 10000 0 0 DROP 0.0.0.0/0 0.0.0.0/0 + + """ + interface = None + parsed_stats = {} + + command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + + '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') + + raw_stats = self.run_command(command) + interface = self._get_interface_name(mac_address) + if not interface: + logger.error('No interface available for mac address: %s' % + mac_address) + return parsed_stats + parsed_stats = self.parse_firewall_stats(interface, raw_stats) + + logger.info("Firewall stats Data, \n %s" % parsed_stats) + return parsed_stats + + def get_vpn_stats(self): + vpn_parsed_data = {} + command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-op-vpn.pl ' + + '--show-ipsec-sa-detail') + + raw_ipsec_stats = self.run_command(command) + if raw_ipsec_stats: + ipsec_parsed_data = self.parse_vpn_s2s(raw_ipsec_stats) + if ipsec_parsed_data: + vpn_parsed_data['ipsec'] = ipsec_parsed_data + else: + logger.warning("Empty IPSec VPN Stats") + else: + logger.warning("Empty IPSec VPN Stats") + + command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-show-ovpn.pl ' + + '--mode=server') + + raw_remote_stats = self.run_command(command) + if raw_remote_stats: + remote_parsed_data = self.parse_vpn_remote(raw_remote_stats) + if remote_parsed_data: + vpn_parsed_data['remote'] = remote_parsed_data + else: + logger.warning("Empty Remote VPN Stats") + else: + logger.warning("Empty Remote VPN Stats") + + logger.info("VPN stats Data, \n %s" % vpn_parsed_data) + return vpn_parsed_data diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py new file mode 100644 index 0000000000..e4f7c28c18 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py @@ -0,0 +1,461 @@ +#!/usr/bin/env python +import logging +import json +import netifaces +import netaddr +import socket +import fcntl +import struct +import array +import time +import ast +import copy +import subprocess +import os +from netaddr import IPNetwork, IPAddress +from operations import configOpts +from vyos_session import utils +from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE +#from vyos_session.configsession import ConfigSession as session +from execformat.executor import session + +OP_SUCCESS = True +OP_FAILED = False + +OP_COMMAND_SCRIPT = "/usr/share/vyos-oc/vpn_op_commands.pl" + +IPSEC_SITE2SITE_COMMANDS = { + 'ike': [ + 'set vpn ipsec ike-group %s proposal 1', + 'set vpn ipsec ike-group %s proposal 1 encryption %s', + 'set vpn ipsec ike-group %s proposal 1 hash %s', + 'set vpn ipsec ike-group %s proposal 2 encryption %s', + 'set vpn ipsec ike-group %s proposal 2 hash %s', + 'set vpn ipsec ike-group %s lifetime %d', + 'set vpn ipsec ike-group %s dead-peer-detection action restart', + 'set vpn ipsec ike-group %s dead-peer-detection interval %s', + 'set vpn ipsec ike-group %s dead-peer-detection timeout %s'], + 'esp': [ + 'set vpn ipsec esp-group %s proposal 1', + 'set vpn ipsec esp-group %s proposal 1 encryption %s', + 'set vpn ipsec esp-group %s proposal 1 hash %s', + 'set vpn ipsec esp-group %s proposal 2 encryption %s', + 'set vpn ipsec esp-group %s proposal 2 hash %s', + 'set vpn ipsec esp-group %s lifetime %d', + 'set vpn ipsec auto-update 60'], + 'conn': [ + 'set vpn ipsec ipsec-interfaces interface %s', + 'set vpn ipsec site-to-site peer %s \ + authentication mode pre-shared-secret', + 'set vpn ipsec site-to-site peer %s \ + authentication pre-shared-secret %s', + 'set vpn ipsec site-to-site peer %s default-esp-group %s', + 'set vpn ipsec site-to-site peer %s ike-group %s', + 'set vpn ipsec site-to-site peer %s local-address %s', + 'set vpn ipsec site-to-site peer %s authentication remote-id %s', + 'set vpn ipsec site-to-site peer %s tunnel %d local prefix %s', + 'set vpn ipsec site-to-site peer %s tunnel %d remote prefix %s', + 'set vpn ipsec site-to-site peer %s authentication id %s'], + 'delete': [ + 'delete vpn ipsec site-to-site peer %s', + 'delete vpn ipsec site-to-site peer %s tunnel %s', + 'delete vpn ipsec'], + 'show': [ + 'show vpn ipsec sa peer %s']} + +SSL_VPN_COMMANDS = { + 'create': [ + 'set interfaces openvpn %s', + 'set interfaces openvpn %s mode server', + 'set interfaces openvpn %s server subnet %s', + 'set interfaces openvpn %s tls ca-cert-file /config/auth/ca.crt', + 'set interfaces openvpn %s tls cert-file /config/auth/server.crt', + 'set interfaces openvpn %s tls dh-file /config/auth/dh.pem', + 'set interfaces openvpn %s tls key-file /config/auth/server.key', + 'set interfaces openvpn %s server push-route %s', + 'set interfaces openvpn %s openvpn-option \ + "--client-cert-not-required --script-security 3 \ + --auth-user-pass-verify /usr/share/vyos-oc/auth_pam.pl via-file"'], + #'set interfaces openvpn %s local-host %s'], + 'delete': [ + 'delete interfaces openvpn %s', + 'delete interfaces openvpn vtun0 server push-route %s']} + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +class NoInterfaceOnCidr(Exception): + def __init__(self, **kwargs): + self.message = _("No interface in the network '%(cidr)s'") % kwargs + + +class VPNHandler(configOpts): + def __init__(self): + super(VPNHandler, self).__init__() + + def create_ipsec_site_conn(self, ctx): + session.setup_config_session() + siteconn = ctx['siteconns'][0] + self._create_ike_group(siteconn['ikepolicy'], + siteconn['connection']['dpd']) + self._create_esp_group(siteconn['ipsecpolicy']) + self._create_ipsec_site_conn(ctx) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def create_ipsec_site_tunnel(self, tunnel): + session.setup_config_session() + self._create_ipsec_site_tunnel(tunnel) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def _ipsec_get_tunnel_idx(self, tunnel): + command = 'perl' + command += " " + OP_COMMAND_SCRIPT + command += " " + 'get_ipsec_tunnel_idx' + command += " " + tunnel['peer_address'] + command += " " + tunnel['local_cidr'] + command += " " + tunnel['peer_cidr'] + proc = subprocess.Popen( + command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + tunidx = out.split('=')[1] + return int(tunidx) + + def _ipsec_get_tunnel_count(self, tunnel): + command = 'perl' + command += " " + OP_COMMAND_SCRIPT + command += " " + 'get_ipsec_tunnel_count' + command += " " + tunnel['peer_address'] + proc = subprocess.Popen( + command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + tuncount = out.split('=')[1] + return int(tuncount) + + def delete_ipsec_site_tunnel(self, tunnel): + try: + session.setup_config_session() + self._delete_ipsec_site_tunnel(tunnel) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + except Exception as ex: + logger.error("Error in deleting ipsec site tunnel. %s" % ex) + return OP_FAILED + + def delete_ipsec_site_conn(self, peer_address): + try: + session.setup_config_session() + self._delete_ipsec_site_conn(peer_address) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + except Exception as ex: + logger.error("Error in deleting ipsec site connection. %s" % ex) + return OP_FAILED + + def create_ssl_vpn_conn(self, ctx): + session.setup_config_session() + self._create_ssl_vpn_conn(ctx) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def ssl_vpn_push_route(self, route): + session.setup_config_session() + self._ssl_vpn_push_route(route) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def delete_ssl_vpn_conn(self, tunnel): + session.setup_config_session() + self._delete_ssl_vpn_conn(tunnel) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def delete_ssl_vpn_route(self, route): + session.setup_config_session() + self._delete_ssl_vpn_route(route) + session.commit() + session.save() + time.sleep(2) + session.teardown_config_session() + return OP_SUCCESS + + def get_ssl_vpn_conn_state(self, peer_address): + return OP_SUCCESS, 'UP' + + def get_ipsec_site_tunnel_state(self, tunnel): + tunidx = self._ipsec_get_tunnel_idx(tunnel) + command = 'perl' + command += " " + OP_COMMAND_SCRIPT + command += " " + 'get_ipsec_tunnel_state' + command += " " + tunnel['peer_address'] + command += " " + str(tunidx) + proc = subprocess.Popen( + command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = proc.communicate() + state = out.split('=')[1] + state = state[:-1] + return OP_SUCCESS, state + + def _delete_ipsec_site_tunnel(self, tunnel): + tunidx = self._ipsec_get_tunnel_idx(tunnel) + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + cmd = cmds['delete'][1] + + cmd = cmd % (tunnel['peer_address'], tunidx) + + self._set_commands([cmd]) + + def _delete_ipsec_site_conn(self, peer_address): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + #cmd = cmds['delete'][0] + + #cmd = cmd % peer_address + cmd = cmds['delete'][2] + + self._set_commands([cmd]) + + def _delete_ssl_vpn_conn(self, tunnel): + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + cmd = cmds['delete'][0] + + cmd = cmd % tunnel + + self._set_commands([cmd]) + + def _delete_ssl_vpn_route(self, route): + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + cmd = cmds['delete'][1] + cmd = cmd % route + self._set_commands([cmd]) + + def _set_commands(self, cmds): + for cmd in cmds: + print cmd + self.set_1(cmd.split(' ')) + + def _create_ike_group(self, ike, dpd): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + ike_cmds = cmds['ike'] + + ike_cmds[0] = ike_cmds[0] % (ike['name']) + ike_cmds[1] = ike_cmds[1] % (ike['name'], ike['encryption_algorithm']) + ike_cmds[2] = ike_cmds[2] % (ike['name'], ike['auth_algorithm']) + ike_cmds[3] = ike_cmds[3] % (ike['name'], ike['encryption_algorithm']) + ike_cmds[4] = ike_cmds[4] % (ike['name'], ike['auth_algorithm']) + ike_cmds[5] = ike_cmds[5] % (ike['name'], ike['lifetime']['value']) + ike_cmds[6] = ike_cmds[6] % ike['name'] + ike_cmds[7] = ike_cmds[7] % (ike['name'], dpd['interval']) + ike_cmds[8] = ike_cmds[8] % (ike['name'], dpd['timeout']) + self._set_commands(ike_cmds) + + def _create_esp_group(self, esp): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + esp_cmds = cmds['esp'] + + esp_cmds[0] = esp_cmds[0] % (esp['name']) + esp_cmds[1] = esp_cmds[1] % (esp['name'], esp['encryption_algorithm']) + esp_cmds[2] = esp_cmds[2] % (esp['name'], esp['auth_algorithm']) + esp_cmds[3] = esp_cmds[3] % (esp['name'], esp['encryption_algorithm']) + esp_cmds[4] = esp_cmds[4] % (esp['name'], esp['auth_algorithm']) + esp_cmds[5] = esp_cmds[5] % (esp['name'], esp['lifetime']['value']) + + self._set_commands(esp_cmds) + + def _create_ipsec_site_tunnel(self, tunnel): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + conn_cmds = cmds['conn'] + tun_cmds = ['', ''] + + tunidx = self._ipsec_get_tunnel_count(tunnel) + 1 + """ + Neutron + GBP model supports only one local subnet. + For now also assuming only one peer cidr. + """ + tun_cmds[0] = conn_cmds[7] % ( + tunnel['peer_address'], tunidx, tunnel['local_cidr']) + tun_cmds[1] = conn_cmds[8] % ( + tunnel['peer_address'], tunidx, tunnel['peer_cidrs'][0]) + + self._set_commands(tun_cmds) + + def _get_vrrp_group(self, ifname): + command = ("vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) + #vrrp_ifname = ifname + "v" + os.popen(command).read().strip() + return os.popen(command).read().strip() + + def _create_ipsec_site_conn(self, ctx): + cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) + conn_cmds = cmds['conn'] + + """ + Get the name of the interface which has ipaddr from + the local cidr on which vpn service is launched. + Also get the ip addr assigned to it + """ + ifname, ip = self._get_if_details_by_cidr(ctx['service']['cidr']) + + conn = ctx['siteconns'][0]['connection'] + esp = ctx['siteconns'][0]['ipsecpolicy'] + ike = ctx['siteconns'][0]['ikepolicy'] + + vrrp_cmd = None + if conn['stitching_fixed_ip'] and conn.get('standby_fip', None): + logger.debug("Get vrrp group number for interface %s" % ifname) + group_no = self._get_vrrp_group(ifname) + ip = conn['stitching_fixed_ip'] + vrrp_cmd = ('set interfaces ethernet %s vrrp vrrp-group %s ' + 'run-transition-scripts master /config/scripts/restart_vpn') % ( + ifname, group_no) + ifname = ifname + "v" + str(group_no) + logger.info("vrrp interface name: %s" % ifname) + + conn_cmds[0] = conn_cmds[0] % (ifname) + conn_cmds[1] = conn_cmds[1] % (conn['peer_address']) + conn_cmds[2] = conn_cmds[2] % (conn['peer_address'], conn['psk']) + conn_cmds[3] = conn_cmds[3] % (conn['peer_address'], esp['name']) + conn_cmds[4] = conn_cmds[4] % (conn['peer_address'], ike['name']) + conn_cmds[5] = conn_cmds[5] % (conn['peer_address'], ip) + conn_cmds[6] = conn_cmds[6] % (conn['peer_address'], conn['peer_id']) + + """ + Neutron + GBP model supports only one local subnet. + For now also assuming only one peer cidr. + """ + conn_cmds[7] = conn_cmds[7] % ( + conn['peer_address'], 1, conn['tunnel_local_cidr']) + conn_cmds[8] = conn_cmds[8] % ( + conn['peer_address'], 1, conn['peer_cidrs'][0]) + conn_cmds[9] = conn_cmds[9] % (conn['peer_address'], conn['access_ip']) + if vrrp_cmd: + conn_cmds.append(vrrp_cmd) + + self._set_commands(conn_cmds) + + def _create_ssl_vpn_conn(self, ctx): + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + conn = ctx['sslvpnconns'][0]['connection'] + cidr = ctx['service']['cidr'] + + conn_cmds = cmds['create'] + + conn_cmds[0] = conn_cmds[0] % ('vtun0') + conn_cmds[1] = conn_cmds[1] % ('vtun0') + conn_cmds[2] = conn_cmds[2] % ( + 'vtun0', conn['client_address_pool_cidr']) + conn_cmds[3] = conn_cmds[3] % ('vtun0') + conn_cmds[4] = conn_cmds[4] % ('vtun0') + conn_cmds[5] = conn_cmds[5] % ('vtun0') + conn_cmds[6] = conn_cmds[6] % ('vtun0') + conn_cmds[7] = conn_cmds[7] % ('vtun0', cidr) + conn_cmds[8] = conn_cmds[8] % ('vtun0') + #conn_cmds[9] = conn_cmds[9] % ('vtun0', conn['stitching_fixed_ip']) + + self._set_commands(conn_cmds) + + def _ssl_vpn_push_route(self, route): + + cmds = copy.deepcopy(SSL_VPN_COMMANDS) + conn_cmds = cmds['create'] + route_cmds = [''] + + route_cmds[0] = conn_cmds[7] % ('vtun0', route['route']) + self._set_commands(route_cmds) + + def configure_static_route(self, action, cidr, gateway_ip): + if action == "set": + route_cmd = ("%s protocols static route %s next-hop" + " %s distance 1" % (action, cidr, gateway_ip)) + else: + route_cmd = "%s protocols static route %s" %(action, cidr) + # The config module we use everywhere else is not used here + # because of the issue mentioned here: + # http://vyatta38.rssing.com/chan-10627532/all_p7.html + # Note: The issue is inconsistent, but not seen anymore with this + # new approach of setting configuration + utils._alternate_set_and_commit(route_cmd) + #session.setup_config_session() + #self._set_commands([route_cmd]) + #session.commit() + #time.sleep(2) + #session.teardown_config_session() + return OP_SUCCESS + + def _get_all_ifs(self): + max_possible = 128 # arbitrary. raise if needed. + bytes = max_possible * 32 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + names = array.array('B', '\0' * bytes) + outbytes = struct.unpack('iL', fcntl.ioctl( + s.fileno(), + 0x8912, # SIOCGIFCONF + struct.pack('iL', bytes, names.buffer_info()[0]) + ))[0] + namestr = names.tostring() + lst = [] + for i in range(0, outbytes, 40): + name = namestr[i:i+16].split('\0', 1)[0] + ip = namestr[i+20:i+24] + lst.append((name, ip)) + return lst + + def _format_ip(self, addr): + return str(ord(addr[0])) + '.' + \ + str(ord(addr[1])) + '.' + \ + str(ord(addr[2])) + '.' + \ + str(ord(addr[3])) + + def _get_if_details_by_cidr(self, cidr): + """ + Get interface name and ip address which is in the + given cidr + """ + # It is observed sometimes that infs take time to get ip address + logger.info("IPSec: get interface ip and name for cidr %s." % cidr) + retry_count = 0 + while True: + ifs = self._get_all_ifs() + for inf in ifs: + ifname = inf[0] + if 'v' in ifname: + continue + ip = self._format_ip(inf[1]) + if IPAddress(ip) in IPNetwork(cidr): + logger.info("Found interface %s for cidr %s" % (ifname, + cidr)) + return ifname, ip + if retry_count < 10: + time.sleep(1) + retry_count += 1 + continue + break + + raise NoInterfaceOnCidr(cidr=cidr) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log new file mode 100644 index 0000000000..25c48e9e1a --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log @@ -0,0 +1,24 @@ +/var/log/oc/vyos_monitor { + weekly + rotate 12 + size 10M + compress + delaycompress + missingok + notifempty + create 644 vyos users +} +/var/log/oc/oc-vyos.log { + monthly + rotate 12 + size 10M + compress + delaycompress + missingok + notifempty + create 644 vyos users + postrotate + sudo /etc/init.d/oc-vyos restart + endscript +} + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_dhc.py new file mode 100644 index 0000000000..3cf064c37b --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_dhc.py @@ -0,0 +1,16 @@ +import netifaces +import shlex +import subprocess + + +def initiate_dhclient(): + interfaces = netifaces.interfaces() + for interface in interfaces: + cmd = "sudo dhclient %s" % interface + args = shlex.split(cmd) + if not netifaces.ifaddresses(interface).get(netifaces.AF_INET): + output, error = subprocess.Popen( + args, stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate() + if error: + raise diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py new file mode 100644 index 0000000000..3ffa2486ad --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py @@ -0,0 +1,17 @@ +class OCException(Exception): + """ + """ + status_code = 400 + + def __init__(self, message, status_code=None, payload=None): + Exception.__init__(self) + self.message = message + if status_code: + self.status_code = status_code + self.payload = payload + + def to_dict(self): + rv = dict(self.payload or ()) + rv["message"] = self.message + return rv + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py new file mode 100644 index 0000000000..3bbdaabb2f --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py @@ -0,0 +1,248 @@ +import copy +import json +import logging +import netifaces +import subprocess +import netaddr +import time + +from execformat.executor import session +from operations import configOpts +from vyos_session import utils + + +ROUTING_TABLE_BASE = 10 + +logger = logging.getLogger(__name__) +utils.init_logger(logger) + + +VYOS_PBR_COMMANDS = { + 'policy_route': [ + 'set policy route %s rule %s protocol all', + 'set policy route %s rule %s set table %s', + 'set policy route %s rule %s source address %s'], + 'table_route': [ + 'set protocols static table %s route %s next-hop %s'], + 'interface_pbr': [ + 'set interfaces ethernet %s policy route %s'], + 'delete': [ + 'delete interfaces ethernet %s policy route %s', + 'delete policy route %s', + 'delete protocols static table %s'], + 'show': [ + 'show policy route %s', + 'show protocols static table %s', + 'show interfaces ethernet %s policy route']} + + +class RoutesConfigHandler(configOpts): + def __init__(self): + super(RoutesConfigHandler, self).__init__() + self.vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" + + def _run_command(self, command): + try: + exec_pipe = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except Exception as err: + message = 'Executing command %s failed with error %s' %(command, err) + logger.error(message) + return False + + cmd_output, cmd_error = exec_pipe.communicate() + if exec_pipe.returncode != 0: + message = 'Executing command %s failed with error %s' %(command, cmd_error) + logger.error(message) + return False + else: + logger.debug('command output: %s', cmd_output) + return True + + def _begin_command(self): + begin_cmd = "%s begin" %(self.vyos_wrapper) + if self._run_command(begin_cmd): + return True + else: + return False + + def _discard_changes(self): + discard_cmd = "%s discard" %(self.vyos_wrapper) + if self._run_command(discard_cmd): + return True + else: + return False + + def _set_commands(self, cmds): + for cmd in cmds: + set_cmd = "%s %s" %(self.vyos_wrapper, cmd) + if not self._run_command(set_cmd): + return False + return True + + def _commit_command(self): + commit_cmd = "%s commit" %(self.vyos_wrapper) + if self._run_command(commit_cmd): + return True + else: + return False + + def _save_command(self): + save_cmd = "%s save" % (self.vyos_wrapper) + if self._run_command(save_cmd): + return True + else: + return False + + def _configure_vyos(self, configure_commands): + if not self._begin_command(): + logger.error("Starting a vyos session failed") + return False + + if not self._set_commands(configure_commands): + logger.error("Executing commands %s failed" %(configure_commands)) + self._discard_changes() + return False + + if not self._commit_command(): + logger.error("Committing %s failed" %(configure_commands)) + self._discard_changes() + return False + + if not self._save_command(): + logger.error("Saving %s failed" %(configure_commands)) + self._discard_changes() + return False + + return True + + def _configure_policy_route(self, source_cidr, gateway_ip, + source_interface): + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for configuring " + "routes" %(source_interface)) + msg = "Wrong interface %s retrieved for source %s" %( + source_interface, source_cidr) + raise Exception(msg) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + pbr_name = "%s_%s" %("pbr", source_interface) + cmds = copy.deepcopy(VYOS_PBR_COMMANDS) + pbr_commands = [] + pbr_commands.append(cmds['policy_route'][0] % (pbr_name, "1")) + pbr_commands.append(cmds['policy_route'][1] % ( + pbr_name, "1", routing_table_number)) + pbr_commands.append( + cmds['policy_route'][2] % (pbr_name, "1", source_cidr)) + + pbr_commands.append(cmds['table_route'][0] %( + routing_table_number, "0.0.0.0/0", gateway_ip)) + + pbr_commands.append( + cmds['interface_pbr'][0] %(source_interface, pbr_name)) + + if not self._configure_vyos(pbr_commands): + logger.error("Configuring Policy Based Routing failed") + raise Exception("Pbr failed %s" % pbr_commands) + else: + return True + + def add_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + gateway_ip = route_info['gateway_ip'] + source_interface = self._get_if_name_by_cidr(source_cidr) + try: + self._delete_policy_route(source_cidr, source_interface) + except Exception as err: + logger.debug("Trying to clear any existing routes before " + "setting source routing failed with error: %s" + %(err)) + try: + self._configure_policy_route( + source_cidr, gateway_ip, source_interface) + except Exception as err: + message = ("Configuring Policy based route failed. " + "Error: %s" %(err)) + raise Exception(message) + return json.dumps(dict(status=True)) + + # FIXME: When invoked on delete path we have to propagate the error + def _delete_policy_route(self, source_cidr, source_interface): + try: + interface_number_string = source_interface.split("eth",1)[1] + except IndexError: + logger.error("Retrieved wrong interface %s for configuring " + "routes" %(source_interface)) + msg = "Wrong interface %s retrieved for source %s" %( + source_interface, source_cidr) + raise Exception(msg) + routing_table_number = ROUTING_TABLE_BASE + int( + interface_number_string.split('v')[0]) + pbr_name = "%s_%s" %("pbr", source_interface) + cmds = copy.deepcopy(VYOS_PBR_COMMANDS) + + delete_pbr_commands = [] + delete_pbr_commands.append(cmds['delete'][0] % ( + source_interface, pbr_name)) + if not self._configure_vyos(delete_pbr_commands): + logger.warn("Deleting PBR failed") + + delete_pbr_commands = [] + delete_pbr_commands.append(cmds['delete'][1] % (pbr_name)) + if not self._configure_vyos(delete_pbr_commands): + logger.warn("Deleting PBR failed") + + delete_pbr_commands = [] + delete_pbr_commands.append(cmds['delete'][2] % (routing_table_number)) + if not self._configure_vyos(delete_pbr_commands): + logger.warn("Deleting PBR failed") + + return + + def delete_source_route(self, routes_info): + routes_info = json.loads(routes_info) + for route_info in routes_info: + source_cidr = route_info['source_cidr'] + source_interface = self._get_if_name_by_cidr(source_cidr, + delete=True) + if source_interface: + self._delete_policy_route(source_cidr, source_interface) + return json.dumps(dict(status=True)) + + def _get_if_name_by_cidr(self, cidr, delete=False): + interfaces = netifaces.interfaces() + retry_count = 0 + while True: + all_interfaces_have_ip = True + for interface in interfaces: + inet_list = netifaces.ifaddresses(interface).get( + netifaces.AF_INET) + if not inet_list: + all_interfaces_have_ip = False + for inet_info in inet_list or []: + netmask = inet_info.get('netmask') + ip_address = inet_info.get('addr') + subnet_prefix = cidr.split("/") + if (ip_address == subnet_prefix[0] and + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + return interface + ip_address_netmask = '%s/%s' %(ip_address, netmask) + interface_cidr = netaddr.IPNetwork(ip_address_netmask) + if str(interface_cidr.cidr) == cidr: + return interface + # Sometimes the hotplugged interface takes time to get IP + if not all_interfaces_have_ip: + if retry_count < 15: + if delete: + return None + time.sleep(2) + retry_count = retry_count + 1 + continue + else: + raise Exception("Some of the interfaces do not have " + "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/op_commands.sh b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/op_commands.sh new file mode 100755 index 0000000000..a3aab4d1f1 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/op_commands.sh @@ -0,0 +1,6 @@ +#!/bin/vbash +cmd1="$1" +source /opt/vyatta/etc/functions/script-template +eval "$cmd1" +echo $? +#run show vpn ipsec sa diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vpn_op_commands.pl new file mode 100644 index 0000000000..5c6317a604 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vpn_op_commands.pl @@ -0,0 +1,66 @@ +#!/usr/bin/perl + +#Usage: sudo perl op_commands.pl get_tunnel_state peer_ip tunnel-id + + +use lib "/opt/vyatta/share/perl5/"; +use Vyatta::VPN::OPMode; +use Data::Dumper qw(Dumper); + +sub get_ipsec_tunnel_count { + my @args = @_; + + my $peer = $args[1]; + my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); + $DB::single = 1; + my $count = $#tunnel_hash; + $count = ($count + 1)/2; + print "tunnels=$count"; + return $count; +} + +sub get_ipsec_tunnel_idx { + my @args = @_; + + my $peer = $args[1]; + my $lcidr = $args[2]; + my $pcidr = $args[3]; + + my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); + my $count = ($#tunnel_hash + 1)/2; + $DB::single = 1; + for my $i (0..$count) { + my $tun = $tunnel_hash[$i+1]; + my $lsnet = $tun->{_lsnet}; + my $rsnet = $tun->{_rsnet}; + if ($lcidr == $lsnet && $pcidr == $rsnet) { + print "tunnel=$tun->{_tunnelnum} \n"; + return $tun->{_tunnelnum}; + } + } + print "tunnel=-1"; + return -1; +} + +sub get_ipsec_tunnel_state { + my @args = @_; + + #args[0] will be subroutine name + + my $peer = $args[1]; + my $tunnel = $args[2]; + + my $tunidx = $tunnel + $tunnel - 1; + my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); + + my $state = $tunnel_hash[$tunidx]->{_state}; + + print "state=$state\n"; + + return $state +} + +#print Dumper \@ARGV; + +my $call=$ARGV[0]; +$call->(@ARGV); diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos new file mode 100755 index 0000000000..850a85e5ed --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos @@ -0,0 +1,130 @@ +#! /bin/sh +# +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2014, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA +# +### BEGIN INIT INFO +# Provides: oc-vyos +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: OC vyos service +# Description: Provides the oc-vyos service +### END INIT INFO +set -e +PIDFILE=/var/run/elastic_services/oc-vyos.pid +LOGFILE=/var/log/elastic_services/oc-vyos.log +DAEMON=/usr/bin/oc-vyos +DAEMON_ARGS="--log-file=$LOGFILE" +DAEMON_DIR=/var/run/elastic_services +ENABLED=true +if test -f /etc/default/oc-vyos; then +. /etc/default/oc-vyos +fi +mkdir -p /var/run/elastic_services +mkdir -p /var/log/elastic_services +. /lib/lsb/init-functions +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" +export TMPDIR=/var/lib/elastic_services/tmp +if [ ! -x ${DAEMON} ] ; then +exit 0 +fi +case "$1" in +start) +test "$ENABLED" = "true" || exit 0 +start=1 +## check if pidfile is there +if [ -f $PIDFILE ]; then +pid=`cat $PIDFILE` +## check if pid is there +if [ "1$pid" -ne "1" ]; then +## check if process with pid not running +set +e +kill -0 $pid > /dev/null 2>&1 +[ $? -eq 0 ] && start=0 +set -e +fi +fi +if [ $start -eq 1 ]; then +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +log_daemon_msg "Starting oc vyos" +# We have completely messed up the rc level scripts +sudo chown vyos:users -R /var/run/elastic_services +sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS +log_end_msg $? +else +echo "oc-vyos[$pid] is already running" +fi +;; +stop) +test "$ENABLED" = "true" || exit 0 +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Stopping oc vyos" +start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +rm $PIDFILE +else +echo "PID file not existing" +fi +## ensure stale processes killed +set +e +running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +set -e +;; +restart|force-reload) +test "$ENABLED" = "true" || exit 1 +$0 stop +sleep 2 +$0 start +;; +reload) +test "$ENABLED" = "true" || exit 0 +## check if pidfile is there +if [ -f $PIDFILE ]; then +set +e +kill -0 `cat $PIDFILE` > /dev/null 2>&1 +if [ $? -eq 0 ]; then +set -e +log_daemon_msg "Reloading oc vyos" +start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE +log_end_msg $? +else +echo "No process with PID `cat $PIDFILE` found running, removing the PID file" +fi +else +echo "oc vyos is not running or PID file not existing" +fi +;; +status) +test "$ENABLED" = "true" || exit 0 +status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +;; +*) +log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +exit 1 +;; +esac +exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/restart_vpn new file mode 100644 index 0000000000..2cb8fe4762 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/restart_vpn @@ -0,0 +1,3 @@ +#!/bin/vbash +sudo rm /var/run/pluto.pid +vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/__init__.py new file mode 100644 index 0000000000..3ed9fd0f30 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/__init__.py @@ -0,0 +1 @@ +__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py new file mode 100644 index 0000000000..9b0e666e66 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py @@ -0,0 +1,146 @@ +import os +from uuid import uuid4 +from utils import get_config_params, _run, clean_environ, init_logger +import logging + +logger = logging.getLogger(__name__) +init_logger(logger) + +VYOS_SHELL_API = get_config_params('bin', 'shell_api_path') +VYOS_SBIN_DIR = get_config_params('bin', 'vyos_sbin_dir') +VYOS_SAVE_SCRIPT = 'vyatta-save-config.pl' + +# Create/Get the logger object +# logger = init_logger() + + +class SessionAlreadyExists(Exception): pass +class SetupSessionFailed(Exception): pass +class OperationFailed(Exception): pass +class SessionNotExists(Exception): pass + + +class Session(object): + """ + Return the session instance if exists. Else, create new one. + SessionAlreadyExists exception raised on the second instantiation. + """ + _ref = None + + def __new__(cls, *args, **kw): + if cls._ref is not None: + raise SessionAlreadyExists('A session exist already !') + cls._ref = super(Session, cls).__new__(cls, *args, **kw) + return cls._ref + + +class ConfigSession(Session): + """ + Create and manage a Vyos config session. + This is a singleton subclass of Session class which ensures that one and + one config session only is opened. + To create instance you have to call setup_config_session() method. + """ + + def setup_config_session(self): + """ + Setup vyos session. A random uuid is generated as a sesssion identifier + ($PPID -Shell PID- could be used as well). + """ + + identifier = uuid4() + env = dict() + env['VYATTA_CHANGES_ONLY_DIR'] = \ + '/opt/vyatta/config/tmp/changes_only_{0}'.format(identifier) + env['VYATTA_CONFIG_TEMPLATE'] = '/opt/vyatta/share/vyatta-cfg/templates' + env['VYATTA_ACTIVE_CONFIGURATION_DIR'] = '/opt/vyatta/config/active' + env['VYATTA_EDIT_LEVEL'] = '/' + env['VYATTA_TEMP_CONFIG_DIR'] = '/opt/vyatta/config/tmp/new_config_{' \ + '0}'.format(identifier) + env['VYATTA_TEMPLATE_LEVEL'] = '/' + env['VYATTA_CONFIG_TMP'] = '/opt/vyatta/config/tmp/tmp_{0}'.format( + identifier) + # Add vyos session environment to system environment. + # This is not good but actually it seems that is the only way to + # handle a persistant vyos session after spawning a shell. + os.environ.update(env) + logger.info('Setting up a configuration session for Vyos') + # Spawn shell and setup vyos config session + if _run('{0} setupSession'.format(VYOS_SHELL_API)): + # Unset vyos session environment and raise an exception + logger.error('Could not create configuration session') + logger.info('Cleaning up session environment variables') + clean_environ(env) + raise SetupSessionFailed('Could not create session !') + self.session_id = identifier + self.session_envs = env + logger.debug('Session identifier is %s', identifier) + logger.debug('Session environment variables: %s', env) + logger.info('Configuration session is set up') + return True + + def session_exists(self): + """ + Test if a vyos config session is set up + """ + return False if _run('{0} inSession'.format(VYOS_SHELL_API)) else True + + def teardown_config_session(self): + """ + End current configuration session. + """ + if not self.session_exists(): + logger.warn('Teardown failed. No session available !') + return False + + if not _run('{0} teardownSession'.format(VYOS_SHELL_API)): + logger.info('Cleaning up session environment variables') + logger.info('Closing Vyos config session') + clean_environ(self.session_envs) + return True + + logger.error('Failed to teardown current config session') + logger.warn('The Vyos config session may still open !') + return False + + def session_changed(self): + """ + Returns if Vyos configuration was changed from current session + """ + if _run('{0} sessionChanged'.format(VYOS_SHELL_API)): + return False + logger.warn('Vyos configuration was changed from current session') + return True + + def commit(self): + """ + Returns True if commit action succeed. False otherwise. + """ + out = _run(os.path.join(VYOS_SBIN_DIR ,'my_commit -l'), output=True) + if not out: + logger.error('Commit changes failed') + raise OperationFailed('[ERROR] Commit changes failed !') + logger.info('Changes successfully commited') + return True + + def discard(self): + """ + Undo config modifications + """ + out = _run(os.path.join(VYOS_SBIN_DIR ,'my_discard'), output=True) + if not out: + raise OperationFailed('[ERROR] Discard changes failed !') + # return out.splitlines()[0] + return out + + def save(self): + """ + Save applied modifications. Changes still persistent even after + system reboot. + """ + out = _run(os.path.join(VYOS_SBIN_DIR, VYOS_SAVE_SCRIPT), output=True) + if not out: + logger.error('Saving changes failed') + raise OperationFailed('[ERROR] Save changes failed !') + logger.info('%s', out) + return True diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py new file mode 100644 index 0000000000..6dc579aae2 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py @@ -0,0 +1,173 @@ +import ConfigParser +import subprocess +import os +import logging +import logging.handlers as handlers + +# In production environment CONFIG_DIR should be /etc/pyatta/ +CONFIG_DIR = "/usr/share/vyos-oc" +CONFIG_FILE_NAME = "oc-vyos.conf" +AVAILABLE_LOG_LEVELS = ['DEBUG','INFO','WARN','ERROR','CRITICAL'] +DEFAULT_LOG_LEVEL = 'INFO' + +logger = logging.getLogger(__name__) + + +def get_config_params(section, key): + """ + To get specific parameters valuers from config file + """ + config = ConfigParser.SafeConfigParser() + config.readfp(open(os.path.join(CONFIG_DIR, CONFIG_FILE_NAME))) + return config.get(section, key) + + +def get_log_level(): + """ + Get and check log level value from pyatta.conf file. + """ + log_level = get_config_params('log', 'level') + if log_level not in AVAILABLE_LOG_LEVELS: + print('[ERROR] Unknown log level !') + return DEFAULT_LOG_LEVEL + return log_level + + +def get_log_filehandler(): + """ + Create file handler which logs messages. + """ + log_dir = get_config_params('log', 'logdir') + log_file = get_config_params('log', 'logfile') + log_file_path = os.path.join(log_dir, log_file) + if not os.path.exists(log_dir) or not os.path.exists(log_file_path): + try: + os.makedirs(log_dir) + open(log_file_path, 'a').close() + except OSError as exception: + print exception + return False + print "[INFO] Create log file %s" % log_file_path + # create file handler + fh = logging.FileHandler(log_file_path,'a') + fh.setLevel(eval('logging.{0}'.format(get_log_level()))) + return fh + + +def init_logger(logger): + """ + Initialize logger object for logging application's activities to a + specific file. + """ + # create logger + logger.setLevel(eval('logging.{0}'.format(get_log_level()))) + # create formatter and add it to the handlers + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - ' + '%(message)s') + file_handler = get_log_filehandler() + file_handler.setFormatter(formatter) + # add the handlers to the logger + logger.addHandler(file_handler) + + formatter = logging.Formatter('vyos %(name)s %(funcName)s() %(levelname)s ' + '%(message)s') + sys_handler = handlers.SysLogHandler(address=('localhost', 514)) + sys_handler.setFormatter(formatter) + sys_handler.setLevel(logging.DEBUG) + logger.addHandler(sys_handler) + + +def _run(cmd, output=False): + """ + To run command easier + """ + # FIXME: This whole code taken from someones personal github implementation + # is really messy !!!! + if output: + try: + logger.debug('exec command: "%s"', cmd) + exec_pipe = subprocess.Popen(cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except Exception as err: + message = 'Executing command %s failed with error %s' %(cmd, err) + logger.error(message) + return False + + cmd_output, cmd_error = exec_pipe.communicate() + # VPN commits succeed but we are getting perl locale warnings on stderr + if exec_pipe.returncode != 0: + message = 'Executing command %s failed with error %s. Output is: %s'%(cmd, cmd_error, cmd_output) + logger.error(message) + return False + else: + logger.debug('command output: %s', cmd_output) + return True + else: + try: + logger.debug('exec command: "%s"', cmd) + out = subprocess.check_call(cmd, shell=True) # returns 0 for True + except subprocess.CalledProcessError as err: + logger.error('command execution failed with Error: %s', err) + out = 1 # returns 1 for False + logger.debug('command return code: %s', out) + return out + +# Alternate implementation for configuring vyos - The whole pyatta module +# is replaced with this one method. This was required top fix the following +# issue :http://vyatta38.rssing.com/chan-10627532/all_p7.html +# Not sure if the other commands also may fails or if there is an issue with +# the way the config module does things +def _alternate_set_and_commit(cmd): + try: + vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" + begin_cmd = "%s begin" %(vyos_wrapper) + set_cmd = "%s %s" %(vyos_wrapper, cmd) + commit_cmd = "%s commit" %(vyos_wrapper) + save_cmd = "%s save" % (vyos_wrapper) + end_cmd = "%s end" %(vyos_wrapper) + command = "%s;%s;%s;%s;%s" % (begin_cmd, set_cmd, commit_cmd, save_cmd, + end_cmd) + logger.debug('exec command: "%s"', command) + exec_pipe = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except Exception as err: + message = 'Executing command %s failed with error %s' %(command, err) + logger.error(message) + return False + + cmd_output, cmd_error = exec_pipe.communicate() + # VPN commits succeed but we are getting perl locale warnings on stderr + if exec_pipe.returncode != 0: + message = 'Executing command %s failed with error %s' %(command, cmd_error) + logger.error(message) + return False + else: + logger.debug('command output: %s', cmd_output) + return True + +def clean_environ(env): + """ + Delete some envionment variables from system. + """ + for key in env.keys(): + if os.environ.get('key'): del os.environ[key] + + +def ip2network(ip): + quads = ip.split('.') + netw = 0 + for i in range(4): + netw = (netw << 8) | int(len(quads) > i and quads[i] or 0) + return netw + + +def get_ip_address_with_netmask(ip, netmask): + prefix = bin(ip2network(netmask)).count('1') + ip_addr = ip + "/" + str(prefix) + return ip_addr + + +# initilize the logger for this module +init_logger(logger) From 0ebad161b04a5fbf6e82699dc96c5d42d1c0a6d1 Mon Sep 17 00:00:00 2001 From: Ashutosh Mishra Date: Tue, 28 Jun 2016 17:47:24 +0530 Subject: [PATCH 002/157] Removed deb-packages folder --- .../oc-vyos/deb-packages/oc-vyos-2-31.deb | Bin 32616 -> 0 bytes .../oc-vyos-2-31/DEBIAN/changelog | 5 - .../deb-packages/oc-vyos-2-31/DEBIAN/control | 8 - .../deb-packages/oc-vyos-2-31/DEBIAN/postinst | 13 - .../deb-packages/oc-vyos-2-31/DEBIAN/postrm | 3 - .../oc-vyos-2-31/config/scripts/restart_vpn | 3 - .../dhclient-exit-hooks.d/management_pbr | 11 - .../oc-vyos-2-31/etc/init.d/oc-vyos | 130 ---- .../etc/network/interface-post-up | 2 - .../oc-vyos-2-31/etc/network/interfaces | 59 -- .../deb-packages/oc-vyos-2-31/etc/sc-version | 1 - .../oc-vyos-2-31/usr/share/oc-pbr/README | 14 - .../usr/share/oc-pbr/controller_route | 0 .../usr/share/oc-pbr/dhclient-script | 327 ---------- .../usr/share/oc-pbr/interface-post-up | 2 - .../oc-vyos-2-31/usr/share/oc-pbr/interfaces | 59 -- .../usr/share/oc-pbr/management_pbr | 11 - .../usr/share/oc-pbr/no-default-route | 12 - .../oc-vyos-2-31/usr/share/oc-pbr/pbr | 2 - .../oc-vyos-2-31/usr/share/oc-pbr/pbr_init | 98 --- .../oc-vyos-2-31/usr/share/oc-pbr/rc.local | 19 - .../usr/share/vyos-oc/LICENSE README | 2 - .../usr/share/vyos-oc/__init__.py | 0 .../usr/share/vyos-oc/auth_pam.pl | 285 --------- .../share/vyos-oc/auth_pam_domain_verify.pl | 273 --------- .../usr/share/vyos-oc/auth_server.conf | 6 - .../usr/share/vyos-oc/execformat/__init__.py | 0 .../usr/share/vyos-oc/execformat/executor.py | 157 ----- .../usr/share/vyos-oc/execformat/formator.py | 38 -- .../usr/share/vyos-oc/init_script/oc-vyos | 130 ---- .../usr/share/vyos-oc/init_script/restart_vpn | 3 - .../usr/share/vyos-oc/oc-vyos.conf | 8 - .../vyos-oc/oc_config_server/__init__.py | 1 - .../oc_config_server/edit_persistent_rule.py | 88 --- .../vyos-oc/oc_config_server/fw_constants.py | 17 - .../vyos-oc/oc_config_server/fw_handler.py | 66 --- .../vyos-oc/oc_config_server/ha_config.py | 367 ------------ .../oc_config_server/interface_monitor.sh | 11 - .../vyos-oc/oc_config_server/log_forwarder.py | 55 -- .../vyos-oc/oc_config_server/oc_fw_module.py | 357 ----------- .../vyos-oc/oc_config_server/operations.py | 65 -- .../oc_config_server/routes_config_handler.py | 211 ------- .../share/vyos-oc/oc_config_server/server.py | 57 -- .../share/vyos-oc/oc_config_server/server2.py | 560 ------------------ .../vyos-oc/oc_config_server/static_ip.py | 149 ----- .../vyos-oc/oc_config_server/stats_parser.py | 336 ----------- .../oc_config_server/vpn_api_server.py | 461 -------------- .../vyos-oc/oc_config_server/vyos-oc-log | 24 - .../vyos-oc/oc_config_server/vyos_dhc.py | 16 - .../oc_config_server/vyos_exception.py | 17 - .../vyos_policy_based_routes.py | 248 -------- .../usr/share/vyos-oc/op_commands.sh | 6 - .../usr/share/vyos-oc/vpn_op_commands.pl | 66 --- .../share/vyos-oc/vyos_init_script/oc-vyos | 130 ---- .../vyos-oc/vyos_init_script/restart_vpn | 3 - .../share/vyos-oc/vyos_session/__init__.py | 1 - .../vyos-oc/vyos_session/configsession.py | 146 ----- .../usr/share/vyos-oc/vyos_session/utils.py | 173 ------ 58 files changed, 5312 deletions(-) delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31.deb delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/controller_route delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/__init__.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/__init__.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31.deb b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31.deb deleted file mode 100644 index e3023502d0e86ce4a9e9c68562b342ae775153c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32616 zcmafYL$EMB5ahFMeb2US+qP}nwr$(CZQHhu{a3Ze?W8ivA*obN_hF_9xD6bQ%z2@V zO$;pzY-tQFYz-Ve@bU2(m|58v7+6@@8SwGx|2zNRm4Tj~m6;hI|G)Wvpby1JOAlpa zXY1@}XHDyD;7Duc`TxJq%Km>}(1*f{f&loR00O>A)3RHlM;Uv{mUCDqZUwAxvMB~Y zM&1GrEU-XMYnycH9?nD;>vewKIwGbCZj9(@20qS9&iZNdF}%t)l8bM15R}R_+hLk) zvj5gT5OK&YzF>}78iy_-&m6@y-bJIAG=khWFlm;5>FMNK`74r^r%E=BS&VD_RY)JP zy23m2I2Jfx^*g%e6-cWVNK;?w?W;0}1PtO?)}6$(N*6uB#jk`+G#&&U@GdUcOAke0 zkS|4@-3d98%PbLc;&~8m-t~kP5od|O`h^l3>PvkG z&b6bw$>XoiK}iAo0B`Q^$a&^3i9RCd&n{?X*SzoP8u7x37Y~9Axr^GL0woPLH58SouuIDqbBd~c%~@#?`iMRFSGr-@8!RZ`%}JA{u55v z(1ATW4&46>?_D2oQ$5PC0OSAw#sq#K6Y08{!IgpGA_!v?bCPn~x-gVmgn4%#5D zeDnl+i4_MowQ?0j&1tG&2HpbilVozud`Kj!-AjAA_i5Csvti}2)W`Y_kUj5X*Z$Ix z7gqxJIZ?9~v#dvXIH$R8Q}Ko;XYwrza7Rzr1<`6 z&mhLPEl``H{9PB@G01c8`GLN*ZNGvw@hH^snbJC>G){O87@G3*E#TOku--WNa9g-T zkOO{xULw!;yJSG|ega24b)C14`TGMqUlJ@^R7Ab%pJO8dD|j--4Z3xyVjS!dpxX>L z2eo~k*$w7G5<}%`0Z?r;Bbq@N(Rbm&7zeB?0SN3qwAZ2FfG(N;GnCkRHUV zK(a4IAQWRT%eIhc?BOg&jk7Mk|4?MdESSV78|Uf%Unb{n1Nr@p7dRaYlRQQRjnHDy$!PPZy_7RW6N1UrSvJ0&MqZ~Q zN(l|8;$7=bDc$a~UWJoZDS$G@%uX4r)$rdGXXp>y5d(tO2t3l8!OY%F6@?R$CKCj zj4kl)F6Q?9{8*mVA-SE~5TiyYg$PHT=y( zB&_jp9+1PbkrVPxz#c8EV;dskzp@0L?*Ah~&!8p~5GP4}VA6^>C@NAza~^fx0dG)h z;@{-gYRq=^8~cjPVSR&5!1ON$)zWd!`VQjFwrOx>3|icMoKCyD?Kk}!yhEzYbwmrg z!nbeww2g);^C0dvzy2yw7J$B*9xyC=-EZpCE z1by(V0+TR4FLrl<1|CMmr&%9gM?fOPLBSa21wbe7NJ z=hBx>qZdn3jX5V!@%EO$cO&$FEVsunAR--0#(Ld|8W*>{wc_iBU=dx7M0YjF#u58? zlx#0vkOs0^J|c=IT=7|h28(xC1~?$FIdZD^FWTWVv1XxDrH>D(a|Y{JL=+BArsmD7 z!FfVERA7&ON@ET4T8RorcaB@8kov|Iw`(@9ZsforNv+x#SH2_aX;pHN+0a96L<_?~ z)pBn8mm#xEc~^Bd#&DRs-+jeAXbKMO1)t) zG1_nHRId=~sz!KAAC(4dycpdBT4ldyjc zTcmkRMX!Wj+ZDCfthoM1VV&RulIG!KsCOP)HMSB`KvTKhle{)Qeb%sENy9~dOM5OamEtyZZYF{LSUWJ@D*~5 zjCI~dv#MWb^l46BzY>O`zVFG6FGocMKsD$!+x*SRH?nBmy+uI(5-Ol8UH_~h2#5Q`lT@gt=^e$Rm(I#O|7AO!=x@ixYq+==r6R}6cU+xrSXLaP7?EY9D7h`ko8eASe z`BT~b%YukksqQgR=mX-hCoS9(6y3hY*%jsPB1k>{TY!A0U4(rinI}pbt_Ugg{R5>* zs)qEYp;_k8hBLYnC~Uom-Rt~N&^Tv)xfag#>t<8O^suc-XFRpV%-$&vWoN)Oyy;-KXJ@<@+Bg z63ymUjp5Fs$%S{^Pn?mt#N#_Ez{{oe~#+HOG*N8WQ8a=2|YG2RJe9*am)9zTNo1!4Y9vE!L5li=Z6 ztKZ4)UGm*9zr2Ie!J9EX3kwx|2lVT-v#c^206j6CoU{kdBeubx!wbbi_2xL0ak0KK zy+ZHoA$QUBSwJ+WSkwRL@)r9wyc{aLH!wiIN#%m7=Lp9yndzQxcpzU$34dO_dzElh z+zte~-$;FLhZe`?W+_Rbzl=HY;He%TEY*XySAN%N(2*bpo^m<7?4Jpwi4w4Ar|Q`} zgc39v$hvJkNh9eltW`1n1nO`N0xa&5^xC>z--natwmt+h#n1fJ=&2b)j0MxNBpQk$ z_4TFN;`DM!Yoo)pgZm~wk=&`8o#Bf*265Z%(s`^62*Ks z-DL}*YjDnF-_;E&+RhxQsi?~}A_Q5Y!U(95)`GoLN|fg?3n5>!?sj+6Oqyqj?q}{k zF)R{NI+*H)v@&IPM_)DN;9H>_pN{tskJ7If?_)V1+0I_SzNccAJcAZ3(MvQ!uEjHF znFziWbB_^;z^wmBJoVSC`Gy$5p(<2v?5#xeu4meV4^)$B;Ytv^V_s?X3FWpJTJS zDE}p19x+uUP!b+~w5v+6>^9B11SXn*-xp8zw97Ed{a)=F5NyRZ8<8Q{!*mZ$U ze>z@jL)nzaM8reLV7r8>`7QY*uMmBk8{kcmDMnIjSQ=HvM3;Xx=)l3!2*Op|&s~2< znLtR;W#y5aGfIJ%{B{$(E$vwRUaf$XPJvJdzA)F0BLF%^s+{k|BWb2l2^N2(Pmv0% zl6i6-#GaxN)0>TLbbBfR_P!;wceBZFRZg^cMQ_H{`P{UExIdazs~kz)cu z#^E&VS_QI8HI$@*mOHC906{pN$pEOIHNfHyt-C{xXGXkwzdCzhRf^5TVb}3q%2Id(pf}tR*aWJOZx?KURz%-Hz;sz$Jk?3^tQaJ5yNRsDX3;(@3*kgNn; z)F)B#>DsO<(tWl0Y8~v@f?Nn|k41yQftwOIM6uD~FSn-#-87fiR>pNm2E*3zvScuN zk_!_I=C1(fx#@I?NsMH0Jh; z&Z%^jwEDEj-Bo}GFJYRO;dhR^?FvtzhQqLeKruYwKTll-xf^`^Xil>a7q z)Hzc-P|f&30DHlrw5}}&w8lb5jLS)#6(T=)0-+0$a(;0`flgWSjE#Y?D5H5Xs@BOC zcHO>_uOSRScq?zo|+7Tzo_O6{V~SnU}R_aFHn&G+Cs}l!1=>g6SK6ZGzsHES`9;cr$0e zOyE$Pi9zwTlRZVl*M?b(6#8F9(!`JD=|i33S=9hvy7^N5s*u-&DnXwUoZ=Zl&w{m}cI2?U8q5=ngsj!=l`R{;#h7#lJ+2RNb3RNT| zSkya{k|tA`mB)I5wbD~70SlXad_!|TB)(8?+7e%+H@)(w@&2IhmbMEBn^=X@3Fn0` z13jSHzaH>P+Hzdx8}?Pw+k}+$FM8CYcpv+ua+w*;9E*0-sLop)4J`Aixv;|#wxwBq z9UK+9M>^bgEE8kdS*LduDgti&jsz$ZIR-rfOdh`@iz4~U&uWORKu@&f;)YUn%s>k(?&YJTK{*_f669-fsmc zi;EN|N9OV-hk>(NdWOVdaEs!7{lO5(HO#N3G1>ARcC$KdO1$BK{Bgi@yYLaN<~svv zjRQxfEOir*(>(&ysYS`^z$yXy{q~Y95#gN2d@6ZXRrrvIvsjPG)b^C^k>>n{lGh0@ zR`9}8VN@3++NkoYx9B6Ht~@xn*#Dr{(eULkcQ@;YgH~nMd>-X;qkCT6+0v4C38@(| zzI#QroY2h4kzI9%4B8dOi)*ve?>B|#(y7(tofUVTjo+^WONCa z%l|qJ$?AWf`m~*|GM|JGKz2?Eyxy>GleT?;2hZ1L%cd$GvkcvW@YqXNK7e~nS69mh zuhwAQJoHUWbhfbH^;5T^9|LgcR8e_cu{!a^=7r(+`|~)EL4p+oH2Y0n8N)D(;Ud`A%JXMa)c&+=ET3yha6{riZ++TST`{dsv!fu2EDkg#@i%$wZ{MfF(>|fpJ z6~JOmDeBKmZBvW*Eg4V4K*);{d4Yp6Ho9cb;Qh3Ng#K#|X+JpBE~2D{*ImXxxXZ`c zCaC{D(oqmd2=-g2S70mcx)(w6n-MunZ_U&}$0IwWy6I(PRgMC1x7dx*&$?ir^)*|1 zAY`W0*+BJ^vp?FIFyYdIobzMp0(+vi1)Jk;y;-rLE0an9>sCiK`Zc>ZsQd{Cg8(5UwXgR|wCf zr%XVcV7B(h%{nZ13d%O5XHTYeRS62MqT^o|5L{`5i0IJ((=P1F9JjNskBGr!eMN$vv~ z^(A=|ny845z|sS#n!24CR-X<@Tl>_a?AR#WX%+gNb8RhiXW-PA+eCc9yb(zu_66j4 zv-5>94o)4ZJvU{ja;pVwp@xUG>Ojv(odO_z?1XXEC^er#`J(!UH5I2VQu$H^!pxNB zJa0|}AOA|TibUh))k?~}nZe7Bt3Ar8<#Ltj_{Mk!QOQbIkFKS8DU*79Ls_dsY+uD- z7a{LYjN7R@MY`|V9=)$a`$vS3SPp-L~14^~C6C2GfZsve4MK zty{0PA^@W?mi}*yf2vN!=HrIpa{v(HWyLX&viB7(CR=$&Gq=rn`F(-Fbohk)SxKam z`Oae7GxUK*C`hBikkT1fh9aIJ_t=Cx{ae3|#xE%+e`EbXT4T7*W-)pZEfIk{h=wxT z8mTcuB8p!dv1~?w{rjK;>*J|YO$maoj5 zD)W070c_~+_&q^Cd_7L(kTlL8pwJn1{94&qy9k+5@<6jG%@HAIl`1e{2|R(69Z;8G z{^XtFwvF7gtXu7EfuK;r9SPMZH~s0jkK{89h5UQZVj^A|s!GxsK?;&iZj=71=&-8_ zJ5)}_rmCj-$qq1H5F)Kh|G)|U^P{?N;4UT=JDlG~g82B!w>l|Nx&{MeS0v0nvzKtU zQ9D5_ZYnD%V|}heCnHSLm5@#aWY=dDo@QGVazrGg!$wGdX}1m)U`%6=z$ICrqT@gJ zfDAb>1<2ArC2QncYWtlFyYPzlo0UiR<<>b^J!w{2_xG{A1$pt`Hz|ru)eq_q=!eMX1kZy)80J_6eX$ zUJupzxY6&5xp0#tU3Gv9fRa#suR$^t3p_W$94%nhHQ>EfFcRh@n-Qoijz@7qrJF9Z z;nLoZk-c-Tv|?VOPzs5@*oe3(ClC?T?PQff_r$(<30D%FfWW3;h`QS2QGP?dv+Snh-@N!qT z5eoi>&YR~s`H2lamoXjhilS-Z7Zftjh}aCWznW#CbeBrU2@&5OPYJ9>7f5} zKzuX8`>$NIeiP(ACzNkm$9hY>0u=5;lF|_y!&IN0;w1$qC7tAb<}?;vQNCa#3%0NHjb6d(elk-ce+?8`6dX~75e9l z544DZ6mw^pq;6%p`RlK1pBvkj*w=#oWpQ^%Ac^GC6W1Jr(#ubs|xjJC7wsBQQ9M< zT_M}S$$B#T^_jV##dsH?t}qV@|MPX>dC!PjcY=6H4E7B+BU>JQ)~Yo^jHK(rQ0hW= zbOD9AOTeOxjmn5xZcWRl)GO46@@-CI-25a07qNz8qm*$&Nv;5Kn;;HI@^Ut+2d!`_ z*2;7ieD(!KX*RoFY)?;6YO-bn0ACjIYR#~R1u=koD;APBq>QJCXIjS+X~-f7;JJ6w z@ynFm{3t#?KTrEUj9#8S31@J;)YpqN&=Z$wt3Gd@d$#JvrLHR_|KOV?EVGNF4WteI z2ufAhT~5PiLYZ+S4K^{+rd~S(n3mq0o70qJVsK((+=jtkFaUNlYq-$;7;3Jd`^__%(x1r&lH*hJ>5M1TG0`sk; z$2q>9>n`Z%(^_%Lnt&0dSJY{x?@nqr*2Aa$M}inmFq~?@6yXiMRtXX_PhhEzUtWH7 z0(2-gJy*!g3`UV6eFueiV}vyqH<%$ByNT=0!HR);_D4c#@UM=+ zrS*p1&XTXQS%I$99i3;~Un;SZDxac7yj<`c0x$1b@0a@i!as-abM%K2zbgQD1Mkt3 z)n)ulod#^TTo{FTP&!}taS_BUgYjAD8e0%8H%t_HzPxs1a2@$4qc+@^&z0@@toTkc zr2d$e7SW_~P*D|((z#DjsXkExv&-U8QS-&AdOECV>s@nL$Rjc8hU%84CtbA9-njv> zB<4mAhqa)Af3%P4D(0pRgaYw(cz!-ly-#}~`pg@VDne!FeXwCl8B#fCxmEOrwyoXDinv+0Ldkfp`Fnn2_Gx_a?}DzvvMvI z>EP2o>=_SXu7@N9`|~nlcmN3=`f+KfOWet*7oeL}M7_&BCEPP(7V7+jM99vE{yce} zH%VnL`16W$+r@^%{i^jhT~(}A%3aXX=|LW;-S8b;HUOXEj?r-&pK+fe3_8EjcaznR zZuvrBO^}C6D^eDc@T>Dobcg`T6{y;luS`GnB9GwI-jey<34iyHEdCmQ*TV(=8GUHg z*t8vB$O8PyEOrS;z`B0Y&i{xzJm!#tm^^k77lbXDf=szXd!r=fLl;P#YyHgSuLD|0 zF;98ViK;^|1V5U>o8J0a;cfz_N>VmU)4Cn=Dq1$PJV|Qz8A8~mzl>`)SRsg&t@NfR`4M=}csM~@I z3EflA+36?&N*h=?RmVp;ggCItz8%yF31o(OnK=AP|7WuEl1~W)#^IqJJogMYQLJX>h8cBd zD7R9{HZme)*)8QlWL?fzSLCb-$2UX74Wx6ELpz!ynU|78&3R46{%$&>&Bg~w2>Q&o z-o<%VD5gSL6X^5QW2bu^!ZW@y^y5(%nE?FHXXe9m^52>zkyiFpBbUR(P0M}Xgk6cw z+$id`DOgj9Qenpx6fue=TH+@7z|Kl#zt>~OnZ9CJzwmLEUERjkPW%byh($wp?Fl#p z3PhjBzEB2fS=s&s)uYvW$*#1vYcToYmNcWEK>h)m?M$6nuhTOlhlrehyV25pEkTJw z`vZ9rpvNLGD*sW8nm2>$zp0-g4pR>|Cy62Kn*&!H)#?YVg10vv5)i&abx3$KpCR>(u8afl8n0|se4fFPRu!%`zKfbr7(9U>g-vUI0 zCyS;cNekqr{_W_(#Fl&TRC-G?6erL%C!-u$i+)O|aHLl%TNBx7&8W`ZDdZ%4?|EJi8o*|3TmI^c zyQML|xB1?aVxBI`!6S0Srw>b^Bi}p=e=`593ro!yzrnqhcyI6dM@ODruv&*d6yr-e zPEco<-y*Y25w5o6rp4AgYpz6J&~x6YvOG+A^Cj6S;iV3q>U;oHZ-8K~8R7(yUDxPI zBEY(L?vp{L4*lrr9nm1+--ho1;sDxq#>-mnsc#4leJqZ_Ey>-3%&*emb zPa8F2sqW{qE18vbW<`;n7$Z?Cx0AOni7NQlemPii+>e>P$NKvPPyE>2nc3HmEFOxtMg|VAOR)0nF4epTuuH1Vs#*bdb>g*v9pad7rmy%&1PX%JE!&?PpAckEqvc2X8h zs@ZJ1i56^m$@C3(f~6GKB4)h^iN&oqFDUZpyDHTyx`C`7I~csa$6wnQwRSVgK*rN; z8Z%x6d0iLae}pJ1pXOyxt7pHvF=j|`_}m#ny^2^>v>bwuROY=_A{h7enY$}(5emw^ z`;sAc0iJlm>Klrz6^HWPx4-FSvYD-&-5!ayjk!Qa7S1U=^mAvMANMI|uL71?cAYDE z_3;3s-P*IV>-$C{=sQD#)*2gAksv)20OU=PeNrDwiUln>*%orO3uverMkGx}k9(3N2HzM`b@c_AGQdbrmB)QP616cluj#k{ zy>n(d(a3U~CZxPM4Bk~7Id0g7IsAFcZBQXSm(3Vu2}o%@K_-9F_#=ytkR1UX_508D zx`DlMm@+VNn{z;XEp(GmdOj|nXzB=Hl2gO_Be`sqJ@7^`JHuZ*w}w?(1XsE&*l-vR zIiR0+WMu!rQh!GE)YjqPnO2|2#1$7G0*L*>4qAlbR05b6G@e#RYco^yd~H!wMNw3W zBinCy2HA>B25*M1ni z8hGHpo76T?FmcvzWvWo4=s+C`$28XJuRH=5dK^3}02vYoNB_>PaJoM77;8M!+$OQK z=7kC!M?p|=hIN^nAzjFnbWxFakgF59scEVv(i4ZBzi_!iOlW?LLI%GL__@ON(_-Za zNMGsujTDSr4n2C>?fT_56g)z(iFu#VAs{1X0Xk>>4GypmBy38ognf0rtvTi|9-+)} z_7{_QT!1(nTyxG+O+e8)E@GDxDYIFH>sK+ljhV;u*+fK|+LV+H-!99U$j?gLX89+h zaxOO{vMv@W2Y6^i*b2%}EDBJ(Z<8p*Ue{NND0`&MNIUTI;XM zrnzc-YtT6q1nJI_nXcMbgLKRb3+I_WhSmZU<`ia@W2Ov=l86oU@+m$Dqf zn*8!3QPolt!CSUi5_q=SvZI*tyeExnu5+j;wklNGB9y8QJJLXAlxluiXU1r0?wp%@ zAz+;5g4`bwlRkbBvOab|9AEu&G1~68e7}WnId?h2^-f%FL$EatSUJ2OHbA}~TW2Hp(d|Trg{s%=S<>zy@{Jyy(sqebg8p7j**3`3l zx7wY8?*%dMKwsRZ%uMn6-x)U(1`S&?#G85@FeEsS)e5Mq!Dg+aRyxa!2B<~ebABEm z=h!UV%rit~baj0df+{tyK%<#&Q>Rg`KS)KC9lqf=;F z-8^l*k6`tv(2?=m4-*obMTs|yiL6CPQPj3VlolEbNq4Q&EZ#(hbRe}M9ZUj5>gLI( z@3$k}Xl4k|OeN#R6fH0;M;1Q4g00-=Etbzu-o}dVF|is>VpN4x=A?5}f9=$0!=$CDO=7ve7ZI(giHda@pm( zrH>gWL$lY98X{hRNDGy`_-$lCJvZRvX`OK$P~=DLI^CIk{TslR`qu%iiz0HEL-EwU zkaIpmTpS(R0-6o-IwkG%b0^*uJ3@*jiO~un>7_s7$Io?GZcjY5)TEqi5)gd$rRIiBis#w_Y3lC z(OD1B=IhDdmX&5JI?x9;yvo&CEsAVLk20ptE5tivP!{Q!fdd%PT1$`{Z|FZEGX&FN zPkCp;pe#z|0P40U5dib!x&39#r#~Jz#3#2Oh(ip~4X{~nkX3}ab*`H9SinWz_QR}} zLxQfg#8M`M@(Y`0u_zX2h*{@gRY35C%L_kKz)}uoSl0IBx=FouY+=Y>lWZ~yQzL=L z-cOXV_MGN-Kd_)^SPQ*Dzg^hvnucL80_gbT^htDKio0*Xo!;Jr4*h`-{y3Sh|FqptQHf! zBObFK$8dT=0+O((M}eX@b><4{j`hZh*g3{eNR60#I3j}C(ZZxX6P=AA zu$6*@>jP&-wf#OAaz7_u$=W=96X*on!7aA46%PELm09%;6w#kYYw(atw<@es$i)wt z19dn`d3v$B-5G#WzW$f%;ly@%_%qtbL*gp68Ss=C7B19?MOb5m+5La@CxCVybH~-C z*7wB}T!tj7}hQ)9fBcIA<#0{#ZC2&_)Ga#o_np@(d= zi;$sgfPgczugv_hq>uG@T}xEHp;c)gkwq;ds_B8&k`BWIpSUBeKQOO%2#4Z4^khMK zWi!e~)ZIXiq|cS>9T(4fF20Is|FjWEp7qWgr`wkkB(u9w&8Ukl6u7@TwDuJr zRR%`;T(1Cq#P=-yfqq0LAY@=h>irOzh_M(0o56PGC;S@Cc4ezhcu}@Ia|Ca7xR#P z8}>7_r4L{(p=ut^xjwJR`x3FsWNyE?gNz*6HJrGDJtSRn(*Kn zhS_Y2U%-J9_7sfq1E*~t-<|&yRt-RiBMc5ce&d1%Rx|>%AwjOl#tlP(Q|_2<82wAR z%#D8=E-{q5*yMvF!ObFEkoKSCD}%5^#7W&fI6g355>n?yUywOe@6@#At->-X12wS` zL8>rpC?4XW{0S~8&!Yuj=qPOjOlZsBEXIb@ zKCInkh-X8N`Q=!K^QG8ns(;(?2OP6{9Gn(E*Hp8xG&NL>d#9DbP}(BM4pjv$=BQGe zCyReD)<+V#qyR)K9`587!xEs99$CY{OQje^rR+wt+-wFt zsbjXdAu)8fmg~`9L@Z>6=DS^Lz?^2OzfMx%HtLq-3z9}zvQyRtN(uyv7L6dmB?fv= zd=}qDu;42j{z+RVRrP-D$y#{YisBtj@tlmi@fsSXI)GJrK7$L6!}KupsENh1OH}4!#*nA2x_M&%m~(3Q@jROIu)}2H!(n zma;Cs_0mcU5!XKZcCIae&o6k;UQ)#qYohmWzpP_J^pD`3i*I%G)Md;5Wf`+X`GESu zfd_%(LMyWgy^+nJQ)o5(+oS_m5dbt}g3yq$q;Pyj-m2iZEB=_XmnLc$$3HBdQ*3Zz zE@qVDh)k7jDjwc1->zzqQ6n#Rr5sX9Nsp;vd<_yrcGI<(cnldByW(Plz?_@5SEDYb z6-@l9)AZra%tIA9khIS+98$1`Zw2GAHOzf|RfFNuL9QWT=rzM*pQdiVXY$Gq7FY2W zZOO4`%LSVhOBG$U@b58g=t;B|CQW-$XsBOX;;f-LdVqeJy{WpRw1pQqwnxw~b^7Tw z|GU*rc|Nvmssz&6sFzs@#N!PAo?U3I3=_Z4)3K6I1XO8a`f({NwAz*Aj!%?79}KaB zhkn03Tl8uqBfdIM;W%NQDx_ZOakYOjBolW4-(7ZahmVB_t;v{~_WNA@DSbE6fm?dK z6ktTJ#+8CcLERkWqiRPDAS|K;2hek?AHp%XmqpMI>KsXR=+BlS`BIU3p0`Rv&=r z!+`;Q2km1YP}zI4Q49lZJT0dROKN{~`Bxw&r=JIscGfxyk482W)W?Wx_-Dd7-Wpah z3pC!qkY;@9xn&B|JF9950%WD-!uF>2xO-sb-%S%vAD{4-(af>`o2bFlGRlWyZp1da zq0!V`we;!=&oyEF1!I$RcA{h(VXi9@+Kj9kSzzxYHd;B=X^$lNrfgXW-N(u}#SdnX0`LTv)%7 z!jb(FtX$#xI>7+p*8bP|j0w+b4Oy+zz%&Dxp=RS?w43u~rlSHTG@L^-VZNTz2BTx8 z&%Lg9Ql2A-SN!I-OzzE| zv#1aFxeFBEEEW9gR({hOx~rYN!XaXHhJQuvdFpebZ3t#lwactFnu}qM3GOXAkz-7cY?{)s+EJR3Mz`n3wTlPoPKUz>2|S{31rlcwI5O#BR4e`v zv?{6jFL$-{XDYm4)qiI5xHSL$F~G~eRbJCK4~c4eRQvWd9$KT65M5rxR0rqN?LJyW zK}6%_lwYMGgXDVbALiX4eIoNRRk(5n(@nF9_;zzZcot0{W&*-Bo&H0s4qsVRmJcK% zhGK9NSMo{TmzeTFU++*FLKj>Fb8B*QE4bH43#qEK-ycz#Lpc)D)CIN|i`4dxfY1d7 zMP|DPw5_{u@43JBXU~I}DjH4VoMir6<`f(V7-^m&aU{+;LAcpTg(}a9YF*k|4jRTZbS9F*ZIoVN!XYtC zV54#ykwVRE=Zz6baK9NFB}z(lB;sRo^IQ5}Ah~a?TZ3zB9GnoB-~~Lt*_dHnk|1@t zpmF3LDJ4T}A_9vy13bd&&-e+L121s!7peesH71Sl#8QggVA|g#9JWWx0hu$xnj{oN z^{p0PlJCpCzKHgGlr&Y|=Wme}ZV2?kGPJf)W{pnYK*vi^wIK>R!sClz<<;=dfoshj1J;k~XK=oYqN0Q$&!)hJk% znpsErguCa-5228A)vio5ns~8V&JlTT_Pz5%-N=+Fs^&b z`|LfIz=}6NiP&$HLz(0v6tjCsvoHW!d{yI#m#xkyI{Fd)&CiC|3eK|&i!^LQ z3G2EXDe(O~6UEypdXhBg)oiWA3K6o`lVvY#D`ZLXJdQhPX%a3mKayN#E1=Hce%Ag- z1J&+42nota;Zu~$PtBvVOMVM=^Rc`t}VH}T789g>y=-BS) zOB9{S`p5hElH{85aUOP@+H3hnJT6P!&(UH!yVXreABSRdyQwp5J7oz)*^vLWYrRrx zbyF!^;v?Srgxl$ek|S)4T?_Oyq|6QI=gWWL#ZvDik`Mu-K z`oUE}U9m)MRqyfvLn_%rSD$bMTDMGlC-^W!J8slBYb2iG&x{+NzAux_%&z$%RR=jd zwLkKKE*>T5?wz1Dm~X(1`tbZJSO%xuA-+<#NI=F%LFr=D1Qz{NM^rP)lN@X2{T&%F z!b!u}{+1YT>HmzqMD<%TLxa44XfFH{iml7LpdJPW>i?=?fR*#jwAV(M)u{$Tz461o z2^&%oA)S39K7W@QIL(rs{SEK#yb07o9NO6m%Skw;uS=ibO~yHy9P3QpH8f%#?LU2? zuDtL`-UAhzGJ-0yjnoZEPV3D1TlRB@>JgihJ>1e)9tOIH?ViO%n6;7=Utl#DuF4B@ zqgIvuxpqD|^tYtb4LP-?m011B!}Hk zdo)cX@1>Q2Z6aAnJI{NQ?H8Hb zHEmjPfDv#&v+_|GA_5QK7yA=esD=vyf|JQU=%*6r5fmkh;*;Imqe$ko01>QZnR6+pJ0CNazY(ow3*Um0p3?gT*!QW!8g zpf=XFhaT6(Y9$H3Mfw)Y8A8(qA=Xd^ihf%MW7HN&j^#Z*+Vo+Iu?;#ezg6tTZWZt* zD3gP0l0ws_Xet$v2YVc>@-!ok-B*|%Eq1(|>EJ1=i=fcE9uRCrB_YtsLKUnN-a?cl zX#CS(Og2;4g`nQXB|7w(ge0LB;A1uXK=<1H=aa+T%m@HsMhty;uou$igr_6lJ;PCL zZ6v;+!FEY1koEV^U7U?TOX?QTFLso68<8ZR%%~__$JaqVXvoD3JUfgB!I%HFw!NhF zL(OQR1@~8)elPH`>LD3)+Q5|4x!>h6_{>}uDz27Pn9VG31_k?JFaMqWcc}|VOY*|Dt3H2a*0oZ%LsZB`TtKDH?xvaOUb<5;&szXqS2*iC|_qk$L2RX#l!GI?u zJX5X;ROQmDKCH)?&KnKV@;+ZSWj&hk(2OfsM37L?X7n^O@cm>I$lL&d_BL^sQHc8p`^7rDr%55*hp)#xJ_NdW zxFO{SZsX3Ual7#NO=k)#dy58coL<7^>x^3aQ@^Gy?wkHbLbUlfM7jg1W?!G+yAqti z_4tSH41abIr3XvbXz1FHC$ zHP1n?822S-E{i6lEq#m`#ocYORh|pvhes*CPzfLI#5|y67z+MdwU(snR6lP{Eet%g)`oKHV}1%c#Ua`^Rot5M@LEO zraLbzO7gwOcLo(#z06ATZ)Hea{UIUBm=)CWo%@(Sl`#(R;?`*i0*xUlYG<}U_oIrc zjhLPAIKc?cS?BRpxg(!|G!j@jC%NnWBkzB0{Xiu4-%VuSr)-+@CBqfU z@Ylt-D|c>kfBvrVr$BJFnHW_uVdCrC+$&w^!Qc`k<^4|&tLhrz5%YVt4UIATU_Sn3 zbrR?is;v2n4n51nOVR4kk)<7EMfQ+OgE5IUV2|rwq0-(|wo~tdBVQ+DXBc~wpJDT! z*G`H4cstZWDQRcEKb<-inT$Z!3HQ0xe$vl~VsSEXuw(xt<~|w0SU`@1l{AL+#G2C) zxaoY81~89Ng;ag=R=Cus;}DOUQalI`P^B|DMkSdF(@MBCq1H!HP6S6Zp7zIVO86c{ zfcVO+VsL>I-msNJt&Ja;OAd}5=Zx6qBxkG(L8zOsZlk}8$Cy93z_aaY`Ku{(>p=ev zk51OBXJU1X!EBnkH=L+<6(tVMnovTSD+x&W_QQINCUUgbk4mL9aVAL!P z(+?CHIu@kP&DuvAh*;>UTP~(phU&vl+pfI0)Fb~xg-blHB*H>!&@!WCet=ZK*7p~g z1O{ItIm4KIkg2>SGZC}F_)O(HgP~y6+?L8_OW&e z-^qoS0e`6t>)+$x6ULTc!=vOygL-R_Fwy%oh%so-U@kM$$(#{3KHmDEb@Fz-4NKWy zL8Y(#3Q6h`Qk>8cpdPdOfPV3Tv0vnh0nF#AL=Z(e1=WlD|H{~nZI>4mgtY!~&O*O2 zbeNu=0w|s9i=%r6RozWnbee$VWqt_NsAcuF@}1ff7*#JsA!*O4`dGI;-{4{n;|QD? zy(0B|5-ls@b-ahKy9R_f$+mw=7SCsE4g?vly%TlM1#7ch0vrDP#c0ipYoc6yjes_A zw)GM>x~^R}tk=l?#EVO0+qczw%3#T;e%a|0Q*QylrUPr7RY71j(+Lw!Bm&=0p$WZ) z#J!E(!CC#Jm+$VW$PDWYB(|4`#5#?zC66e`uMsbhsW)vN`et=qN&;FD;&OrM=i#td zXlw1%1IM|sNwPs_UHk&^4LS@fW1KIPhk<_~78eb5m-HoID`(ub-K*WI_7kH~1F(EJ zwa%0Gx%4{XX@^~Alj%-_28)=NPOL;y9Xa&klYT%Jq0l_UvCjNll6$|0cz27yX)#vR z{Ndgax}OF(W?JJTqt0kTS}TfB%Ak3O76xu}leYwYy#}?8YH__Ayw5oMVw@5lp}^W1 z8nI8nSt)fR3Ujn|5*EW2r#QMe#hmQP)UH&TrE7Jkp7>n$(y)~6b?HyPj8|%DEwC2Y zwf*aHiB?b>AZ3y5VS!`L8oFQ8Kz<@`=D>sa|efC^#lM(v~B_yq;19C>+n z-er`{cA*YLO39G6Genjx? zuea-W`z-uGkc@ZP^Ekg_+!faDWJYeJ)Z2KA<{AVI!kSHPL29+_jPp}^Z*kVbP5>Gy zN2$EAGBOW4N|JX4_M8z1+eHhL=35OA$k+x%Z04~PE-Z)5s(?fwiv$Yy1a@@ zk?T|~9xgkqu^|ls&_4W}aV;?aA;`S+Wyxe;y1YN`0A@VsH7;KX%<{?= zqH9%pN2MW0Q^)MfLHwy-sRY^*AMxPY`K(jnJno9eVN76iR~9#lw{cB~3y1G`E74;) zLYU_Y_!amfX|~k6QhIif>2)FXhSg;RY14%ESfLXX@u2gbk#+m3! zIX=Jo#$u)Ug)JVG9yhf-Zt zi-NR1=LjxCrldzpuw;xj*Vktk6tD({n#wArY=0fUUX^E!g8X~wZ-z2K;TSt|Lu7|A zgbC~n_}OdEMVI(_K#|n;I31TCCZTP+SYSdNO4vaqE=tQ1P>BnU(U`iU9dxDOqXCAZ z;#vaUgJ#lt(Qkx2@H~;?1Q7#5Pu4Z$WDms$Q*s3OAFj#kt>gix zy>~_U`wfp8+dl7en9ZMkxdskSOsh1AbP|4&W^HRxgNJ~;+Fv6QJMs+eS#xz$T!|}4 z;Mli{G`~c-iFlRNOUTlNPKh<=yz<}!vbq}`R_vrkIbZG5Ktiw z?GT)OF6v1QbfcglX@>Y7MVwgGjCJOTLk~@`c3}6uQG&U=>Hb;OgyeKI-EYVUDlQzB z%FWoQk`NiVQm0FEpCWgSZmA+2RIYR6K5=Lj>Z6xS4eVu0xp|e}rAp8R$6zwvD-RGw}p8N zEb8aYknS-Gp?W^uPX)yg;#NOhoOQwJz5LPk;EFNy#O|Q_y!3Y`IwVsVJJD65|2G0 z(FLxm`X^(Hu1^t|!J(6=zI}T9${+Ohse=4K#@t`4&_VD#PEf{98o*%*;U^TJwHJ4O zV%@sihlwF6<>@QvRleP}6eN7SaM*JhluumpfHE)U>9W;hcm6q|EHpF5!e6ofPCvx)m79BH2=yVVs0==6CabK3&k?o#9+l&e}6zYAsZc7Rnd|GGs=ME$HFH^5wP9yoNIJU--kP+qJ_A81eQ*%4&{O~bN%QjVZi!@8 z7aMzxOcF@R^L)mZk5qd1E6s?fs7elax!rp!etpws_MP(PfwCAN zrEF)b{FVCfM5f1swOT5$ZC+C&d;bWm)Oz3T{twh_5~cKv*?zD$o@ebi?_c8XrNeJ4 zOG45~4)OM19%2E4g~u?Tu4or0R%!suIu0Fem0maI+{7QHbM?`Sk~=X7=jCdB+qi-V;2!9{o#+xs6cdOtn++yis{Ny3YjbYX8oR_el; zi*g}htx3LqeKrAvZg1dm{-j2J>wBGlDxi=BIFHJoUY(O4^6;|;sf+;8lHxk|-s8@x+!X(aaa zg5Y^2M#UipM1&0~O(Z=7$Wm$jO25m$7uI{4iM%pDp%Z4KdqnjNP)>S|+sHOEUjq%) zQ<@VKN7D9_pzm5k?`A`;L#`iu@Eop)0x~T=|t7-*!>0 zJ{=QxAblRS2T9kyRKyaS#G!1g_pTIJR#W`HDxptgxIKGkRelQtg&Y&Xtci5x#&Tov zNV)OQ4y53I7Qk-W$?z?@Sjs}*VIUb-R?b;rWl$fsJ!HC}`f`GW^UUD@Qrfp!EGL7K z!2)8LyA$wGM3)WjtuM;U_6_8H-DnoPBD>D5P6pBUdMdZluxmDNIQuLia;}X>iI?eK zTZkc^3z9xJX>3ePyFs>N2jv}M=gT0>kbu2z&Nn$ zhZ}0>P#E-9am)!?-S@Ps=2a65H|rCg7t{UD?(RWz;cxE^sbZAd4$5$Z`WNyXj4y95 zls%=0kq>gh##zp6lwY63yUSw{J_z7#Z|@(?YV@OZWdYF~pDX9@D`ta|*RPb77|eg3 zagoj1rB-sKj{rKFpvZIfCoBTTtbqcP!9mqp(bq;N9Y88t*xp($`wj?RZD45 zww-sdmIBzOu2vXl^(^xjKXNPr;K*pE+>s<>;!3t4|K(Ksjs9*7d=0IczOsWgxSpiv ziSDn44glQ%O?MIK3i<~?hS@O=$IY3652`q@EB4QMt@EUD*XOUS)eI+L)V@X#DCje# zt<9mEzBT_1(Ggp;#uv*^pYRv)W2UL$lGGJb`@^=&u-^Eo!QXVVc3=izc*dhm7)md? z)T9=j6iLX|1kvQ3RVdBGk&x2$>V-JXVJe>bjR75WV>18YlqP0Jo*Z*krWretM|Z5T8% zfuAC-I#F1-C+k_TgDHk?8@^)tFOeP{kCoqA59dPMQ*t}lUtekwCV}u8(%fcyuy~;z z%nE2vSA^A)UDBchy_Ji`WH1)MgI_FvH`)4}+y13?GEUQ3kqq3|`J@t;d}lzs_XSfI zB{8v#2NpzVZWmINX9yh~gNo2^RL)I?8BmaEOgpH@)5;5U;^mz8PCm}Dt#+if=)5|( z0`yGDS=Mo2rBzvWH*3w{!HgN^fezqtDC~rTWP?vUax6LqU?Q5&j-Y&6O406vi>10) zCcJV_y&;VpMX&Qo5eQS;zK7D@52KVKD;S(G3<=2;>`a3vL9=+nBbO%SOv)bAry;RZ zK*S>UJfpa%zFiS+7aalG6viqmUtx?H8s^n9S!(B{fN$aWL(W8N>U-l>*02kFfTSme zEvVRzeLW;wd7j*~pgL@VA{hOeI-iGT8Q^z7``dm0X+?yDv?;r>y72Dwk<}CgK*ed# z4mrAxfx`O%hK++n!vO)-&0e1Xw8gu|c1- zSb@LlO`lc#KOvaK$Wt0C`guMta&RH9_~CT>JYeP;O#uNrkY*Ta9F&9N0Vw5tuha4^ znw%1*9eXL#lB!%X#eC_83b=ctBJDs;X)h+6HfOc|@^Lu3_0&)~<;N}MCn)y-T%&Hw ziSo;~>hC~55U!CP*Cj6hn52MGAZG7Fox?(Umq(GHT54~sTj6X3_Za5cHZY`PwZaaB zOP5gkuUvjscA`86q5N_>lSBYuDp|G4S8|K+vj8WnEagK7&bt;amEO6ytuXYEPMem1I596Qj z`=qII7JDAc7&M9?S6~pD0hG$VbCOGG!DoK#uyO8@A#2dB9FrCQz1ea;lIOs=(;#Wi!kXSu=MTgV= z{msIcXgXTKfR9CW{V*qmH=s0eE0vv*^8;>!eQ82(RKrjDOdB}C2(^(e;OfKfW3gcP z*z|Zf|--{p{e#(7ZcB5S!qB(nN8R zgDRRC-cW|s9$a^qf(*9n+B>O>3oR6=PSA(5S#k!(ROmG(K3#C@4wYSGf2#aq6@sg| z$A9E?gcdCBy8AxHzgJYy$e#eq!nic50DBs8mv=230q`!XN+5YRh7Q!4Y5=dAF513K zL8zEi3Ai7-lfzlh2S^XD%^zy55RL=yxO8|2x{=R5k58FTB00=~k0K;ijP;uzT%msW zmhH^LsfzkqWXzMofc&nKe*QUGZqiZSjLBi)5`d#d2{=YzsXKY0#w}}T7S9x^uq@WM8x0<Zr-lTMrm8;p`Zh3b$;=&Q?;-0hD;nQL zS-+2_T6O^|^w^kZWp&tcxe!ZF{37o)78?4HhEqm7}!CLpdRxOTI{`k#?aWffvrZB1+SyHWF1Yfw#x|1YBdilp)Po* znLTN5koRui?M26fc5Hn?_U6V(N&ATH>L=HfuYG$_a%A5kZh)|bzqwdV>;3+8`X^S8 z>eK#JH1T46BY2;x(4&5ueyon85Oma_+Gs2~(e`N<7PRDR4g)-awJcg2NnM9^Uzz8H zbuQ&igB98eVi+j*60VDtkE*TYO0P4Hzx3M&e}7yjV}vispqm-$=pLIUIK|S$(%K2U zI9hjj(-n{(&IaZ+m_H$QQs)NC{Pro>d+n|gT!t#@?genAcqpU(>BcINL0Fk5Pk*5t z55~IOJkdk*6(b1_y?EWa=d;h2;=+po4`F0nmH4U59oXhcml#fCL@bS_+dNOuo7@$l zfr--M@^8S0bAC!?g(%o&__gkOVL~C-={hb8fx)*G_W=gb<{;F$_&*8?r%V3&l6g+I zB~;LoUiL7GI5FGu4?2nfXbkh+F>IP6PS^u^oA_=OV1VR6&$jKOmK}3BjCMs_n|uGc zB!>F9SI#PSv{`%6Fox2Ms}2nJsw!5axONtap0BtcQBcC(4Nt%Q?fxv#0xl458Pr+y7cihhcf>i zS4<*^SH80qOP@puh0%G;SLaQ!`V9P8qI?bggCwN@Xuv$?@Q%KqvniBKPP*|cGHy1& z&C;eT3C%L|kUYvoIang=$^gyDfFP{W5-Un#+$U{{pG>s``fRS!&RXmvVQy7p1uDOa zOdc1O4DcK9Yt~k*^K5;hA&83j*c&$vt&Pym_GffHa<-rEv=Q6?j zVinPEE)vo3lW|2sF>ECD0Mmh>E|eO8C=gW;kpO^vA5IIRl5{|)Ne6l>GHPiZ96Hc} zbOnon*4sTwOGJ}>+!QV$i*$$EYh6f0KiSMADczUgXjp_>+?l^>@>s!hdnq_p4LpvL z2-1C|8Rl)q(ccsSazEg%e-Wsem_n9x5NNm@O;YPyz$VT0er^*!0KW@vjHBA9m^Wgf zW5A{bZoDT?2AR_@i)M9VY?FS1$8!CI#Lo{nl)z14yD7q`XNY2VYL%7KLFinf3(8gJF# zDly!K+4UqJp2jnzY*krJ9+VQ$v?Ex~PV@cT4mGX;kk_tL!fY~c0*Pg{fdRUNCO(7( zVC4pY?vIjHh+aO6)6Bw&u21V)ui_N?^Z7l9SZ-@}s@AW~t`;0&ReDAeEGh2QYC8HD z$`Jls;)Mh8fgQ?_ympH(#5{7AC*)8L)Fp29i(!>wGR>B?A6yv|X#P|WEfi1gh4u5) zG$7E8G1~I46CjP2WK_$Z^auWVCz5U@!@9{%aY+U6-;^I}xyQin6BP-u zb^$mys!+9L@BG}?jxOD$T~W>Ba2+6d`HiU&dN{#RxE(|MPwxs*~gm)z{cd!0^gt60NSrQEZu z+e=W+P4SOJ!9G7?-<8cMxggm8GxNF{@zy$Y-fbqc;3*LBD-IO~16!6HZ%TUClwDL;@wAkAW*OhfFzsT5O4B3+MomLNjQv3%8CQNs5)D#- z%37e9DM#%zGK%k@K3{nbd+|^_$NVf64pRYEWkN4TWoXUze9!;*8+oCn7&!SS47IWBncB9VDJQ3T92A zxso}_jZxmvPhmlFEsgK}v`wy57I0PN8JbsQAfPwg5jnyNE>0{k7E6ah^7+?3Sc}l} zQJP1NMX#=sOOYM5MyNfj3Grecp^eCXU|_AYwiWH?J7n~)HX1cR>~x=qm|dNBV@@m< z1h^Y|L8RN3%vj5aT9LQPcQ`|qOPVt^xz9E*fQ`^QVapc2l zu5=QIfuxK>Lc_=|wB~u%%_1bKBKi?~hF_va1>+LIc*C`sLIV`vE}rBB>AQHgU7dFw zIZQM%48SL{A5HEe!!}yf5Op1#x#n#F@U3n?v-WWA(1M|D`tGJ;QMCg**l~A$=3+Fk zdq?Q53svL$&VdInkaj!yk5Ne!b~v=jDqNEf_+{)vgY$IL#MKM49L__xwz^1fSv^(Q z;uTx#qT^e9TD+UdbO0Ja1gy-oC~VhMv#Da5`~}WBT&Lu{WI>_`@0OOCo}Cf8qxOyl zTo_R?cx0L!h8cj=EB(KEX>F$-H96{xFw zEJqjC{0Ko4Ml|GQwrPD2NO^(pb|gaTBx1#&qr=zi3tQdYhpkdNiXR`#%>981&I_L0 zM%e7Vs>#88vIx06GHMJGwBOnzQZ~KPUGOr8n8Iam6}4TJbgs7QE5_6t=K;@eT*NY* zM!qwn_j7G1iwtlZuZZulmN0)q>A9dgA(*+`c~czKy~M%Qxze-gBBTB{fYf!AD>%ov zXIhk!OF)6?Xn-R-lF%gk^ZFfI1w@Rvl#L_K4Q+78aFE0trrBz}A3mt6mg8g5`ydyv zggtpVlV$Pd*ONX?}gI~aAq%2I4~49mTIBS*yk)<+QNxH^tg{_c+AemG^g4_=5MOd>TnD80)e zd@sJuG|;gGMk-QwNLC8g`%ND4tm;UD*&k*;vYaTC-#n4-mS#EE4aATC03i;QyjkI; zFnTN&8mkFe$P#{EyBcpx~l^OI-n60j{Xvu)nKk zLH&~_G*+bq5lrrBLZxmVb&R})Qe^(imGf@#rl~+fi+y_ln)6}H@@c-FS!bOH`#zrt zALyM`l1nzqNZMS?GALjP;E(niF$j5{Qbt-*kXXEZn}v5*9%x~k&0mLiK~@usyD@)k z0PQvO)s=U;Mw}~HiT;*DOF7?Srgi}eln%C;H6Z1F%Kw$7-pL`k!mKvMu^)EK`q)n7 zZLtOJJY^#oxYaE$E1qWr70sj_1=1Q?-#rp}a&>sxCUslMX3<=dIVy~VjlNY%P!@#~ z@s@UhYdnH1u3%{|o$)IpBwAOyr+_}X?}U*W`P-0=rbvj%weCb35FSBsnds{y%{sX3 zkfvYCh5m}izq;@>wAmh3wM#lSHs`M_=m_~j2md(PZLu{SW8-FSZt9ZDO)^vz7>l+_ z-#q~?x4q(rs)SNI`KMZdlH*O-Rzw{>oKN;)2{aSW*S@2Ti?PW=OiH|X*={p50lxzA ztsW_o&gil4c-;0;o?i=m|3!4|2# z9QO|BKH?i(*afvm3a;Pw3&o;RnmQ2m9a8gf=0NB+mn;?)OI#oxR#YgLSaifA__FLgaOHzX++Az^47TUnr5w}Rce)PB^$w?WcQv6hB-|9cu5M$s8 zK=q?DJ})G01bi*?{A%eT_)@A^BO(FWhGruiQfBkz0T09g4w$xf5nGvLeLIg>(H)_kX57Yt`{*VEg=J+OV(O5wxm-gt@-hh<UGfB4REA!fm`Tvm$OyO6_l>Y=n*9d93_r3P;+gUF|i zh=vDMI3PxlHhs?J^p~^hsNh&F?%h4dDV~%YZ~GMtW*rw!80$Emol>p_9QdgE>v8<9 zgh&qHwexL;a2Q%moR=0M%8W2Y{(8_l`xG&D*8Q05{jL@l#0cm^$!UB* z)$3cAb*~rGRQi8ouU)>O6Rzo+ghBVdYj4|38L>I{B!&&`~c>`Kv`Z=`|&;^yk4*3j)@MT=6UF z=q0~tNO5r@cE2R?fM?TC(hC5OD58px%Q`kOwr8p1**KthoA_Ico^wRh7;mTT+K0|?)D z&JE_mMiv>AUrEX;4-N0dX_B2PU3#M|y7)==n zZrHma)%m#&*>z#+{Zb>52&|mwLB*T7^|bh~R;LE=rd@x%F zt+Si8H(VyD;A`v$&fDs7p~4%vv$B!caJbi&3%7u=Ty9wwmrcO66mxM8N29L5(EFkq z0R3Y6h1!WmQNAgM8@~uy$}2KsPr3?glOom4YLN$)D*)rIKK4E|F#ND}6}G4-cwL8> ztd{R_i@=<|y0C$tsqF*n!N;iYBJ< z@4-Jd5Z^)8GTmF_EL|oZ#CAO=W^CbF>j2ePDXoo%>gIJcJ(A9Ee3d2^`^F4p+!7Nu zJ6X!6n=g#qjBY9VeDsYU51tI`nqg_``%sdMIMnz4*IJW5`i=&KHtO!sPr~S@-&2@% z5YACKiFfq;`b`qMzFP8(I5{%3j)BSw7R22oQCzlCssn6<3UMYf z$LxKTk0Z>4!Nj0l`e9m?^r9rzWkeJpl4-@VAPm#8nGcYa)JdJpuK^Oz>t3K#Vv5@7 zx(=OxQu#G4+u^ylrT=$gi?2mhZILtd)!uS#Vr*@!jqgfGZ}QBvQ#E92KxTV1(M5U|Fq0wBZOXU z#9ug=ts6}HK@O0#UJG~O;ZuLpSuBwjTCo=+atQxbJ1T^<`yO1;pILuSA7=&Catb)X z7)pBQXAk|32~PlUHBDLCtqEnMrze@brok%4z9nY*YmtV`jy~ zLY39h_4Ekr*KN1Rb_oXbpn+z6A-6D|mhOcCeXX&pU%#AhYtULjp>qc$BgMnDe@g)+ z;7k2Gv)`XoWs{bsb`af}8Fk=QTx@&fds7QwTESZ)M2#;EPo^9us3P;{VQycK8*X@N z&6pb8VQXcp*^3~Be<{W5QZqjG)SXQTeR}~GTwT`ncW617T79q$acHzQkCx72&WGX- zF7Y$VCqqNDtq=PLt&Lxj!)Y8Y&&um}@#-IApX4{V0S+VTD|jnxMVuBcx-=CC7TJHq zhf!%4RyrEg+C}?|k?`JhTt3p|OoONHb&p$yRU1 zQYfUfBgxP?n`Hq~qq! z^_Z46(Mt3sDbnsO|6GfBU5qKmE`GdP;IJB7(8mDO+ z|5ild#tuZ>=F{({X6)EJC8usPQ7&p4wVD<|UV{UWK{s=d5q{S7L{mApoKw&FTw}K9 zknYO@f=W%B0P{>kM+UtBU{t68T0jK=k%+fx&*iZZV(aAiY9BW z<30X@C5cBD3*4LK&zHt(Ei zae?A#Rzv(DK%=GQV8z}mbPlFsIvPr35Z}%8lYy*jITLG@{AFq+k4%)@H?`DGdjdbJ^|bzNs5mIAA}CDkhD!7yh7l1z$^} z62)>5O^W2-F#5;M2p9(8j6t*KrvVSBeKZR0Lzt%@4Jb))&s$j?*M zKKV}K1?bA?txh6gQ_?7sM&r9&7vH`e!+*yb+kQ!PKyH^Sxt*K=ySt$Ya%^ELF0sgz zDxJ6d_nyeYo_b58sacsRlOTasDN)jNRD4aswU z3A`HHYLFB^K(pc1=`QBh=5jXP(gGgwn#DE@EP4rGsM;=_p{oTKaG^P-YoKrLMfj`m z{eKO8_5P=&aff6yFlIH6h{r6;LzfeJCm-MVpT!Z=)}^hqNxh=ntS&}&kJSd$gvic9 zn?8m%qT?VHXiTyje!%3~!?V%E0msl$qGuQs`_*qv#_C*oH)-KOQ0^GfJF3RxMC+tO zW+(0T_^5FD_`EK$;3^_IxgiI2iJ7NMcvRw!5MNr26rS!%D-}JAvND2)Nb2HpKjqiJ6 z1?mdFCTkBH)(sG&*N|SvMJ6(pe{b5P4j^i$BEJxEweueu(32+SK9cYqv^peXhbCBT zpxPtQYK-7hT5T|D_9Vin<>cZx-NrrLBu2A!v41!v?S`2^(Dx$!Y_H2*nbb$5^XV<-k51l2MoS zR^~5-=U2BK6yh`CG9a6epd+XaXn|`ndV}xPZ1Vp%ZK@Kg zPVL6WCcsi0^CVuMN@zA#+;y03um0uYK$b))v93?u;nz-OW{%U+9y}|A>WhKLCRe7x zWr4Jvj?s|EPnSSXQ{>GQ#Mt|W_}|ZxC=S(}w4uhB*Q{V+wVU?bL`CdN>9%aV^6ESzEhcoFHTlZ9a4AVEq* zxFbymEx7tM;wbypJ$qKKxKY`86c1SwBsuS>Tj|Xv`hz;~e@XePW}_B+H)s|ovS9hn zjZKj|5!$A}w56hAcp_n^a1mx0PKPCfQFAC#uH{u~Y3r6DQR!kBOp?iIs>0*r0|-Dp zl=Z117RSj$zE%h)oiUP8N;2H&whYWgFm4Laku8~RZJKv6SXY|1F%mi}-pF54p^a_% z>M@9%KUPA6>txa2tdHt3tLCbfy^njQ?%cM|4SNAImFV0STvJnG)sr%C!%Vc5ev5!ljr{G)$&ruWaZv>FBV1Q77<1G?g^Y_Qdaim!a$_wyQ=yQlh89 z+>^Id>x8>k1AFggBu5p;UoB~Irx{-m8KJ7ji6D5+X|vc_H2zhzIY&#h0RUnL)S6Ou3SRu?w$b;(>f25A-1jnt|aW7$M5d>bQvu_rMQD*$ADr_Olxc^ z-ntBWnSsM)_OSV6eBEH@W=e;cAriH+D(JPY+IkXaE7UF4$oc$5E2+Y-Vez(7 z5+q}J`@|Pyv)R9H;qGy^cb0fs=-Y}7zEfrl{IHF}S}KzDnzZHEgIqK##gHg>r1=^^ zdXC$Bc6fkCR=@6n?=uy&VZWe3zD=hXO(vRuQZ70Tp6d@-)%{k@GcHN^t60k7E$9l&J*)8a*{w z>&6eO@|aQ>Vl93n%uKQP))ul_zf_A_WMHo)KH!nT5TPkhQZ{S#LcDBN zZ_BH7#!lQAJW`=uhJ8LYb?Hhm?1_dd_6GKV-$q;~7M~G?VAIv5q|;|teXVo(^@c^264GdM2RsUWX1VdQTMV^kq#POk{v*u6J(ezXzYDoZG zm8YEA7f-j|2HuRyBE8GLWA6J~B9cn-br*^q^2lV+lJS1~LTBSYu$_{wixSX&a`N7J zdy*g^jj4N|(Bt;^v^%01we51wb5B=wWuW9hUS~I)8k^kd3tx(?Q0DDyeE5jHW2(7k ziW3-9r$ZMYJ-Zy`?LGjxmbT%d6ugJ+{utmXC^bz@QgEV#8V3q(^l0)X6r<$gHzVZ= zQIn$Jyvdj0Mu{Rdy`g{GxPbu;Lcf|48FFCJmV`y!(pPnHO<`k0sWnCnny4F`=*GCv zF~6#MfJ^?8`*Jm3>0VDzhf+F{#@hQ-D->#_iZXl$O1jMe-2YDMF%yg{Vo^~6`}Q4u4|Hjn;p&sD zdg=Dp@i_nw={kJeoJez`UJ#dR)5}Uk)38g%8mZk+>YfbM`*YAISGeR(6#DbG6Kf(w z?4pQes86N8%nEpMjsAKK5-x&9>>~F^_?^0CQ}~R#s8Hf< z$JYEfEP?pZHzM7_FH8BEA;vofvYdpzKme*$;%b0o#6H}IrigQ;Vbu_6$ZeGq0iG}? zM7y@^pQ`z}1iHQem3!T6cUE1NcWSqI#-)2Ryy&F`?=&a~`UoSiwgnZeL}fo%<}=LM znq0%749CoHhOa#|LD-A<$?AjzjT72G)84Ly(SQGo>sVN`J~Ljf7arPW)hM^R1>b7- zCMG2z+7|Nh4o8U(dyAgUlNObuSIR3ZM5QZre|C4S&s*Razyg{tp_;8V&2|c)MVq)u zDHvQb$04ouotv_Q!|Uxq9&o{A`6H_VWjCZHXV z2^K@r*oaAxJ=zALNK|^+w9DXp^G@?+$J0$yPWY$LkP^JsDY&MZ0w&-JT2y9K5q(Im z%lZPykfVp54`AA%Sxb~bf=gVRbxeyVAj2kp{8M)Cp(G9=L>hM4Y75sAj@7o~B1$L6 z1LKl<<``Dwk9Yvzj`0t59iPZ$s!ryHp|i1&)kd`g7IU+})r!=kw2n-o2y$G<0>T66 z-V1Vnh3|dS^KxR=?WtgH$7v3>aIZH+j@}qFbj>bp-eurP#3QD$V9XRPtYFVrVeUEI zm{iU{l^K_LP3_#cXcP9fgGJTdK}am2mP!!Ya;gl^1T|Y*Pua~b=fYy#m-7CJ4fufh zA_e%Vg#gq~7NX5HNJ%;TOBmSyj{;>e%D$1#jm|CHKf7=_Ewr7B8L`bEbEws9X0>Nn zIvLHhdg$x92jplC%b%T9CSS(`5=X+b4zt<`A_+LDpa{{o6hsyb%#>%LieX@=-RCLd zF$8YgS_$^rEu&R&ai5?L*Y%4pZDIa3{2@6EjI8ALUpHa8FqA3~zZdALq>8=|rT(s} z?a*k-CCLJmmpyEfVICZwLON1uDrV4{+h!_#&*7Lq;@#O3sSoTL? zIyrs-wDngY>S0`SRD65`Vz=OM;H&fXMWq*W38&dUXDGaRC3o2*xz1O^wIBqfz6xeTnYzGd5lgxX^8TrCq=&dp-F&lLaK zQfRbIzK0pNy~x#a!yz7PXVxW(gv0$)V;48aLzpIU_M^q;#eXw_~ag zTR&wEbeNub`gn|sX_J&7SoejO`7BV#_E%k!@0{cKz5k@tWq9rpbF+oJeWz>}1%?JB z)oJ=Rdykbaj4S7-_Y&PX)lK(IN6<4SzJM<|oj5>NW)tNm0AUWvS z8Xd7x1Trc8^lNP6cJhK)_SQyAObt_ah#duykT_FkHYt&X@TtUn9s(v@&J$DYUcoyTlsq#`F=1>+BLMNz+x zBdt2o-cySUEa;Y&JiBX{;%;9R3oA)pV-++Fp%7Q6R@>_TCe`D5&bd+5K;u04k(?yV zn@)MyndWC&<&Gb_pDeC9PE7CPLcdjHS*-`;uFTL zw2{w)I!)9x(25B-OA<_Wh#`HaGXerIxbJ7M&RL6#9fj076-_%vzKQ>qCXs*BTEgB*1sI>I}wbwn*KGUvTW$zZaS3CC7_-Aks$45L2e(|)0GM- zCk{CZ>n`jY?CVSIEXLHog_=p;D@FqLMds#YH}6Q^R&Y!a+R>mrw5;tDNW z*EOq|UKu5h<86!dKpf_9&GFUYZ*e+j?>=30+|sJxP09Hg#T5Z~9@p$m3cb__ESrYz z{>qo@028ju%>In%1Y>kN|5-HXv+I@C?+Aqb#2GVtAje4Uh)8X008;!7WDuD Z*Y^Q{fDbs0&%{134T}N*00001Sz0B-Ew=yw diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog deleted file mode 100644 index 881840828b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/changelog +++ /dev/null @@ -1,5 +0,0 @@ -oc-vyos (2-31) UNRELEASED; urgency=low - - * Initial release. (Closes: #XXXXXX) - - -- root Wed, 13 May 2015 10:13:46 +0530 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control deleted file mode 100644 index 6ca9a9df3d..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/control +++ /dev/null @@ -1,8 +0,0 @@ -Package: oc-vyos -Source: oc-vyos-2-31 -Version: 2-31 -Architecture: all -Maintainer: Mahesh Kurund -Section: devel -Priority: optional -Description: oc vyos package diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst deleted file mode 100755 index 746e9467e1..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postinst +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -#sed -i '/pbr_init/d' /etc/rc.local -#sed -i '/exit 0/i sudo bash /usr/share/oc-pbr/pbr_init &' /etc/rc.local -sudo chown -R root:vyattacfg /config/auth/ -sudo chown -R root:vyattacfg /config/scripts/ -sudo update-rc.d oc-vyos defaults -sudo mkdir -p /var/log/oc -touch /var/log/oc/oc-vyos.log -echo "" > /var/log/oc/vyos_monitor -sudo chown vyos:users -R /var/log/oc /usr/share/vyos-oc /usr/share/oc-pbr -cp /usr/share/oc-pbr/dhclient-script /sbin/dhclient-script -sudo cp /usr/share/vyos-oc/oc_config_server/vyos-oc-log /etc/logrotate.d/vyos-oc-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm deleted file mode 100755 index 4b88c70985..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/DEBIAN/postrm +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -echo "" -#sed -i '/pbr_init/d' /etc/rc.local diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn deleted file mode 100644 index 2cb8fe4762..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/config/scripts/restart_vpn +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/vbash -sudo rm /var/run/pluto.pid -vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr deleted file mode 100755 index ed5776260b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/dhcp3/dhclient-exit-hooks.d/management_pbr +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -echo "dhclient: $reason" -case $reason in - BOUND|RENEW|REBIND|REBOOT) - if [ "eth0" == $interface ]; then - sudo bash /usr/share/oc-pbr/pbr_init & - echo "Management pbr is set" - fi - ;; -esac - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos deleted file mode 100755 index 850a85e5ed..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/init.d/oc-vyos +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh -# -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA -# -### BEGIN INIT INFO -# Provides: oc-vyos -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: OC vyos service -# Description: Provides the oc-vyos service -### END INIT INFO -set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos -DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services -ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos -fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services -. /lib/lsb/init-functions -export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp -if [ ! -x ${DAEMON} ] ; then -exit 0 -fi -case "$1" in -start) -test "$ENABLED" = "true" || exit 0 -start=1 -## check if pidfile is there -if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi -fi -if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting oc vyos" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? -else -echo "oc-vyos[$pid] is already running" -fi -;; -stop) -test "$ENABLED" = "true" || exit 0 -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping oc vyos" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" -fi -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -;; -restart|force-reload) -test "$ENABLED" = "true" || exit 1 -$0 stop -sleep 2 -$0 start -;; -reload) -test "$ENABLED" = "true" || exit 0 -## check if pidfile is there -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading oc vyos" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "oc vyos is not running or PID file not existing" -fi -;; -status) -test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? -;; -*) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" -exit 1 -;; -esac -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up deleted file mode 100755 index 56862e7f18..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interface-post-up +++ /dev/null @@ -1,2 +0,0 @@ -/sbin/route del default dev $IFACE -echo 1 > /proc/sys/net/ipv4/conf/$IFACE/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces deleted file mode 100644 index 72cf17c415..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/network/interfaces +++ /dev/null @@ -1,59 +0,0 @@ -# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or -# /usr/share/doc/ifupdown/examples for more information. - -# The loopback network interface -auto lo -iface lo inet loopback - -auto eth0 -iface eth0 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth1 -iface eth1 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth2 -iface eth2 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth3 -iface eth3 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth4 -iface eth4 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth5 -iface eth5 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth6 -iface eth6 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth7 -iface eth7 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth8 -iface eth8 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth9 -iface eth9 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth10 -iface eth10 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth11 -iface eth11 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth12 -iface eth12 inet dhcp -post-up /etc/network/interface-post-up - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version deleted file mode 100644 index 6ffbf58707..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/etc/sc-version +++ /dev/null @@ -1 +0,0 @@ -Version: 2-31 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README deleted file mode 100644 index 9a29ea0b1f..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/README +++ /dev/null @@ -1,14 +0,0 @@ -1) Add the following line in /etc/rc.local file as give in sample rc.local file - sudo bash /usr/share/oc-pbr/pbr_init & -2) Modify the interfaces file to looks like given sample interfaces file - -3) mkdir -p /usr/share/oc-pbr - -4) copy pbr_init and pbr to /usr/share/oc-pbr - - -vyos agent (server2.py) adds route to the controller node received from pushed -configuration, and also writes a route in the -/usr/share/oc-pbr/controller_route file. This is to make the added route -persistent even if the instance is rebooted. -controller_route is called from pbr_init file. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/controller_route b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/controller_route deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script deleted file mode 100755 index a1a2423149..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/dhclient-script +++ /dev/null @@ -1,327 +0,0 @@ -#!/bin/vbash - -# dhclient-script for Linux. Dan Halbert, March, 1997. -# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. -# Modified for Debian. Matt Zimmerman and Eloy Paris, December 2003 -# Modified to remove useless tests for antiquated kernel versions that -# this doesn't even work with anyway, and introduces a dependency on /usr -# being mounted, which causes cosmetic errors on hosts that NFS mount /usr -# Andrew Pollock, February 2005 -# Modified to work on point-to-point links. Andrew Pollock, June 2005 -# Modified to support passing the parameters called with to the hooks. Andrew Pollock, November 2005 - -# 'ip' just looks too weird. /sbin/ip looks less weird. -ip=/sbin/ip - - -# modified make_resolv_conf () for Vyatta system below -make_resolv_conf() { - local new_resolv_conf="/etc/resolv.conf.dhclient-new-$interface" - local old_resolv_conf="/etc/resolv.conf.dhclient-old-$interface" - mv -f $new_resolv_conf $old_resolv_conf - if [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then - if [ -n "$new_domain_name" ]; then - echo search $new_domain_name >>$new_resolv_conf - fi - if [ -n "$new_domain_name_servers" ]; then - for nameserver in $new_domain_name_servers; do - echo nameserver $nameserver >>$new_resolv_conf - done - fi - elif [ "x${new_dhcp6_name_servers}" != x ] ; then - if [ "x${new_dhcp6_domain_search}" != x ] ; then - echo search ${new_dhcp6_domain_search} >> $new_resolv_conf - fi - for nameserver in ${new_dhcp6_name_servers} ; do - echo nameserver ${nameserver} >> $new_resolv_conf - done - else - echo " " > $new_resolv_conf - fi - - /opt/vyatta/sbin/vyatta_update_resolv.pl --dhclient-script 1 - if ! diff -q $old_resolv_conf $new_resolv_conf >&/dev/null; then - if [ -d /opt/vyatta/config/active/service/dns/forwarding ]; then - /opt/vyatta/sbin/vyatta-dns-forwarding.pl --update-dnsforwarding --outside-cli >&/dev/null - fi - fi - rm -f $old_resolv_conf -} - -run_hook() { - local script="$1" - local exit_status - shift # discard the first argument, then the rest are the script's - - if [ -f $script ]; then - . $script "$@" - fi - - - if [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; then - logger -p daemon.err "$script returned non-zero exit status $exit_status" - save_exit_status=$exit_status - fi - - return $exit_status -} - -run_hookdir() { - local dir="$1" - local exit_status - shift # See run_hook - - if [ -d "$dir" ]; then - for script in $(run-parts --list $dir); do - run_hook $script "$@" || true - exit_status=$? - done - fi - - return $exit_status -} - -# Must be used on exit. Invokes the local dhcp client exit hooks, if any. -exit_with_hooks() { - exit_status=$1 - - # Source the documented exit-hook script, if it exists - if ! run_hook /etc/dhcp3/dhclient-exit-hooks "$@"; then - exit_status=$? - fi - - # Now run scripts in the Debian-specific directory. - if ! run_hookdir /etc/dhcp3/dhclient-exit-hooks.d "$@"; then - exit_status=$? - fi - - exit $exit_status -} - -get_prefix() { - # use existing perl module to compute prefix - # one line don't bother with script - perl -MNetAddr::IP \ - -e '$ip = new NetAddr::IP(@ARGV); print $ip->masklen(), "\n"' $* -} - -set_hostname() { - local current_hostname=$(hostname) - if [ -z "$current_hostname" -o "$current_hostname" = "(none)" ]; then - hostname "$new_host_name" - fi -} - -set_address() { - if [ -n "$old_ip_address" ] && - [ "$old_ip_address" != "$new_ip_address" -o "$old_prefix" != "$new_prefix" ] ; then - # Clear out route cache and ARP tables and all addresses and routes - ip -family inet addr flush dev $interface - fi - - if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ] || - [ -z "$old_ip_address" -o "$old_ip_address" != "$new_ip_address" ] || - [ -z "$old_prefix" -o "$old_prefix" != "$new_prefix" ] ; then - ip -family inet addr add $new_ip_address/$new_prefix \ - broadcast $new_broadcast_address dev $interface - fi - - if [ -n "$new_interface_mtu" ] && - [ ! "$old_interface_mtu" = "$new_interface_mtu" ]; then - ip link set $interface mtu $new_interface_mtu - fi -} - -# Administrative for DHCP routes. Should be configurable -ZEBRA_ROUTE_DHCP=210 - -update_routers() { - if [ -n "$old_routers" ]; then - # No change just renewing - if [ "$reason" = "RENEW" -a "$old_routers" = "$new_routers" ]; then - return 0 - fi - - for router in $old_routers; do - if [ "$old_subnet_mask" == "255.255.255.255" ]; then - vtysh -c "conf t" -c "no ip route $router $interface $ZEBRA_ROUTE_DHCP" - fi - if [ "eth0" == "$interface" ]; then - vtysh -c "conf t" -c "no ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" - fi - done - fi - - for router in $new_routers; do - # point to point - if [ "$new_subnet_mask" == "255.255.255.255" ]; then - vtysh -c "conf t" -c "ip route $router $interface $ZEBRA_ROUTE_DHCP" - fi - if [ "eth0" == "$interface" ]; then - vtysh -c "conf t" -c "ip route 0.0.0.0/0 $router 2" - fi - done - # Making vrrp interface down and up adds back our static route - intf=`ip ad | grep $interface'v' | awk '{print $2}' | grep '@' |cut -f1 -d'@'` - if [ 'x'$intf != x ]; then - sudo ifconfig $intf down - sudo ifconfig $intf up - fi -} - -if [ -n "$new_subnet_mask" ]; then - new_prefix=$(get_prefix $new_ip_address $new_subnet_mask) -fi -if [ -n "$old_subnet_mask" ]; then - old_prefix=$(get_prefix $old_ip_address $old_subnet_mask) -fi -if [ -n "$new_interface_mtu" ]; then - # Vyatta configuration overrides response from server to allow user - # to work around broken ISP's - mtu_path=$(/opt/vyatta/sbin/vyatta-interfaces.pl --dev=$interface --path) - if [ -r $mtu_path ]; then - read new_interface_mtu < $mtu_path - fi - - # The 576 MTU is only used for X.25 and dialup connections - # where the admin wants low latency. Such a low MTU can cause - # problems with UDP traffic, among other things. As such, - # disallow MTUs from 576 and below by default, so that broken - # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc). - if [ $new_interface_mtu -le 576 ]; then - new_interface_mtu= - fi -fi - -# The action starts here - -# Invoke the local dhcp client enter hooks, if they exist. -run_hook /etc/dhcp3/dhclient-enter-hooks -run_hookdir /etc/dhcp3/dhclient-enter-hooks.d - -# Execute the operation -case "$reason" in - MEDIUM) - # Do nothing - ;; - - PREINIT) - ip -family inet addr flush dev $interface - ip link set $interface up - - if [ -n "$DHCLIENT_DELAY" ] && [ $DHCLIENT_DELAY -gt 0 ]; then - sleep $DHCLIENT_DELAY - fi - ;; - - ARPCHECK|ARPSEND) - if [ -z "$new_ip_address" ] || [ -z "$interface" ] || - arping -q -f -c 2 -w 3 -D -I $interface $new_ip_address; then - exit_with_hooks 0 - else - exit_with_hooks 1 - fi - ;; - - BOUND|RENEW|REBIND|REBOOT) - set_hostname - - make_resolv_conf - set_address - update_routers - - exit_with_hooks 0 - ;; - - EXPIRE|FAIL|RELEASE|STOP) - new_routers=""; update_routers - - if [ -n "$old_ip_address" ]; then - ip -family inet addr flush dev ${interface} - fi - if [ "$reason" = "STOP" ]; then - ip link set ${interface} down - fi - - make_resolv_conf - ;; - - TIMEOUT) - if [ -n "$new_routers" ]; then - ip -family inet addr add $new_ip_address/$new_prefix \ - broadcast $new_broadcast_address dev $interface - - set -- $new_routers - first_router="$1" - - if ping -q -c 1 -I $interface $first_router ; then - make_resolv_conf - set_address - update_routers - - exit_with_hooks 0 - fi - ip -family inet addr flush dev $interface - # Note: this exits with interface still up - # see Debian bug #144666 - fi - exit_with_hooks 2 "$@" - ;; - - PREINIT6) - # Ensure interface is up. - ${ip} link set ${interface} up - - exit_with_hooks 0 - ;; - - BOUND6) - if [ x${new_ip6_address} != x ] && [ x${new_ip6_prefixlen} != x ] ; then - ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ - dev ${interface} scope global - fi - - # Check for nameserver options. - make_resolv_conf - - exit_with_hooks 0 - ;; - - RENEW6|REBIND6) - # Make sure nothing has moved around on us. - - # Nameservers/domains/etc. - if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || - [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then - make_resolv_conf - fi - - exit_with_hooks 0 - ;; - - DEPREF6) - if [ x${new_ip6_prefixlen} = x ] ; then - exit_with_hooks 2; - fi - - ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ - dev ${interface} scope global preferred_lft 0 - - exit_with_hooks 0 - ;; - - EXPIRE6|RELEASE6|STOP6) - if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then - exit_with_hooks 2; - fi - - ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ - dev ${interface} - - make_resolv_conf - exit_with_hooks 0 - ;; - -esac - -exit_with_hooks 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up deleted file mode 100755 index 56862e7f18..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interface-post-up +++ /dev/null @@ -1,2 +0,0 @@ -/sbin/route del default dev $IFACE -echo 1 > /proc/sys/net/ipv4/conf/$IFACE/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces deleted file mode 100644 index 72cf17c415..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/interfaces +++ /dev/null @@ -1,59 +0,0 @@ -# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or -# /usr/share/doc/ifupdown/examples for more information. - -# The loopback network interface -auto lo -iface lo inet loopback - -auto eth0 -iface eth0 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth1 -iface eth1 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth2 -iface eth2 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth3 -iface eth3 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth4 -iface eth4 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth5 -iface eth5 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth6 -iface eth6 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth7 -iface eth7 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth8 -iface eth8 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth9 -iface eth9 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth10 -iface eth10 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth11 -iface eth11 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth12 -iface eth12 inet dhcp -post-up /etc/network/interface-post-up - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr deleted file mode 100755 index ed5776260b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/management_pbr +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -echo "dhclient: $reason" -case $reason in - BOUND|RENEW|REBIND|REBOOT) - if [ "eth0" == $interface ]; then - sudo bash /usr/share/oc-pbr/pbr_init & - echo "Management pbr is set" - fi - ;; -esac - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route deleted file mode 100755 index 885672d274..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/no-default-route +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -case $reason in - BOUND|RENEW|REBIND|REBOOT) - if [ "eth0" == $interface ]; then - echo $new_routers > /usr/share/oc-pbr/eth0_route - #unset new_routers - else - unset new_routers - fi - echo "Default gateway has been cleared" - ;; -esac diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr deleted file mode 100755 index 90e91c1464..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/vbash -sudo ip route add default via $@ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init deleted file mode 100755 index e3fe31c7ce..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/pbr_init +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -#Converts decimal to ip address -function dec2ip () { - local ip dec=$1 - for e in {3..0} - do - ((octet = dec / (256 ** e) )) - ((dec -= octet * 256 ** e)) - ip+=$delim$octet - delim=. - done - echo $ip -} - -#Converts ip notation to decimal -function ip2dec () { - local a b c d ip=$1 - IFS=. read -r a b c d <<< "$ip" - echo $((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d)) -} - - -#sleep 20 -flag=0 -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -all_interfaces=`/sbin/ifconfig | grep "Link encap" | grep -v "127.0.0.1" |cut -d: -d " " -f 1` -index=0 -for i in $all_interfaces; do - if [ "$i" == "eth0" ] || [ "$i" == "eth1" ] - then - while true - do - ip_addr=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $4 }'` - if [ $ip_addr ] - then - #echo "GOT IP for interface $i" - #flag=1 - break - fi - done - bcast_ip=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $6 }'`; - mask=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $8 }'`; - dec_bcast_ip=$(ip2dec $bcast_ip) - dec_mask=$(ip2dec $mask) - dec_net_ip=$(($dec_bcast_ip & $dec_mask)) - net_ip=$(dec2ip $dec_net_ip) - interfaces[$index]=$i - ip_addresses[$index]=$ip_addr - network_id[$index]=$net_ip - filename="/var/lib/dhcp3/dhclient_"$i"_lease" - #route=`grep "option routers" $filename |tail -1| cut -d: -d " " -f5` - route=`grep "new_routers" $filename |tail -1| cut -d: -d "=" -f2| tr -d "'"` - default_route[$index]=$route - #echo "$index ${default_route[$index]}" - if [ "$i" == "eth0" ] && [ $flag == 0 ] - then - table_name=$i"_table" - table_id=`expr $index + 5` - is_present=`grep "$table_name" /etc/iproute2/rt_tables` - if [ "$is_present" == "" ] - then - echo $table_id $table_name >> /etc/iproute2/rt_tables - fi - `ip route add default via ${default_route[$index]} table $table_name` - `ip rule del from ${ip_addresses[$index]} table $table_name` - `ip rule add from ${ip_addresses[$index]} table $table_name` - echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route - #echo "configured pbr for interface $i" - fi - #index=`expr $index + 1` - ((index++)) - fi -done - -index=0 -for interface in ${interfaces[*]}; do - #echo "$index ${default_route[$index]}" - if [ "$interface" == "eth1" ] && [ $flag == 0 ] - then - #echo "Set default route on $interface ${default_route[$index]} $index" - cmd="bash /usr/share/oc-pbr/pbr ${default_route[$index]}" - #sudo su - vyos -c "$cmd" - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]} - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper end - #source /opt/vyatta/etc/functions/script-template - #eval "set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]}" - #eval "commit" - #eval "exit" - fi - #index=`expr $index + 1` - ((index++)) -done - -#bash /usr/share/oc-pbr/controller_route -echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local deleted file mode 100755 index 2a68541436..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/oc-pbr/rc.local +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -e -# -# rc.local -# -# This script is executed at the end of each multiuser runlevel. -# value on error. -# -# In order to enable or disable this script just change the execution -# bits. -# -# By default this script does nothing. - -# Do not remove the following call to vyatta-postconfig-bootup.script. -# Any boot time workarounds should be put in script below so that they -# get preserved for the new image during image upgrade. -POSTCONFIG=/opt/vyatta/etc/config/scripts/vyatta-postconfig-bootup.script -[ -x $POSTCONFIG ] && $POSTCONFIG -sudo bash /usr/share/oc-pbr/pbr_init & -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README deleted file mode 100644 index 81526a2dc4..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/LICENSE README +++ /dev/null @@ -1,2 +0,0 @@ -configsession.py and utils.py are opens source files and originally taken from -"https://github.com/abessifi/pyatta". \ No newline at end of file diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl deleted file mode 100755 index 3cf31fa4cb..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam.pl +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/perl - -use Data::Dumper; -local $Data::Dumper::Terse =1; -use JSON; -use LWP::UserAgent; - -#Constants -my $httpclient = LWP::UserAgent->new; - - -my $get_admin_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "name"=> "Default" - }, - "name"=> "", - "password"=> "" - } - } - }, - "scope" => - {"domain" => { - "name" => "Default" - } - } - } -}; - -my $get_user_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "id"=> "" - }, - "name"=> "", - "password"=> "" - } - } - }, - "scope" => { - "project" => { - "domain" => { - "id" => "" - }, - "name" => "" - } - } - } -}; - -#Global variables -my $admin_token_id; -my $user_token_id; -my $domain_id; -my $user_role; -my $cloud_admin_projname; -my $cloud_admin_username; -my $cloud_admin_password; -my $KEYSTONE_AUTH_URL; -my $REMOTE_VPN_ROLE_NAME; -my $SERVICE_PROJECT_ID; -my $username; -my $password; -my $user_id; -my $user_role_id; -my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; -my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - - - -sub read_auth_server_conf { - # Get auth server conf from file - my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; - - if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { - print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; - exit 1; - } - $KEYSTONE_AUTH_URL = ; - $cloud_admin_projname = ; - $cloud_admin_username = ; - $cloud_admin_password = ; - $REMOTE_VPN_ROLE_NAME = ; - $SERVICE_PROJECT_ID = ; - - chomp $KEYSTONE_AUTH_URL; - chomp $cloud_admin_projname; - chomp $cloud_admin_username; - chomp $cloud_admin_password; - chomp $REMOTE_VPN_ROLE_NAME; - chomp $SERVICE_PROJECT_ID; - - #$DB::single = 1; - - close(AUTHFILE); -} - - -sub read_username_passwd { - # Get username/password from file - - if ($ARG = shift @ARGV) { - if (!open (UPFILE, "<$ARG")) { - print "Could not open username/password file: $ARG\n"; - exit 1; - } - } else { - print "No username/password file specified on command line\n"; - exit 1; - } - - $username = ; - $password = ; - - if (!$username || !$password) { - print "Username/password not found in file: $ARG\n"; - exit 1; - } - - chomp $username; - chomp $password; - - close (UPFILE); -} - - - - - -sub get_cloud_admin_token { - #$DB::single = 1; - - my $http_req = HTTP::Request->new(POST => $url_get_admin_token); - $http_req->header('content-type' => 'application/json'); - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; - #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; - $json_string = to_json($get_admin_token_data); - $http_req->content($json_string); - #$http_req->content($get_admin_token_data); - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $admin_token_id = $http_resp->headers->{'x-subject-token'}; - print "Admin token id: ", $admin_token_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting cloud admin token failed \n"; - } -} - -sub get_domain_id { - my $http_req = HTTP::Request->new(GET => $url_get_domain); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $domain_id = $decoded_resp->{'project'}->{'domain_id'}; - $project_name = $decoded_resp->{'project'}->{'name'}; - print "Domain id: ", $domain_id, "\n"; - print "Project name: ", $project_name, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting domain id failed \n"; - } -} - -sub get_role_id { - my $http_req = HTTP::Request->new(GET => $url_get_role_id); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; - print "Role id: ", $user_role_id, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting role id failed \n"; - } -} - - - - -sub user_authenticate { - my $http_req = HTTP::Request->new(POST => $url_user_authenticate); - $http_req->header('content-type' => 'application/json'); - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; - $get_user_token_data->{"auth"}{"scope"}{"project"}{"domain"}{"id"} = $domain_id; - $get_user_token_data->{"auth"}{"scope"}{"project"}{"name"} = $project_name; - $json_string = to_json($get_user_token_data); - $http_req->content($json_string); - my $http_resp = $httpclient->request($http_req); - - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - #$DB::single = 1; - my $decoded_resp = decode_json($message); - $user_token_id = $http_resp->headers->{'x-subject-token'}; - $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; - print "User token id: ", $user_token_id, "\n"; - print "User id: ", $user_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting user token failed \n"; - } -} - -sub get_user_roles { - $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - #$DB::single = 1; - my $user_roles = $decoded_resp->{'role_assignments'}; - my $len = @{$user_roles}; - if ($len) { - $user_role = $REMOTE_VPN_ROLE_NAME; - } else { - $user_role = ""; - } - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting user roles failed \n"; - } -} - - -read_auth_server_conf(); -read_username_passwd(); - -$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; -$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - -get_cloud_admin_token(); -get_domain_id(); -get_role_id(); -user_authenticate(); -get_user_roles(); - -if ($user_role eq $REMOTE_VPN_ROLE_NAME) { - exit 0; -} -exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl deleted file mode 100755 index d5d32c58f7..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_pam_domain_verify.pl +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/perl - -use Data::Dumper; -local $Data::Dumper::Terse =1; -use JSON; -use LWP::UserAgent; - -#Constants -my $httpclient = LWP::UserAgent->new; - - -my $get_admin_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "name"=> "Default" - }, - "name"=> "", - "password"=> "" - } - } - }, - "scope" => - {"domain" => { - "name" => "Default" - } - } - } -}; - -my $get_user_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "id"=> "" - }, - "name"=> "", - "password"=> "" - } - } - } - } -}; - -#Global variables -my $admin_token_id; -my $user_token_id; -my $domain_id; -my $user_role; -my $cloud_admin_projname; -my $cloud_admin_username; -my $cloud_admin_password; -my $KEYSTONE_AUTH_URL; -my $REMOTE_VPN_ROLE_NAME; -my $PROJECT_ID; -my $username; -my $password; -my $user_id; -my $user_role_id; -my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; -my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - - - -sub read_auth_server_conf { - # Get auth server conf from file - my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; - - if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { - print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; - exit 1; - } - $KEYSTONE_AUTH_URL = ; - $cloud_admin_projname = ; - $cloud_admin_username = ; - $cloud_admin_password = ; - $REMOTE_VPN_ROLE_NAME = ; - $PROJECT_ID = ; - - chomp $KEYSTONE_AUTH_URL; - chomp $cloud_admin_projname; - chomp $cloud_admin_username; - chomp $cloud_admin_password; - chomp $REMOTE_VPN_ROLE_NAME; - chomp $PROJECT_ID; - - #$DB::single = 1; - - close(AUTHFILE); -} - - -sub read_username_passwd { - # Get username/password from file - - if ($ARG = shift @ARGV) { - if (!open (UPFILE, "<$ARG")) { - print "Could not open username/password file: $ARG\n"; - exit 1; - } - } else { - print "No username/password file specified on command line\n"; - exit 1; - } - - $username = ; - $password = ; - - if (!$username || !$password) { - print "Username/password not found in file: $ARG\n"; - exit 1; - } - - chomp $username; - chomp $password; - - close (UPFILE); -} - - - - - -sub get_cloud_admin_token { - #$DB::single = 1; - - my $http_req = HTTP::Request->new(POST => $url_get_admin_token); - $http_req->header('content-type' => 'application/json'); - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; - #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; - $json_string = to_json($get_admin_token_data); - $http_req->content($json_string); - #$http_req->content($get_admin_token_data); - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $admin_token_id = $http_resp->headers->{'x-subject-token'}; - print "Admin token id: ", $admin_token_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting cloud admin token failed \n"; - } -} - -sub get_domain_id { - my $http_req = HTTP::Request->new(GET => $url_get_domain); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $domain_id = $decoded_resp->{'project'}->{'domain_id'}; - print "Domain id: ", $domain_id, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting domain id failed \n"; - } -} - -sub get_role_id { - my $http_req = HTTP::Request->new(GET => $url_get_role_id); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; - print "Role id: ", $user_role_id, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting role id failed \n"; - } -} - - - - -sub user_authenticate { - my $http_req = HTTP::Request->new(POST => $url_user_authenticate); - $http_req->header('content-type' => 'application/json'); - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; - $json_string = to_json($get_user_token_data); - $http_req->content($json_string); - my $http_resp = $httpclient->request($http_req); - - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - #$DB::single = 1; - my $decoded_resp = decode_json($message); - $user_token_id = $http_resp->headers->{'x-subject-token'}; - $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; - print "User token id: ", $user_token_id, "\n"; - print "User id: ", $user_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting user token failed \n"; - } -} - -sub get_user_roles { - $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - #$DB::single = 1; - my $user_roles = $decoded_resp->{'role_assignments'}; - my $len = @{$user_roles}; - if ($len) { - $user_role = $REMOTE_VPN_ROLE_NAME; - } else { - $user_role = ""; - } - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting user roles failed \n"; - } -} - - -read_auth_server_conf(); -read_username_passwd(); - -$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; -$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - -get_cloud_admin_token(); -get_domain_id(); -get_role_id(); -user_authenticate(); -get_user_roles(); - -if ($user_role eq $REMOTE_VPN_ROLE_NAME) { - exit 0; -} -exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf deleted file mode 100755 index ef768a8728..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/auth_server.conf +++ /dev/null @@ -1,6 +0,0 @@ -http://10.30.120.97:5000/ -services -neutron -noir0123 -vpn -45fe9bb731054eb4acdae8e15d48a562 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/__init__.py deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py deleted file mode 100755 index f7b2b39b0a..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/executor.py +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env python -import sys -import subprocess -import os - -#sys.path.append('/home/vyos/vyos-api/project/') -from vyos_session.configsession import ConfigSession, SessionNotExists, \ - SetupSessionFailed -from vyos_session import utils -import logging -import shlex - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - -try: - session = ConfigSession() -except Exception as err: - logger.error('A session exist already !') - -VYOS_SBIN_DIR = utils.get_config_params('bin','vyos_sbin_dir') -VYOS_SHELL_API = utils.get_config_params('bin', 'shell_api_path') - -class OperationFailed(Exception): pass -class OperationNameError(Exception): pass -class ConfigPathNotCorrect(Exception): pass - -def check_operation_name(args): - """ Check if operation/command name is correct. """ - if len(args) == 0: - logger.error('Operation name required') - raise OperationNameError('Operation name required.') - elif args[0] not in ['show','set','delete', 'edit']: - logger.error('Operation name "%s" not correct' % args[0]) - raise OperationNameError('Operation name not correct.') - return True - -def _runner(command): - """ - Run shell commands via subprocess.Popen() - """ - # NOTE: - # if Popen(self.args, shell=True, ...) => Execution fails - # if Popen(self.args, ...) => OSError: [Errno 2] No such file or directory - # if self.args = ['/bin/cli-shell-api','showCfg', ...] and Popen(self.args, ...) that works but actually we keep using ' '.join(self.args). - proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # wait for the process to terminate and get stdout/stderr outputs - out, err = proc.communicate() - return out, err, proc.returncode - -def _op_command(command=None): - command = './op_commands.sh' - command += " " + "\"run show vpn ipsec sa\"" - - proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out,err = proc.communicate() - return out - -class execUtils: - """ Executes possible operations in a Vyos configure session.""" - def __init__(self, args): - self.args = args - - def execmd(self, nonsession=False): - """ - Performs execution of allowed config operations ['show','set','delete'] - """ - if check_operation_name(self.args): - # prepare executable file to be called - operation_name = self.args[0] - logger.info('Perform operation "%s"' % operation_name) - - if not nonsession: - if self.args[0] == 'show': self.args[0] = '{0} showCfg'.format( - VYOS_SHELL_API) - else: self.args[0] = os.path.join(VYOS_SBIN_DIR, - 'my_{0}'.format(self.args[0])) - logger.debug('exec command: "%s"' % ' '.join(self.args)) - - if not nonsession and not session.session_exists(): - raise SessionNotExists('Configure session do not exists') - - if not nonsession: - result = _runner(' '.join(self.args)) # result = (stdout, stderr, errcode) - else: - result = _op_command() - return (True, result) - - logger.debug('command return code: %s' % result[2]) - - if result[2]: - logger.info('command output: %s' % ' '.join(result[0].splitlines())) - logger.error('Failed executing operation "%s"' % operation_name) - raise OperationFailed('Operation failed !') - logger.debug('%s' % ' '.join(result[0].splitlines())) - logger.info('Executing "%s" operation OK' % operation_name) - return (True, result[0]) - - def check_cmd_args(self): - """ - Check that config path is correct before performing execmd() - """ - logger.info('Check specified configuration path existance') - config_path = ' '.join(self.args[1:]) - logger.info('config path: "%s"' % config_path) - cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) - logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # result = (stdout, stderr, errcode) - logger.debug('command return code: %s' % result[2]) - if result[2]: - logger.error('Configuration path is not correct') - raise ConfigPathNotCorrect('Configuration path is not correct') - logger.info('Configuration path is correct') - return True - - def check_cmd_args(self): - """ - Check that config path is correct before performing execmd() - """ - logger.info('Check specified configuration path existance') - config_path = ' '.join(self.args[1:]) - logger.info('config path: "%s"' % config_path) - cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) - logger.debug('exec command: "%s"' % cmd) - proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - errcode = proc.returncode - logger.debug('command return code: %s' % errcode) - if errcode: - logger.error('Configuration path is not correct') - raise ConfigPathNotCorrect('Configuration path is not correct') - logger.info('Configuration path is correct') - return True - - def get_possible_options(self): - """ - Returns list of nodes under specified configuration path - """ - out = [] - try: - self.check_cmd_args() # check config path validation - except ConfigPathNotCorrect: - return False, out # config path is not correct - - config_path = ' '.join(self.args[1:]) - logger.info('Get possible options of config path "%s"' % config_path) - cmd = '{0} listNodes {1}'.format(VYOS_SHELL_API, config_path) - logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # rst = (stdout, stderr, errcode) - logger.debug('command return code: %s' % result[2]) - if not result[0]: - logger.info('No more options for the specified config path') - return True, result[0] - options = shlex.split(result[0]) - logger.debug('List of options : "%s"' % options) - return True, options diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py deleted file mode 100755 index 55c41a0518..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/execformat/formator.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python -import sys -import os -topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." -topdir = os.path.realpath(topdir) -sys.path.insert(0, topdir) -from executor import OperationFailed, execUtils as executor -from vyos_session.utils import logger -from vyosparser import vyos_parser as vparser - -class ServiceError(Exception): pass - -class showConfig(): - def formator(self,options): - args=['show'] - service = options[0] - logger.debug("=====>>>>>> args before executor call = %s"%args) - if service in ['protocols','nat','interfaces','firewall']: - args.extend(options) - elif service in ['dns','dhcp-server','ssh','webproxy']: - options.insert(0,'service') - args.extend(options) - else: - raise ServiceError('unknown such service!') - exe=executor(list(args)) - try: - #if not exe.checkcmd(' '.join(args)): - # logger.error("%s: given args does not match with existing configs!"%args) - # return False - execstate,output=exe.execmd() - logger.debug("=====>>>>>> args after executor call = %s"%args) - except OperationFailed, e: - logger.error(e.message) - return False - if execstate==True: - return vparser.decode_string(output) - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos deleted file mode 100755 index 850a85e5ed..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/oc-vyos +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh -# -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA -# -### BEGIN INIT INFO -# Provides: oc-vyos -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: OC vyos service -# Description: Provides the oc-vyos service -### END INIT INFO -set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos -DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services -ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos -fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services -. /lib/lsb/init-functions -export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp -if [ ! -x ${DAEMON} ] ; then -exit 0 -fi -case "$1" in -start) -test "$ENABLED" = "true" || exit 0 -start=1 -## check if pidfile is there -if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi -fi -if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting oc vyos" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? -else -echo "oc-vyos[$pid] is already running" -fi -;; -stop) -test "$ENABLED" = "true" || exit 0 -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping oc vyos" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" -fi -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -;; -restart|force-reload) -test "$ENABLED" = "true" || exit 1 -$0 stop -sleep 2 -$0 start -;; -reload) -test "$ENABLED" = "true" || exit 0 -## check if pidfile is there -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading oc vyos" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "oc vyos is not running or PID file not existing" -fi -;; -status) -test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? -;; -*) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" -exit 1 -;; -esac -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn deleted file mode 100755 index 2cb8fe4762..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/init_script/restart_vpn +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/vbash -sudo rm /var/run/pluto.pid -vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf deleted file mode 100644 index 1ae8510480..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc-vyos.conf +++ /dev/null @@ -1,8 +0,0 @@ -[bin] -vyos_sbin_dir = /opt/vyatta/sbin -shell_api_path = /bin/cli-shell-api - -[log] -logdir=/var/log/oc -logfile=oc-vyos.log -level=ERROR diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py deleted file mode 100644 index 3ed9fd0f30..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py deleted file mode 100644 index db45c0e8ea..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/edit_persistent_rule.py +++ /dev/null @@ -1,88 +0,0 @@ -from subprocess import call -import netifaces -import logging -from vyos_dhc import initiate_dhclient -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - -INTERFACE_RULE_FILE = "/etc/udev/rules.d/70-persistent-cd.rules" -ADD_RULE = 'SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="%s", NAME="%s"' - - -class EditPersistentRule(object): - def __init__(self): - pass - - def add(self, mac_info): - provider_rule, stitching_rule, interface_list = self.get_rule(mac_info) - self.clean_stale_rules(interface_list) - # line = ADD_RULE % (mac, interface) - # initiate_dhclient() - self.delete(mac_info) - try: - call("sudo chown vyos: " - "/etc/udev/rules.d/70-persistent-cd.rules".split() - ) - with open(INTERFACE_RULE_FILE, "a") as myfile: - myfile.write(provider_rule + "\n") - myfile.write(stitching_rule + "\n") - except Exception as err: - logger.error("Failed to add persistent rule for macs -%r " % - mac_info) - raise Exception(err) - finally: - call("sudo chown root:root " - "/etc/udev/rules.d/70-persistent-cd.rules".split() - ) - - def delete(self, mac_info): - pro_cmd = 'sudo sed -i /%s/d %s' % (mac_info['provider_mac'], - INTERFACE_RULE_FILE) - stitch_cmd = 'sudo sed -i /%s/d %s' % (mac_info['stitching_mac'], - INTERFACE_RULE_FILE) - try: - call(pro_cmd.split()) - call(stitch_cmd.split()) - except Exception as err: - logger.error("Failed to delete persistent rule for macs -%r " % - mac_info) - raise Exception(err) - - def get_rule(self, mac_info): - interfaces = netifaces.interfaces() - provider_rule = '' - stitching_rule = '' - interface_list = list() - for interface in interfaces: - physical_interface = netifaces.ifaddresses(interface).get( - netifaces.AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses(interface)[netifaces.AF_LINK][0][ - 'addr'] - - if mac_addr == mac_info['provider_mac']: - interface_list.append(interface) - provider_rule = ADD_RULE % (mac_addr, interface) - elif mac_addr == mac_info['stitching_mac']: - interface_list.append(interface) - stitching_rule = ADD_RULE % (mac_addr, interface) - - return provider_rule, stitching_rule, interface_list - - def clean_stale_rules(self, interface_list): - try: - for interface in interface_list: - cmd = 'sudo sed -i /%s/d %s' % ( - interface, INTERFACE_RULE_FILE) - call(cmd.split()) - except Exception, err: - logger.error("ERROR deleting stale persistent rule. Interfaces: " - "%r . Details: %r" % (interface_list, str(err))) - - - - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py deleted file mode 100644 index 5e417c91e8..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_constants.py +++ /dev/null @@ -1,17 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -actions = ["drop", "reject", "accept", "inspect"] -state = ["established", "invalid", "related"] -availability = ["enable", "disable"] -intercloud = False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py deleted file mode 100755 index 9ffe9581ab..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/fw_handler.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -from operations import configOpts - -FWN = "firewall name" -ZPZ = "zone-policy zone" -class fwHandler(configOpts): - actions=["drop","reject","accept","inspect"] - state=["established","invalid","related"] - availability=["enable","disable"] - - def firewall_config(self,name,suffix): - firewall=[FWN,name,"rule"] - firewall.extend(suffix) - self.set(firewall) - - def zone_config(self,suffix): - zone=[ZPZ] - zone.extend(suffix) - self.set(zone) - - def set_zone_desc(self,zone_name,desc): - description = [zone_name,"description",desc] - self.zone_config(description) - - def set_zone_interface(self,zone_name,iface): - interface = [zone_name,"interface",iface] - self.zone_config(interface) - - def setup_fw_on_zone(self,zone_src,zone_dst,firewall): - fw_on_zone=[zone_src,"from",zone_dst,"name",firewall] - self.zone_config(fw_on_zone) - - def set_default_action(self,name,rule_num,action): - if action in self.actions: - self.set_action[rule_num,"action",action] - self.firewall_config(name,set_action) - - def set_rule_state(self,name,rule_num,state,allow): - if state in self.states and allow in self.availability: - self.set_state[rule_num,"state",state,allow] - self.firewall_config(name,set_state) - - def set_protocol(self,name,rule_num,prot): - protocol=[rule_num,"protocol",prot] - self.firewall_config(name,protocol) - - def set_dest_port(self,name,rule_num,portlist,orient="destination"): - port=[rule_num,orient,"port",portlist] - self.firewall_config(name,port) - - - def set_dest_addr(self,name,rule_num,addr_subnet,orient="destination"): - addr=[rule_num,orient,"address",addr_subnet] - self.firewall_config(name,addr) - - def set_src_port(self,name,rule_num,portlist): - self.set_dest_port(name,rule_num,portlist,"source") - - def set_src_addr(self,name,rule_num,addr_subnet): - self.set_dest_addr(name,rule_num,addr_subnet,"source") - - def rule_state(self,name,rule_num,status): - if status in availability: - rule_status=[rule_num,status] - self.firewall_config(name,rule_status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py deleted file mode 100644 index bd1017c22c..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/ha_config.py +++ /dev/null @@ -1,367 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -#!/usr/bin/env python -import json -import netifaces -import time -import logging -from netifaces import AF_INET, AF_LINK - -from execformat.executor import session - -from operations import configOpts -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class VYOSHAConfig(configOpts): - """ - Class to configure HA for VYOS. - """ - def __init__(self): - super(VYOSHAConfig, self).__init__() - pass - - def configure_conntrack_sync(self, ha_config): - """ - :param ha_config: - :return: - """ - ha_config = json.loads(ha_config) - monitoring_info, data_info = self.get_conntrack_request_data( - ha_config) - event_queue_size = monitoring_info["event_queue_size"] - cluster_name = monitoring_info["cluster_name"] - mcast_group = monitoring_info["mcast_group"] - sync_queue_size = monitoring_info["sync_queue_size"] - monitoring_mac = monitoring_info["monitoring_mac"] - - monitoring_interface, monitoring_ip = self._get_interface_name( - dict(monitoring_mac=monitoring_mac), - interface_type='monitoring') - - if not monitoring_interface: - # return {'status': 500, - # 'message': 'Failed to get monitoring interface name'} - logger.error("Failed to configure conntrack for CLUSTER- %r" % - cluster_name) - raise Exception("Conntrack sync configuration failed. Reason - " - "No monitoring interface information found.", - 400, dict(ha_config=ha_config)) - - conntrack_commands = self._set_conntrack( - cluster_name, event_queue_size, mcast_group, - monitoring_interface, sync_queue_size) - interface_vrrp_commands = self.set_vrrp_for_interface(data_info) - - all_commands = conntrack_commands + interface_vrrp_commands - - self._execute_commands(all_commands, ha_config['tenant_id']) - logger.debug("VRRP configured succesfully - %r " % all_commands) - return {'status': 200, 'message': 'VRRP configured succesfully'} - - def set_interface_ha(self, interface_config): - ha_config = json.loads(interface_config) - try: - cluster_name = ha_config["cluster_name"] - vrrp_group = ha_config["vrrp_group"] - data_macs = ha_config["data_macs"] - preempt_delay = ha_config["preempt_delay"] - priority = ha_config["priority"] - vip = ha_config["vip"] - tenant_id = ha_config["tenant_id"] - advertised_interval = ha_config["advertised_interval"] - except KeyError, err: - raise Exception("HA configuration for interface failed. Value " - "not found. %r" % str(err), - 400, dict(interface_config=ha_config)) - interface_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, - vip=vip, preempt_delay=preempt_delay, - priority=priority, cluster_name=cluster_name, - advertised_interval=advertised_interval, - tenant_id=tenant_id) - - interface_vrrp_commands = self.set_vrrp_for_interface(interface_info) - - self._execute_commands(interface_vrrp_commands, interface_info[ - 'tenant_id']) - logger.debug("VRRP succesfully configured for interfaces.") - return {'status': 200, 'message': 'VRRP succesfully configured for ' - 'interfaces'} - - def delete_vrrp(self, vrrp_config): - """ - :param self: - :param vrrp_config: - :return: - This method makes an assumption that detach of an interface will - finally clean the vrrp entry. That's why doesn't raise any - exception, as was observed that even though it succeeds but raises an - exception. Investigation will continue. Also this methods doesn't - clean conntrack explicitly, instead it goes with VM delete. - Exception code will be incorporated once the exception established - case. - """ - vrrp_config = json.loads(vrrp_config) - data_macs = vrrp_config["data_macs"] - # cluster_name = vrrp_config.get("cluster_name", "CLUSTER-1") - - data_interface, data_ip = self._get_interface_name( - dict(data_mac=data_macs['provider_mac']), interface_type='data') - - provider_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface - - data_interface, data_ip = self._get_interface_name( - dict(data_mac=data_macs['stitching_mac']), interface_type='data') - stitching_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface - - session.setup_config_session() - # delete_conntrack_cluster = ("service conntrack-sync " - # "failover-mechanism vrrp sync-group %s" % - # cluster_name) - # try: - # self.delete(group_delete.split()) - # except Exception, err: - # session.discard() - # session.teardown_config_session() - # raise Exception(err) - - try: - self.delete(provider_vrrp_delete.split()) - except Exception, err: - # session.discard() - logger.error("Error deleting provider vrrp %r " % err) - # raise Exception(err) - - try: - self.delete(stitching_vrrp_delete.split()) - except Exception, err: - # session.discard() - logger.error("Error deleting stitching vrrp %r " % err) - # raise Exception(err) - - # try: - # self.delete(delete_conntrack_cluster.split()) - # except Exception, err: - # session.discard() - # session.teardown_config_session() - # raise Exception(err) - # logger.error("Error deleting conntrack - %r " % err) - - session.commit() - time.sleep(5) - session.save() - # REVISIT (VK) This sleep need to get invoked if we see any issue - # with session teardown. - # time.sleep(5) - session.teardown_config_session() - logger.debug("VRRP succesfully deleted for interfaces") - return {'status': 200, 'message': 'VRRP succesfully deleted for ' - 'interfaces'} - - def set_vrrp_for_interface(self, data_info): - interface_commands = list() - direct_call = False - if isinstance(data_info, str): - direct_call = True - data_info = json.loads(data_info) - data_macs = data_info.get("data_macs", {}) - vips = data_info.get("vip", {}) - vrrp_groups = data_info["vrrp_group"] - - for mac_type, mac in data_macs.iteritems(): - # mac_type - provider_mac, stitching_mac - data_mac = dict(data_mac=str(mac)) - vip_type = mac_type.split("_")[0] + "_vip" - vip_ip = vips.get(vip_type) - if mac_type == "provider_mac": - vrrp_group = vrrp_groups["provider_vrrp_group"] - if mac_type == "stitching_mac": - vrrp_group = vrrp_groups["stitching_vrrp_group"] - - interface_name, ip = self._get_interface_name( - data_mac, interface_type='data') - - if not interface_name: - logger.error("Failed to configure VRRP, as unable to get " - "interface name.") - raise Exception('VRRP config failed.Failed to get interface' - ' name to configure vrrp', 400, - dict(data_info=data_info)) - - common_command = "interfaces ethernet %s vrrp vrrp-group %s " % ( - interface_name, vrrp_group) - - interface_address_set = "interfaces ethernet %s address %s " % ( - interface_name, ip) - - advt_interval_set = common_command + "advertise-interval %s " % ( - data_info["advertised_interval"]) - - preempt_set = common_command + "preempt true" - # preempt_set = common_command + "preempt %s" % data_info[ - # "preempt"] - preempt_delay_set = common_command + "preempt-delay %s" % \ - data_info["preempt_delay"] - priority_set = common_command + "priority %s" % data_info[ - "priority"] - rfc_set = common_command + "rfc3768-compatibility" - sync_group_set = common_command + "sync-group %s " % data_info[ - "cluster_name"] - virtual_address_set = common_command + "virtual-address %s" % \ - vip_ip - - interface_commands += [interface_address_set, advt_interval_set, - preempt_set, preempt_delay_set, - priority_set, rfc_set, sync_group_set, - virtual_address_set] - - logger.debug("Interface commands - %r ", interface_commands) - if not direct_call: - return interface_commands - else: - self._execute_commands(interface_commands, data_info.get( - 'tenant_id')) - return dict(message='Interface configured succesfully') - - @staticmethod - def _set_conntrack(cluster_name, event_queue_size, mcast_group, - monitoring_interface, sync_queue_size): - peer_link_set = "interfaces ethernet %s description PEER-LINK" % \ - monitoring_interface - event_queue_set = "service conntrack-sync event-listen-queue-size " \ - "%s" % str(event_queue_size) - cluster_set = "service conntrack-sync failover-mechanism vrrp " \ - "sync-group " + cluster_name - interface_set = "service conntrack-sync interface %s" % \ - monitoring_interface - mcast_set = "service conntrack-sync mcast-group %s " % mcast_group - sync_queue_set = "service conntrack-sync sync-queue-size %s " % \ - str(sync_queue_size) - commands = [peer_link_set, event_queue_set, cluster_set, - interface_set, mcast_set, sync_queue_set] - - logger.debug("Conntrack commands - %r " % commands) - return commands - - @staticmethod - def _get_interface_name(ha_config, interface_type=None): - """ - :param ha_config: - :param interface_type: - :return: - """ - interfaces = netifaces.interfaces() - for interface in interfaces: - physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) - if not physical_interface: - continue - if AF_INET not in netifaces.ifaddresses(interface).keys(): - continue - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - ip_addr = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] - netmask = netifaces.ifaddresses(interface)[AF_INET][0]['netmask'] - if mac_addr == ha_config.get('monitoring_mac', None) and \ - interface_type.lower() == 'monitoring': - return interface, ip_addr - elif (mac_addr == ha_config.get('data_mac', None) and - interface_type.lower() == 'data'): - mlen = sum([bin(int(x)).count('1') for x in - netmask.split('.')]) - ip_addr += ("/" + str(mlen)) - return interface, ip_addr - - logger.error("interface name none, ha_config: %s" % ha_config) - return None, None - - def get_conntrack_request_data(self, ha_config): - try: - monitoring_mac = ha_config["monitoring_mac"] - queue_size = ha_config.get("queue_size", 8) - cluster_name = ha_config["cluster_name"] - mcast_group = ha_config["mcast_group"] - sync_queue_size = ha_config.get("sync_queue_size", 1) - vrrp_group = ha_config["vrrp_group"] - data_macs = ha_config["data_macs"] - preempt_delay = ha_config["preempt_delay"] - priority = ha_config["priority"] - vip = ha_config["vip"] - advertised_interval = ha_config["advertised_interval"] - except KeyError, err: - raise Exception("Parameters missing for conntrack configuration " - "%r" % str(err), 400, {"ha_config": ha_config}) - - monitoring_info = dict(monitoring_mac=monitoring_mac, - event_queue_size=queue_size, - cluster_name=cluster_name, - mcast_group=mcast_group, - sync_queue_size=sync_queue_size) - - data_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, - vip=vip, preempt_delay=preempt_delay, - priority=priority, cluster_name=cluster_name, - advertised_interval=advertised_interval) - - return monitoring_info, data_info - - def get_interface_data(self, interface_config): - try: - data_macs = interface_config["data_macs"] - advertised_interval = interface_config["advertised_interval"] - vrrp_group = interface_config["vrrp_group"] - preempt_delay = interface_config["preempt_delay"] - priority = interface_config["priority"] - vip = interface_config["vip"] - except KeyError: - pass - - data_info = dict(data_macs=data_macs, - advertised_interval=advertised_interval, - vrrp_group=vrrp_group, preempt_delay=preempt_delay, - priority=priority, vip=vip) - - return data_info - - def _execute_commands(self, all_commands, tenant_id=None): - session.setup_config_session() - for command in all_commands: - try: - self.set(command.split()) - except: - logger.error("Failed to configure HA. Tenant - %r" % tenant_id) - session.teardown_config_session() - raise Exception("Failed to configure HA for tenant %s" % - tenant_id, 400, {"commands": all_commands, - "failed_command": command}) - try: - session.commit() - except: - logger.error("Failed to commit HA configuration. Tenant - %r" - % tenant_id) - session.discard() - time.sleep(2) - session.teardown_config_session() - raise Exception("Failed to configure HA for tenant %s" % tenant_id, - 400, {"commands": all_commands, - "failed_command": command}) - time.sleep(5) - session.save() - time.sleep(5) - session.teardown_config_session() - - - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh deleted file mode 100755 index f2ebd12247..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/interface_monitor.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - - function enumerate_net_interfaces { - - echo `date` `ip addr` >> /var/log/oc/vyos_monitor - echo "\n" - echo `date` `sudo netstat -pantl | grep 8888` >>/var/log/oc/vyos_monitor - } - - enumerate_net_interfaces - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py deleted file mode 100644 index b40135d752..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/log_forwarder.py +++ /dev/null @@ -1,55 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import logging -import subprocess - -from vyos_session import utils - -OP_SUCCESS = True -OP_FAILED = False - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - -class APIHandler(object): - def __init__(self): - pass - - def run_command(self, command): - proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - out, err = proc.communicate() - if err: - logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) - return None - return out - - def configure_rsyslog_as_client(self, config): - command = """ - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system syslog host %s facility all level %s - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save - """ %(config['server_ip'], config['log_level']) - - try: - out = self.run_command(command) - return OP_SUCCESS - except Exception as ex: - logger.error("Error while configuring rsyslog as client. %s" % ex) - return OP_FAILED diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py deleted file mode 100644 index b2963430a0..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/oc_fw_module.py +++ /dev/null @@ -1,357 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -#!/usr/bin/env python -import logging -import json -import netifaces -import time -import fw_constants -import ast -from operations import configOpts -from vyos_session import utils -from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE -from execformat.executor import session - -FWN = 'firewall name' -# oc_fw_identifier = 'oc_fw' -rule = 'rule' -firewall_rules = { - 'protocol': '%s protocol %s', - 'source_ip_address': '%s source address %s', - 'destination_ip_address': '%s destination address %s', - 'source_port': '%s source port %s', - 'destination_port': '%s destination port %s' - } - -firewall_action = {'allow': 'accept', 'deny': 'drop'} - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class OCFWConfigClass(configOpts): - - def __init__(self): - super(OCFWConfigClass, self).__init__() - self.oc_fw_identifier = 'oc_fw' - self.provider_ptg_interfaces = list() - self.rules = list() - - def set_up_rule_on_interfaces(self, firewall): - """ - firewall = {'status': u'PENDING_CREATE', 'name': u'', 'shared': None, - 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', - 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', - 'admin_state_up': True, 'id': u'e9b5ca2f-a721-41b9-be9b-7a6189ddbec5' - , 'firewall_rule_list': [{'protocol': u'tcp', 'description': u'', - 'source_port': None, 'source_ip_address': None, - 'destination_ip_address': None, - 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', - 'position': 1L, 'destination_port': '80', - 'id': u'b98296cb-335a-4314-83f9-aa5654f296fa', 'name': u'', - 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', 'enabled': True, - 'action': u'allow', 'ip_version': 4L, 'shared': False}], - 'description': u''} - - :param firewall: Firewall object - """ - sorted_rule_list, self.provider_ptg_interfaces = list(), list() - - firewall = json.loads(firewall) - fw_rule_list = firewall['firewall_rule_list'] - logger.info("Initiating firewall - %s build. of Tenant: %s" % ( - firewall['id'], firewall['tenant_id'])) - sorted_rule_list = self.sort_rule_list(fw_rule_list, firewall['id']) - try: - self.set_provider_interface(firewall) - except Exception as e: - msg = ("Firewall - %s configuration failed. Tenant : %s Error " - "retrieving PTG's interface %r" % - (firewall['id'], firewall['tenant_id'], str(e))) - logger.error(msg) - raise Exception(msg, 400, dict(config_success=False)) - else: - if not self.provider_ptg_interfaces: - msg = ("No interface was found to configure firewall - %s . " - "Tenant: %s" % - (firewall['id'], firewall['tenant_id'])) - logger.error(msg) - raise Exception(msg, 400, dict(config_success=False)) - - session.setup_config_session() - # FIXME (VK): This will log error also when there is no firewall - # before on the interface. Need to evaluate side effect of this method. - try: - self._ensure_clean_interface() - except: - pass - self.rules = list() - self.add_common_rule() - try: - for fw_rule in sorted_rule_list: - self.create_vyos_fw_rule(fw_rule) - self.configure_interfaces() - for _rule in self.rules: - self.set(_rule.split()) - session.commit() - except Exception as e: - msg = ("Firewall - %s configuration failed. Error: %s " % - (firewall['id'], str(e))) - logger.error(msg) - session.discard() - session.teardown_config_session() - raise Exception(msg, 400, dict(config_success=False)) - else: - msg = "Firewall - %s rules created successfully on %r" % ( - firewall['id'], self.provider_ptg_interfaces) - logger.info(msg) - return {'status': 200, 'config_success': True, 'message': msg} - finally: - session.save() - time.sleep(4) - session.teardown_config_session() - - def add_common_rule(self): - self.oc_fw_identifier = ('oc_fw' + '_' + - self.provider_ptg_interfaces[0]) - default_action = (FWN + ' ' + self.oc_fw_identifier + - ' default-action drop' - ) - common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + - rule + ' 10') - accept_action = (common_fw_rule_prefix + ' action accept') - established_action = (common_fw_rule_prefix + - ' state established enable') - related_action = (common_fw_rule_prefix + - ' state related enable') - self.rules += [default_action, accept_action, established_action, - related_action] - - def create_vyos_fw_rule(self, fw_rule): - if not fw_rule.get('enabled'): - return - - position = str(int(fw_rule.get('position', '100')) + 10) - if position < 1: - position *= 10 - common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + - rule + ' ' + position) - self.rules.append(common_fw_rule_prefix) - self.rules.append(''.join([common_fw_rule_prefix, ' action %s' % - firewall_action[fw_rule['action'.lower()]]]) - ) - try: - self.rules.extend( - [firewall_rules[k] % - (common_fw_rule_prefix, fw_rule[k] - if k not in ['source_port', 'destination_port'] - else fw_rule[k].replace(':', '-')) - for k, v in fw_rule.iteritems() - if fw_rule[k] and k in firewall_rules] - ) - - except Exception as err: - logger.error("Firewall rule retrieval failed . Error - %s" % - str(err)) - raise Exception(err) - - def configure_interfaces(self): - if fw_constants.intercloud: - # TODO(Vikash) Its not always the bridge will have same name every - # time. Its only for intercloud - interface_conf = ("interfaces bridge br0 firewall in name " + - self.oc_fw_identifier) - self.rules += [interface_conf] - else: - # It would be always 1 for now. - for interface in self.provider_ptg_interfaces: - if interface.lower() == 'lo': - continue - interface_conf = ('interfaces ethernet ' + interface + ' ' + - 'firewall out name ' + self.oc_fw_identifier) - self.rules += [interface_conf] - - def reset_firewall(self, firewall): - fw_data = json.loads(firewall) - try: - self.set_provider_interface(fw_data) - except Exception as err: - msg = ("Firewall %s reset failed. Error retrieving PTG's " - "interface- %r" % (fw_data['id'], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - if not self.provider_ptg_interfaces: - msg = ("No interface was found for - %r " % fw_data[ - 'id']) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False, - message="INTERFACE NOT FOUND")) - - session.setup_config_session() - - if fw_constants.intercloud: - bridge_rule = ("interfaces bridge br0 firewall in name " + - self.oc_fw_identifier) - try: - self.delete(bridge_rule.split()) - except Exception as err: - msg = (" Rule deletion on bridge failed - %s " % str( - err)) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - del_interface_rule = ( - 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + - ' ' + 'firewall') - try: - self.delete(del_interface_rule.split()) - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Rule deletion on interface %s failed. ERROR: %s " % - (self.provider_ptg_interfaces[0], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - try: - session.commit() - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Rule deletion commit operation failed for firewall - %s. " - "Error - %s" % (fw_data['id'], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - - # sleep for 2 sec. Got removed in last merge. - time.sleep(2) - self.oc_fw_identifier = ('oc_fw' + '_' + - self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.oc_fw_identifier - try: - self.delete(del_firewall.split()) - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Firewall - %s deletion failed on interface: %r .ERROR %s" - % (fw_data['id'], self.provider_ptg_interfaces[0], - str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - try: - session.commit() - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Session commit failed for firewall deletion : %s. " - "Error - %r " % - (fw_data['id'], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - logger.info("Firewall -%r deleted succesfully" % fw_data[ - 'id']) - - session.save() - # Can be removed if we don't see any issue. - time.sleep(1) - session.teardown_config_session() - - return {'status': 200, 'message': 'Firewall - %s deleted ' - 'succesfully' % fw_data['id'], - 'delete_success': True} - - def sort_rule_list(self, fw_rule_list, fw_id): - fw_rule_list_len = len(fw_rule_list) - rule_list = [-1] * fw_rule_list_len - for rule in fw_rule_list: - ind = rule['position'] - 1 - rule_list[ind] = rule - - if -1 in rule_list: - # raise Exception("Something went wrong") - rule_list = list() - logger.warn("Adding only DROP rule as not received any rules for " - "firewall %s" % fw_id) - return rule_list - - def set_provider_interface(self, firewall): - description = ast.literal_eval(firewall["description"]) - if not description.get('provider_ptg_info'): - raise - provider_ptg_info = description["provider_ptg_info"] - # consumer_ptg_ips = description.get('consumer_ptg_ips', []) - interfaces = netifaces.interfaces() - self.provider_ptg_interfaces = list() - for interface in interfaces: - # IPV4 support only - # (Fixme) what in the case of aliasing? - # ip = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] - # TODO (Vikash) Not reqd for L2 , need to revisit for L3 - # vpn tunnel interface for ssl vpn does not have a mac address - physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - - if mac_addr in provider_ptg_info: - self.provider_ptg_interfaces.append(interface) - - def get_out_and_in_rule(self, fw_rule_list): - in_rule_list = out_rule_list = list() - - for rule in fw_rule_list: - if rule['direction'] == 'in': - in_rule_list.append(rule) - elif rule['direction'] == 'out': - out_rule_list.append(rule) - else: - raise Exception("Not valid direction") - - return in_rule_list, out_rule_list - - def _ensure_clean_interface(self): - del_interface_rule = ( - 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + - ' ' + 'firewall') - self.oc_fw_identifier = ('oc_fw' + '_' + - self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.oc_fw_identifier - try: - self.delete(del_interface_rule.split()) - # delete firewall - self.delete(del_firewall.split()) - except Exception as err: - logger.info("Stale firewall rule deletion on interface %s failed. " - "This method is called with every firewall create to " - "avoid previous stale firewall rule. This message can " - "be ignored." % self.provider_ptg_interfaces[0]) - raise Exception(err) - - def run_sshd_on_mgmt_ip(self, mgmt_ip): - command = "service ssh listen-address %s" % mgmt_ip - session.setup_config_session() - self.set(command.split()) - try: - session.commit() - except: - logger.error("Failed to update sshd listen-address to %s" % - mgmt_ip) - session.discard() - session.teardown_config_session() - return - session.save() - session.teardown_config_session() - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py deleted file mode 100755 index 849124a9a2..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/operations.py +++ /dev/null @@ -1,65 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -#!/usr/bin/env python - -import sys -import os -import logging -topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." -topdir = os.path.realpath(topdir) -sys.path.insert(0, topdir) -from execformat.executor import execUtils, OperationFailed -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class configOpts(object): - - def __init__(self): - pass - - def set_1(self, args): - exe=execUtils(list(args)) - exe.execmd() - - def delete_1(self, args): - exe=execUtils(list(args)) - exe.execmd() - - def show(self, args): - exe=execUtils(list(args)) - res,output=exe.execmd(nonsession=True) - return res,output - - def set(self, args): - args.insert(0, 'set') - exe=execUtils(list(args)) - try: - exe.execmd() - return True - except OperationFailed, e: - logger.error(e.message) - return False - - def delete(self, args): - args.insert(0, 'delete') - exe=execUtils(list(args)) - try: - exe.execmd() - return True - except OperationFailed, e: - logger.error(e.message) - return False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py deleted file mode 100644 index 28155768fb..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/routes_config_handler.py +++ /dev/null @@ -1,211 +0,0 @@ -import json -import logging -import netifaces -import subprocess -import netaddr -import time - -from vyos_session import utils - -ROUTING_TABLE_BASE = 10 - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class RoutesConfigHandler(object): - def __init__(self): - super(RoutesConfigHandler, self).__init__() - - def add_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - gateway_ip = route_info['gateway_ip'] - source_interface = self._get_if_name_by_cidr(source_cidr) - try: - interface_number_string = source_interface.split("eth",1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - ip_rule_command = "ip rule add from %s table %s" %( - source_cidr, routing_table_number) - out1 = subprocess.Popen(ip_rule_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - ip_rule_command = "ip rule add to %s table main" %(source_cidr) - out2 = subprocess.Popen(ip_rule_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - ip_route_command = "ip route add table %s default via %s" %( - routing_table_number, gateway_ip) - out3 = self._add_default_route_in_table(ip_route_command, - routing_table_number) - output = "%s\n%s\n%s" %(out1, out2, out3) - logger.info("Static route configuration result: %s" %(output)) - return json.dumps(dict(status=True)) - - def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" %(table) - command_pipe = subprocess.Popen(route_del_command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" %(err)) - - def _add_default_route_in_table(self, route_cmd, table): - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0: - if "File exists" in err: - self._del_default_route_in_table(table) - else: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) - raise Exception("Setting Default Table route failed") - else: - return out - - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) - raise Exception("Setting Default Table route failed") - else: - return out - - def _delete_ip_rule(self, cidr): - count = 0 - for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) - while True: - command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0 and "No such file" in err: - break - else: - count = count + 1 - if count >= 10: - logger.error("Deleting policy based routing for CIDR: " - "%s not completed even after 10 attempts" - %(cidr)) - break - - def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" %(table) - command_pipe = subprocess.Popen(route_del_command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" %(err)) - - def _add_default_route_in_table(self, route_cmd, table): - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0: - if "File exists" in err: - self._del_default_route_in_table(table) - else: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) - raise Exception("Setting Default Table route failed") - else: - return out - - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) - raise Exception("Setting Default Table route failed") - else: - return out - - def _delete_ip_rule(self, cidr): - count = 0 - for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) - while True: - command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0 and "No such file" in err: - break - else: - count = count + 1 - if count >= 10: - logger.error("Deleting policy based routing for CIDR: " - "%s not completed even after 10 attempts" - %(cidr)) - break - - # REVISIT(Magesh): There may be a chance that there are duplicate rules - # May have to do a list and cleanup multiple entries - def delete_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - source_interface = self._get_if_name_by_cidr(source_cidr) - try: - interface_number_string = source_interface.split("eth",1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for deleting routes" - %(source_interface)) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - self._delete_ip_rule(source_cidr) - ip_route_command = "ip route del table %s default" %( - routing_table_number) - out = subprocess.Popen(ip_route_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - logger.info("Static route delete result: %s" %(out)) - return json.dumps(dict(status=True)) - - def _get_if_name_by_cidr(self, cidr): - interfaces = netifaces.interfaces() - retry_count = 0 - while True: - all_interfaces_have_ip = True - for interface in interfaces: - inet_list = netifaces.ifaddresses(interface).get( - netifaces.AF_INET) - if not inet_list: - all_interfaces_have_ip = False - for inet_info in inet_list or []: - netmask = inet_info.get('netmask') - ip_address = inet_info.get('addr') - subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): - return interface - ip_address_netmask = '%s/%s' %(ip_address, netmask) - interface_cidr = netaddr.IPNetwork(ip_address_netmask) - if str(interface_cidr.cidr) == cidr: - return interface - # Sometimes the hotplugged interface takes time to get IP - if not all_interfaces_have_ip: - if retry_count < 10: - time.sleep(3) - retry_count = retry_count + 1 - continue - else: - raise Exception("Some of the interfaces do not have " - "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py deleted file mode 100644 index d9cd383db8..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server.py +++ /dev/null @@ -1,57 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import signal -import logging -import sys -from vyos_session.utils import init_logger - - -logger = logging.getlogger(__name__) -init_logger(logger) - - -class OCVyOSServer(object): - def __init__(self): - pass - - - -def handler(signum, frame): - if signum in [2, 3, 11, 15]: - logger.info(" Recieved signal: %r. Thus exiting " % signum) - sys.exit() - else: - logger.info(" Caught singal: %r. Ignoring " % signum) - - -def main(argv): - vyos_server = OCVyOSServer() - host = '' - port = 0 - if len(argv) != 5: - print "server.py -h -p " - sys.exit(2) - - # Review - OSM: We should accept -h -p in any order. - if argv[1] == '-h': - host = argv[2] - if argv[3] == '-p': - port = int(argv[4]) - signal.signal(signal.SIGTERM, handler) - signal.signal(signal.SIGINT, handler) - vyos_server.start(vyos_server.server, host, port) - - -if __name__ == '__main__': - main(sys.argv) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py deleted file mode 100644 index 53b0fdeff5..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/server2.py +++ /dev/null @@ -1,560 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import sys -import os -import json -import signal -import logging -import ast -import time -from os.path import abspath, dirname - -import netifaces - -sys.path.insert(0, dirname(dirname(abspath(__file__)))) -from vyos_session.utils import init_logger -from oc_fw_module import OCFWConfigClass -from edit_persistent_rule import EditPersistentRule -from static_ip import StaticIp -from flask import Flask, request -from os.path import abspath, dirname -from vpn_api_server import VPNHandler as vpnhandler -from vyos_policy_based_routes import RoutesConfigHandler as routes_handler -from ha_config import VYOSHAConfig -from vyos_exception import OCException -from flask import jsonify -from log_forwarder import APIHandler as apihandler -from stats_parser import APIHandler as stats_apihandler -# sys.path.insert(0, dirname(dirname(abspath(__file__)))) -# sys.path.insert(0, (abspath(__file__))) - -logger = logging.getLogger(__name__) -init_logger(logger) - -app = Flask(__name__) - -oc_fw_module = None -e = EditPersistentRule() - -error_msgs = { - 'unexpected': 'Unexpected VYOS ERROR occurred while %s %s ' -} - - -@app.route('/auth-server-config', methods=['POST']) -def auth_server_config(): - data = json.loads(request.data) - f = open("/usr/share/vyos-oc/auth_server.conf", 'w') - f.write(data['auth_uri']) - f.write('\n') - f.write(data['admin_tenant_name']) - f.write('\n') - f.write(data['admin_user']) - f.write('\n') - f.write(data['admin_password']) - f.write('\n') - f.write(data['remote_vpn_role_name']) - f.write("\n") - f.write(data['project_id']) - f.write("\n") - - try: - host_ip = data['host_mapping'].split()[0]+"/32" - command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' - gateway_ip = os.popen(command).read().strip().strip("'") - status = vpnhandler().configure_static_route("set", host_ip, gateway_ip) - - except Exception as ex: - err = ("Error in adding rvpn route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - try: - if data['host_mapping'].split()[1]: - os.system("sudo chown vyos:users /etc/hosts") - os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) - os.system("sudo chown root:root /etc/hosts") - #with open('/etc/hosts', 'a') as hosts: - # hosts.write(data['host_mapping']) - except Exception as e: - logger.error("Error in writing host mapping in /etc/hosts - %s" % e) - - return json.dumps(dict(status=True)) - - -@app.route('/create-ipsec-site-conn', methods=['POST']) -def create_ipsec_site_conn(): - """ - Open a "configure" session with vyos - "Set" all the parameters - "commit" the changes - """ - try: - data = json.loads(request.data) - status = vpnhandler().create_ipsec_site_conn(data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = "Error in configuring ipsec_site_conection. Reason: %s" % ex - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/create-ipsec-site-tunnel', methods=['POST']) -def create_ipsec_site_tunnel(): - """ - Open a "configure" session with vyos - "Set" all the parameters - "commit" the changes - """ - try: - tunnel = json.loads(request.data) - pcidrs = tunnel['peer_cidrs'] - for pcidr in pcidrs: - tunnel['peer_cidr'] = pcidr - status = vpnhandler().create_ipsec_site_tunnel(tunnel) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in configuring ipsec_site_tunnel. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ipsec-site-tunnel', methods=['DELETE']) -def delete_ipsec_site_tunnel(): - try: - pcidrs = request.args.get('peer_cidrs') - peer_address = request.args.get('peer_address') - local_cidr = request.args.get('local_cidr') - pcidrs = ast.literal_eval(pcidrs) - for pcidr in pcidrs: - tunnel = {} - tunnel['peer_address'] = peer_address - tunnel['local_cidr'] = local_cidr - tunnel['peer_cidr'] = pcidr - status = vpnhandler().delete_ipsec_site_tunnel(tunnel) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in deleting ipsec_site_tunnel. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ipsec-site-conn', methods=['DELETE']) -def delete_ipsec_site_conn(): - try: - peer_address = request.args.get('peer_address') - status = vpnhandler().delete_ipsec_site_conn(peer_address) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in deleting ipsec_site_connection. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/get-ipsec-site-tunnel-state', methods=['GET']) -def get_ipsec_site_tunnel_state(): - try: - peer_address = request.args.get('peer_address') - lcidr = request.args.get('local_cidr') - pcidr = request.args.get('peer_cidr') - tunnel = {} - tunnel['peer_address'] = peer_address - tunnel['local_cidr'] = lcidr - tunnel['peer_cidr'] = pcidr - status, state = vpnhandler().get_ipsec_site_tunnel_state(tunnel) - return json.dumps(dict(state=state)) - except Exception as ex: - err = ("Error in get_ipsec_site_tunnel_state. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/create-ssl-vpn-conn', methods=['POST']) -def create_ssl_vpn_conn(): - try: - data = json.loads(request.data) - status = vpnhandler().create_ssl_vpn_conn(data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in create_ssl_vpn_connection. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/ssl-vpn-push-route', methods=['POST']) -def ssl_vpn_push_route(): - try: - data = json.loads(request.data) - status = vpnhandler().ssl_vpn_push_route(data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in ssl_vpn_push_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ssl-vpn-conn', methods=['DELETE']) -def delete_ssl_vpn_conn(): - try: - tunnel_name = request.args.get('tunnel') - status = vpnhandler().delete_ssl_vpn_conn(tunnel_name) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_ssl_vpn_conn. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ssl-vpn-route', methods=['DELETE']) -def delete_ssl_vpn_route(): - try: - route = request.args.get('route') - status = vpnhandler().delete_ssl_vpn_route(route) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_ssl_vpn_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/get-ssl-vpn-conn-state', methods=['GET']) -def get_ssl_vpn_conn_state(): - try: - tunnel_name = request.args.get('tunnel') - status, state = vpnhandler().get_ssl_vpn_conn_state(tunnel_name) - return json.dumps(dict(status=status, state=state)) - except Exception as ex: - err = ("Error in get_ssl_vpn_conn_state. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/configure-firewall-rule', methods=['POST']) -def configure_firewall_rule(): - global oc_fw_module - firewall_data = request.data - try: - response = oc_fw_module.set_up_rule_on_interfaces(firewall_data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'configuring', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/delete-firewall-rule', methods=['DELETE']) -def delete_firewall_rule(): - global oc_fw_module - try: - response = oc_fw_module.reset_firewall(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'deleting', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/update-firewall-rule', methods=['PUT']) -def update_firewall_rule(): - global oc_fw_module - try: - oc_fw_module.reset_firewall(request.data) - response = oc_fw_module.set_up_rule_on_interfaces(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'updating', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/add-source-route', methods=['POST']) -def add_source_route(): - try: - return routes_handler().add_source_route(request.data) - except Exception as ex: - err = ("Exception in adding source route. %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-source-route', methods=['DELETE']) -def delete_source_route(): - try: - return routes_handler().delete_source_route(request.data) - except Exception as ex: - err = ("Exception in deleting source route. %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/add-stitching-route', methods=['POST']) -def add_stitching_route(): - try: - gateway_ip = json.loads(request.data).get('gateway_ip') - status = vpnhandler().configure_static_route("set", "0.0.0.0/0", gateway_ip) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in add_stitching_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-stitching-route', methods=['DELETE']) -def delete_stitching_route(): - try: - gateway_ip = request.args.get('gateway_ip') - status = vpnhandler().configure_static_route( - "delete", "0.0.0.0/0", gateway_ip) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_stitching_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/configure_conntrack_sync', methods=['POST']) -def configure_conntrack_sync(): - global vyos_ha_config - try: - response = vyos_ha_config.configure_conntrack_sync(request.data) - except Exception as err: - # This flask version has issue in implicit way of registering - # error handler. - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'configuring', 'conntrack sync')))) - else: - return jsonify(**response) - - -@app.route('/configure_interface_ha', methods=['POST']) -def configure_interface_ha(): - global vyos_ha_config - try: - response = vyos_ha_config.set_vrrp_for_interface(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict( - err=error_msgs['unexpected'] % ( - 'configuring', 'HA for the interface')))) - else: - return jsonify(**response) - - -@app.route('/delete_vrrp', methods=['DELETE']) -def delete_vrrp(): - global vyos_ha_config - try: - response = vyos_ha_config.delete_vrrp(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'deleting', 'VRRP')))) - else: - return jsonify(**response) - - -# @app.errorhandler(OCException) -def send_error_response(error): - response = jsonify(error.to_dict()) - response.status_code = error.status_code - return response - - -@app.route('/add_static_ip', methods=['POST']) -def add_static_ip(): - try: - static_ip_obj = StaticIp() - data = json.loads(request.data) - static_ip_obj.configure(data) - except Exception as err: - msg = ("Error adding static IPs for hotplugged interfaces. " - "Data: %r. Error: %r" % (data, str(err))) - logger.error(msg) - return json.dumps(dict(status=False, reason=msg)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/del_static_ip', methods=['DELETE']) -def del_static_ip(): - try: - static_ip_obj = StaticIp() - data = json.loads(request.data) - static_ip_obj.clear(data) - except Exception as err: - msg = ("Error clearing static IPs for hotplugged interfaces. " - "Data: %r. Error: %r" % (data, str(err))) - logger.error(msg) - return json.dumps(dict(status=False, reason=msg)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/add_rule', methods=['POST']) -def add_rule(): - # configuring sshd to listen on management ip address - ip_addr = get_interface_to_bind() - oc_fw_module.run_sshd_on_mgmt_ip(ip_addr) - - data = json.loads(request.data) - try: - EditPersistentRule.add(e, data) - except Exception as err: - logger.error("Error adding persistent rule %r" % str(err)) - return json.dumps(dict(status=False)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/delete_rule', methods=['DELETE']) -def del_rule(): - data = json.loads(request.data) - try: - EditPersistentRule.delete(e, data) - except Exception as err: - logger.error("Error deleting persistent rule %r" % str(err)) - return json.dumps(dict(status=False)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/configure-rsyslog-as-client', methods=['POST']) -def configure_rsyslog_as_client(): - try: - config_data = json.loads(request.data) - status = apihandler().configure_rsyslog_as_client(config_data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error while conifiguring rsyslog client. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - -@app.route('/get-fw-stats', methods=['GET']) -def get_fw_stats(): - try: - mac_address = request.args.get('mac_address') - fw_stats = stats_apihandler().get_fw_stats(mac_address) - return json.dumps(dict(stats=fw_stats)) - except Exception as ex: - err = ("Error while getting firewall stats. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - -@app.route('/get-vpn-stats', methods=['GET']) -def get_vpn_stats(): - try: - vpn_stats = stats_apihandler().get_vpn_stats() - return json.dumps(dict(stats=vpn_stats)) - except Exception as ex: - err = ("Error while getting vpn stats. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -def handler(signum, frame): - if signum in [2, 3, 9, 11, 15]: - sys.exit(0) - else: - pass - - -def add_management_pbr(): - command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' - gateway_ip = os.popen(command).read().strip().strip("'") - command = 'grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' - src_ip = os.popen(command).read().strip().strip("'") - routes_info = [{'source_cidr': src_ip, 'gateway_ip': gateway_ip}] - routes_handler().add_source_route(json.dumps(routes_info)) - - -def getipaddr(): - # This is an assumption that service management will always gets - # configured on eth0 interface. - return netifaces.ifaddresses('eth0')[2][0]['addr'] - - -def get_interface_to_bind(): - while True: - try: - ip_addr = getipaddr() - logger.info("Management interface up on - %r " % - ''.join([netifaces.ifaddresses('eth0')[17][0][ - 'addr'][:2], - netifaces.ifaddresses('eth0')[17][0][ - 'addr'][-2:], - netifaces.ifaddresses('eth0')[2][0][ - 'addr'].split('.')[-1] - ])) - except ValueError: - logger.error("Management Interface not UP") - time.sleep(5) - except KeyError: - logger.error("Management Interface not FOUND") - time.sleep(5) - else: - break - return ip_addr - - -def main(): - """ - - :type ip_addr: Server listen address - """ - global oc_fw_module, vyos_ha_config - oc_fw_module = OCFWConfigClass() - vyos_ha_config = VYOSHAConfig() - ip_addr = get_interface_to_bind() - signal.signal(signal.SIGTERM, handler) - signal.signal(signal.SIGINT, handler) - app.run(ip_addr, 8888) - logger.info("VYOS Agent started ..... ") - - -if __name__ == '__main__': - main() - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py deleted file mode 100644 index 223f55407a..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/static_ip.py +++ /dev/null @@ -1,149 +0,0 @@ - -import logging -import netifaces -import time - -from netifaces import AF_LINK -from operations import configOpts -from execformat.executor import session -from vyos_session.utils import init_logger - -logger = logging.getLogger(__name__) -init_logger(logger) - -COMMAND = "interfaces ethernet %s address %s/%s" - -""" Implements attachment and detachment of fixed IPs to - hot-plugged interfaces based on IP and MAC binding. - -""" - - -class StaticIp(configOpts): - def __init__(self): - self.hotplug_timeout = 25 - - def save(self): - retries = 100 - while retries: - try: - session.commit() - session.save() - time.sleep(3) - session.teardown_config_session() - return - except Exception: - time.sleep(0.1) - retries -= 1 - - def discard(self): - session.discard() - time.sleep(3) - session.teardown_config_session() - - def check_if_interface_is_up(self, pip, sip): - start_time = time.time() - while time.time() - start_time < self.hotplug_timeout: - interfaces = netifaces.interfaces() - if (pip in interfaces and sip in interfaces): - return True - time.sleep(2) - return False - - def _get_interface_name(self, interface_mac): - interfaces = netifaces.interfaces() - - for interface in interfaces: - if netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] == interface_mac: - return interface - - - def configure(self, data): - try: - session.setup_config_session() - ip_mac_map = {} - provider_ip = data['provider_ip'] - provider_mac = data['provider_mac'] - provider_cidr = data['provider_cidr'].split('/')[1] - provider_interface = self._get_interface_name(provider_mac) - - stitching_ip = data['stitching_ip'] - stitching_mac = data['stitching_mac'] - stitching_cidr = data['stitching_cidr'].split('/')[1] - stitching_interface = self._get_interface_name(stitching_mac) - - if not self.check_if_interface_is_up(provider_interface, - stitching_interface): - msg = ("Interfaces are not hotplugged even after waiting " - "for %s seconds." % self.hotplug_timeout) - raise Exception(msg) - - interfaces = netifaces.interfaces() - self.provider_ptg_interfaces = list() - for interface in interfaces: - physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] - if 'eth' in interface: - ip_mac_map.update({interface: mac_addr}) - - for (interface, mac_addr) in ip_mac_map.iteritems(): - if provider_mac == mac_addr: - set_ip = COMMAND % (interface, provider_ip, provider_cidr) - elif stitching_mac == mac_addr: - set_ip = COMMAND % (interface, - stitching_ip, stitching_cidr) - else: - continue - result = self.set(set_ip.split()) - logger.debug("Result of add static ip is %s." % result) - self.save() - except Exception as err: - msg = ("Failed to set static IP. Error: %s" % err) - logger.error(msg) - self.discard() - raise Exception(err) - - def clear(self, data): - try: - session.setup_config_session() - ip_mac_map = {} - provider_ip = data['provider_ip'] - provider_mac = data['provider_mac'] - provider_cidr = data['provider_cidr'].split('/')[1] - - stitching_ip = data['stitching_ip'] - stitching_mac = data['stitching_mac'] - stitching_cidr = data['stitching_cidr'].split('/')[1] - - interfaces = netifaces.interfaces() - self.provider_ptg_interfaces = list() - for interface in interfaces: - physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] - if 'eth' in interface: - ip_mac_map.update({interface: mac_addr}) - - for (interface, mac_addr) in ip_mac_map.iteritems(): - if provider_mac == mac_addr: - del_ip = COMMAND % (interface, provider_ip, provider_cidr) - elif stitching_mac == mac_addr: - del_ip = COMMAND % (interface, - stitching_ip, stitching_cidr) - else: - continue - result = self.delete(del_ip.split()) - logger.debug("Result of delete static IP is %s." % result) - self.save() - except Exception as err: - msg = ("Failed to delete static IP. Error: %s." % err) - logger.error(msg) - self.discard() - raise Exception(msg) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py deleted file mode 100644 index 4272ce4d91..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/stats_parser.py +++ /dev/null @@ -1,336 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import logging -import subprocess -import netifaces - -from netifaces import AF_LINK -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - -class APIHandler(object): - def __init__(self): - pass - - def run_command(self, command): - proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - out, err = proc.communicate() - if err: - logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) - return None - return out - - def _get_interface_name(self, interface_mac): - interfaces = netifaces.interfaces() - - for interface in interfaces: - try: - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - if mac_addr == interface_mac: - return interface - - except KeyError as keyerr: - logger.error('Unable to Parse Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - return None - - def parse_firewall_stats(self, interface, raw_stats): - """ - sample data for command show_firewall_detail.xsl : - - IPv4 Firewall "oc_fw_eth1": - - Active on (eth1,OUT) - - rule action proto packets bytes - ---- ------ ----- ------- ----- - 11 accept tcp 476405 24805598 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:22 - - 12 accept icmp 1222414 101692572 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 - - 13 drop udp 150770055788 DROP - condition - saddr 11.0.2.0/24 daddr /* - - 14 accept tcp 3589762 238449000 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:80 - - 10000 drop all 0 0 - condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 - - """ - firewall = {} - firewalls = [] - firewall_start = False - table = False - status = None - rule_keys = ['rulepriority', 'packets', 'bytes', 'action', - 'source', 'destination'] - - try: - for line in raw_stats.split('\n'): - words = line.split() - if 'IPv4 Firewall' in line: - firewall_start = True - if 'Active on' in line and interface in line and firewall_start: - status = "Active" - (interface, direction) = words[2][1:-1].split(',') - firewall['interface'] = interface - firewall['dir'] = direction - firewall['rules'] = [] - elif len(words) >= 4: - if words[3] in ['ACCEPT', 'DROP'] and status == "Active": - table = True - rule = dict(zip(rule_keys, words)) - firewall['rules'].append(rule) - elif table and status == "Active": - command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_detail.xsl') - show_fw_data = self.run_command(command) - firewall = self.add_protocol_and_dest_port_info(firewall, show_fw_data) - logger.info("packed firewall \n %s" % firewall) - firewalls.append(firewall) - break - - except KeyError as keyerr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return firewalls - - def add_protocol_and_dest_port_info(self, firewall, show_fw_data): - firewall_started = False - firewall_info_started = False - firewall_matcher = "Active on (" + firewall['interface'] - firewall_info_end = "-------------" - firewall_info = [] - for line in show_fw_data.split('\n'): - if "IPv4 Firewall" in line: - firewall_started = True - if firewall_matcher in line: - firewall_info_started = True - if firewall_started and firewall_info_started: - firewall_info.append(line) - if firewall_started and firewall_info_started and firewall_info_end in line: - break - try: - for rule in firewall.get('rules', []): - for index, stats in enumerate(firewall_info): - if stats is not '': - extract_stats = stats.split() - if rule['rulepriority'] in extract_stats[0]: - rule['protocol'] = extract_stats[2] - for key in firewall_info[index + 1].split(): - if "dpt:" in key: - rule['dest_port'] = key.split(':')[1] - break - break - - except KeyError as keyerr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return firewall - - def parse_vpn_s2s(self, raw_stats): - """ - sample data for command show-ipsec-sa-detail : - - Peer IP: 192.168.20.194 - Peer ID: 120.0.0.2 - Local IP: 91.0.0.11 - Local ID: 91.0.0.11 - NAT Traversal: no - NAT Source Port: n/a - NAT Dest Port: n/a - - Tunnel 1: - State: up - Inbound SPI: c6621bd8 - Outbound SPI: cbf2ab18 - Encryption: aes128 - Hash: sha1 - PFS Group: 5 - - Local Net: 90.0.0.0/24 - Local Protocol: all - Local Port: all - - Remote Net: 120.0.0.0/24 - Remote Protocol: all - Remote Port: all - - Inbound Bytes: 654.0 - Outbound Bytes: 504.0 - Active Time (s): 289 - Lifetime (s): 1800 - - """ - s2s_connection = {} - s2s_connections = [] - - try: - for line in raw_stats.split('\n'): - key = '' - value = '' - if ':' in line: - key,value = line.split(":") - - if 'Peer IP' in key: - s2s_connection['peerip'] = value.strip(" \t\n\r") - - elif 'Local IP' in key: - s2s_connection['localip'] = value.strip(" \t\n\r") - - elif "Tunnel" in key: - s2s_connection['tunnels'] = [] - tunnel_info = { 'tunnel' : - key.strip(" \t\n\r").split(" ")[-1] } - - elif "Inbound Bytes" in key: - tunnel_info['in'] = value.strip(" \t\n\r") - - elif "Outbound Bytes" in key: - tunnel_info['out'] = value.strip(" \t\n\r") - s2s_connection['tunnels'].append(tunnel_info) - s2s_connections.append(s2s_connection) - s2s_connection = {} - - except KeyError as keyerr: - logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return s2s_connections - - def parse_vpn_remote(self, raw_stats): - """ - sample data for command vyatta-show-ovpn.pl --mode=server : - - OpenVPN server status on vtun0 [] - - Client CN Remote IP Tunnel IP TX byte RX byte Connected Since - --------- --------- --------- ------- ------- --------------- - UNDEF 192.168.2.81 192.168.200.4 8.0K 2.7K Tue Mar 8 09:01:05 2016 - """ - table = False - remote_connection = {} - remote_connections = [] - keys = ['clientCN', 'remoteip', 'tunnelip', 'in', 'out', 'connected_since'] - - try: - for line in raw_stats.split('\n'): - if "Client CN" in line: - table = True - elif len(line.split()) >= 5 and table and "---" not in line: - value_list = line.split()[:-5] - connected_since = " ".join(line.split()[5:]) - clients = filter(lambda value: value.strip(), value_list) - clients.append(connected_since) - remote_connection = dict(zip(keys, clients)) - remote_connections.append(remote_connection) - - except KeyError as keyerr: - logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return remote_connections - - def get_fw_stats(self, mac_address): - """ - sample data for command show_firewall_statistics.xsl : - - IPv4 Firewall "oc_fw_eth1": - - Active on (eth1,OUT) - - rule packets bytes action source destination - ---- ------- ----- ------ ------ ----------- - 11 476.22K 24.80M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 12 1.22M 101.66M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 13 3.43G 150.73G DROP 11.0.1.0/24 11.0.2.0/24 - 14 3.59M 238.39M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 10000 0 0 DROP 0.0.0.0/0 0.0.0.0/0 - - """ - interface = None - parsed_stats = {} - - command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') - - raw_stats = self.run_command(command) - interface = self._get_interface_name(mac_address) - if not interface: - logger.error('No interface available for mac address: %s' % - mac_address) - return parsed_stats - parsed_stats = self.parse_firewall_stats(interface, raw_stats) - - logger.info("Firewall stats Data, \n %s" % parsed_stats) - return parsed_stats - - def get_vpn_stats(self): - vpn_parsed_data = {} - command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-op-vpn.pl ' + - '--show-ipsec-sa-detail') - - raw_ipsec_stats = self.run_command(command) - if raw_ipsec_stats: - ipsec_parsed_data = self.parse_vpn_s2s(raw_ipsec_stats) - if ipsec_parsed_data: - vpn_parsed_data['ipsec'] = ipsec_parsed_data - else: - logger.warning("Empty IPSec VPN Stats") - else: - logger.warning("Empty IPSec VPN Stats") - - command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-show-ovpn.pl ' + - '--mode=server') - - raw_remote_stats = self.run_command(command) - if raw_remote_stats: - remote_parsed_data = self.parse_vpn_remote(raw_remote_stats) - if remote_parsed_data: - vpn_parsed_data['remote'] = remote_parsed_data - else: - logger.warning("Empty Remote VPN Stats") - else: - logger.warning("Empty Remote VPN Stats") - - logger.info("VPN stats Data, \n %s" % vpn_parsed_data) - return vpn_parsed_data diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py deleted file mode 100644 index e4f7c28c18..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vpn_api_server.py +++ /dev/null @@ -1,461 +0,0 @@ -#!/usr/bin/env python -import logging -import json -import netifaces -import netaddr -import socket -import fcntl -import struct -import array -import time -import ast -import copy -import subprocess -import os -from netaddr import IPNetwork, IPAddress -from operations import configOpts -from vyos_session import utils -from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE -#from vyos_session.configsession import ConfigSession as session -from execformat.executor import session - -OP_SUCCESS = True -OP_FAILED = False - -OP_COMMAND_SCRIPT = "/usr/share/vyos-oc/vpn_op_commands.pl" - -IPSEC_SITE2SITE_COMMANDS = { - 'ike': [ - 'set vpn ipsec ike-group %s proposal 1', - 'set vpn ipsec ike-group %s proposal 1 encryption %s', - 'set vpn ipsec ike-group %s proposal 1 hash %s', - 'set vpn ipsec ike-group %s proposal 2 encryption %s', - 'set vpn ipsec ike-group %s proposal 2 hash %s', - 'set vpn ipsec ike-group %s lifetime %d', - 'set vpn ipsec ike-group %s dead-peer-detection action restart', - 'set vpn ipsec ike-group %s dead-peer-detection interval %s', - 'set vpn ipsec ike-group %s dead-peer-detection timeout %s'], - 'esp': [ - 'set vpn ipsec esp-group %s proposal 1', - 'set vpn ipsec esp-group %s proposal 1 encryption %s', - 'set vpn ipsec esp-group %s proposal 1 hash %s', - 'set vpn ipsec esp-group %s proposal 2 encryption %s', - 'set vpn ipsec esp-group %s proposal 2 hash %s', - 'set vpn ipsec esp-group %s lifetime %d', - 'set vpn ipsec auto-update 60'], - 'conn': [ - 'set vpn ipsec ipsec-interfaces interface %s', - 'set vpn ipsec site-to-site peer %s \ - authentication mode pre-shared-secret', - 'set vpn ipsec site-to-site peer %s \ - authentication pre-shared-secret %s', - 'set vpn ipsec site-to-site peer %s default-esp-group %s', - 'set vpn ipsec site-to-site peer %s ike-group %s', - 'set vpn ipsec site-to-site peer %s local-address %s', - 'set vpn ipsec site-to-site peer %s authentication remote-id %s', - 'set vpn ipsec site-to-site peer %s tunnel %d local prefix %s', - 'set vpn ipsec site-to-site peer %s tunnel %d remote prefix %s', - 'set vpn ipsec site-to-site peer %s authentication id %s'], - 'delete': [ - 'delete vpn ipsec site-to-site peer %s', - 'delete vpn ipsec site-to-site peer %s tunnel %s', - 'delete vpn ipsec'], - 'show': [ - 'show vpn ipsec sa peer %s']} - -SSL_VPN_COMMANDS = { - 'create': [ - 'set interfaces openvpn %s', - 'set interfaces openvpn %s mode server', - 'set interfaces openvpn %s server subnet %s', - 'set interfaces openvpn %s tls ca-cert-file /config/auth/ca.crt', - 'set interfaces openvpn %s tls cert-file /config/auth/server.crt', - 'set interfaces openvpn %s tls dh-file /config/auth/dh.pem', - 'set interfaces openvpn %s tls key-file /config/auth/server.key', - 'set interfaces openvpn %s server push-route %s', - 'set interfaces openvpn %s openvpn-option \ - "--client-cert-not-required --script-security 3 \ - --auth-user-pass-verify /usr/share/vyos-oc/auth_pam.pl via-file"'], - #'set interfaces openvpn %s local-host %s'], - 'delete': [ - 'delete interfaces openvpn %s', - 'delete interfaces openvpn vtun0 server push-route %s']} - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class NoInterfaceOnCidr(Exception): - def __init__(self, **kwargs): - self.message = _("No interface in the network '%(cidr)s'") % kwargs - - -class VPNHandler(configOpts): - def __init__(self): - super(VPNHandler, self).__init__() - - def create_ipsec_site_conn(self, ctx): - session.setup_config_session() - siteconn = ctx['siteconns'][0] - self._create_ike_group(siteconn['ikepolicy'], - siteconn['connection']['dpd']) - self._create_esp_group(siteconn['ipsecpolicy']) - self._create_ipsec_site_conn(ctx) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def create_ipsec_site_tunnel(self, tunnel): - session.setup_config_session() - self._create_ipsec_site_tunnel(tunnel) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def _ipsec_get_tunnel_idx(self, tunnel): - command = 'perl' - command += " " + OP_COMMAND_SCRIPT - command += " " + 'get_ipsec_tunnel_idx' - command += " " + tunnel['peer_address'] - command += " " + tunnel['local_cidr'] - command += " " + tunnel['peer_cidr'] - proc = subprocess.Popen( - command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - tunidx = out.split('=')[1] - return int(tunidx) - - def _ipsec_get_tunnel_count(self, tunnel): - command = 'perl' - command += " " + OP_COMMAND_SCRIPT - command += " " + 'get_ipsec_tunnel_count' - command += " " + tunnel['peer_address'] - proc = subprocess.Popen( - command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - tuncount = out.split('=')[1] - return int(tuncount) - - def delete_ipsec_site_tunnel(self, tunnel): - try: - session.setup_config_session() - self._delete_ipsec_site_tunnel(tunnel) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - except Exception as ex: - logger.error("Error in deleting ipsec site tunnel. %s" % ex) - return OP_FAILED - - def delete_ipsec_site_conn(self, peer_address): - try: - session.setup_config_session() - self._delete_ipsec_site_conn(peer_address) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - except Exception as ex: - logger.error("Error in deleting ipsec site connection. %s" % ex) - return OP_FAILED - - def create_ssl_vpn_conn(self, ctx): - session.setup_config_session() - self._create_ssl_vpn_conn(ctx) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def ssl_vpn_push_route(self, route): - session.setup_config_session() - self._ssl_vpn_push_route(route) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def delete_ssl_vpn_conn(self, tunnel): - session.setup_config_session() - self._delete_ssl_vpn_conn(tunnel) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def delete_ssl_vpn_route(self, route): - session.setup_config_session() - self._delete_ssl_vpn_route(route) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def get_ssl_vpn_conn_state(self, peer_address): - return OP_SUCCESS, 'UP' - - def get_ipsec_site_tunnel_state(self, tunnel): - tunidx = self._ipsec_get_tunnel_idx(tunnel) - command = 'perl' - command += " " + OP_COMMAND_SCRIPT - command += " " + 'get_ipsec_tunnel_state' - command += " " + tunnel['peer_address'] - command += " " + str(tunidx) - proc = subprocess.Popen( - command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - state = out.split('=')[1] - state = state[:-1] - return OP_SUCCESS, state - - def _delete_ipsec_site_tunnel(self, tunnel): - tunidx = self._ipsec_get_tunnel_idx(tunnel) - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - cmd = cmds['delete'][1] - - cmd = cmd % (tunnel['peer_address'], tunidx) - - self._set_commands([cmd]) - - def _delete_ipsec_site_conn(self, peer_address): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - #cmd = cmds['delete'][0] - - #cmd = cmd % peer_address - cmd = cmds['delete'][2] - - self._set_commands([cmd]) - - def _delete_ssl_vpn_conn(self, tunnel): - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - cmd = cmds['delete'][0] - - cmd = cmd % tunnel - - self._set_commands([cmd]) - - def _delete_ssl_vpn_route(self, route): - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - cmd = cmds['delete'][1] - cmd = cmd % route - self._set_commands([cmd]) - - def _set_commands(self, cmds): - for cmd in cmds: - print cmd - self.set_1(cmd.split(' ')) - - def _create_ike_group(self, ike, dpd): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - ike_cmds = cmds['ike'] - - ike_cmds[0] = ike_cmds[0] % (ike['name']) - ike_cmds[1] = ike_cmds[1] % (ike['name'], ike['encryption_algorithm']) - ike_cmds[2] = ike_cmds[2] % (ike['name'], ike['auth_algorithm']) - ike_cmds[3] = ike_cmds[3] % (ike['name'], ike['encryption_algorithm']) - ike_cmds[4] = ike_cmds[4] % (ike['name'], ike['auth_algorithm']) - ike_cmds[5] = ike_cmds[5] % (ike['name'], ike['lifetime']['value']) - ike_cmds[6] = ike_cmds[6] % ike['name'] - ike_cmds[7] = ike_cmds[7] % (ike['name'], dpd['interval']) - ike_cmds[8] = ike_cmds[8] % (ike['name'], dpd['timeout']) - self._set_commands(ike_cmds) - - def _create_esp_group(self, esp): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - esp_cmds = cmds['esp'] - - esp_cmds[0] = esp_cmds[0] % (esp['name']) - esp_cmds[1] = esp_cmds[1] % (esp['name'], esp['encryption_algorithm']) - esp_cmds[2] = esp_cmds[2] % (esp['name'], esp['auth_algorithm']) - esp_cmds[3] = esp_cmds[3] % (esp['name'], esp['encryption_algorithm']) - esp_cmds[4] = esp_cmds[4] % (esp['name'], esp['auth_algorithm']) - esp_cmds[5] = esp_cmds[5] % (esp['name'], esp['lifetime']['value']) - - self._set_commands(esp_cmds) - - def _create_ipsec_site_tunnel(self, tunnel): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - conn_cmds = cmds['conn'] - tun_cmds = ['', ''] - - tunidx = self._ipsec_get_tunnel_count(tunnel) + 1 - """ - Neutron + GBP model supports only one local subnet. - For now also assuming only one peer cidr. - """ - tun_cmds[0] = conn_cmds[7] % ( - tunnel['peer_address'], tunidx, tunnel['local_cidr']) - tun_cmds[1] = conn_cmds[8] % ( - tunnel['peer_address'], tunidx, tunnel['peer_cidrs'][0]) - - self._set_commands(tun_cmds) - - def _get_vrrp_group(self, ifname): - command = ("vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) - #vrrp_ifname = ifname + "v" + os.popen(command).read().strip() - return os.popen(command).read().strip() - - def _create_ipsec_site_conn(self, ctx): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - conn_cmds = cmds['conn'] - - """ - Get the name of the interface which has ipaddr from - the local cidr on which vpn service is launched. - Also get the ip addr assigned to it - """ - ifname, ip = self._get_if_details_by_cidr(ctx['service']['cidr']) - - conn = ctx['siteconns'][0]['connection'] - esp = ctx['siteconns'][0]['ipsecpolicy'] - ike = ctx['siteconns'][0]['ikepolicy'] - - vrrp_cmd = None - if conn['stitching_fixed_ip'] and conn.get('standby_fip', None): - logger.debug("Get vrrp group number for interface %s" % ifname) - group_no = self._get_vrrp_group(ifname) - ip = conn['stitching_fixed_ip'] - vrrp_cmd = ('set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn') % ( - ifname, group_no) - ifname = ifname + "v" + str(group_no) - logger.info("vrrp interface name: %s" % ifname) - - conn_cmds[0] = conn_cmds[0] % (ifname) - conn_cmds[1] = conn_cmds[1] % (conn['peer_address']) - conn_cmds[2] = conn_cmds[2] % (conn['peer_address'], conn['psk']) - conn_cmds[3] = conn_cmds[3] % (conn['peer_address'], esp['name']) - conn_cmds[4] = conn_cmds[4] % (conn['peer_address'], ike['name']) - conn_cmds[5] = conn_cmds[5] % (conn['peer_address'], ip) - conn_cmds[6] = conn_cmds[6] % (conn['peer_address'], conn['peer_id']) - - """ - Neutron + GBP model supports only one local subnet. - For now also assuming only one peer cidr. - """ - conn_cmds[7] = conn_cmds[7] % ( - conn['peer_address'], 1, conn['tunnel_local_cidr']) - conn_cmds[8] = conn_cmds[8] % ( - conn['peer_address'], 1, conn['peer_cidrs'][0]) - conn_cmds[9] = conn_cmds[9] % (conn['peer_address'], conn['access_ip']) - if vrrp_cmd: - conn_cmds.append(vrrp_cmd) - - self._set_commands(conn_cmds) - - def _create_ssl_vpn_conn(self, ctx): - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - conn = ctx['sslvpnconns'][0]['connection'] - cidr = ctx['service']['cidr'] - - conn_cmds = cmds['create'] - - conn_cmds[0] = conn_cmds[0] % ('vtun0') - conn_cmds[1] = conn_cmds[1] % ('vtun0') - conn_cmds[2] = conn_cmds[2] % ( - 'vtun0', conn['client_address_pool_cidr']) - conn_cmds[3] = conn_cmds[3] % ('vtun0') - conn_cmds[4] = conn_cmds[4] % ('vtun0') - conn_cmds[5] = conn_cmds[5] % ('vtun0') - conn_cmds[6] = conn_cmds[6] % ('vtun0') - conn_cmds[7] = conn_cmds[7] % ('vtun0', cidr) - conn_cmds[8] = conn_cmds[8] % ('vtun0') - #conn_cmds[9] = conn_cmds[9] % ('vtun0', conn['stitching_fixed_ip']) - - self._set_commands(conn_cmds) - - def _ssl_vpn_push_route(self, route): - - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - conn_cmds = cmds['create'] - route_cmds = [''] - - route_cmds[0] = conn_cmds[7] % ('vtun0', route['route']) - self._set_commands(route_cmds) - - def configure_static_route(self, action, cidr, gateway_ip): - if action == "set": - route_cmd = ("%s protocols static route %s next-hop" - " %s distance 1" % (action, cidr, gateway_ip)) - else: - route_cmd = "%s protocols static route %s" %(action, cidr) - # The config module we use everywhere else is not used here - # because of the issue mentioned here: - # http://vyatta38.rssing.com/chan-10627532/all_p7.html - # Note: The issue is inconsistent, but not seen anymore with this - # new approach of setting configuration - utils._alternate_set_and_commit(route_cmd) - #session.setup_config_session() - #self._set_commands([route_cmd]) - #session.commit() - #time.sleep(2) - #session.teardown_config_session() - return OP_SUCCESS - - def _get_all_ifs(self): - max_possible = 128 # arbitrary. raise if needed. - bytes = max_possible * 32 - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - names = array.array('B', '\0' * bytes) - outbytes = struct.unpack('iL', fcntl.ioctl( - s.fileno(), - 0x8912, # SIOCGIFCONF - struct.pack('iL', bytes, names.buffer_info()[0]) - ))[0] - namestr = names.tostring() - lst = [] - for i in range(0, outbytes, 40): - name = namestr[i:i+16].split('\0', 1)[0] - ip = namestr[i+20:i+24] - lst.append((name, ip)) - return lst - - def _format_ip(self, addr): - return str(ord(addr[0])) + '.' + \ - str(ord(addr[1])) + '.' + \ - str(ord(addr[2])) + '.' + \ - str(ord(addr[3])) - - def _get_if_details_by_cidr(self, cidr): - """ - Get interface name and ip address which is in the - given cidr - """ - # It is observed sometimes that infs take time to get ip address - logger.info("IPSec: get interface ip and name for cidr %s." % cidr) - retry_count = 0 - while True: - ifs = self._get_all_ifs() - for inf in ifs: - ifname = inf[0] - if 'v' in ifname: - continue - ip = self._format_ip(inf[1]) - if IPAddress(ip) in IPNetwork(cidr): - logger.info("Found interface %s for cidr %s" % (ifname, - cidr)) - return ifname, ip - if retry_count < 10: - time.sleep(1) - retry_count += 1 - continue - break - - raise NoInterfaceOnCidr(cidr=cidr) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log deleted file mode 100644 index 25c48e9e1a..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos-oc-log +++ /dev/null @@ -1,24 +0,0 @@ -/var/log/oc/vyos_monitor { - weekly - rotate 12 - size 10M - compress - delaycompress - missingok - notifempty - create 644 vyos users -} -/var/log/oc/oc-vyos.log { - monthly - rotate 12 - size 10M - compress - delaycompress - missingok - notifempty - create 644 vyos users - postrotate - sudo /etc/init.d/oc-vyos restart - endscript -} - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py deleted file mode 100644 index 3cf064c37b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_dhc.py +++ /dev/null @@ -1,16 +0,0 @@ -import netifaces -import shlex -import subprocess - - -def initiate_dhclient(): - interfaces = netifaces.interfaces() - for interface in interfaces: - cmd = "sudo dhclient %s" % interface - args = shlex.split(cmd) - if not netifaces.ifaddresses(interface).get(netifaces.AF_INET): - output, error = subprocess.Popen( - args, stdout=subprocess.PIPE, - stderr=subprocess.PIPE).communicate() - if error: - raise diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py deleted file mode 100644 index 3ffa2486ad..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_exception.py +++ /dev/null @@ -1,17 +0,0 @@ -class OCException(Exception): - """ - """ - status_code = 400 - - def __init__(self, message, status_code=None, payload=None): - Exception.__init__(self) - self.message = message - if status_code: - self.status_code = status_code - self.payload = payload - - def to_dict(self): - rv = dict(self.payload or ()) - rv["message"] = self.message - return rv - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py deleted file mode 100644 index 3bbdaabb2f..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/oc_config_server/vyos_policy_based_routes.py +++ /dev/null @@ -1,248 +0,0 @@ -import copy -import json -import logging -import netifaces -import subprocess -import netaddr -import time - -from execformat.executor import session -from operations import configOpts -from vyos_session import utils - - -ROUTING_TABLE_BASE = 10 - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -VYOS_PBR_COMMANDS = { - 'policy_route': [ - 'set policy route %s rule %s protocol all', - 'set policy route %s rule %s set table %s', - 'set policy route %s rule %s source address %s'], - 'table_route': [ - 'set protocols static table %s route %s next-hop %s'], - 'interface_pbr': [ - 'set interfaces ethernet %s policy route %s'], - 'delete': [ - 'delete interfaces ethernet %s policy route %s', - 'delete policy route %s', - 'delete protocols static table %s'], - 'show': [ - 'show policy route %s', - 'show protocols static table %s', - 'show interfaces ethernet %s policy route']} - - -class RoutesConfigHandler(configOpts): - def __init__(self): - super(RoutesConfigHandler, self).__init__() - self.vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" - - def _run_command(self, command): - try: - exec_pipe = subprocess.Popen(command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - except Exception as err: - message = 'Executing command %s failed with error %s' %(command, err) - logger.error(message) - return False - - cmd_output, cmd_error = exec_pipe.communicate() - if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' %(command, cmd_error) - logger.error(message) - return False - else: - logger.debug('command output: %s', cmd_output) - return True - - def _begin_command(self): - begin_cmd = "%s begin" %(self.vyos_wrapper) - if self._run_command(begin_cmd): - return True - else: - return False - - def _discard_changes(self): - discard_cmd = "%s discard" %(self.vyos_wrapper) - if self._run_command(discard_cmd): - return True - else: - return False - - def _set_commands(self, cmds): - for cmd in cmds: - set_cmd = "%s %s" %(self.vyos_wrapper, cmd) - if not self._run_command(set_cmd): - return False - return True - - def _commit_command(self): - commit_cmd = "%s commit" %(self.vyos_wrapper) - if self._run_command(commit_cmd): - return True - else: - return False - - def _save_command(self): - save_cmd = "%s save" % (self.vyos_wrapper) - if self._run_command(save_cmd): - return True - else: - return False - - def _configure_vyos(self, configure_commands): - if not self._begin_command(): - logger.error("Starting a vyos session failed") - return False - - if not self._set_commands(configure_commands): - logger.error("Executing commands %s failed" %(configure_commands)) - self._discard_changes() - return False - - if not self._commit_command(): - logger.error("Committing %s failed" %(configure_commands)) - self._discard_changes() - return False - - if not self._save_command(): - logger.error("Saving %s failed" %(configure_commands)) - self._discard_changes() - return False - - return True - - def _configure_policy_route(self, source_cidr, gateway_ip, - source_interface): - try: - interface_number_string = source_interface.split("eth",1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) - msg = "Wrong interface %s retrieved for source %s" %( - source_interface, source_cidr) - raise Exception(msg) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - pbr_name = "%s_%s" %("pbr", source_interface) - cmds = copy.deepcopy(VYOS_PBR_COMMANDS) - pbr_commands = [] - pbr_commands.append(cmds['policy_route'][0] % (pbr_name, "1")) - pbr_commands.append(cmds['policy_route'][1] % ( - pbr_name, "1", routing_table_number)) - pbr_commands.append( - cmds['policy_route'][2] % (pbr_name, "1", source_cidr)) - - pbr_commands.append(cmds['table_route'][0] %( - routing_table_number, "0.0.0.0/0", gateway_ip)) - - pbr_commands.append( - cmds['interface_pbr'][0] %(source_interface, pbr_name)) - - if not self._configure_vyos(pbr_commands): - logger.error("Configuring Policy Based Routing failed") - raise Exception("Pbr failed %s" % pbr_commands) - else: - return True - - def add_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - gateway_ip = route_info['gateway_ip'] - source_interface = self._get_if_name_by_cidr(source_cidr) - try: - self._delete_policy_route(source_cidr, source_interface) - except Exception as err: - logger.debug("Trying to clear any existing routes before " - "setting source routing failed with error: %s" - %(err)) - try: - self._configure_policy_route( - source_cidr, gateway_ip, source_interface) - except Exception as err: - message = ("Configuring Policy based route failed. " - "Error: %s" %(err)) - raise Exception(message) - return json.dumps(dict(status=True)) - - # FIXME: When invoked on delete path we have to propagate the error - def _delete_policy_route(self, source_cidr, source_interface): - try: - interface_number_string = source_interface.split("eth",1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) - msg = "Wrong interface %s retrieved for source %s" %( - source_interface, source_cidr) - raise Exception(msg) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - pbr_name = "%s_%s" %("pbr", source_interface) - cmds = copy.deepcopy(VYOS_PBR_COMMANDS) - - delete_pbr_commands = [] - delete_pbr_commands.append(cmds['delete'][0] % ( - source_interface, pbr_name)) - if not self._configure_vyos(delete_pbr_commands): - logger.warn("Deleting PBR failed") - - delete_pbr_commands = [] - delete_pbr_commands.append(cmds['delete'][1] % (pbr_name)) - if not self._configure_vyos(delete_pbr_commands): - logger.warn("Deleting PBR failed") - - delete_pbr_commands = [] - delete_pbr_commands.append(cmds['delete'][2] % (routing_table_number)) - if not self._configure_vyos(delete_pbr_commands): - logger.warn("Deleting PBR failed") - - return - - def delete_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - source_interface = self._get_if_name_by_cidr(source_cidr, - delete=True) - if source_interface: - self._delete_policy_route(source_cidr, source_interface) - return json.dumps(dict(status=True)) - - def _get_if_name_by_cidr(self, cidr, delete=False): - interfaces = netifaces.interfaces() - retry_count = 0 - while True: - all_interfaces_have_ip = True - for interface in interfaces: - inet_list = netifaces.ifaddresses(interface).get( - netifaces.AF_INET) - if not inet_list: - all_interfaces_have_ip = False - for inet_info in inet_list or []: - netmask = inet_info.get('netmask') - ip_address = inet_info.get('addr') - subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): - return interface - ip_address_netmask = '%s/%s' %(ip_address, netmask) - interface_cidr = netaddr.IPNetwork(ip_address_netmask) - if str(interface_cidr.cidr) == cidr: - return interface - # Sometimes the hotplugged interface takes time to get IP - if not all_interfaces_have_ip: - if retry_count < 15: - if delete: - return None - time.sleep(2) - retry_count = retry_count + 1 - continue - else: - raise Exception("Some of the interfaces do not have " - "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh deleted file mode 100755 index a3aab4d1f1..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/op_commands.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/vbash -cmd1="$1" -source /opt/vyatta/etc/functions/script-template -eval "$cmd1" -echo $? -#run show vpn ipsec sa diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl deleted file mode 100644 index 5c6317a604..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vpn_op_commands.pl +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl - -#Usage: sudo perl op_commands.pl get_tunnel_state peer_ip tunnel-id - - -use lib "/opt/vyatta/share/perl5/"; -use Vyatta::VPN::OPMode; -use Data::Dumper qw(Dumper); - -sub get_ipsec_tunnel_count { - my @args = @_; - - my $peer = $args[1]; - my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); - $DB::single = 1; - my $count = $#tunnel_hash; - $count = ($count + 1)/2; - print "tunnels=$count"; - return $count; -} - -sub get_ipsec_tunnel_idx { - my @args = @_; - - my $peer = $args[1]; - my $lcidr = $args[2]; - my $pcidr = $args[3]; - - my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); - my $count = ($#tunnel_hash + 1)/2; - $DB::single = 1; - for my $i (0..$count) { - my $tun = $tunnel_hash[$i+1]; - my $lsnet = $tun->{_lsnet}; - my $rsnet = $tun->{_rsnet}; - if ($lcidr == $lsnet && $pcidr == $rsnet) { - print "tunnel=$tun->{_tunnelnum} \n"; - return $tun->{_tunnelnum}; - } - } - print "tunnel=-1"; - return -1; -} - -sub get_ipsec_tunnel_state { - my @args = @_; - - #args[0] will be subroutine name - - my $peer = $args[1]; - my $tunnel = $args[2]; - - my $tunidx = $tunnel + $tunnel - 1; - my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); - - my $state = $tunnel_hash[$tunidx]->{_state}; - - print "state=$state\n"; - - return $state -} - -#print Dumper \@ARGV; - -my $call=$ARGV[0]; -$call->(@ARGV); diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos deleted file mode 100755 index 850a85e5ed..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/oc-vyos +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh -# -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA -# -### BEGIN INIT INFO -# Provides: oc-vyos -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: OC vyos service -# Description: Provides the oc-vyos service -### END INIT INFO -set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos -DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services -ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos -fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services -. /lib/lsb/init-functions -export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp -if [ ! -x ${DAEMON} ] ; then -exit 0 -fi -case "$1" in -start) -test "$ENABLED" = "true" || exit 0 -start=1 -## check if pidfile is there -if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi -fi -if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting oc vyos" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? -else -echo "oc-vyos[$pid] is already running" -fi -;; -stop) -test "$ENABLED" = "true" || exit 0 -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping oc vyos" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" -fi -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -;; -restart|force-reload) -test "$ENABLED" = "true" || exit 1 -$0 stop -sleep 2 -$0 start -;; -reload) -test "$ENABLED" = "true" || exit 0 -## check if pidfile is there -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading oc vyos" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "oc vyos is not running or PID file not existing" -fi -;; -status) -test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? -;; -*) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" -exit 1 -;; -esac -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn deleted file mode 100644 index 2cb8fe4762..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_init_script/restart_vpn +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/vbash -sudo rm /var/run/pluto.pid -vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py deleted file mode 100644 index 3ed9fd0f30..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py deleted file mode 100644 index 9b0e666e66..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/configsession.py +++ /dev/null @@ -1,146 +0,0 @@ -import os -from uuid import uuid4 -from utils import get_config_params, _run, clean_environ, init_logger -import logging - -logger = logging.getLogger(__name__) -init_logger(logger) - -VYOS_SHELL_API = get_config_params('bin', 'shell_api_path') -VYOS_SBIN_DIR = get_config_params('bin', 'vyos_sbin_dir') -VYOS_SAVE_SCRIPT = 'vyatta-save-config.pl' - -# Create/Get the logger object -# logger = init_logger() - - -class SessionAlreadyExists(Exception): pass -class SetupSessionFailed(Exception): pass -class OperationFailed(Exception): pass -class SessionNotExists(Exception): pass - - -class Session(object): - """ - Return the session instance if exists. Else, create new one. - SessionAlreadyExists exception raised on the second instantiation. - """ - _ref = None - - def __new__(cls, *args, **kw): - if cls._ref is not None: - raise SessionAlreadyExists('A session exist already !') - cls._ref = super(Session, cls).__new__(cls, *args, **kw) - return cls._ref - - -class ConfigSession(Session): - """ - Create and manage a Vyos config session. - This is a singleton subclass of Session class which ensures that one and - one config session only is opened. - To create instance you have to call setup_config_session() method. - """ - - def setup_config_session(self): - """ - Setup vyos session. A random uuid is generated as a sesssion identifier - ($PPID -Shell PID- could be used as well). - """ - - identifier = uuid4() - env = dict() - env['VYATTA_CHANGES_ONLY_DIR'] = \ - '/opt/vyatta/config/tmp/changes_only_{0}'.format(identifier) - env['VYATTA_CONFIG_TEMPLATE'] = '/opt/vyatta/share/vyatta-cfg/templates' - env['VYATTA_ACTIVE_CONFIGURATION_DIR'] = '/opt/vyatta/config/active' - env['VYATTA_EDIT_LEVEL'] = '/' - env['VYATTA_TEMP_CONFIG_DIR'] = '/opt/vyatta/config/tmp/new_config_{' \ - '0}'.format(identifier) - env['VYATTA_TEMPLATE_LEVEL'] = '/' - env['VYATTA_CONFIG_TMP'] = '/opt/vyatta/config/tmp/tmp_{0}'.format( - identifier) - # Add vyos session environment to system environment. - # This is not good but actually it seems that is the only way to - # handle a persistant vyos session after spawning a shell. - os.environ.update(env) - logger.info('Setting up a configuration session for Vyos') - # Spawn shell and setup vyos config session - if _run('{0} setupSession'.format(VYOS_SHELL_API)): - # Unset vyos session environment and raise an exception - logger.error('Could not create configuration session') - logger.info('Cleaning up session environment variables') - clean_environ(env) - raise SetupSessionFailed('Could not create session !') - self.session_id = identifier - self.session_envs = env - logger.debug('Session identifier is %s', identifier) - logger.debug('Session environment variables: %s', env) - logger.info('Configuration session is set up') - return True - - def session_exists(self): - """ - Test if a vyos config session is set up - """ - return False if _run('{0} inSession'.format(VYOS_SHELL_API)) else True - - def teardown_config_session(self): - """ - End current configuration session. - """ - if not self.session_exists(): - logger.warn('Teardown failed. No session available !') - return False - - if not _run('{0} teardownSession'.format(VYOS_SHELL_API)): - logger.info('Cleaning up session environment variables') - logger.info('Closing Vyos config session') - clean_environ(self.session_envs) - return True - - logger.error('Failed to teardown current config session') - logger.warn('The Vyos config session may still open !') - return False - - def session_changed(self): - """ - Returns if Vyos configuration was changed from current session - """ - if _run('{0} sessionChanged'.format(VYOS_SHELL_API)): - return False - logger.warn('Vyos configuration was changed from current session') - return True - - def commit(self): - """ - Returns True if commit action succeed. False otherwise. - """ - out = _run(os.path.join(VYOS_SBIN_DIR ,'my_commit -l'), output=True) - if not out: - logger.error('Commit changes failed') - raise OperationFailed('[ERROR] Commit changes failed !') - logger.info('Changes successfully commited') - return True - - def discard(self): - """ - Undo config modifications - """ - out = _run(os.path.join(VYOS_SBIN_DIR ,'my_discard'), output=True) - if not out: - raise OperationFailed('[ERROR] Discard changes failed !') - # return out.splitlines()[0] - return out - - def save(self): - """ - Save applied modifications. Changes still persistent even after - system reboot. - """ - out = _run(os.path.join(VYOS_SBIN_DIR, VYOS_SAVE_SCRIPT), output=True) - if not out: - logger.error('Saving changes failed') - raise OperationFailed('[ERROR] Save changes failed !') - logger.info('%s', out) - return True diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py deleted file mode 100644 index 6dc579aae2..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/deb-packages/oc-vyos-2-31/usr/share/vyos-oc/vyos_session/utils.py +++ /dev/null @@ -1,173 +0,0 @@ -import ConfigParser -import subprocess -import os -import logging -import logging.handlers as handlers - -# In production environment CONFIG_DIR should be /etc/pyatta/ -CONFIG_DIR = "/usr/share/vyos-oc" -CONFIG_FILE_NAME = "oc-vyos.conf" -AVAILABLE_LOG_LEVELS = ['DEBUG','INFO','WARN','ERROR','CRITICAL'] -DEFAULT_LOG_LEVEL = 'INFO' - -logger = logging.getLogger(__name__) - - -def get_config_params(section, key): - """ - To get specific parameters valuers from config file - """ - config = ConfigParser.SafeConfigParser() - config.readfp(open(os.path.join(CONFIG_DIR, CONFIG_FILE_NAME))) - return config.get(section, key) - - -def get_log_level(): - """ - Get and check log level value from pyatta.conf file. - """ - log_level = get_config_params('log', 'level') - if log_level not in AVAILABLE_LOG_LEVELS: - print('[ERROR] Unknown log level !') - return DEFAULT_LOG_LEVEL - return log_level - - -def get_log_filehandler(): - """ - Create file handler which logs messages. - """ - log_dir = get_config_params('log', 'logdir') - log_file = get_config_params('log', 'logfile') - log_file_path = os.path.join(log_dir, log_file) - if not os.path.exists(log_dir) or not os.path.exists(log_file_path): - try: - os.makedirs(log_dir) - open(log_file_path, 'a').close() - except OSError as exception: - print exception - return False - print "[INFO] Create log file %s" % log_file_path - # create file handler - fh = logging.FileHandler(log_file_path,'a') - fh.setLevel(eval('logging.{0}'.format(get_log_level()))) - return fh - - -def init_logger(logger): - """ - Initialize logger object for logging application's activities to a - specific file. - """ - # create logger - logger.setLevel(eval('logging.{0}'.format(get_log_level()))) - # create formatter and add it to the handlers - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - ' - '%(message)s') - file_handler = get_log_filehandler() - file_handler.setFormatter(formatter) - # add the handlers to the logger - logger.addHandler(file_handler) - - formatter = logging.Formatter('vyos %(name)s %(funcName)s() %(levelname)s ' - '%(message)s') - sys_handler = handlers.SysLogHandler(address=('localhost', 514)) - sys_handler.setFormatter(formatter) - sys_handler.setLevel(logging.DEBUG) - logger.addHandler(sys_handler) - - -def _run(cmd, output=False): - """ - To run command easier - """ - # FIXME: This whole code taken from someones personal github implementation - # is really messy !!!! - if output: - try: - logger.debug('exec command: "%s"', cmd) - exec_pipe = subprocess.Popen(cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - except Exception as err: - message = 'Executing command %s failed with error %s' %(cmd, err) - logger.error(message) - return False - - cmd_output, cmd_error = exec_pipe.communicate() - # VPN commits succeed but we are getting perl locale warnings on stderr - if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s. Output is: %s'%(cmd, cmd_error, cmd_output) - logger.error(message) - return False - else: - logger.debug('command output: %s', cmd_output) - return True - else: - try: - logger.debug('exec command: "%s"', cmd) - out = subprocess.check_call(cmd, shell=True) # returns 0 for True - except subprocess.CalledProcessError as err: - logger.error('command execution failed with Error: %s', err) - out = 1 # returns 1 for False - logger.debug('command return code: %s', out) - return out - -# Alternate implementation for configuring vyos - The whole pyatta module -# is replaced with this one method. This was required top fix the following -# issue :http://vyatta38.rssing.com/chan-10627532/all_p7.html -# Not sure if the other commands also may fails or if there is an issue with -# the way the config module does things -def _alternate_set_and_commit(cmd): - try: - vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" - begin_cmd = "%s begin" %(vyos_wrapper) - set_cmd = "%s %s" %(vyos_wrapper, cmd) - commit_cmd = "%s commit" %(vyos_wrapper) - save_cmd = "%s save" % (vyos_wrapper) - end_cmd = "%s end" %(vyos_wrapper) - command = "%s;%s;%s;%s;%s" % (begin_cmd, set_cmd, commit_cmd, save_cmd, - end_cmd) - logger.debug('exec command: "%s"', command) - exec_pipe = subprocess.Popen(command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - except Exception as err: - message = 'Executing command %s failed with error %s' %(command, err) - logger.error(message) - return False - - cmd_output, cmd_error = exec_pipe.communicate() - # VPN commits succeed but we are getting perl locale warnings on stderr - if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' %(command, cmd_error) - logger.error(message) - return False - else: - logger.debug('command output: %s', cmd_output) - return True - -def clean_environ(env): - """ - Delete some envionment variables from system. - """ - for key in env.keys(): - if os.environ.get('key'): del os.environ[key] - - -def ip2network(ip): - quads = ip.split('.') - netw = 0 - for i in range(4): - netw = (netw << 8) | int(len(quads) > i and quads[i] or 0) - return netw - - -def get_ip_address_with_netmask(ip, netmask): - prefix = bin(ip2network(netmask)).count('1') - ip_addr = ip + "/" + str(prefix) - return ip_addr - - -# initilize the logger for this module -init_logger(logger) From 30eb40c1a47051f6ece1fa921bef52ee451f06f6 Mon Sep 17 00:00:00 2001 From: "aijaz.baig" Date: Wed, 29 Jun 2016 16:06:49 +0530 Subject: [PATCH 003/157] Added missing bin/ folder --- .../vyos/oc-vyos/bin/oc-vyos | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos new file mode 100755 index 0000000000..353b6f4b21 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# +# One Convergence, Inc. CONFIDENTIAL +# Copyright (c) 2012-2014, One Convergence, Inc., USA +# All Rights Reserved. +# +# All information contained herein is, and remains the property of +# One Convergence, Inc. and its suppliers, if any. The intellectual and +# technical concepts contained herein are proprietary to One Convergence, +# Inc. and its suppliers. +# +# Dissemination of this information or reproduction of this material is +# strictly forbidden unless prior written permission is obtained from +# One Convergence, Inc., USA +# + +import sys + +#sys.path.append("/home/vikash/vyos-oc") +sys.path.append("/usr/share/vyos-oc") + +from oc_config_server.server2 import main +#sys.argv=[__name__, '-h', '0', '-p', 8888] +main() + From 0181b438bcbea2e478a06f4087d9977392590983 Mon Sep 17 00:00:00 2001 From: "aijaz.baig" Date: Wed, 29 Jun 2016 17:02:11 +0530 Subject: [PATCH 004/157] Image Builder >> Added fix for docker load inside VM >> Added a sleep after docker daemon is started and before invoking docker load inside VM --- .../elements/configurator/extra-data.d/49-cp | 2 +- .../elements/configurator/post-install.d/01-configurator | 1 + .../elements/configurator/post-install.d/03-docker-load | 8 +++++++- .../configurator/post-install.d/06-del-docker-images | 1 + .../elements/visibility/extra-data.d/49-cp | 2 +- .../elements/visibility/post-install.d/01-visibility | 1 + .../elements/visibility/post-install.d/03-docker-load | 8 +++++++- .../visibility/post-install.d/06-del-docker-images | 2 +- 8 files changed, 20 insertions(+), 5 deletions(-) diff --git a/gbpservice/tests/contrib/diskimage-create/elements/configurator/extra-data.d/49-cp b/gbpservice/tests/contrib/diskimage-create/elements/configurator/extra-data.d/49-cp index 23def73920..67bfe10212 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/configurator/extra-data.d/49-cp +++ b/gbpservice/tests/contrib/diskimage-create/elements/configurator/extra-data.d/49-cp @@ -1,5 +1,5 @@ #!/bin/bash -set -eu +set -eux # create 'images' directory to hold docker images sudo mkdir -p ${TMP_MOUNT_PATH}/usr/share/configurator/docker/images diff --git a/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/01-configurator b/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/01-configurator index c6941b42c6..62eb3ffd0d 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/01-configurator +++ b/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/01-configurator @@ -1,4 +1,5 @@ #!/bin/bash +set -eux apt-get -y --force-yes install apt-transport-https ca-certificates apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D diff --git a/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/03-docker-load b/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/03-docker-load index 7460f14134..4f455d449a 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/03-docker-load +++ b/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/03-docker-load @@ -1,5 +1,11 @@ #!/bin/bash +set -eux -# start docker and load the configurator image +# start docker for loading the configurator image docker daemon --raw-logs & + +# wait for docker daemon to come up +sleep 10 + +# preload the docker image inside the VM docker load -i /usr/share/configurator/docker/images/configurator-docker diff --git a/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/06-del-docker-images b/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/06-del-docker-images index 7172b1ad0d..9712156589 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/06-del-docker-images +++ b/gbpservice/tests/contrib/diskimage-create/elements/configurator/post-install.d/06-del-docker-images @@ -1,4 +1,5 @@ #!/bin/bash +set -eux # since we already did a docker load, we can delete docker images diff --git a/gbpservice/tests/contrib/diskimage-create/elements/visibility/extra-data.d/49-cp b/gbpservice/tests/contrib/diskimage-create/elements/visibility/extra-data.d/49-cp index de568f40b6..fb1558f8b9 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/visibility/extra-data.d/49-cp +++ b/gbpservice/tests/contrib/diskimage-create/elements/visibility/extra-data.d/49-cp @@ -1,5 +1,5 @@ #!/bin/bash -set -eu +set -eux # create SCUI directory sudo mkdir -p ${TMP_MOUNT_PATH}/usr/share/SCUI diff --git a/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/01-visibility b/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/01-visibility index 233b0f3a16..ba402c312c 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/01-visibility +++ b/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/01-visibility @@ -1,4 +1,5 @@ #!/bin/bash +set -eux apt-get -y --force-yes install apt-transport-https ca-certificates apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D diff --git a/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/03-docker-load b/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/03-docker-load index 667fde8802..6e4e311b8a 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/03-docker-load +++ b/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/03-docker-load @@ -1,7 +1,13 @@ #!/bin/bash +set -eux -# start docker and load the configurator image +# start docker for loading docker images inside VM docker daemon --raw-logs & + +# wait for docker daemon to come up +sleep 10 + +# preload the docker images inside VM docker load -i /usr/share/SCUI/docker/images/configurator-docker docker load -i /usr/share/SCUI/docker/images/visibility-docker docker load -i /usr/share/SCUI/docker/images/elastic diff --git a/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/06-del-docker-images b/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/06-del-docker-images index 031dac6cdb..9527385474 100755 --- a/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/06-del-docker-images +++ b/gbpservice/tests/contrib/diskimage-create/elements/visibility/post-install.d/06-del-docker-images @@ -1,5 +1,5 @@ #!/bin/bash - +set -eux # since we already did a docker load, we can delete docker images rm -rf /usr/share/SCUI/docker/images/ From 008bf9e58e37b5835ec6b98bec0e9a60bc107a2c Mon Sep 17 00:00:00 2001 From: "aijaz.baig" Date: Wed, 29 Jun 2016 17:27:54 +0530 Subject: [PATCH 005/157] VyOS Image Builder >> Added support for building VyOS image into devstack script --- devstack/lib/nfp | 5 +- .../diskimage-create/vyos/customize_vyos.sh | 78 +++++++ .../contrib/diskimage-create/vyos/packer.json | 82 +++++++ .../diskimage-create/vyos/vyos_conf.json | 7 + .../vyos/vyos_image_create.py | 201 ++++++++++++++++++ 5 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh create mode 100644 gbpservice/tests/contrib/diskimage-create/vyos/packer.json create mode 100644 gbpservice/tests/contrib/diskimage-create/vyos/vyos_conf.json create mode 100644 gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 4385bf25a6..e490f35460 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -97,7 +97,10 @@ function create_nfp_image { VyosQcow2ImageName=vyos if [[ $VyosQcow2Image = build ]]; then echo "Building Image: $VyosQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/vyos_conf.json + cur_dir=$PWD + cd $DISK_IMAGE_DIR/diskimage-create/vyos/ + python vyos_image_create.py vyos_conf.json + cd $cur_dir VyosQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $VyosQcow2ImageName" diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh new file mode 100644 index 0000000000..dbdcf0019c --- /dev/null +++ b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh @@ -0,0 +1,78 @@ +#!/bin/vbash +source /opt/vyatta/etc/functions/script-template + +# set rules +set firewall all-ping 'enable' +set firewall broadcast-ping 'disable' +set firewall config-trap 'disable' +set firewall ipv6-receive-redirects 'disable' +set firewall ipv6-src-route 'disable' +set firewall ip-src-route 'disable' +set firewall log-martians 'enable' +set firewall receive-redirects 'disable' +set firewall send-redirects 'enable' +set firewall source-validation 'disable' +set firewall syn-cookies 'enable' +set firewall twa-hazards-protection 'disable' +set 'policy' +set protocols 'static' +#set system config-management commit-revisions '20' +#set system console device ttyS0 speed '9600' +#set system syslog global facility all level 'notice' +#set system syslog global facility protocols level 'debug' + + +# delete non-working repository +delete system package repository community +# Add squeeze repository for downloading dependent packages +set system package repository squeeze components 'main contrib non-free' +set system package repository squeeze distribution 'squeeze' +set system package repository squeeze url 'http://archive.debian.org/debian' +set system package repository squeeze-lts components 'main contrib non-free' +set system package repository squeeze-lts distribution 'squeeze-lts' +set system package repository squeeze-lts url 'http://archive.debian.org/debian' +# set local repo +set system package repository vyos components '#' +set system package repository vyos distribution 'amd64/' +set system package repository vyos url 'http://192.168.122.1/vyos/' + +# change password +set system login user vyos authentication plaintext-password $VYOS_PASSWORD +commit +save + +# update the repo +sudo apt-get -o Acquire::Check-Valid-Until=false update +# install dependent packages +sudo apt-get -y install python-netifaces python-flask python-netaddr + +# get oc-vyos package +sudo apt-get -y --force-yes install oc-vyos + +set system task-scheduler task health-monitor executable path '/usr/share/vyos-oc/oc_config_server/interface_monitor.sh' +set system task-scheduler task health-monitor interval '5m' + +# delete the local repo +delete system package repository vyos + +# commit and save the above changes +commit +save +exit + +# edit /etc/network/interfaces file as required by vyos agent +# make 'static' to all interfaces except eth0 +sudo sed -i 's/inet dhcp/inet static/g' /etc/network/interfaces +sudo sed -i 's/eth0 inet static/eth0 inet dhcp/g' /etc/network/interfaces + +# copy the missing pl files +sudo cp /opt/vyatta/sbin/vyatta-firewall-trap.pl / +sudo cp /opt/vyatta/sbin/valid_port_range.pl / +sudo cp /opt/vyatta/sbin/vyatta-firewall.pl / +sudo cp /opt/vyatta/sbin/vyatta-fw-global-state-policy.pl / +sudo cp /opt/vyatta/sbin/vyatta-ipset.pl / + +# free up disk space +sudo rm -rf /var/lib/apt/lists +sudo apt-get clean +sudo apt-get autoclean diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/packer.json b/gbpservice/tests/contrib/diskimage-create/vyos/packer.json new file mode 100644 index 0000000000..55bfc39039 --- /dev/null +++ b/gbpservice/tests/contrib/diskimage-create/vyos/packer.json @@ -0,0 +1,82 @@ +{ + "builders": [ + { + "accelerator": "kvm", + "boot_command": [ + "", + "vyos", + "vyos", + "install image", + "", + "", + "", + "Yes", + "", + "", + "", + "vyos", + "vyos", + "", + "reboot", + "Yes", + "vyos", + "vyos", + "configure", + "set interface ethernet eth0 address dhcp", + "set service ssh", + "commit", + "save", + "delete interface ethernet eth0 hw-id", + "commit", + "save", + "exit" + ], + "boot_wait": "5s", + "disk_compression": true, + "disk_interface": "virtio", + "disk_size": 4096, + "format": "qcow2", + "headless": true, + "iso_checksum": "{{user `iso_checksum`}}", + "iso_checksum_type": "md5", + "iso_url": "{{user `iso_url`}}", + "name": "qemu-image", + "net_device": "virtio-net", + "output_directory": "./output", + "qemuargs": [ + [ + "-m", + "1024" + ] + ], + "shutdown_command": "sudo halt -p", + "ssh_host_port_max": 2229, + "ssh_host_port_min": 2222, + "ssh_password": "vyos", + "ssh_port": 22, + "ssh_username": "vyos", + "ssh_wait_timeout": "300s", + "type": "qemu", + "vm_name": "vyos.qcow2" + } + ], + "provisioners": [ + { + "environment_vars": [ + "VYOS_PASSWORD={{user `vyos_passwd`}}" + ], + "only": [ + "qemu-image" + ], + "scripts": [ + "./customize_vyos.sh" + ], + "type": "shell" + } + ], + "variables": { + "iso_checksum": "{{env `ISO_MD5_SUM`}}", + "iso_url": "{{env `ISO_IMAGE`}}", + "vyos_passwd": "{{env `VYOS_PASSWORD`}}" + } +} \ No newline at end of file diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_conf.json b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_conf.json new file mode 100644 index 0000000000..71b62c60d2 --- /dev/null +++ b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_conf.json @@ -0,0 +1,7 @@ +{ + "packer": + { + "image_size":4, + "vyos_pswd":"oc@sc!23;)" + } +} diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py new file mode 100644 index 0000000000..d76a358468 --- /dev/null +++ b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py @@ -0,0 +1,201 @@ +import sys +import os +import json +import subprocess +import commands +import datetime +import requests + + +conf = [] +cur_dir = '' + +def parse_json(j_file): + global conf + + with open(j_file) as json_data: + config = json.load(json_data) + return config + + +def update_vyos_repo(): + + vyos_vendor_dir = ("%s/../../../../nfp/service_vendor_agents/vyos/" % cur_dir) + service = 'oc-vyos' + version = '2' + release = '1' + subprocess.call(['rm', '-rf', + "%s/%s/deb-packages" % (vyos_vendor_dir, service)]) + os.chdir(vyos_vendor_dir) + ret = subprocess.call(['bash', + 'build_oc_vyos_deb.sh', + service, + version, release]) + + if(ret): + print "ERROR: Unable to generate vyos agent deb package" + return 1 + + subprocess.call(["rm", "-rf", "/var/www/html/vyos"]) + subprocess.call(["mkdir", "-p", "/var/www/html/vyos/amd64"]) + vyos_agent_deb = ("%s/%s/deb-packages/%s-%s-%s.deb" + % (vyos_vendor_dir, service, + service, version, release)) + subprocess.call(["cp", vyos_agent_deb, "/var/www/html/vyos/amd64/"]) + + # update repo Packages.gz + os.chdir("/var/www/html/vyos") + out = commands.getoutput("dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz") + print out + + return 0 + +def packer_build(): + + os.chdir(cur_dir) + os.environ['VYOS_PASSWORD'] = conf['packer']['vyos_pswd'] + + # get the packer configuration + try: + conf_packer = parse_json("./packer.json") + except Exception as e: + print "ERROR: parsing ./packer.json file" + print e + return + + # packer expects VM size in MB + conf_packer['builders'][0]['disk_size'] = conf['packer']['image_size'] * 1024 + # packer exptects new output dir name for each run, packer creates the dir + #timestamp = datetime.datetime.now().strftime('%I%M%p-%d-%m-%Y') + #output_dir = "./output_" + timestamp + #conf_packer['builders'][0]['output_directory'] = output_dir + # update VM output file name + filepath = os.environ.get('ISO_IMAGE', '-1') + iso = os.path.basename(filepath) + #vm_name = iso[:-4] + '.qcow2' + #conf_packer['builders'][0]['vm_name'] = vm_name + + # update the packer.json file + with open('packer.json', 'w') as f: + json.dump(conf_packer, f, sort_keys = True, indent = 4, ensure_ascii=False) + + print "\n#########################################################" + print "Invoking packer build, this will take about 10mins......" + print "#########################################################\n" + # invoke packer build + ret = subprocess.call(["packer", "build", "packer.json"]) + if ret: + print "ERROR: packer build failed" + + ''' + # move to vyos image to output directory + old_file = output_dir + "/" + vm_name + new_file = "./output/vyos.qcow2" + ret = subprocess.call(["mv", old_file, new_file]) + if ret: + print "ERROR: unable to move file" + ''' + image_path = "%s/output/%s.qcow2" % (cur_dir, "vyos") + print("Image location: %s" % image_path) + with open("/tmp/image_path", "w") as f: + f.write(image_path) + f.close() + + return + +def check_packer_tool(): + if(os.path.isfile("/usr/local/bin/packer")): + return 0 + + # get packer tool from website + print "Downloading 'packer' tool" + ret = subprocess.call(["wget", "https://releases.hashicorp.com/packer/0.10.1/packer_0.10.1_linux_amd64.zip"]) + if ret: + print "ERROR: Unable to download packer tool" + return 1 + # unzip the file and copy packer tool to specific place + ret = subprocess.call(["unzip", "packer_0.10.1_linux_amd64.zip"]) + if ret: + return 1 + ret = subprocess.call(["cp", "packer", "/usr/local/bin/"]) + if ret: + return 1 + return 0 + +def get_vyos_iso(): + iso_path = os.environ['HOME'] + "/.cache/image-create/" + iso_file = "vyos-1.1.7-amd64.iso" + os.environ['ISO_IMAGE'] = iso_path + iso_file + os.environ['ISO_MD5_SUM'] = commands.getoutput("md5sum %s" % (iso_path + iso_file)).split(' ')[0] + if(os.path.isfile(iso_path + iso_file)): + print "VyOS iso: %s exists locally" % (iso_path + iso_file) + return 0 + + # get the output dir + if not os.path.isdir(iso_path): + os.makedirs(iso_path) + + # download iso from internet + os.chdir(iso_path) + print "Downloading VyOS 1.1.7 ISO" + iso_url = "http://packages.vyos.net/iso/release/1.1.7/vyos-1.1.7-amd64.iso" + ret = subprocess.call(["wget", iso_url]) + if ret: + return 1 + + # get sha1sum for iso from web + sha1sum_web = '' + r = requests.get("http://packages.vyos.net/iso/release/1.1.7/sha1sums") + sha1sums = r.content.splitlines() + for sums in sha1sums: + if(sums.find(iso_file)) > 0: + sha1sum_web = sums.split(' ')[0] + + # calcualte the sha1 of downloaded file + sha1sum_local = commands.getoutput("sha1sum %s" % (iso_path + iso_file)).split(' ')[0] + + if not sha1sum_web == sha1sum_local: + print "Downloaded iso file is corrupt, exiting now..." + return 1 + os.environ['ISO_MD5_SUM'] = commands.getoutput("md5sum %s" % (iso_path + iso_file)).split(' ')[0] + + return 0 + + + +if __name__ == "__main__": + + if os.geteuid(): + sys.exit("ERROR: Script should be run as sudo/root") + if len(sys.argv) != 2: + print "ERROR: Invalid Usage" + print "Usage:\n\t%s " % sys.argv[0] + print "\twhere: contains all the configuration" + exit() + # save PWD + cur_dir = os.path.dirname(__file__) + cur_dir = os.path.realpath(cur_dir) + if not cur_dir: + # if script is executed from current dir, get abs path + cur_dir = os.path.realpath('./') + + # parse args from json file + try: + conf = parse_json(sys.argv[1]) + except Exception as e: + print "ERROR parsing json file" + print e + exit() + + if(check_packer_tool()): + print "ERROR: Failed to get packer tool" + exit() + + if(get_vyos_iso()): + print "ERROR: Unable to get vyos-1.1.7-amd64.iso file" + exit() + + if(update_vyos_repo()): + exit() + + packer_build() From a47ae54239dbe6c67f8c31b21ac15aa0f6d1e94c Mon Sep 17 00:00:00 2001 From: "aijaz.baig" Date: Wed, 29 Jun 2016 17:31:54 +0530 Subject: [PATCH 006/157] VyOS Image Builder >> updated the time for VM to bootup to a safe time --- gbpservice/tests/contrib/diskimage-create/vyos/packer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/packer.json b/gbpservice/tests/contrib/diskimage-create/vyos/packer.json index 55bfc39039..34220127b0 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/packer.json +++ b/gbpservice/tests/contrib/diskimage-create/vyos/packer.json @@ -3,7 +3,7 @@ { "accelerator": "kvm", "boot_command": [ - "", + "", "vyos", "vyos", "install image", @@ -18,7 +18,7 @@ "vyos", "", "reboot", - "Yes", + "Yes", "vyos", "vyos", "configure", @@ -79,4 +79,4 @@ "iso_url": "{{env `ISO_IMAGE`}}", "vyos_passwd": "{{env `VYOS_PASSWORD`}}" } -} \ No newline at end of file +} From 26722723922b55b5a6886e26c036ae46a5f7c7f5 Mon Sep 17 00:00:00 2001 From: "aijaz.baig" Date: Wed, 29 Jun 2016 23:38:03 +0530 Subject: [PATCH 007/157] VyOS ImageBuilder >> The vyos image building scritp should be run as sudo/root --- devstack/lib/nfp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index e490f35460..c3d2fd957b 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -99,7 +99,7 @@ function create_nfp_image { echo "Building Image: $VyosQcow2ImageName" cur_dir=$PWD cd $DISK_IMAGE_DIR/diskimage-create/vyos/ - python vyos_image_create.py vyos_conf.json + sudo python vyos_image_create.py vyos_conf.json cd $cur_dir VyosQcow2Image=$(cat /tmp/image_path) fi From 21b7556e28268a5d565eb55c9f96f33c6977b2dc Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 30 Jun 2016 16:33:21 +0530 Subject: [PATCH 008/157] basic pep8 fix --- .../vyos/execformat/executor.py | 72 +++++++---- .../vyos/execformat/formator.py | 32 ++--- .../vyos/oc-vyos/bin/oc-vyos | 3 +- .../vyos/oc-vyos/src/execformat/executor.py | 72 +++++++---- .../vyos/oc-vyos/src/execformat/formator.py | 32 ++--- .../oc_config_server/edit_persistent_rule.py | 6 +- .../src/oc_config_server/fw_handler.py | 119 +++++++++--------- .../oc-vyos/src/oc_config_server/ha_config.py | 15 +-- .../src/oc_config_server/log_forwarder.py | 12 +- .../src/oc_config_server/oc_fw_module.py | 17 ++- .../src/oc_config_server/operations.py | 18 +-- .../oc_config_server/routes_config_handler.py | 67 +++++----- .../oc-vyos/src/oc_config_server/server.py | 2 +- .../oc-vyos/src/oc_config_server/server2.py | 21 ++-- .../oc-vyos/src/oc_config_server/static_ip.py | 10 +- .../src/oc_config_server/stats_parser.py | 56 +++++---- .../src/oc_config_server/vpn_api_server.py | 29 +++-- .../src/oc_config_server/vyos_exception.py | 1 - .../vyos_policy_based_routes.py | 53 ++++---- .../oc-vyos/src/vyos_session/configsession.py | 22 +++- .../vyos/oc-vyos/src/vyos_session/utils.py | 32 +++-- .../oc_config_server/edit_persistent_rule.py | 6 +- .../vyos/oc_config_server/fw_handler.py | 119 +++++++++--------- .../vyos/oc_config_server/ha_config.py | 15 +-- .../vyos/oc_config_server/log_forwarder.py | 12 +- .../vyos/oc_config_server/oc_fw_module.py | 17 ++- .../vyos/oc_config_server/operations.py | 18 +-- .../oc_config_server/routes_config_handler.py | 67 +++++----- .../vyos/oc_config_server/server.py | 2 +- .../vyos/oc_config_server/server2.py | 21 ++-- .../vyos/oc_config_server/static_ip.py | 10 +- .../vyos/oc_config_server/stats_parser.py | 56 +++++---- .../vyos/oc_config_server/vpn_api_server.py | 29 +++-- .../vyos/oc_config_server/vyos_exception.py | 1 - .../vyos_policy_based_routes.py | 53 ++++---- .../vyos/vyos_session/configsession.py | 22 +++- .../vyos/vyos_session/utils.py | 32 +++-- 37 files changed, 631 insertions(+), 540 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py index f7b2b39b0a..3827054fde 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py @@ -3,7 +3,7 @@ import subprocess import os -#sys.path.append('/home/vyos/vyos-api/project/') +# sys.path.append('/home/vyos/vyos-api/project/') from vyos_session.configsession import ConfigSession, SessionNotExists, \ SetupSessionFailed from vyos_session import utils @@ -18,23 +18,33 @@ except Exception as err: logger.error('A session exist already !') -VYOS_SBIN_DIR = utils.get_config_params('bin','vyos_sbin_dir') +VYOS_SBIN_DIR = utils.get_config_params('bin', 'vyos_sbin_dir') VYOS_SHELL_API = utils.get_config_params('bin', 'shell_api_path') -class OperationFailed(Exception): pass -class OperationNameError(Exception): pass -class ConfigPathNotCorrect(Exception): pass + +class OperationFailed(Exception): + pass + + +class OperationNameError(Exception): + pass + + +class ConfigPathNotCorrect(Exception): + pass + def check_operation_name(args): """ Check if operation/command name is correct. """ if len(args) == 0: logger.error('Operation name required') raise OperationNameError('Operation name required.') - elif args[0] not in ['show','set','delete', 'edit']: + elif args[0] not in ['show', 'set', 'delete', 'edit']: logger.error('Operation name "%s" not correct' % args[0]) raise OperationNameError('Operation name not correct.') return True + def _runner(command): """ Run shell commands via subprocess.Popen() @@ -42,22 +52,29 @@ def _runner(command): # NOTE: # if Popen(self.args, shell=True, ...) => Execution fails # if Popen(self.args, ...) => OSError: [Errno 2] No such file or directory - # if self.args = ['/bin/cli-shell-api','showCfg', ...] and Popen(self.args, ...) that works but actually we keep using ' '.join(self.args). - proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # if self.args = ['/bin/cli-shell-api','showCfg', ...] and + # Popen(self.args, ...) that works but actually we keep using ' + # '.join(self.args). + proc = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) # wait for the process to terminate and get stdout/stderr outputs out, err = proc.communicate() return out, err, proc.returncode + def _op_command(command=None): command = './op_commands.sh' command += " " + "\"run show vpn ipsec sa\"" - proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out,err = proc.communicate() + proc = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = proc.communicate() return out + class execUtils: """ Executes possible operations in a Vyos configure session.""" + def __init__(self, args): self.args = args @@ -71,27 +88,32 @@ def execmd(self, nonsession=False): logger.info('Perform operation "%s"' % operation_name) if not nonsession: - if self.args[0] == 'show': self.args[0] = '{0} showCfg'.format( - VYOS_SHELL_API) - else: self.args[0] = os.path.join(VYOS_SBIN_DIR, - 'my_{0}'.format(self.args[0])) + if self.args[0] == 'show': + self.args[0] = '{0} showCfg'.format( + VYOS_SHELL_API) + else: + self.args[0] = os.path.join(VYOS_SBIN_DIR, + 'my_{0}'.format(self.args[0])) logger.debug('exec command: "%s"' % ' '.join(self.args)) - + if not nonsession and not session.session_exists(): raise SessionNotExists('Configure session do not exists') if not nonsession: - result = _runner(' '.join(self.args)) # result = (stdout, stderr, errcode) + # result = (stdout, stderr, errcode) + result = _runner(' '.join(self.args)) else: - result = _op_command() - return (True, result) + result = _op_command() + return (True, result) logger.debug('command return code: %s' % result[2]) if result[2]: - logger.info('command output: %s' % ' '.join(result[0].splitlines())) - logger.error('Failed executing operation "%s"' % operation_name) - raise OperationFailed('Operation failed !') + logger.info('command output: %s' % + ' '.join(result[0].splitlines())) + logger.error('Failed executing operation "%s"' % + operation_name) + raise OperationFailed('Operation failed !') logger.debug('%s' % ' '.join(result[0].splitlines())) logger.info('Executing "%s" operation OK' % operation_name) return (True, result[0]) @@ -105,7 +127,7 @@ def check_cmd_args(self): logger.info('config path: "%s"' % config_path) cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # result = (stdout, stderr, errcode) + result = _runner(cmd) # result = (stdout, stderr, errcode) logger.debug('command return code: %s' % result[2]) if result[2]: logger.error('Configuration path is not correct') @@ -139,15 +161,15 @@ def get_possible_options(self): """ out = [] try: - self.check_cmd_args() # check config path validation + self.check_cmd_args() # check config path validation except ConfigPathNotCorrect: - return False, out # config path is not correct + return False, out # config path is not correct config_path = ' '.join(self.args[1:]) logger.info('Get possible options of config path "%s"' % config_path) cmd = '{0} listNodes {1}'.format(VYOS_SHELL_API, config_path) logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # rst = (stdout, stderr, errcode) + result = _runner(cmd) # rst = (stdout, stderr, errcode) logger.debug('command return code: %s' % result[2]) if not result[0]: logger.info('No more options for the specified config path') diff --git a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py index 55c41a0518..b73a6fa73d 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py @@ -8,31 +8,33 @@ from vyos_session.utils import logger from vyosparser import vyos_parser as vparser -class ServiceError(Exception): pass + +class ServiceError(Exception): + pass + class showConfig(): - def formator(self,options): - args=['show'] + + def formator(self, options): + args = ['show'] service = options[0] - logger.debug("=====>>>>>> args before executor call = %s"%args) - if service in ['protocols','nat','interfaces','firewall']: - args.extend(options) - elif service in ['dns','dhcp-server','ssh','webproxy']: - options.insert(0,'service') + logger.debug("=====>>>>>> args before executor call = %s" % args) + if service in ['protocols', 'nat', 'interfaces', 'firewall']: + args.extend(options) + elif service in ['dns', 'dhcp-server', 'ssh', 'webproxy']: + options.insert(0, 'service') args.extend(options) else: raise ServiceError('unknown such service!') - exe=executor(list(args)) + exe = executor(list(args)) try: - #if not exe.checkcmd(' '.join(args)): + # if not exe.checkcmd(' '.join(args)): # logger.error("%s: given args does not match with existing configs!"%args) # return False - execstate,output=exe.execmd() - logger.debug("=====>>>>>> args after executor call = %s"%args) + execstate, output = exe.execmd() + logger.debug("=====>>>>>> args after executor call = %s" % args) except OperationFailed, e: logger.error(e.message) return False - if execstate==True: + if execstate == True: return vparser.decode_string(output) - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos index 353b6f4b21..c4eea201e5 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos @@ -16,10 +16,9 @@ import sys -#sys.path.append("/home/vikash/vyos-oc") +# sys.path.append("/home/vikash/vyos-oc") sys.path.append("/usr/share/vyos-oc") from oc_config_server.server2 import main #sys.argv=[__name__, '-h', '0', '-p', 8888] main() - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py index f7b2b39b0a..3827054fde 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py @@ -3,7 +3,7 @@ import subprocess import os -#sys.path.append('/home/vyos/vyos-api/project/') +# sys.path.append('/home/vyos/vyos-api/project/') from vyos_session.configsession import ConfigSession, SessionNotExists, \ SetupSessionFailed from vyos_session import utils @@ -18,23 +18,33 @@ except Exception as err: logger.error('A session exist already !') -VYOS_SBIN_DIR = utils.get_config_params('bin','vyos_sbin_dir') +VYOS_SBIN_DIR = utils.get_config_params('bin', 'vyos_sbin_dir') VYOS_SHELL_API = utils.get_config_params('bin', 'shell_api_path') -class OperationFailed(Exception): pass -class OperationNameError(Exception): pass -class ConfigPathNotCorrect(Exception): pass + +class OperationFailed(Exception): + pass + + +class OperationNameError(Exception): + pass + + +class ConfigPathNotCorrect(Exception): + pass + def check_operation_name(args): """ Check if operation/command name is correct. """ if len(args) == 0: logger.error('Operation name required') raise OperationNameError('Operation name required.') - elif args[0] not in ['show','set','delete', 'edit']: + elif args[0] not in ['show', 'set', 'delete', 'edit']: logger.error('Operation name "%s" not correct' % args[0]) raise OperationNameError('Operation name not correct.') return True + def _runner(command): """ Run shell commands via subprocess.Popen() @@ -42,22 +52,29 @@ def _runner(command): # NOTE: # if Popen(self.args, shell=True, ...) => Execution fails # if Popen(self.args, ...) => OSError: [Errno 2] No such file or directory - # if self.args = ['/bin/cli-shell-api','showCfg', ...] and Popen(self.args, ...) that works but actually we keep using ' '.join(self.args). - proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # if self.args = ['/bin/cli-shell-api','showCfg', ...] and + # Popen(self.args, ...) that works but actually we keep using ' + # '.join(self.args). + proc = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) # wait for the process to terminate and get stdout/stderr outputs out, err = proc.communicate() return out, err, proc.returncode + def _op_command(command=None): command = './op_commands.sh' command += " " + "\"run show vpn ipsec sa\"" - proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out,err = proc.communicate() + proc = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = proc.communicate() return out + class execUtils: """ Executes possible operations in a Vyos configure session.""" + def __init__(self, args): self.args = args @@ -71,27 +88,32 @@ def execmd(self, nonsession=False): logger.info('Perform operation "%s"' % operation_name) if not nonsession: - if self.args[0] == 'show': self.args[0] = '{0} showCfg'.format( - VYOS_SHELL_API) - else: self.args[0] = os.path.join(VYOS_SBIN_DIR, - 'my_{0}'.format(self.args[0])) + if self.args[0] == 'show': + self.args[0] = '{0} showCfg'.format( + VYOS_SHELL_API) + else: + self.args[0] = os.path.join(VYOS_SBIN_DIR, + 'my_{0}'.format(self.args[0])) logger.debug('exec command: "%s"' % ' '.join(self.args)) - + if not nonsession and not session.session_exists(): raise SessionNotExists('Configure session do not exists') if not nonsession: - result = _runner(' '.join(self.args)) # result = (stdout, stderr, errcode) + # result = (stdout, stderr, errcode) + result = _runner(' '.join(self.args)) else: - result = _op_command() - return (True, result) + result = _op_command() + return (True, result) logger.debug('command return code: %s' % result[2]) if result[2]: - logger.info('command output: %s' % ' '.join(result[0].splitlines())) - logger.error('Failed executing operation "%s"' % operation_name) - raise OperationFailed('Operation failed !') + logger.info('command output: %s' % + ' '.join(result[0].splitlines())) + logger.error('Failed executing operation "%s"' % + operation_name) + raise OperationFailed('Operation failed !') logger.debug('%s' % ' '.join(result[0].splitlines())) logger.info('Executing "%s" operation OK' % operation_name) return (True, result[0]) @@ -105,7 +127,7 @@ def check_cmd_args(self): logger.info('config path: "%s"' % config_path) cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # result = (stdout, stderr, errcode) + result = _runner(cmd) # result = (stdout, stderr, errcode) logger.debug('command return code: %s' % result[2]) if result[2]: logger.error('Configuration path is not correct') @@ -139,15 +161,15 @@ def get_possible_options(self): """ out = [] try: - self.check_cmd_args() # check config path validation + self.check_cmd_args() # check config path validation except ConfigPathNotCorrect: - return False, out # config path is not correct + return False, out # config path is not correct config_path = ' '.join(self.args[1:]) logger.info('Get possible options of config path "%s"' % config_path) cmd = '{0} listNodes {1}'.format(VYOS_SHELL_API, config_path) logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # rst = (stdout, stderr, errcode) + result = _runner(cmd) # rst = (stdout, stderr, errcode) logger.debug('command return code: %s' % result[2]) if not result[0]: logger.info('No more options for the specified config path') diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py index 55c41a0518..b73a6fa73d 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py @@ -8,31 +8,33 @@ from vyos_session.utils import logger from vyosparser import vyos_parser as vparser -class ServiceError(Exception): pass + +class ServiceError(Exception): + pass + class showConfig(): - def formator(self,options): - args=['show'] + + def formator(self, options): + args = ['show'] service = options[0] - logger.debug("=====>>>>>> args before executor call = %s"%args) - if service in ['protocols','nat','interfaces','firewall']: - args.extend(options) - elif service in ['dns','dhcp-server','ssh','webproxy']: - options.insert(0,'service') + logger.debug("=====>>>>>> args before executor call = %s" % args) + if service in ['protocols', 'nat', 'interfaces', 'firewall']: + args.extend(options) + elif service in ['dns', 'dhcp-server', 'ssh', 'webproxy']: + options.insert(0, 'service') args.extend(options) else: raise ServiceError('unknown such service!') - exe=executor(list(args)) + exe = executor(list(args)) try: - #if not exe.checkcmd(' '.join(args)): + # if not exe.checkcmd(' '.join(args)): # logger.error("%s: given args does not match with existing configs!"%args) # return False - execstate,output=exe.execmd() - logger.debug("=====>>>>>> args after executor call = %s"%args) + execstate, output = exe.execmd() + logger.debug("=====>>>>>> args after executor call = %s" % args) except OperationFailed, e: logger.error(e.message) return False - if execstate==True: + if execstate == True: return vparser.decode_string(output) - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py index db45c0e8ea..fe6de550fc 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py @@ -12,6 +12,7 @@ class EditPersistentRule(object): + def __init__(self): pass @@ -81,8 +82,3 @@ def clean_stale_rules(self, interface_list): except Exception, err: logger.error("ERROR deleting stale persistent rule. Interfaces: " "%r . Details: %r" % (interface_list, str(err))) - - - - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py index 9ffe9581ab..b31fb06d8c 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py @@ -4,63 +4,64 @@ FWN = "firewall name" ZPZ = "zone-policy zone" + + class fwHandler(configOpts): - actions=["drop","reject","accept","inspect"] - state=["established","invalid","related"] - availability=["enable","disable"] - - def firewall_config(self,name,suffix): - firewall=[FWN,name,"rule"] - firewall.extend(suffix) - self.set(firewall) - - def zone_config(self,suffix): - zone=[ZPZ] - zone.extend(suffix) - self.set(zone) - - def set_zone_desc(self,zone_name,desc): - description = [zone_name,"description",desc] - self.zone_config(description) - - def set_zone_interface(self,zone_name,iface): - interface = [zone_name,"interface",iface] - self.zone_config(interface) - - def setup_fw_on_zone(self,zone_src,zone_dst,firewall): - fw_on_zone=[zone_src,"from",zone_dst,"name",firewall] - self.zone_config(fw_on_zone) - - def set_default_action(self,name,rule_num,action): - if action in self.actions: - self.set_action[rule_num,"action",action] - self.firewall_config(name,set_action) - - def set_rule_state(self,name,rule_num,state,allow): - if state in self.states and allow in self.availability: - self.set_state[rule_num,"state",state,allow] - self.firewall_config(name,set_state) - - def set_protocol(self,name,rule_num,prot): - protocol=[rule_num,"protocol",prot] - self.firewall_config(name,protocol) - - def set_dest_port(self,name,rule_num,portlist,orient="destination"): - port=[rule_num,orient,"port",portlist] - self.firewall_config(name,port) - - - def set_dest_addr(self,name,rule_num,addr_subnet,orient="destination"): - addr=[rule_num,orient,"address",addr_subnet] - self.firewall_config(name,addr) - - def set_src_port(self,name,rule_num,portlist): - self.set_dest_port(name,rule_num,portlist,"source") - - def set_src_addr(self,name,rule_num,addr_subnet): - self.set_dest_addr(name,rule_num,addr_subnet,"source") - - def rule_state(self,name,rule_num,status): - if status in availability: - rule_status=[rule_num,status] - self.firewall_config(name,rule_status) + actions = ["drop", "reject", "accept", "inspect"] + state = ["established", "invalid", "related"] + availability = ["enable", "disable"] + + def firewall_config(self, name, suffix): + firewall = [FWN, name, "rule"] + firewall.extend(suffix) + self.set(firewall) + + def zone_config(self, suffix): + zone = [ZPZ] + zone.extend(suffix) + self.set(zone) + + def set_zone_desc(self, zone_name, desc): + description = [zone_name, "description", desc] + self.zone_config(description) + + def set_zone_interface(self, zone_name, iface): + interface = [zone_name, "interface", iface] + self.zone_config(interface) + + def setup_fw_on_zone(self, zone_src, zone_dst, firewall): + fw_on_zone = [zone_src, "from", zone_dst, "name", firewall] + self.zone_config(fw_on_zone) + + def set_default_action(self, name, rule_num, action): + if action in self.actions: + self.set_action[rule_num, "action", action] + self.firewall_config(name, set_action) + + def set_rule_state(self, name, rule_num, state, allow): + if state in self.states and allow in self.availability: + self.set_state[rule_num, "state", state, allow] + self.firewall_config(name, set_state) + + def set_protocol(self, name, rule_num, prot): + protocol = [rule_num, "protocol", prot] + self.firewall_config(name, protocol) + + def set_dest_port(self, name, rule_num, portlist, orient="destination"): + port = [rule_num, orient, "port", portlist] + self.firewall_config(name, port) + + def set_dest_addr(self, name, rule_num, addr_subnet, orient="destination"): + addr = [rule_num, orient, "address", addr_subnet] + self.firewall_config(name, addr) + + def set_src_port(self, name, rule_num, portlist): + self.set_dest_port(name, rule_num, portlist, "source") + + def set_src_addr(self, name, rule_num, addr_subnet): + self.set_dest_addr(name, rule_num, addr_subnet, "source") + + def rule_state(self, name, rule_num, status): + if status in availability: + rule_status = [rule_num, status] + self.firewall_config(name, rule_status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py index bd1017c22c..a911207aaa 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py @@ -31,6 +31,7 @@ class VYOSHAConfig(configOpts): """ Class to configure HA for VYOS. """ + def __init__(self): super(VYOSHAConfig, self).__init__() pass @@ -121,7 +122,7 @@ def delete_vrrp(self, vrrp_config): data_interface, data_ip = self._get_interface_name( dict(data_mac=data_macs['provider_mac']), interface_type='data') - + provider_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface data_interface, data_ip = self._get_interface_name( @@ -152,7 +153,7 @@ def delete_vrrp(self, vrrp_config): # session.discard() logger.error("Error deleting stitching vrrp %r " % err) # raise Exception(err) - + # try: # self.delete(delete_conntrack_cluster.split()) # except Exception, err: @@ -160,7 +161,7 @@ def delete_vrrp(self, vrrp_config): # session.teardown_config_session() # raise Exception(err) # logger.error("Error deleting conntrack - %r " % err) - + session.commit() time.sleep(5) session.save() @@ -177,7 +178,7 @@ def set_vrrp_for_interface(self, data_info): direct_call = False if isinstance(data_info, str): direct_call = True - data_info = json.loads(data_info) + data_info = json.loads(data_info) data_macs = data_info.get("data_macs", {}) vips = data_info.get("vip", {}) vrrp_groups = data_info["vrrp_group"] @@ -278,7 +279,7 @@ def _get_interface_name(ha_config, interface_type=None): interface_type.lower() == 'monitoring': return interface, ip_addr elif (mac_addr == ha_config.get('data_mac', None) and - interface_type.lower() == 'data'): + interface_type.lower() == 'data'): mlen = sum([bin(int(x)).count('1') for x in netmask.split('.')]) ip_addr += ("/" + str(mlen)) @@ -361,7 +362,3 @@ def _execute_commands(self, all_commands, tenant_id=None): session.save() time.sleep(5) session.teardown_config_session() - - - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py index b40135d752..72d97db4d0 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py @@ -22,20 +22,22 @@ logger = logging.getLogger(__name__) utils.init_logger(logger) + class APIHandler(object): + def __init__(self): pass def run_command(self, command): proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) out, err = proc.communicate() if err: logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) + (command, err)) return None return out @@ -45,7 +47,7 @@ def configure_rsyslog_as_client(self, config): /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system syslog host %s facility all level %s /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save - """ %(config['server_ip'], config['log_level']) + """ % (config['server_ip'], config['log_level']) try: out = self.run_command(command) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py index b2963430a0..53257cfe2d 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py @@ -27,12 +27,12 @@ # oc_fw_identifier = 'oc_fw' rule = 'rule' firewall_rules = { - 'protocol': '%s protocol %s', - 'source_ip_address': '%s source address %s', - 'destination_ip_address': '%s destination address %s', - 'source_port': '%s source port %s', - 'destination_port': '%s destination port %s' - } + 'protocol': '%s protocol %s', + 'source_ip_address': '%s source address %s', + 'destination_ip_address': '%s destination address %s', + 'source_port': '%s source port %s', + 'destination_port': '%s destination port %s' +} firewall_action = {'allow': 'accept', 'deny': 'drop'} @@ -155,8 +155,8 @@ def create_vyos_fw_rule(self, fw_rule): self.rules.extend( [firewall_rules[k] % (common_fw_rule_prefix, fw_rule[k] - if k not in ['source_port', 'destination_port'] - else fw_rule[k].replace(':', '-')) + if k not in ['source_port', 'destination_port'] + else fw_rule[k].replace(':', '-')) for k, v in fw_rule.iteritems() if fw_rule[k] and k in firewall_rules] ) @@ -354,4 +354,3 @@ def run_sshd_on_mgmt_ip(self, mgmt_ip): return session.save() session.teardown_config_session() - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py index 849124a9a2..558efbe7cd 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py @@ -12,7 +12,7 @@ # One Convergence, Inc., USA #!/usr/bin/env python - + import sys import os import logging @@ -20,7 +20,7 @@ topdir = os.path.realpath(topdir) sys.path.insert(0, topdir) from execformat.executor import execUtils, OperationFailed -from vyos_session import utils +from vyos_session import utils logger = logging.getLogger(__name__) utils.init_logger(logger) @@ -32,21 +32,21 @@ def __init__(self): pass def set_1(self, args): - exe=execUtils(list(args)) + exe = execUtils(list(args)) exe.execmd() def delete_1(self, args): - exe=execUtils(list(args)) + exe = execUtils(list(args)) exe.execmd() def show(self, args): - exe=execUtils(list(args)) - res,output=exe.execmd(nonsession=True) - return res,output + exe = execUtils(list(args)) + res, output = exe.execmd(nonsession=True) + return res, output def set(self, args): args.insert(0, 'set') - exe=execUtils(list(args)) + exe = execUtils(list(args)) try: exe.execmd() return True @@ -56,7 +56,7 @@ def set(self, args): def delete(self, args): args.insert(0, 'delete') - exe=execUtils(list(args)) + exe = execUtils(list(args)) try: exe.execmd() return True diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py index 28155768fb..ec1fa2ed26 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py @@ -14,6 +14,7 @@ class RoutesConfigHandler(object): + def __init__(self): super(RoutesConfigHandler, self).__init__() @@ -24,35 +25,35 @@ def add_source_route(self, routes_info): gateway_ip = route_info['gateway_ip'] source_interface = self._get_if_name_by_cidr(source_cidr) try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) + "routes" % (source_interface)) routing_table_number = ROUTING_TABLE_BASE + int( interface_number_string.split('v')[0]) - ip_rule_command = "ip rule add from %s table %s" %( + ip_rule_command = "ip rule add from %s table %s" % ( source_cidr, routing_table_number) out1 = subprocess.Popen(ip_rule_command, shell=True, stdout=subprocess.PIPE).stdout.read() - ip_rule_command = "ip rule add to %s table main" %(source_cidr) + ip_rule_command = "ip rule add to %s table main" % (source_cidr) out2 = subprocess.Popen(ip_rule_command, shell=True, stdout=subprocess.PIPE).stdout.read() - ip_route_command = "ip route add table %s default via %s" %( - routing_table_number, gateway_ip) + ip_route_command = "ip route add table %s default via %s" % ( + routing_table_number, gateway_ip) out3 = self._add_default_route_in_table(ip_route_command, routing_table_number) - output = "%s\n%s\n%s" %(out1, out2, out3) - logger.info("Static route configuration result: %s" %(output)) + output = "%s\n%s\n%s" % (out1, out2, out3) + logger.info("Static route configuration result: %s" % (output)) return json.dumps(dict(status=True)) def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" %(table) + route_del_command = "ip route del table %s default" % (table) command_pipe = subprocess.Popen(route_del_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" %(err)) + logger.error("Deleting default route failed: %s" % (err)) def _add_default_route_in_table(self, route_cmd, table): command_pipe = subprocess.Popen(route_cmd, shell=True, @@ -64,8 +65,8 @@ def _add_default_route_in_table(self, route_cmd, table): if "File exists" in err: self._del_default_route_in_table(table) else: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -75,8 +76,8 @@ def _add_default_route_in_table(self, route_cmd, table): stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -84,7 +85,7 @@ def _add_default_route_in_table(self, route_cmd, table): def _delete_ip_rule(self, cidr): count = 0 for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + ip_rule_cmd = "ip rule del %s %s" % (direction, cidr) while True: command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, stdout=subprocess.PIPE, @@ -98,17 +99,17 @@ def _delete_ip_rule(self, cidr): if count >= 10: logger.error("Deleting policy based routing for CIDR: " "%s not completed even after 10 attempts" - %(cidr)) + % (cidr)) break def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" %(table) + route_del_command = "ip route del table %s default" % (table) command_pipe = subprocess.Popen(route_del_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" %(err)) + logger.error("Deleting default route failed: %s" % (err)) def _add_default_route_in_table(self, route_cmd, table): command_pipe = subprocess.Popen(route_cmd, shell=True, @@ -120,8 +121,8 @@ def _add_default_route_in_table(self, route_cmd, table): if "File exists" in err: self._del_default_route_in_table(table) else: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -131,8 +132,8 @@ def _add_default_route_in_table(self, route_cmd, table): stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -140,7 +141,7 @@ def _add_default_route_in_table(self, route_cmd, table): def _delete_ip_rule(self, cidr): count = 0 for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + ip_rule_cmd = "ip rule del %s %s" % (direction, cidr) while True: command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, stdout=subprocess.PIPE, @@ -154,7 +155,7 @@ def _delete_ip_rule(self, cidr): if count >= 10: logger.error("Deleting policy based routing for CIDR: " "%s not completed even after 10 attempts" - %(cidr)) + % (cidr)) break # REVISIT(Magesh): There may be a chance that there are duplicate rules @@ -165,18 +166,18 @@ def delete_source_route(self, routes_info): source_cidr = route_info['source_cidr'] source_interface = self._get_if_name_by_cidr(source_cidr) try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for deleting routes" - %(source_interface)) + % (source_interface)) routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) + interface_number_string.split('v')[0]) self._delete_ip_rule(source_cidr) - ip_route_command = "ip route del table %s default" %( + ip_route_command = "ip route del table %s default" % ( routing_table_number) out = subprocess.Popen(ip_route_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - logger.info("Static route delete result: %s" %(out)) + stdout=subprocess.PIPE).stdout.read() + logger.info("Static route delete result: %s" % (out)) return json.dumps(dict(status=True)) def _get_if_name_by_cidr(self, cidr): @@ -194,10 +195,10 @@ def _get_if_name_by_cidr(self, cidr): ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface - ip_address_netmask = '%s/%s' %(ip_address, netmask) - interface_cidr = netaddr.IPNetwork(ip_address_netmask) + ip_address_netmask = '%s/%s' % (ip_address, netmask) + interface_cidr = netaddr.IPNetwork(ip_address_netmask) if str(interface_cidr.cidr) == cidr: return interface # Sometimes the hotplugged interface takes time to get IP diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py index d9cd383db8..becb0c535e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py @@ -22,11 +22,11 @@ class OCVyOSServer(object): + def __init__(self): pass - def handler(signum, frame): if signum in [2, 3, 11, 15]: logger.info(" Recieved signal: %r. Thus exiting " % signum) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py index 53b0fdeff5..4fcfe6313b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py @@ -70,7 +70,7 @@ def auth_server_config(): f.write("\n") try: - host_ip = data['host_mapping'].split()[0]+"/32" + host_ip = data['host_mapping'].split()[0] + "/32" command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' gateway_ip = os.popen(command).read().strip().strip("'") status = vpnhandler().configure_static_route("set", host_ip, gateway_ip) @@ -84,7 +84,7 @@ def auth_server_config(): os.system("sudo chown vyos:users /etc/hosts") os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) os.system("sudo chown root:root /etc/hosts") - #with open('/etc/hosts', 'a') as hosts: + # with open('/etc/hosts', 'a') as hosts: # hosts.write(data['host_mapping']) except Exception as e: logger.error("Error in writing host mapping in /etc/hosts - %s" % e) @@ -332,7 +332,7 @@ def delete_stitching_route(): try: gateway_ip = request.args.get('gateway_ip') status = vpnhandler().configure_static_route( - "delete", "0.0.0.0/0", gateway_ip) + "delete", "0.0.0.0/0", gateway_ip) return json.dumps(dict(status=status)) except Exception as ex: err = ("Error in delete_stitching_route. Reason: %s" % ex) @@ -473,6 +473,7 @@ def configure_rsyslog_as_client(): logger.error(err) return json.dumps(dict(status=False, reason=err)) + @app.route('/get-fw-stats', methods=['GET']) def get_fw_stats(): try: @@ -484,6 +485,7 @@ def get_fw_stats(): logger.error(err) return json.dumps(dict(status=False, reason=err)) + @app.route('/get-vpn-stats', methods=['GET']) def get_vpn_stats(): try: @@ -523,12 +525,12 @@ def get_interface_to_bind(): ip_addr = getipaddr() logger.info("Management interface up on - %r " % ''.join([netifaces.ifaddresses('eth0')[17][0][ - 'addr'][:2], - netifaces.ifaddresses('eth0')[17][0][ - 'addr'][-2:], - netifaces.ifaddresses('eth0')[2][0][ - 'addr'].split('.')[-1] - ])) + 'addr'][:2], + netifaces.ifaddresses('eth0')[17][0][ + 'addr'][-2:], + netifaces.ifaddresses('eth0')[2][0][ + 'addr'].split('.')[-1] + ])) except ValueError: logger.error("Management Interface not UP") time.sleep(5) @@ -557,4 +559,3 @@ def main(): if __name__ == '__main__': main() - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py index 223f55407a..46562bec3c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py @@ -20,6 +20,7 @@ class StaticIp(configOpts): + def __init__(self): self.hotplug_timeout = 25 @@ -57,7 +58,6 @@ def _get_interface_name(self, interface_mac): if netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] == interface_mac: return interface - def configure(self, data): try: session.setup_config_session() @@ -82,11 +82,11 @@ def configure(self, data): self.provider_ptg_interfaces = list() for interface in interfaces: physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) + interface).get(AF_LINK) if not physical_interface: continue mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] + interface)[AF_LINK][0]['addr'] if 'eth' in interface: ip_mac_map.update({interface: mac_addr}) @@ -123,11 +123,11 @@ def clear(self, data): self.provider_ptg_interfaces = list() for interface in interfaces: physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) + interface).get(AF_LINK) if not physical_interface: continue mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] + interface)[AF_LINK][0]['addr'] if 'eth' in interface: ip_mac_map.update({interface: mac_addr}) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py index 4272ce4d91..fbfb4b2183 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py @@ -21,20 +21,22 @@ logger = logging.getLogger(__name__) utils.init_logger(logger) + class APIHandler(object): + def __init__(self): pass def run_command(self, command): proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) out, err = proc.communicate() if err: logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) + (command, err)) return None return out @@ -49,7 +51,7 @@ def _get_interface_name(self, interface_mac): except KeyError as keyerr: logger.error('Unable to Parse Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) return None def parse_firewall_stats(self, interface, raw_stats): @@ -78,13 +80,13 @@ def parse_firewall_stats(self, interface, raw_stats): condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 """ - firewall = {} + firewall = {} firewalls = [] firewall_start = False table = False status = None rule_keys = ['rulepriority', 'packets', 'bytes', 'action', - 'source', 'destination'] + 'source', 'destination'] try: for line in raw_stats.split('\n'): @@ -106,18 +108,19 @@ def parse_firewall_stats(self, interface, raw_stats): command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + '/opt/vyatta/share/xsl/show_firewall_detail.xsl') show_fw_data = self.run_command(command) - firewall = self.add_protocol_and_dest_port_info(firewall, show_fw_data) + firewall = self.add_protocol_and_dest_port_info( + firewall, show_fw_data) logger.info("packed firewall \n %s" % firewall) firewalls.append(firewall) break except KeyError as keyerr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return firewalls @@ -151,11 +154,11 @@ def add_protocol_and_dest_port_info(self, firewall, show_fw_data): except KeyError as keyerr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return firewall @@ -201,7 +204,7 @@ def parse_vpn_s2s(self, raw_stats): key = '' value = '' if ':' in line: - key,value = line.split(":") + key, value = line.split(":") if 'Peer IP' in key: s2s_connection['peerip'] = value.strip(" \t\n\r") @@ -211,25 +214,25 @@ def parse_vpn_s2s(self, raw_stats): elif "Tunnel" in key: s2s_connection['tunnels'] = [] - tunnel_info = { 'tunnel' : - key.strip(" \t\n\r").split(" ")[-1] } + tunnel_info = {'tunnel': + key.strip(" \t\n\r").split(" ")[-1]} elif "Inbound Bytes" in key: - tunnel_info['in'] = value.strip(" \t\n\r") + tunnel_info['in'] = value.strip(" \t\n\r") elif "Outbound Bytes" in key: - tunnel_info['out'] = value.strip(" \t\n\r") + tunnel_info['out'] = value.strip(" \t\n\r") s2s_connection['tunnels'].append(tunnel_info) s2s_connections.append(s2s_connection) s2s_connection = {} except KeyError as keyerr: logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return s2s_connections @@ -246,7 +249,8 @@ def parse_vpn_remote(self, raw_stats): table = False remote_connection = {} remote_connections = [] - keys = ['clientCN', 'remoteip', 'tunnelip', 'in', 'out', 'connected_since'] + keys = ['clientCN', 'remoteip', 'tunnelip', + 'in', 'out', 'connected_since'] try: for line in raw_stats.split('\n'): @@ -262,11 +266,11 @@ def parse_vpn_remote(self, raw_stats): except KeyError as keyerr: logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return remote_connections @@ -291,13 +295,13 @@ def get_fw_stats(self, mac_address): parsed_stats = {} command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') + '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') raw_stats = self.run_command(command) interface = self._get_interface_name(mac_address) if not interface: logger.error('No interface available for mac address: %s' % - mac_address) + mac_address) return parsed_stats parsed_stats = self.parse_firewall_stats(interface, raw_stats) @@ -307,7 +311,7 @@ def get_fw_stats(self, mac_address): def get_vpn_stats(self): vpn_parsed_data = {} command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-op-vpn.pl ' + - '--show-ipsec-sa-detail') + '--show-ipsec-sa-detail') raw_ipsec_stats = self.run_command(command) if raw_ipsec_stats: @@ -320,7 +324,7 @@ def get_vpn_stats(self): logger.warning("Empty IPSec VPN Stats") command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-show-ovpn.pl ' + - '--mode=server') + '--mode=server') raw_remote_stats = self.run_command(command) if raw_remote_stats: diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py index e4f7c28c18..6f15dafa76 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py @@ -76,7 +76,7 @@ 'set interfaces openvpn %s openvpn-option \ "--client-cert-not-required --script-security 3 \ --auth-user-pass-verify /usr/share/vyos-oc/auth_pam.pl via-file"'], - #'set interfaces openvpn %s local-host %s'], + #'set interfaces openvpn %s local-host %s'], 'delete': [ 'delete interfaces openvpn %s', 'delete interfaces openvpn vtun0 server push-route %s']} @@ -86,11 +86,13 @@ class NoInterfaceOnCidr(Exception): + def __init__(self, **kwargs): self.message = _("No interface in the network '%(cidr)s'") % kwargs class VPNHandler(configOpts): + def __init__(self): super(VPNHandler, self).__init__() @@ -98,7 +100,7 @@ def create_ipsec_site_conn(self, ctx): session.setup_config_session() siteconn = ctx['siteconns'][0] self._create_ike_group(siteconn['ikepolicy'], - siteconn['connection']['dpd']) + siteconn['connection']['dpd']) self._create_esp_group(siteconn['ipsecpolicy']) self._create_ipsec_site_conn(ctx) session.commit() @@ -308,7 +310,8 @@ def _create_ipsec_site_tunnel(self, tunnel): self._set_commands(tun_cmds) def _get_vrrp_group(self, ifname): - command = ("vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) + command = ( + "vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) #vrrp_ifname = ifname + "v" + os.popen(command).read().strip() return os.popen(command).read().strip() @@ -333,8 +336,8 @@ def _create_ipsec_site_conn(self, ctx): group_no = self._get_vrrp_group(ifname) ip = conn['stitching_fixed_ip'] vrrp_cmd = ('set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn') % ( - ifname, group_no) + 'run-transition-scripts master /config/scripts/restart_vpn') % ( + ifname, group_no) ifname = ifname + "v" + str(group_no) logger.info("vrrp interface name: %s" % ifname) @@ -395,18 +398,18 @@ def configure_static_route(self, action, cidr, gateway_ip): route_cmd = ("%s protocols static route %s next-hop" " %s distance 1" % (action, cidr, gateway_ip)) else: - route_cmd = "%s protocols static route %s" %(action, cidr) + route_cmd = "%s protocols static route %s" % (action, cidr) # The config module we use everywhere else is not used here # because of the issue mentioned here: # http://vyatta38.rssing.com/chan-10627532/all_p7.html # Note: The issue is inconsistent, but not seen anymore with this # new approach of setting configuration utils._alternate_set_and_commit(route_cmd) - #session.setup_config_session() - #self._set_commands([route_cmd]) - #session.commit() - #time.sleep(2) - #session.teardown_config_session() + # session.setup_config_session() + # self._set_commands([route_cmd]) + # session.commit() + # time.sleep(2) + # session.teardown_config_session() return OP_SUCCESS def _get_all_ifs(self): @@ -422,8 +425,8 @@ def _get_all_ifs(self): namestr = names.tostring() lst = [] for i in range(0, outbytes, 40): - name = namestr[i:i+16].split('\0', 1)[0] - ip = namestr[i+20:i+24] + name = namestr[i:i + 16].split('\0', 1)[0] + ip = namestr[i + 20:i + 24] lst.append((name, ip)) return lst diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py index 3ffa2486ad..3e19171b95 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py @@ -14,4 +14,3 @@ def to_dict(self): rv = dict(self.payload or ()) rv["message"] = self.message return rv - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py index 3bbdaabb2f..8da5a6e7db 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py @@ -37,6 +37,7 @@ class RoutesConfigHandler(configOpts): + def __init__(self): super(RoutesConfigHandler, self).__init__() self.vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" @@ -47,13 +48,15 @@ def _run_command(self, command): stdout=subprocess.PIPE, stderr=subprocess.PIPE) except Exception as err: - message = 'Executing command %s failed with error %s' %(command, err) + message = 'Executing command %s failed with error %s' % ( + command, err) logger.error(message) return False cmd_output, cmd_error = exec_pipe.communicate() if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' %(command, cmd_error) + message = 'Executing command %s failed with error %s' % ( + command, cmd_error) logger.error(message) return False else: @@ -61,14 +64,14 @@ def _run_command(self, command): return True def _begin_command(self): - begin_cmd = "%s begin" %(self.vyos_wrapper) + begin_cmd = "%s begin" % (self.vyos_wrapper) if self._run_command(begin_cmd): return True else: return False def _discard_changes(self): - discard_cmd = "%s discard" %(self.vyos_wrapper) + discard_cmd = "%s discard" % (self.vyos_wrapper) if self._run_command(discard_cmd): return True else: @@ -76,13 +79,13 @@ def _discard_changes(self): def _set_commands(self, cmds): for cmd in cmds: - set_cmd = "%s %s" %(self.vyos_wrapper, cmd) + set_cmd = "%s %s" % (self.vyos_wrapper, cmd) if not self._run_command(set_cmd): return False return True def _commit_command(self): - commit_cmd = "%s commit" %(self.vyos_wrapper) + commit_cmd = "%s commit" % (self.vyos_wrapper) if self._run_command(commit_cmd): return True else: @@ -101,17 +104,17 @@ def _configure_vyos(self, configure_commands): return False if not self._set_commands(configure_commands): - logger.error("Executing commands %s failed" %(configure_commands)) + logger.error("Executing commands %s failed" % (configure_commands)) self._discard_changes() return False if not self._commit_command(): - logger.error("Committing %s failed" %(configure_commands)) + logger.error("Committing %s failed" % (configure_commands)) self._discard_changes() return False if not self._save_command(): - logger.error("Saving %s failed" %(configure_commands)) + logger.error("Saving %s failed" % (configure_commands)) self._discard_changes() return False @@ -120,16 +123,16 @@ def _configure_vyos(self, configure_commands): def _configure_policy_route(self, source_cidr, gateway_ip, source_interface): try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) - msg = "Wrong interface %s retrieved for source %s" %( + "routes" % (source_interface)) + msg = "Wrong interface %s retrieved for source %s" % ( source_interface, source_cidr) raise Exception(msg) routing_table_number = ROUTING_TABLE_BASE + int( interface_number_string.split('v')[0]) - pbr_name = "%s_%s" %("pbr", source_interface) + pbr_name = "%s_%s" % ("pbr", source_interface) cmds = copy.deepcopy(VYOS_PBR_COMMANDS) pbr_commands = [] pbr_commands.append(cmds['policy_route'][0] % (pbr_name, "1")) @@ -138,11 +141,11 @@ def _configure_policy_route(self, source_cidr, gateway_ip, pbr_commands.append( cmds['policy_route'][2] % (pbr_name, "1", source_cidr)) - pbr_commands.append(cmds['table_route'][0] %( - routing_table_number, "0.0.0.0/0", gateway_ip)) + pbr_commands.append(cmds['table_route'][0] % ( + routing_table_number, "0.0.0.0/0", gateway_ip)) pbr_commands.append( - cmds['interface_pbr'][0] %(source_interface, pbr_name)) + cmds['interface_pbr'][0] % (source_interface, pbr_name)) if not self._configure_vyos(pbr_commands): logger.error("Configuring Policy Based Routing failed") @@ -161,34 +164,34 @@ def add_source_route(self, routes_info): except Exception as err: logger.debug("Trying to clear any existing routes before " "setting source routing failed with error: %s" - %(err)) + % (err)) try: self._configure_policy_route( source_cidr, gateway_ip, source_interface) except Exception as err: message = ("Configuring Policy based route failed. " - "Error: %s" %(err)) + "Error: %s" % (err)) raise Exception(message) return json.dumps(dict(status=True)) # FIXME: When invoked on delete path we have to propagate the error def _delete_policy_route(self, source_cidr, source_interface): try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) - msg = "Wrong interface %s retrieved for source %s" %( + "routes" % (source_interface)) + msg = "Wrong interface %s retrieved for source %s" % ( source_interface, source_cidr) raise Exception(msg) routing_table_number = ROUTING_TABLE_BASE + int( interface_number_string.split('v')[0]) - pbr_name = "%s_%s" %("pbr", source_interface) + pbr_name = "%s_%s" % ("pbr", source_interface) cmds = copy.deepcopy(VYOS_PBR_COMMANDS) delete_pbr_commands = [] delete_pbr_commands.append(cmds['delete'][0] % ( - source_interface, pbr_name)) + source_interface, pbr_name)) if not self._configure_vyos(delete_pbr_commands): logger.warn("Deleting PBR failed") @@ -229,9 +232,9 @@ def _get_if_name_by_cidr(self, cidr, delete=False): ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface - ip_address_netmask = '%s/%s' %(ip_address, netmask) + ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) if str(interface_cidr.cidr) == cidr: return interface diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py index 9b0e666e66..f6ca055a5b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py @@ -14,10 +14,20 @@ # logger = init_logger() -class SessionAlreadyExists(Exception): pass -class SetupSessionFailed(Exception): pass -class OperationFailed(Exception): pass -class SessionNotExists(Exception): pass +class SessionAlreadyExists(Exception): + pass + + +class SetupSessionFailed(Exception): + pass + + +class OperationFailed(Exception): + pass + + +class SessionNotExists(Exception): + pass class Session(object): @@ -116,7 +126,7 @@ def commit(self): """ Returns True if commit action succeed. False otherwise. """ - out = _run(os.path.join(VYOS_SBIN_DIR ,'my_commit -l'), output=True) + out = _run(os.path.join(VYOS_SBIN_DIR, 'my_commit -l'), output=True) if not out: logger.error('Commit changes failed') raise OperationFailed('[ERROR] Commit changes failed !') @@ -127,7 +137,7 @@ def discard(self): """ Undo config modifications """ - out = _run(os.path.join(VYOS_SBIN_DIR ,'my_discard'), output=True) + out = _run(os.path.join(VYOS_SBIN_DIR, 'my_discard'), output=True) if not out: raise OperationFailed('[ERROR] Discard changes failed !') # return out.splitlines()[0] diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py index 6dc579aae2..361f21f1ea 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py @@ -7,7 +7,7 @@ # In production environment CONFIG_DIR should be /etc/pyatta/ CONFIG_DIR = "/usr/share/vyos-oc" CONFIG_FILE_NAME = "oc-vyos.conf" -AVAILABLE_LOG_LEVELS = ['DEBUG','INFO','WARN','ERROR','CRITICAL'] +AVAILABLE_LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL'] DEFAULT_LOG_LEVEL = 'INFO' logger = logging.getLogger(__name__) @@ -49,7 +49,7 @@ def get_log_filehandler(): return False print "[INFO] Create log file %s" % log_file_path # create file handler - fh = logging.FileHandler(log_file_path,'a') + fh = logging.FileHandler(log_file_path, 'a') fh.setLevel(eval('logging.{0}'.format(get_log_level()))) return fh @@ -90,14 +90,15 @@ def _run(cmd, output=False): stdout=subprocess.PIPE, stderr=subprocess.PIPE) except Exception as err: - message = 'Executing command %s failed with error %s' %(cmd, err) + message = 'Executing command %s failed with error %s' % (cmd, err) logger.error(message) return False cmd_output, cmd_error = exec_pipe.communicate() - # VPN commits succeed but we are getting perl locale warnings on stderr + # VPN commits succeed but we are getting perl locale warnings on stderr if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s. Output is: %s'%(cmd, cmd_error, cmd_output) + message = 'Executing command %s failed with error %s. Output is: %s' % ( + cmd, cmd_error, cmd_output) logger.error(message) return False else: @@ -106,7 +107,7 @@ def _run(cmd, output=False): else: try: logger.debug('exec command: "%s"', cmd) - out = subprocess.check_call(cmd, shell=True) # returns 0 for True + out = subprocess.check_call(cmd, shell=True) # returns 0 for True except subprocess.CalledProcessError as err: logger.error('command execution failed with Error: %s', err) out = 1 # returns 1 for False @@ -118,14 +119,16 @@ def _run(cmd, output=False): # issue :http://vyatta38.rssing.com/chan-10627532/all_p7.html # Not sure if the other commands also may fails or if there is an issue with # the way the config module does things + + def _alternate_set_and_commit(cmd): try: vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" - begin_cmd = "%s begin" %(vyos_wrapper) - set_cmd = "%s %s" %(vyos_wrapper, cmd) - commit_cmd = "%s commit" %(vyos_wrapper) + begin_cmd = "%s begin" % (vyos_wrapper) + set_cmd = "%s %s" % (vyos_wrapper, cmd) + commit_cmd = "%s commit" % (vyos_wrapper) save_cmd = "%s save" % (vyos_wrapper) - end_cmd = "%s end" %(vyos_wrapper) + end_cmd = "%s end" % (vyos_wrapper) command = "%s;%s;%s;%s;%s" % (begin_cmd, set_cmd, commit_cmd, save_cmd, end_cmd) logger.debug('exec command: "%s"', command) @@ -133,26 +136,29 @@ def _alternate_set_and_commit(cmd): stdout=subprocess.PIPE, stderr=subprocess.PIPE) except Exception as err: - message = 'Executing command %s failed with error %s' %(command, err) + message = 'Executing command %s failed with error %s' % (command, err) logger.error(message) return False cmd_output, cmd_error = exec_pipe.communicate() # VPN commits succeed but we are getting perl locale warnings on stderr if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' %(command, cmd_error) + message = 'Executing command %s failed with error %s' % ( + command, cmd_error) logger.error(message) return False else: logger.debug('command output: %s', cmd_output) return True + def clean_environ(env): """ Delete some envionment variables from system. """ for key in env.keys(): - if os.environ.get('key'): del os.environ[key] + if os.environ.get('key'): + del os.environ[key] def ip2network(ip): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py index db45c0e8ea..fe6de550fc 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py @@ -12,6 +12,7 @@ class EditPersistentRule(object): + def __init__(self): pass @@ -81,8 +82,3 @@ def clean_stale_rules(self, interface_list): except Exception, err: logger.error("ERROR deleting stale persistent rule. Interfaces: " "%r . Details: %r" % (interface_list, str(err))) - - - - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py index 9ffe9581ab..b31fb06d8c 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py @@ -4,63 +4,64 @@ FWN = "firewall name" ZPZ = "zone-policy zone" + + class fwHandler(configOpts): - actions=["drop","reject","accept","inspect"] - state=["established","invalid","related"] - availability=["enable","disable"] - - def firewall_config(self,name,suffix): - firewall=[FWN,name,"rule"] - firewall.extend(suffix) - self.set(firewall) - - def zone_config(self,suffix): - zone=[ZPZ] - zone.extend(suffix) - self.set(zone) - - def set_zone_desc(self,zone_name,desc): - description = [zone_name,"description",desc] - self.zone_config(description) - - def set_zone_interface(self,zone_name,iface): - interface = [zone_name,"interface",iface] - self.zone_config(interface) - - def setup_fw_on_zone(self,zone_src,zone_dst,firewall): - fw_on_zone=[zone_src,"from",zone_dst,"name",firewall] - self.zone_config(fw_on_zone) - - def set_default_action(self,name,rule_num,action): - if action in self.actions: - self.set_action[rule_num,"action",action] - self.firewall_config(name,set_action) - - def set_rule_state(self,name,rule_num,state,allow): - if state in self.states and allow in self.availability: - self.set_state[rule_num,"state",state,allow] - self.firewall_config(name,set_state) - - def set_protocol(self,name,rule_num,prot): - protocol=[rule_num,"protocol",prot] - self.firewall_config(name,protocol) - - def set_dest_port(self,name,rule_num,portlist,orient="destination"): - port=[rule_num,orient,"port",portlist] - self.firewall_config(name,port) - - - def set_dest_addr(self,name,rule_num,addr_subnet,orient="destination"): - addr=[rule_num,orient,"address",addr_subnet] - self.firewall_config(name,addr) - - def set_src_port(self,name,rule_num,portlist): - self.set_dest_port(name,rule_num,portlist,"source") - - def set_src_addr(self,name,rule_num,addr_subnet): - self.set_dest_addr(name,rule_num,addr_subnet,"source") - - def rule_state(self,name,rule_num,status): - if status in availability: - rule_status=[rule_num,status] - self.firewall_config(name,rule_status) + actions = ["drop", "reject", "accept", "inspect"] + state = ["established", "invalid", "related"] + availability = ["enable", "disable"] + + def firewall_config(self, name, suffix): + firewall = [FWN, name, "rule"] + firewall.extend(suffix) + self.set(firewall) + + def zone_config(self, suffix): + zone = [ZPZ] + zone.extend(suffix) + self.set(zone) + + def set_zone_desc(self, zone_name, desc): + description = [zone_name, "description", desc] + self.zone_config(description) + + def set_zone_interface(self, zone_name, iface): + interface = [zone_name, "interface", iface] + self.zone_config(interface) + + def setup_fw_on_zone(self, zone_src, zone_dst, firewall): + fw_on_zone = [zone_src, "from", zone_dst, "name", firewall] + self.zone_config(fw_on_zone) + + def set_default_action(self, name, rule_num, action): + if action in self.actions: + self.set_action[rule_num, "action", action] + self.firewall_config(name, set_action) + + def set_rule_state(self, name, rule_num, state, allow): + if state in self.states and allow in self.availability: + self.set_state[rule_num, "state", state, allow] + self.firewall_config(name, set_state) + + def set_protocol(self, name, rule_num, prot): + protocol = [rule_num, "protocol", prot] + self.firewall_config(name, protocol) + + def set_dest_port(self, name, rule_num, portlist, orient="destination"): + port = [rule_num, orient, "port", portlist] + self.firewall_config(name, port) + + def set_dest_addr(self, name, rule_num, addr_subnet, orient="destination"): + addr = [rule_num, orient, "address", addr_subnet] + self.firewall_config(name, addr) + + def set_src_port(self, name, rule_num, portlist): + self.set_dest_port(name, rule_num, portlist, "source") + + def set_src_addr(self, name, rule_num, addr_subnet): + self.set_dest_addr(name, rule_num, addr_subnet, "source") + + def rule_state(self, name, rule_num, status): + if status in availability: + rule_status = [rule_num, status] + self.firewall_config(name, rule_status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py index bd1017c22c..a911207aaa 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py @@ -31,6 +31,7 @@ class VYOSHAConfig(configOpts): """ Class to configure HA for VYOS. """ + def __init__(self): super(VYOSHAConfig, self).__init__() pass @@ -121,7 +122,7 @@ def delete_vrrp(self, vrrp_config): data_interface, data_ip = self._get_interface_name( dict(data_mac=data_macs['provider_mac']), interface_type='data') - + provider_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface data_interface, data_ip = self._get_interface_name( @@ -152,7 +153,7 @@ def delete_vrrp(self, vrrp_config): # session.discard() logger.error("Error deleting stitching vrrp %r " % err) # raise Exception(err) - + # try: # self.delete(delete_conntrack_cluster.split()) # except Exception, err: @@ -160,7 +161,7 @@ def delete_vrrp(self, vrrp_config): # session.teardown_config_session() # raise Exception(err) # logger.error("Error deleting conntrack - %r " % err) - + session.commit() time.sleep(5) session.save() @@ -177,7 +178,7 @@ def set_vrrp_for_interface(self, data_info): direct_call = False if isinstance(data_info, str): direct_call = True - data_info = json.loads(data_info) + data_info = json.loads(data_info) data_macs = data_info.get("data_macs", {}) vips = data_info.get("vip", {}) vrrp_groups = data_info["vrrp_group"] @@ -278,7 +279,7 @@ def _get_interface_name(ha_config, interface_type=None): interface_type.lower() == 'monitoring': return interface, ip_addr elif (mac_addr == ha_config.get('data_mac', None) and - interface_type.lower() == 'data'): + interface_type.lower() == 'data'): mlen = sum([bin(int(x)).count('1') for x in netmask.split('.')]) ip_addr += ("/" + str(mlen)) @@ -361,7 +362,3 @@ def _execute_commands(self, all_commands, tenant_id=None): session.save() time.sleep(5) session.teardown_config_session() - - - - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py index b40135d752..72d97db4d0 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py @@ -22,20 +22,22 @@ logger = logging.getLogger(__name__) utils.init_logger(logger) + class APIHandler(object): + def __init__(self): pass def run_command(self, command): proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) out, err = proc.communicate() if err: logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) + (command, err)) return None return out @@ -45,7 +47,7 @@ def configure_rsyslog_as_client(self, config): /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system syslog host %s facility all level %s /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save - """ %(config['server_ip'], config['log_level']) + """ % (config['server_ip'], config['log_level']) try: out = self.run_command(command) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py index b2963430a0..53257cfe2d 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py @@ -27,12 +27,12 @@ # oc_fw_identifier = 'oc_fw' rule = 'rule' firewall_rules = { - 'protocol': '%s protocol %s', - 'source_ip_address': '%s source address %s', - 'destination_ip_address': '%s destination address %s', - 'source_port': '%s source port %s', - 'destination_port': '%s destination port %s' - } + 'protocol': '%s protocol %s', + 'source_ip_address': '%s source address %s', + 'destination_ip_address': '%s destination address %s', + 'source_port': '%s source port %s', + 'destination_port': '%s destination port %s' +} firewall_action = {'allow': 'accept', 'deny': 'drop'} @@ -155,8 +155,8 @@ def create_vyos_fw_rule(self, fw_rule): self.rules.extend( [firewall_rules[k] % (common_fw_rule_prefix, fw_rule[k] - if k not in ['source_port', 'destination_port'] - else fw_rule[k].replace(':', '-')) + if k not in ['source_port', 'destination_port'] + else fw_rule[k].replace(':', '-')) for k, v in fw_rule.iteritems() if fw_rule[k] and k in firewall_rules] ) @@ -354,4 +354,3 @@ def run_sshd_on_mgmt_ip(self, mgmt_ip): return session.save() session.teardown_config_session() - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py index 849124a9a2..558efbe7cd 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py @@ -12,7 +12,7 @@ # One Convergence, Inc., USA #!/usr/bin/env python - + import sys import os import logging @@ -20,7 +20,7 @@ topdir = os.path.realpath(topdir) sys.path.insert(0, topdir) from execformat.executor import execUtils, OperationFailed -from vyos_session import utils +from vyos_session import utils logger = logging.getLogger(__name__) utils.init_logger(logger) @@ -32,21 +32,21 @@ def __init__(self): pass def set_1(self, args): - exe=execUtils(list(args)) + exe = execUtils(list(args)) exe.execmd() def delete_1(self, args): - exe=execUtils(list(args)) + exe = execUtils(list(args)) exe.execmd() def show(self, args): - exe=execUtils(list(args)) - res,output=exe.execmd(nonsession=True) - return res,output + exe = execUtils(list(args)) + res, output = exe.execmd(nonsession=True) + return res, output def set(self, args): args.insert(0, 'set') - exe=execUtils(list(args)) + exe = execUtils(list(args)) try: exe.execmd() return True @@ -56,7 +56,7 @@ def set(self, args): def delete(self, args): args.insert(0, 'delete') - exe=execUtils(list(args)) + exe = execUtils(list(args)) try: exe.execmd() return True diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py index 28155768fb..ec1fa2ed26 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py @@ -14,6 +14,7 @@ class RoutesConfigHandler(object): + def __init__(self): super(RoutesConfigHandler, self).__init__() @@ -24,35 +25,35 @@ def add_source_route(self, routes_info): gateway_ip = route_info['gateway_ip'] source_interface = self._get_if_name_by_cidr(source_cidr) try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) + "routes" % (source_interface)) routing_table_number = ROUTING_TABLE_BASE + int( interface_number_string.split('v')[0]) - ip_rule_command = "ip rule add from %s table %s" %( + ip_rule_command = "ip rule add from %s table %s" % ( source_cidr, routing_table_number) out1 = subprocess.Popen(ip_rule_command, shell=True, stdout=subprocess.PIPE).stdout.read() - ip_rule_command = "ip rule add to %s table main" %(source_cidr) + ip_rule_command = "ip rule add to %s table main" % (source_cidr) out2 = subprocess.Popen(ip_rule_command, shell=True, stdout=subprocess.PIPE).stdout.read() - ip_route_command = "ip route add table %s default via %s" %( - routing_table_number, gateway_ip) + ip_route_command = "ip route add table %s default via %s" % ( + routing_table_number, gateway_ip) out3 = self._add_default_route_in_table(ip_route_command, routing_table_number) - output = "%s\n%s\n%s" %(out1, out2, out3) - logger.info("Static route configuration result: %s" %(output)) + output = "%s\n%s\n%s" % (out1, out2, out3) + logger.info("Static route configuration result: %s" % (output)) return json.dumps(dict(status=True)) def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" %(table) + route_del_command = "ip route del table %s default" % (table) command_pipe = subprocess.Popen(route_del_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" %(err)) + logger.error("Deleting default route failed: %s" % (err)) def _add_default_route_in_table(self, route_cmd, table): command_pipe = subprocess.Popen(route_cmd, shell=True, @@ -64,8 +65,8 @@ def _add_default_route_in_table(self, route_cmd, table): if "File exists" in err: self._del_default_route_in_table(table) else: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -75,8 +76,8 @@ def _add_default_route_in_table(self, route_cmd, table): stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -84,7 +85,7 @@ def _add_default_route_in_table(self, route_cmd, table): def _delete_ip_rule(self, cidr): count = 0 for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + ip_rule_cmd = "ip rule del %s %s" % (direction, cidr) while True: command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, stdout=subprocess.PIPE, @@ -98,17 +99,17 @@ def _delete_ip_rule(self, cidr): if count >= 10: logger.error("Deleting policy based routing for CIDR: " "%s not completed even after 10 attempts" - %(cidr)) + % (cidr)) break def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" %(table) + route_del_command = "ip route del table %s default" % (table) command_pipe = subprocess.Popen(route_del_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" %(err)) + logger.error("Deleting default route failed: %s" % (err)) def _add_default_route_in_table(self, route_cmd, table): command_pipe = subprocess.Popen(route_cmd, shell=True, @@ -120,8 +121,8 @@ def _add_default_route_in_table(self, route_cmd, table): if "File exists" in err: self._del_default_route_in_table(table) else: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -131,8 +132,8 @@ def _add_default_route_in_table(self, route_cmd, table): stderr=subprocess.PIPE) out, err = command_pipe.communicate() if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" %(route_cmd)) - logger.error("Error: %s" %(err)) + logger.error("Adding default route failed: %s" % (route_cmd)) + logger.error("Error: %s" % (err)) raise Exception("Setting Default Table route failed") else: return out @@ -140,7 +141,7 @@ def _add_default_route_in_table(self, route_cmd, table): def _delete_ip_rule(self, cidr): count = 0 for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" %(direction, cidr) + ip_rule_cmd = "ip rule del %s %s" % (direction, cidr) while True: command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, stdout=subprocess.PIPE, @@ -154,7 +155,7 @@ def _delete_ip_rule(self, cidr): if count >= 10: logger.error("Deleting policy based routing for CIDR: " "%s not completed even after 10 attempts" - %(cidr)) + % (cidr)) break # REVISIT(Magesh): There may be a chance that there are duplicate rules @@ -165,18 +166,18 @@ def delete_source_route(self, routes_info): source_cidr = route_info['source_cidr'] source_interface = self._get_if_name_by_cidr(source_cidr) try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for deleting routes" - %(source_interface)) + % (source_interface)) routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) + interface_number_string.split('v')[0]) self._delete_ip_rule(source_cidr) - ip_route_command = "ip route del table %s default" %( + ip_route_command = "ip route del table %s default" % ( routing_table_number) out = subprocess.Popen(ip_route_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - logger.info("Static route delete result: %s" %(out)) + stdout=subprocess.PIPE).stdout.read() + logger.info("Static route delete result: %s" % (out)) return json.dumps(dict(status=True)) def _get_if_name_by_cidr(self, cidr): @@ -194,10 +195,10 @@ def _get_if_name_by_cidr(self, cidr): ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface - ip_address_netmask = '%s/%s' %(ip_address, netmask) - interface_cidr = netaddr.IPNetwork(ip_address_netmask) + ip_address_netmask = '%s/%s' % (ip_address, netmask) + interface_cidr = netaddr.IPNetwork(ip_address_netmask) if str(interface_cidr.cidr) == cidr: return interface # Sometimes the hotplugged interface takes time to get IP diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py index d9cd383db8..becb0c535e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py @@ -22,11 +22,11 @@ class OCVyOSServer(object): + def __init__(self): pass - def handler(signum, frame): if signum in [2, 3, 11, 15]: logger.info(" Recieved signal: %r. Thus exiting " % signum) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py index 53b0fdeff5..4fcfe6313b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py @@ -70,7 +70,7 @@ def auth_server_config(): f.write("\n") try: - host_ip = data['host_mapping'].split()[0]+"/32" + host_ip = data['host_mapping'].split()[0] + "/32" command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' gateway_ip = os.popen(command).read().strip().strip("'") status = vpnhandler().configure_static_route("set", host_ip, gateway_ip) @@ -84,7 +84,7 @@ def auth_server_config(): os.system("sudo chown vyos:users /etc/hosts") os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) os.system("sudo chown root:root /etc/hosts") - #with open('/etc/hosts', 'a') as hosts: + # with open('/etc/hosts', 'a') as hosts: # hosts.write(data['host_mapping']) except Exception as e: logger.error("Error in writing host mapping in /etc/hosts - %s" % e) @@ -332,7 +332,7 @@ def delete_stitching_route(): try: gateway_ip = request.args.get('gateway_ip') status = vpnhandler().configure_static_route( - "delete", "0.0.0.0/0", gateway_ip) + "delete", "0.0.0.0/0", gateway_ip) return json.dumps(dict(status=status)) except Exception as ex: err = ("Error in delete_stitching_route. Reason: %s" % ex) @@ -473,6 +473,7 @@ def configure_rsyslog_as_client(): logger.error(err) return json.dumps(dict(status=False, reason=err)) + @app.route('/get-fw-stats', methods=['GET']) def get_fw_stats(): try: @@ -484,6 +485,7 @@ def get_fw_stats(): logger.error(err) return json.dumps(dict(status=False, reason=err)) + @app.route('/get-vpn-stats', methods=['GET']) def get_vpn_stats(): try: @@ -523,12 +525,12 @@ def get_interface_to_bind(): ip_addr = getipaddr() logger.info("Management interface up on - %r " % ''.join([netifaces.ifaddresses('eth0')[17][0][ - 'addr'][:2], - netifaces.ifaddresses('eth0')[17][0][ - 'addr'][-2:], - netifaces.ifaddresses('eth0')[2][0][ - 'addr'].split('.')[-1] - ])) + 'addr'][:2], + netifaces.ifaddresses('eth0')[17][0][ + 'addr'][-2:], + netifaces.ifaddresses('eth0')[2][0][ + 'addr'].split('.')[-1] + ])) except ValueError: logger.error("Management Interface not UP") time.sleep(5) @@ -557,4 +559,3 @@ def main(): if __name__ == '__main__': main() - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py index 223f55407a..46562bec3c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py @@ -20,6 +20,7 @@ class StaticIp(configOpts): + def __init__(self): self.hotplug_timeout = 25 @@ -57,7 +58,6 @@ def _get_interface_name(self, interface_mac): if netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] == interface_mac: return interface - def configure(self, data): try: session.setup_config_session() @@ -82,11 +82,11 @@ def configure(self, data): self.provider_ptg_interfaces = list() for interface in interfaces: physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) + interface).get(AF_LINK) if not physical_interface: continue mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] + interface)[AF_LINK][0]['addr'] if 'eth' in interface: ip_mac_map.update({interface: mac_addr}) @@ -123,11 +123,11 @@ def clear(self, data): self.provider_ptg_interfaces = list() for interface in interfaces: physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) + interface).get(AF_LINK) if not physical_interface: continue mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] + interface)[AF_LINK][0]['addr'] if 'eth' in interface: ip_mac_map.update({interface: mac_addr}) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py index 4272ce4d91..fbfb4b2183 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py @@ -21,20 +21,22 @@ logger = logging.getLogger(__name__) utils.init_logger(logger) + class APIHandler(object): + def __init__(self): pass def run_command(self, command): proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) out, err = proc.communicate() if err: logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) + (command, err)) return None return out @@ -49,7 +51,7 @@ def _get_interface_name(self, interface_mac): except KeyError as keyerr: logger.error('Unable to Parse Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) return None def parse_firewall_stats(self, interface, raw_stats): @@ -78,13 +80,13 @@ def parse_firewall_stats(self, interface, raw_stats): condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 """ - firewall = {} + firewall = {} firewalls = [] firewall_start = False table = False status = None rule_keys = ['rulepriority', 'packets', 'bytes', 'action', - 'source', 'destination'] + 'source', 'destination'] try: for line in raw_stats.split('\n'): @@ -106,18 +108,19 @@ def parse_firewall_stats(self, interface, raw_stats): command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + '/opt/vyatta/share/xsl/show_firewall_detail.xsl') show_fw_data = self.run_command(command) - firewall = self.add_protocol_and_dest_port_info(firewall, show_fw_data) + firewall = self.add_protocol_and_dest_port_info( + firewall, show_fw_data) logger.info("packed firewall \n %s" % firewall) firewalls.append(firewall) break except KeyError as keyerr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return firewalls @@ -151,11 +154,11 @@ def add_protocol_and_dest_port_info(self, firewall, show_fw_data): except KeyError as keyerr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return firewall @@ -201,7 +204,7 @@ def parse_vpn_s2s(self, raw_stats): key = '' value = '' if ':' in line: - key,value = line.split(":") + key, value = line.split(":") if 'Peer IP' in key: s2s_connection['peerip'] = value.strip(" \t\n\r") @@ -211,25 +214,25 @@ def parse_vpn_s2s(self, raw_stats): elif "Tunnel" in key: s2s_connection['tunnels'] = [] - tunnel_info = { 'tunnel' : - key.strip(" \t\n\r").split(" ")[-1] } + tunnel_info = {'tunnel': + key.strip(" \t\n\r").split(" ")[-1]} elif "Inbound Bytes" in key: - tunnel_info['in'] = value.strip(" \t\n\r") + tunnel_info['in'] = value.strip(" \t\n\r") elif "Outbound Bytes" in key: - tunnel_info['out'] = value.strip(" \t\n\r") + tunnel_info['out'] = value.strip(" \t\n\r") s2s_connection['tunnels'].append(tunnel_info) s2s_connections.append(s2s_connection) s2s_connection = {} except KeyError as keyerr: logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return s2s_connections @@ -246,7 +249,8 @@ def parse_vpn_remote(self, raw_stats): table = False remote_connection = {} remote_connections = [] - keys = ['clientCN', 'remoteip', 'tunnelip', 'in', 'out', 'connected_since'] + keys = ['clientCN', 'remoteip', 'tunnelip', + 'in', 'out', 'connected_since'] try: for line in raw_stats.split('\n'): @@ -262,11 +266,11 @@ def parse_vpn_remote(self, raw_stats): except KeyError as keyerr: logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) + 'KeyError: {}'.format(keyerr)) except IndexError as inderr: logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) + 'IndexError: {}'.format(inderr)) return remote_connections @@ -291,13 +295,13 @@ def get_fw_stats(self, mac_address): parsed_stats = {} command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') + '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') raw_stats = self.run_command(command) interface = self._get_interface_name(mac_address) if not interface: logger.error('No interface available for mac address: %s' % - mac_address) + mac_address) return parsed_stats parsed_stats = self.parse_firewall_stats(interface, raw_stats) @@ -307,7 +311,7 @@ def get_fw_stats(self, mac_address): def get_vpn_stats(self): vpn_parsed_data = {} command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-op-vpn.pl ' + - '--show-ipsec-sa-detail') + '--show-ipsec-sa-detail') raw_ipsec_stats = self.run_command(command) if raw_ipsec_stats: @@ -320,7 +324,7 @@ def get_vpn_stats(self): logger.warning("Empty IPSec VPN Stats") command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-show-ovpn.pl ' + - '--mode=server') + '--mode=server') raw_remote_stats = self.run_command(command) if raw_remote_stats: diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py index e4f7c28c18..6f15dafa76 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py @@ -76,7 +76,7 @@ 'set interfaces openvpn %s openvpn-option \ "--client-cert-not-required --script-security 3 \ --auth-user-pass-verify /usr/share/vyos-oc/auth_pam.pl via-file"'], - #'set interfaces openvpn %s local-host %s'], + #'set interfaces openvpn %s local-host %s'], 'delete': [ 'delete interfaces openvpn %s', 'delete interfaces openvpn vtun0 server push-route %s']} @@ -86,11 +86,13 @@ class NoInterfaceOnCidr(Exception): + def __init__(self, **kwargs): self.message = _("No interface in the network '%(cidr)s'") % kwargs class VPNHandler(configOpts): + def __init__(self): super(VPNHandler, self).__init__() @@ -98,7 +100,7 @@ def create_ipsec_site_conn(self, ctx): session.setup_config_session() siteconn = ctx['siteconns'][0] self._create_ike_group(siteconn['ikepolicy'], - siteconn['connection']['dpd']) + siteconn['connection']['dpd']) self._create_esp_group(siteconn['ipsecpolicy']) self._create_ipsec_site_conn(ctx) session.commit() @@ -308,7 +310,8 @@ def _create_ipsec_site_tunnel(self, tunnel): self._set_commands(tun_cmds) def _get_vrrp_group(self, ifname): - command = ("vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) + command = ( + "vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) #vrrp_ifname = ifname + "v" + os.popen(command).read().strip() return os.popen(command).read().strip() @@ -333,8 +336,8 @@ def _create_ipsec_site_conn(self, ctx): group_no = self._get_vrrp_group(ifname) ip = conn['stitching_fixed_ip'] vrrp_cmd = ('set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn') % ( - ifname, group_no) + 'run-transition-scripts master /config/scripts/restart_vpn') % ( + ifname, group_no) ifname = ifname + "v" + str(group_no) logger.info("vrrp interface name: %s" % ifname) @@ -395,18 +398,18 @@ def configure_static_route(self, action, cidr, gateway_ip): route_cmd = ("%s protocols static route %s next-hop" " %s distance 1" % (action, cidr, gateway_ip)) else: - route_cmd = "%s protocols static route %s" %(action, cidr) + route_cmd = "%s protocols static route %s" % (action, cidr) # The config module we use everywhere else is not used here # because of the issue mentioned here: # http://vyatta38.rssing.com/chan-10627532/all_p7.html # Note: The issue is inconsistent, but not seen anymore with this # new approach of setting configuration utils._alternate_set_and_commit(route_cmd) - #session.setup_config_session() - #self._set_commands([route_cmd]) - #session.commit() - #time.sleep(2) - #session.teardown_config_session() + # session.setup_config_session() + # self._set_commands([route_cmd]) + # session.commit() + # time.sleep(2) + # session.teardown_config_session() return OP_SUCCESS def _get_all_ifs(self): @@ -422,8 +425,8 @@ def _get_all_ifs(self): namestr = names.tostring() lst = [] for i in range(0, outbytes, 40): - name = namestr[i:i+16].split('\0', 1)[0] - ip = namestr[i+20:i+24] + name = namestr[i:i + 16].split('\0', 1)[0] + ip = namestr[i + 20:i + 24] lst.append((name, ip)) return lst diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py index 3ffa2486ad..3e19171b95 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py @@ -14,4 +14,3 @@ def to_dict(self): rv = dict(self.payload or ()) rv["message"] = self.message return rv - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py index 3bbdaabb2f..8da5a6e7db 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py @@ -37,6 +37,7 @@ class RoutesConfigHandler(configOpts): + def __init__(self): super(RoutesConfigHandler, self).__init__() self.vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" @@ -47,13 +48,15 @@ def _run_command(self, command): stdout=subprocess.PIPE, stderr=subprocess.PIPE) except Exception as err: - message = 'Executing command %s failed with error %s' %(command, err) + message = 'Executing command %s failed with error %s' % ( + command, err) logger.error(message) return False cmd_output, cmd_error = exec_pipe.communicate() if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' %(command, cmd_error) + message = 'Executing command %s failed with error %s' % ( + command, cmd_error) logger.error(message) return False else: @@ -61,14 +64,14 @@ def _run_command(self, command): return True def _begin_command(self): - begin_cmd = "%s begin" %(self.vyos_wrapper) + begin_cmd = "%s begin" % (self.vyos_wrapper) if self._run_command(begin_cmd): return True else: return False def _discard_changes(self): - discard_cmd = "%s discard" %(self.vyos_wrapper) + discard_cmd = "%s discard" % (self.vyos_wrapper) if self._run_command(discard_cmd): return True else: @@ -76,13 +79,13 @@ def _discard_changes(self): def _set_commands(self, cmds): for cmd in cmds: - set_cmd = "%s %s" %(self.vyos_wrapper, cmd) + set_cmd = "%s %s" % (self.vyos_wrapper, cmd) if not self._run_command(set_cmd): return False return True def _commit_command(self): - commit_cmd = "%s commit" %(self.vyos_wrapper) + commit_cmd = "%s commit" % (self.vyos_wrapper) if self._run_command(commit_cmd): return True else: @@ -101,17 +104,17 @@ def _configure_vyos(self, configure_commands): return False if not self._set_commands(configure_commands): - logger.error("Executing commands %s failed" %(configure_commands)) + logger.error("Executing commands %s failed" % (configure_commands)) self._discard_changes() return False if not self._commit_command(): - logger.error("Committing %s failed" %(configure_commands)) + logger.error("Committing %s failed" % (configure_commands)) self._discard_changes() return False if not self._save_command(): - logger.error("Saving %s failed" %(configure_commands)) + logger.error("Saving %s failed" % (configure_commands)) self._discard_changes() return False @@ -120,16 +123,16 @@ def _configure_vyos(self, configure_commands): def _configure_policy_route(self, source_cidr, gateway_ip, source_interface): try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) - msg = "Wrong interface %s retrieved for source %s" %( + "routes" % (source_interface)) + msg = "Wrong interface %s retrieved for source %s" % ( source_interface, source_cidr) raise Exception(msg) routing_table_number = ROUTING_TABLE_BASE + int( interface_number_string.split('v')[0]) - pbr_name = "%s_%s" %("pbr", source_interface) + pbr_name = "%s_%s" % ("pbr", source_interface) cmds = copy.deepcopy(VYOS_PBR_COMMANDS) pbr_commands = [] pbr_commands.append(cmds['policy_route'][0] % (pbr_name, "1")) @@ -138,11 +141,11 @@ def _configure_policy_route(self, source_cidr, gateway_ip, pbr_commands.append( cmds['policy_route'][2] % (pbr_name, "1", source_cidr)) - pbr_commands.append(cmds['table_route'][0] %( - routing_table_number, "0.0.0.0/0", gateway_ip)) + pbr_commands.append(cmds['table_route'][0] % ( + routing_table_number, "0.0.0.0/0", gateway_ip)) pbr_commands.append( - cmds['interface_pbr'][0] %(source_interface, pbr_name)) + cmds['interface_pbr'][0] % (source_interface, pbr_name)) if not self._configure_vyos(pbr_commands): logger.error("Configuring Policy Based Routing failed") @@ -161,34 +164,34 @@ def add_source_route(self, routes_info): except Exception as err: logger.debug("Trying to clear any existing routes before " "setting source routing failed with error: %s" - %(err)) + % (err)) try: self._configure_policy_route( source_cidr, gateway_ip, source_interface) except Exception as err: message = ("Configuring Policy based route failed. " - "Error: %s" %(err)) + "Error: %s" % (err)) raise Exception(message) return json.dumps(dict(status=True)) # FIXME: When invoked on delete path we have to propagate the error def _delete_policy_route(self, source_cidr, source_interface): try: - interface_number_string = source_interface.split("eth",1)[1] + interface_number_string = source_interface.split("eth", 1)[1] except IndexError: logger.error("Retrieved wrong interface %s for configuring " - "routes" %(source_interface)) - msg = "Wrong interface %s retrieved for source %s" %( + "routes" % (source_interface)) + msg = "Wrong interface %s retrieved for source %s" % ( source_interface, source_cidr) raise Exception(msg) routing_table_number = ROUTING_TABLE_BASE + int( interface_number_string.split('v')[0]) - pbr_name = "%s_%s" %("pbr", source_interface) + pbr_name = "%s_%s" % ("pbr", source_interface) cmds = copy.deepcopy(VYOS_PBR_COMMANDS) delete_pbr_commands = [] delete_pbr_commands.append(cmds['delete'][0] % ( - source_interface, pbr_name)) + source_interface, pbr_name)) if not self._configure_vyos(delete_pbr_commands): logger.warn("Deleting PBR failed") @@ -229,9 +232,9 @@ def _get_if_name_by_cidr(self, cidr, delete=False): ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface - ip_address_netmask = '%s/%s' %(ip_address, netmask) + ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) if str(interface_cidr.cidr) == cidr: return interface diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py index 9b0e666e66..f6ca055a5b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py @@ -14,10 +14,20 @@ # logger = init_logger() -class SessionAlreadyExists(Exception): pass -class SetupSessionFailed(Exception): pass -class OperationFailed(Exception): pass -class SessionNotExists(Exception): pass +class SessionAlreadyExists(Exception): + pass + + +class SetupSessionFailed(Exception): + pass + + +class OperationFailed(Exception): + pass + + +class SessionNotExists(Exception): + pass class Session(object): @@ -116,7 +126,7 @@ def commit(self): """ Returns True if commit action succeed. False otherwise. """ - out = _run(os.path.join(VYOS_SBIN_DIR ,'my_commit -l'), output=True) + out = _run(os.path.join(VYOS_SBIN_DIR, 'my_commit -l'), output=True) if not out: logger.error('Commit changes failed') raise OperationFailed('[ERROR] Commit changes failed !') @@ -127,7 +137,7 @@ def discard(self): """ Undo config modifications """ - out = _run(os.path.join(VYOS_SBIN_DIR ,'my_discard'), output=True) + out = _run(os.path.join(VYOS_SBIN_DIR, 'my_discard'), output=True) if not out: raise OperationFailed('[ERROR] Discard changes failed !') # return out.splitlines()[0] diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py index 6dc579aae2..361f21f1ea 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py @@ -7,7 +7,7 @@ # In production environment CONFIG_DIR should be /etc/pyatta/ CONFIG_DIR = "/usr/share/vyos-oc" CONFIG_FILE_NAME = "oc-vyos.conf" -AVAILABLE_LOG_LEVELS = ['DEBUG','INFO','WARN','ERROR','CRITICAL'] +AVAILABLE_LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL'] DEFAULT_LOG_LEVEL = 'INFO' logger = logging.getLogger(__name__) @@ -49,7 +49,7 @@ def get_log_filehandler(): return False print "[INFO] Create log file %s" % log_file_path # create file handler - fh = logging.FileHandler(log_file_path,'a') + fh = logging.FileHandler(log_file_path, 'a') fh.setLevel(eval('logging.{0}'.format(get_log_level()))) return fh @@ -90,14 +90,15 @@ def _run(cmd, output=False): stdout=subprocess.PIPE, stderr=subprocess.PIPE) except Exception as err: - message = 'Executing command %s failed with error %s' %(cmd, err) + message = 'Executing command %s failed with error %s' % (cmd, err) logger.error(message) return False cmd_output, cmd_error = exec_pipe.communicate() - # VPN commits succeed but we are getting perl locale warnings on stderr + # VPN commits succeed but we are getting perl locale warnings on stderr if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s. Output is: %s'%(cmd, cmd_error, cmd_output) + message = 'Executing command %s failed with error %s. Output is: %s' % ( + cmd, cmd_error, cmd_output) logger.error(message) return False else: @@ -106,7 +107,7 @@ def _run(cmd, output=False): else: try: logger.debug('exec command: "%s"', cmd) - out = subprocess.check_call(cmd, shell=True) # returns 0 for True + out = subprocess.check_call(cmd, shell=True) # returns 0 for True except subprocess.CalledProcessError as err: logger.error('command execution failed with Error: %s', err) out = 1 # returns 1 for False @@ -118,14 +119,16 @@ def _run(cmd, output=False): # issue :http://vyatta38.rssing.com/chan-10627532/all_p7.html # Not sure if the other commands also may fails or if there is an issue with # the way the config module does things + + def _alternate_set_and_commit(cmd): try: vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" - begin_cmd = "%s begin" %(vyos_wrapper) - set_cmd = "%s %s" %(vyos_wrapper, cmd) - commit_cmd = "%s commit" %(vyos_wrapper) + begin_cmd = "%s begin" % (vyos_wrapper) + set_cmd = "%s %s" % (vyos_wrapper, cmd) + commit_cmd = "%s commit" % (vyos_wrapper) save_cmd = "%s save" % (vyos_wrapper) - end_cmd = "%s end" %(vyos_wrapper) + end_cmd = "%s end" % (vyos_wrapper) command = "%s;%s;%s;%s;%s" % (begin_cmd, set_cmd, commit_cmd, save_cmd, end_cmd) logger.debug('exec command: "%s"', command) @@ -133,26 +136,29 @@ def _alternate_set_and_commit(cmd): stdout=subprocess.PIPE, stderr=subprocess.PIPE) except Exception as err: - message = 'Executing command %s failed with error %s' %(command, err) + message = 'Executing command %s failed with error %s' % (command, err) logger.error(message) return False cmd_output, cmd_error = exec_pipe.communicate() # VPN commits succeed but we are getting perl locale warnings on stderr if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' %(command, cmd_error) + message = 'Executing command %s failed with error %s' % ( + command, cmd_error) logger.error(message) return False else: logger.debug('command output: %s', cmd_output) return True + def clean_environ(env): """ Delete some envionment variables from system. """ for key in env.keys(): - if os.environ.get('key'): del os.environ[key] + if os.environ.get('key'): + del os.environ[key] def ip2network(ip): From 6ee26281a7298577be2b9f1e00c6563edb3e94f1 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 30 Jun 2016 16:41:49 +0530 Subject: [PATCH 009/157] level 1 aggressive pep8 fix --- .../nfp/service_vendor_agents/vyos/execformat/formator.py | 2 +- .../vyos/oc-vyos/src/execformat/formator.py | 2 +- .../oc-vyos/src/oc_config_server/edit_persistent_rule.py | 2 +- .../vyos/oc-vyos/src/oc_config_server/ha_config.py | 8 ++++---- .../vyos/oc-vyos/src/oc_config_server/operations.py | 4 ++-- .../vyos/oc-vyos/src/oc_config_server/static_ip.py | 3 ++- .../vyos/oc-vyos/src/vyos_session/configsession.py | 2 +- .../vyos/oc_config_server/edit_persistent_rule.py | 2 +- .../vyos/oc_config_server/ha_config.py | 8 ++++---- .../vyos/oc_config_server/operations.py | 4 ++-- .../vyos/oc_config_server/static_ip.py | 3 ++- .../vyos/vyos_session/configsession.py | 2 +- 12 files changed, 22 insertions(+), 20 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py index b73a6fa73d..9ce6c316f8 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py @@ -33,7 +33,7 @@ def formator(self, options): # return False execstate, output = exe.execmd() logger.debug("=====>>>>>> args after executor call = %s" % args) - except OperationFailed, e: + except OperationFailed as e: logger.error(e.message) return False if execstate == True: diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py index b73a6fa73d..9ce6c316f8 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py @@ -33,7 +33,7 @@ def formator(self, options): # return False execstate, output = exe.execmd() logger.debug("=====>>>>>> args after executor call = %s" % args) - except OperationFailed, e: + except OperationFailed as e: logger.error(e.message) return False if execstate == True: diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py index fe6de550fc..987cc7e8d6 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py @@ -79,6 +79,6 @@ def clean_stale_rules(self, interface_list): cmd = 'sudo sed -i /%s/d %s' % ( interface, INTERFACE_RULE_FILE) call(cmd.split()) - except Exception, err: + except Exception as err: logger.error("ERROR deleting stale persistent rule. Interfaces: " "%r . Details: %r" % (interface_list, str(err))) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py index a911207aaa..ef652dab29 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py @@ -85,7 +85,7 @@ def set_interface_ha(self, interface_config): vip = ha_config["vip"] tenant_id = ha_config["tenant_id"] advertised_interval = ha_config["advertised_interval"] - except KeyError, err: + except KeyError as err: raise Exception("HA configuration for interface failed. Value " "not found. %r" % str(err), 400, dict(interface_config=ha_config)) @@ -142,14 +142,14 @@ def delete_vrrp(self, vrrp_config): try: self.delete(provider_vrrp_delete.split()) - except Exception, err: + except Exception as err: # session.discard() logger.error("Error deleting provider vrrp %r " % err) # raise Exception(err) try: self.delete(stitching_vrrp_delete.split()) - except Exception, err: + except Exception as err: # session.discard() logger.error("Error deleting stitching vrrp %r " % err) # raise Exception(err) @@ -301,7 +301,7 @@ def get_conntrack_request_data(self, ha_config): priority = ha_config["priority"] vip = ha_config["vip"] advertised_interval = ha_config["advertised_interval"] - except KeyError, err: + except KeyError as err: raise Exception("Parameters missing for conntrack configuration " "%r" % str(err), 400, {"ha_config": ha_config}) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py index 558efbe7cd..c8a4c0e091 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py @@ -50,7 +50,7 @@ def set(self, args): try: exe.execmd() return True - except OperationFailed, e: + except OperationFailed as e: logger.error(e.message) return False @@ -60,6 +60,6 @@ def delete(self, args): try: exe.execmd() return True - except OperationFailed, e: + except OperationFailed as e: logger.error(e.message) return False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py index 46562bec3c..0f9f1a0e94 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py @@ -55,7 +55,8 @@ def _get_interface_name(self, interface_mac): interfaces = netifaces.interfaces() for interface in interfaces: - if netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] == interface_mac: + if netifaces.ifaddresses(interface)[AF_LINK][0][ + 'addr'] == interface_mac: return interface def configure(self, data): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py index f6ca055a5b..54c88a85ce 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py @@ -54,7 +54,7 @@ class ConfigSession(Session): def setup_config_session(self): """ - Setup vyos session. A random uuid is generated as a sesssion identifier + Setup vyos session. A random uuid is generated as a sesssion identifier ($PPID -Shell PID- could be used as well). """ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py index fe6de550fc..987cc7e8d6 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py @@ -79,6 +79,6 @@ def clean_stale_rules(self, interface_list): cmd = 'sudo sed -i /%s/d %s' % ( interface, INTERFACE_RULE_FILE) call(cmd.split()) - except Exception, err: + except Exception as err: logger.error("ERROR deleting stale persistent rule. Interfaces: " "%r . Details: %r" % (interface_list, str(err))) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py index a911207aaa..ef652dab29 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py @@ -85,7 +85,7 @@ def set_interface_ha(self, interface_config): vip = ha_config["vip"] tenant_id = ha_config["tenant_id"] advertised_interval = ha_config["advertised_interval"] - except KeyError, err: + except KeyError as err: raise Exception("HA configuration for interface failed. Value " "not found. %r" % str(err), 400, dict(interface_config=ha_config)) @@ -142,14 +142,14 @@ def delete_vrrp(self, vrrp_config): try: self.delete(provider_vrrp_delete.split()) - except Exception, err: + except Exception as err: # session.discard() logger.error("Error deleting provider vrrp %r " % err) # raise Exception(err) try: self.delete(stitching_vrrp_delete.split()) - except Exception, err: + except Exception as err: # session.discard() logger.error("Error deleting stitching vrrp %r " % err) # raise Exception(err) @@ -301,7 +301,7 @@ def get_conntrack_request_data(self, ha_config): priority = ha_config["priority"] vip = ha_config["vip"] advertised_interval = ha_config["advertised_interval"] - except KeyError, err: + except KeyError as err: raise Exception("Parameters missing for conntrack configuration " "%r" % str(err), 400, {"ha_config": ha_config}) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py index 558efbe7cd..c8a4c0e091 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py @@ -50,7 +50,7 @@ def set(self, args): try: exe.execmd() return True - except OperationFailed, e: + except OperationFailed as e: logger.error(e.message) return False @@ -60,6 +60,6 @@ def delete(self, args): try: exe.execmd() return True - except OperationFailed, e: + except OperationFailed as e: logger.error(e.message) return False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py index 46562bec3c..0f9f1a0e94 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py @@ -55,7 +55,8 @@ def _get_interface_name(self, interface_mac): interfaces = netifaces.interfaces() for interface in interfaces: - if netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] == interface_mac: + if netifaces.ifaddresses(interface)[AF_LINK][0][ + 'addr'] == interface_mac: return interface def configure(self, data): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py index f6ca055a5b..54c88a85ce 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py @@ -54,7 +54,7 @@ class ConfigSession(Session): def setup_config_session(self): """ - Setup vyos session. A random uuid is generated as a sesssion identifier + Setup vyos session. A random uuid is generated as a sesssion identifier ($PPID -Shell PID- could be used as well). """ From 1a39fa52c1fe4457baf3dc6674fd971d26d53ba4 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 30 Jun 2016 16:45:17 +0530 Subject: [PATCH 010/157] level 2 aggressive pep8 fix --- .../nfp/service_vendor_agents/vyos/execformat/formator.py | 2 +- .../vyos/oc-vyos/src/execformat/formator.py | 2 +- .../oc-vyos/src/oc_config_server/routes_config_handler.py | 4 ++-- .../vyos/oc-vyos/src/oc_config_server/stats_parser.py | 5 +++-- .../vyos/oc-vyos/src/oc_config_server/vpn_api_server.py | 7 ++++--- .../src/oc_config_server/vyos_policy_based_routes.py | 4 ++-- .../vyos/oc_config_server/routes_config_handler.py | 4 ++-- .../vyos/oc_config_server/stats_parser.py | 5 +++-- .../vyos/oc_config_server/vpn_api_server.py | 7 ++++--- .../vyos/oc_config_server/vyos_policy_based_routes.py | 4 ++-- 10 files changed, 24 insertions(+), 20 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py index 9ce6c316f8..0c464f7261 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py @@ -36,5 +36,5 @@ def formator(self, options): except OperationFailed as e: logger.error(e.message) return False - if execstate == True: + if execstate: return vparser.decode_string(output) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py index 9ce6c316f8..0c464f7261 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py @@ -36,5 +36,5 @@ def formator(self, options): except OperationFailed as e: logger.error(e.message) return False - if execstate == True: + if execstate: return vparser.decode_string(output) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py index ec1fa2ed26..0724da36aa 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py @@ -194,8 +194,8 @@ def _get_if_name_by_cidr(self, cidr): netmask = inet_info.get('netmask') ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + if (ip_address == subnet_prefix[0] and ( + len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py index fbfb4b2183..1f646e303a 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py @@ -105,8 +105,9 @@ def parse_firewall_stats(self, interface, raw_stats): rule = dict(zip(rule_keys, words)) firewall['rules'].append(rule) elif table and status == "Active": - command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_detail.xsl') + command = ( + '/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + + '/opt/vyatta/share/xsl/show_firewall_detail.xsl') show_fw_data = self.run_command(command) firewall = self.add_protocol_and_dest_port_info( firewall, show_fw_data) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py index 6f15dafa76..599a22832b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py @@ -335,9 +335,10 @@ def _create_ipsec_site_conn(self, ctx): logger.debug("Get vrrp group number for interface %s" % ifname) group_no = self._get_vrrp_group(ifname) ip = conn['stitching_fixed_ip'] - vrrp_cmd = ('set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn') % ( - ifname, group_no) + vrrp_cmd = ( + 'set interfaces ethernet %s vrrp vrrp-group %s ' + 'run-transition-scripts master /config/scripts/restart_vpn') % (ifname, + group_no) ifname = ifname + "v" + str(group_no) logger.info("vrrp interface name: %s" % ifname) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py index 8da5a6e7db..2b79fc9909 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py @@ -231,8 +231,8 @@ def _get_if_name_by_cidr(self, cidr, delete=False): netmask = inet_info.get('netmask') ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + if (ip_address == subnet_prefix[0] and ( + len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py index ec1fa2ed26..0724da36aa 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py @@ -194,8 +194,8 @@ def _get_if_name_by_cidr(self, cidr): netmask = inet_info.get('netmask') ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + if (ip_address == subnet_prefix[0] and ( + len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py index fbfb4b2183..1f646e303a 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py @@ -105,8 +105,9 @@ def parse_firewall_stats(self, interface, raw_stats): rule = dict(zip(rule_keys, words)) firewall['rules'].append(rule) elif table and status == "Active": - command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_detail.xsl') + command = ( + '/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + + '/opt/vyatta/share/xsl/show_firewall_detail.xsl') show_fw_data = self.run_command(command) firewall = self.add_protocol_and_dest_port_info( firewall, show_fw_data) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py index 6f15dafa76..599a22832b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py @@ -335,9 +335,10 @@ def _create_ipsec_site_conn(self, ctx): logger.debug("Get vrrp group number for interface %s" % ifname) group_no = self._get_vrrp_group(ifname) ip = conn['stitching_fixed_ip'] - vrrp_cmd = ('set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn') % ( - ifname, group_no) + vrrp_cmd = ( + 'set interfaces ethernet %s vrrp vrrp-group %s ' + 'run-transition-scripts master /config/scripts/restart_vpn') % (ifname, + group_no) ifname = ifname + "v" + str(group_no) logger.info("vrrp interface name: %s" % ifname) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py index 8da5a6e7db..2b79fc9909 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py @@ -231,8 +231,8 @@ def _get_if_name_by_cidr(self, cidr, delete=False): netmask = inet_info.get('netmask') ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and - (len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + if (ip_address == subnet_prefix[0] and ( + len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): return interface ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) From f9b106e992fd2325a9a1a3bff2762ef6fb634180 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 30 Jun 2016 17:26:08 +0530 Subject: [PATCH 011/157] removed duplicate files; renamed oc_fw_module --- .../service_vendor_agents/vyos/LICENSE README | 2 - .../service_vendor_agents/vyos/auth_pam.pl | 285 --------- .../vyos/auth_pam_domain_verify.pl | 273 --------- .../vyos/auth_server.conf | 6 - ...build_oc_vyos_deb.sh => build_vyos_deb.sh} | 9 +- .../vyos/execformat/__init__.py | 0 .../vyos/execformat/executor.py | 179 ------ .../vyos/execformat/formator.py | 40 -- .../vyos/init_script/oc-vyos | 130 ---- .../vyos/init_script/restart_vpn | 3 - .../service_vendor_agents/vyos/oc-vyos.conf | 8 - .../oc-vyos/src/oc_config_server/server2.py | 24 +- .../vyos/oc_config_server/__init__.py | 1 - .../oc_config_server/edit_persistent_rule.py | 84 --- .../vyos/oc_config_server/fw_constants.py | 17 - .../vyos/oc_config_server/fw_handler.py | 67 --- .../vyos/oc_config_server/ha_config.py | 364 ------------ .../oc_config_server/interface_monitor.sh | 11 - .../vyos/oc_config_server/log_forwarder.py | 57 -- .../vyos/oc_config_server/oc_fw_module.py | 356 ----------- .../vyos/oc_config_server/operations.py | 65 -- .../oc_config_server/routes_config_handler.py | 212 ------- .../vyos/oc_config_server/server.py | 57 -- .../vyos/oc_config_server/server2.py | 561 ------------------ .../vyos/oc_config_server/static_ip.py | 150 ----- .../vyos/oc_config_server/stats_parser.py | 341 ----------- .../vyos/oc_config_server/vpn_api_server.py | 465 --------------- .../vyos/oc_config_server/vyos-oc-log | 24 - .../vyos/oc_config_server/vyos_dhc.py | 16 - .../vyos/oc_config_server/vyos_exception.py | 16 - .../vyos_policy_based_routes.py | 251 -------- .../service_vendor_agents/vyos/op_commands.sh | 6 - .../vyos/vpn_op_commands.pl | 66 --- .../vyos/vyos_init_script/oc-vyos | 130 ---- .../vyos/vyos_init_script/restart_vpn | 3 - .../vyos/vyos_session/__init__.py | 1 - .../vyos/vyos_session/configsession.py | 156 ----- .../vyos/vyos_session/utils.py | 179 ------ 38 files changed, 14 insertions(+), 4601 deletions(-) delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/LICENSE README delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/auth_pam.pl delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/auth_pam_domain_verify.pl delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/auth_server.conf rename gbpservice/nfp/service_vendor_agents/vyos/{build_oc_vyos_deb.sh => build_vyos_deb.sh} (85%) delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/execformat/__init__.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/init_script/oc-vyos delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/init_script/restart_vpn delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos.conf delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/__init__.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_constants.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/interface_monitor.sh delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos-oc-log delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_dhc.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/op_commands.sh delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/vpn_op_commands.pl delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/oc-vyos delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/restart_vpn delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/vyos_session/__init__.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/LICENSE README b/gbpservice/nfp/service_vendor_agents/vyos/LICENSE README deleted file mode 100644 index 81526a2dc4..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/LICENSE README +++ /dev/null @@ -1,2 +0,0 @@ -configsession.py and utils.py are opens source files and originally taken from -"https://github.com/abessifi/pyatta". \ No newline at end of file diff --git a/gbpservice/nfp/service_vendor_agents/vyos/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/auth_pam.pl deleted file mode 100755 index 3cf31fa4cb..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/auth_pam.pl +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/perl - -use Data::Dumper; -local $Data::Dumper::Terse =1; -use JSON; -use LWP::UserAgent; - -#Constants -my $httpclient = LWP::UserAgent->new; - - -my $get_admin_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "name"=> "Default" - }, - "name"=> "", - "password"=> "" - } - } - }, - "scope" => - {"domain" => { - "name" => "Default" - } - } - } -}; - -my $get_user_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "id"=> "" - }, - "name"=> "", - "password"=> "" - } - } - }, - "scope" => { - "project" => { - "domain" => { - "id" => "" - }, - "name" => "" - } - } - } -}; - -#Global variables -my $admin_token_id; -my $user_token_id; -my $domain_id; -my $user_role; -my $cloud_admin_projname; -my $cloud_admin_username; -my $cloud_admin_password; -my $KEYSTONE_AUTH_URL; -my $REMOTE_VPN_ROLE_NAME; -my $SERVICE_PROJECT_ID; -my $username; -my $password; -my $user_id; -my $user_role_id; -my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; -my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - - - -sub read_auth_server_conf { - # Get auth server conf from file - my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; - - if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { - print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; - exit 1; - } - $KEYSTONE_AUTH_URL = ; - $cloud_admin_projname = ; - $cloud_admin_username = ; - $cloud_admin_password = ; - $REMOTE_VPN_ROLE_NAME = ; - $SERVICE_PROJECT_ID = ; - - chomp $KEYSTONE_AUTH_URL; - chomp $cloud_admin_projname; - chomp $cloud_admin_username; - chomp $cloud_admin_password; - chomp $REMOTE_VPN_ROLE_NAME; - chomp $SERVICE_PROJECT_ID; - - #$DB::single = 1; - - close(AUTHFILE); -} - - -sub read_username_passwd { - # Get username/password from file - - if ($ARG = shift @ARGV) { - if (!open (UPFILE, "<$ARG")) { - print "Could not open username/password file: $ARG\n"; - exit 1; - } - } else { - print "No username/password file specified on command line\n"; - exit 1; - } - - $username = ; - $password = ; - - if (!$username || !$password) { - print "Username/password not found in file: $ARG\n"; - exit 1; - } - - chomp $username; - chomp $password; - - close (UPFILE); -} - - - - - -sub get_cloud_admin_token { - #$DB::single = 1; - - my $http_req = HTTP::Request->new(POST => $url_get_admin_token); - $http_req->header('content-type' => 'application/json'); - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; - #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; - $json_string = to_json($get_admin_token_data); - $http_req->content($json_string); - #$http_req->content($get_admin_token_data); - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $admin_token_id = $http_resp->headers->{'x-subject-token'}; - print "Admin token id: ", $admin_token_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting cloud admin token failed \n"; - } -} - -sub get_domain_id { - my $http_req = HTTP::Request->new(GET => $url_get_domain); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $domain_id = $decoded_resp->{'project'}->{'domain_id'}; - $project_name = $decoded_resp->{'project'}->{'name'}; - print "Domain id: ", $domain_id, "\n"; - print "Project name: ", $project_name, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting domain id failed \n"; - } -} - -sub get_role_id { - my $http_req = HTTP::Request->new(GET => $url_get_role_id); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; - print "Role id: ", $user_role_id, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting role id failed \n"; - } -} - - - - -sub user_authenticate { - my $http_req = HTTP::Request->new(POST => $url_user_authenticate); - $http_req->header('content-type' => 'application/json'); - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; - $get_user_token_data->{"auth"}{"scope"}{"project"}{"domain"}{"id"} = $domain_id; - $get_user_token_data->{"auth"}{"scope"}{"project"}{"name"} = $project_name; - $json_string = to_json($get_user_token_data); - $http_req->content($json_string); - my $http_resp = $httpclient->request($http_req); - - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - #$DB::single = 1; - my $decoded_resp = decode_json($message); - $user_token_id = $http_resp->headers->{'x-subject-token'}; - $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; - print "User token id: ", $user_token_id, "\n"; - print "User id: ", $user_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting user token failed \n"; - } -} - -sub get_user_roles { - $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - #$DB::single = 1; - my $user_roles = $decoded_resp->{'role_assignments'}; - my $len = @{$user_roles}; - if ($len) { - $user_role = $REMOTE_VPN_ROLE_NAME; - } else { - $user_role = ""; - } - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting user roles failed \n"; - } -} - - -read_auth_server_conf(); -read_username_passwd(); - -$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$SERVICE_PROJECT_ID"; -$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - -get_cloud_admin_token(); -get_domain_id(); -get_role_id(); -user_authenticate(); -get_user_roles(); - -if ($user_role eq $REMOTE_VPN_ROLE_NAME) { - exit 0; -} -exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/auth_pam_domain_verify.pl deleted file mode 100755 index d5d32c58f7..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/auth_pam_domain_verify.pl +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/perl - -use Data::Dumper; -local $Data::Dumper::Terse =1; -use JSON; -use LWP::UserAgent; - -#Constants -my $httpclient = LWP::UserAgent->new; - - -my $get_admin_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "name"=> "Default" - }, - "name"=> "", - "password"=> "" - } - } - }, - "scope" => - {"domain" => { - "name" => "Default" - } - } - } -}; - -my $get_user_token_data = -{"auth" => - {"identity" => - {"methods" => ["password"], - "password"=> { - "user" => { - "domain"=> { - "id"=> "" - }, - "name"=> "", - "password"=> "" - } - } - } - } -}; - -#Global variables -my $admin_token_id; -my $user_token_id; -my $domain_id; -my $user_role; -my $cloud_admin_projname; -my $cloud_admin_username; -my $cloud_admin_password; -my $KEYSTONE_AUTH_URL; -my $REMOTE_VPN_ROLE_NAME; -my $PROJECT_ID; -my $username; -my $password; -my $user_id; -my $user_role_id; -my $url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; -my $url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -my $url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -my $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - - - -sub read_auth_server_conf { - # Get auth server conf from file - my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; - - if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { - print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; - exit 1; - } - $KEYSTONE_AUTH_URL = ; - $cloud_admin_projname = ; - $cloud_admin_username = ; - $cloud_admin_password = ; - $REMOTE_VPN_ROLE_NAME = ; - $PROJECT_ID = ; - - chomp $KEYSTONE_AUTH_URL; - chomp $cloud_admin_projname; - chomp $cloud_admin_username; - chomp $cloud_admin_password; - chomp $REMOTE_VPN_ROLE_NAME; - chomp $PROJECT_ID; - - #$DB::single = 1; - - close(AUTHFILE); -} - - -sub read_username_passwd { - # Get username/password from file - - if ($ARG = shift @ARGV) { - if (!open (UPFILE, "<$ARG")) { - print "Could not open username/password file: $ARG\n"; - exit 1; - } - } else { - print "No username/password file specified on command line\n"; - exit 1; - } - - $username = ; - $password = ; - - if (!$username || !$password) { - print "Username/password not found in file: $ARG\n"; - exit 1; - } - - chomp $username; - chomp $password; - - close (UPFILE); -} - - - - - -sub get_cloud_admin_token { - #$DB::single = 1; - - my $http_req = HTTP::Request->new(POST => $url_get_admin_token); - $http_req->header('content-type' => 'application/json'); - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; - $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; - #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; - $json_string = to_json($get_admin_token_data); - $http_req->content($json_string); - #$http_req->content($get_admin_token_data); - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $admin_token_id = $http_resp->headers->{'x-subject-token'}; - print "Admin token id: ", $admin_token_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting cloud admin token failed \n"; - } -} - -sub get_domain_id { - my $http_req = HTTP::Request->new(GET => $url_get_domain); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $domain_id = $decoded_resp->{'project'}->{'domain_id'}; - print "Domain id: ", $domain_id, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting domain id failed \n"; - } -} - -sub get_role_id { - my $http_req = HTTP::Request->new(GET => $url_get_role_id); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - $user_role_id = $decoded_resp->{'roles'}[0]->{'id'}; - print "Role id: ", $user_role_id, "\n"; - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting role id failed \n"; - } -} - - - - -sub user_authenticate { - my $http_req = HTTP::Request->new(POST => $url_user_authenticate); - $http_req->header('content-type' => 'application/json'); - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"domain"}{"id"} = $domain_id; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $username; - $get_user_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $password; - $json_string = to_json($get_user_token_data); - $http_req->content($json_string); - my $http_resp = $httpclient->request($http_req); - - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - #$DB::single = 1; - my $decoded_resp = decode_json($message); - $user_token_id = $http_resp->headers->{'x-subject-token'}; - $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; - print "User token id: ", $user_token_id, "\n"; - print "User id: ", $user_id, "\n"; - } - else { - print "HTTP POST error code: ", $http_resp->code, "\n"; - print "HTTP POST error message: ", $http_resp->message, "\n"; - die "Getting user token failed \n"; - } -} - -sub get_user_roles { - $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); - #$DB::single = 1; - $http_req->header('content-type' => 'application/json'); - $http_req->header('x-auth-token' => $admin_token_id); - - my $http_resp = $httpclient->request($http_req); - if ($http_resp->is_success) { - my $message = $http_resp->decoded_content; - my $decoded_resp = decode_json($message); - #$DB::single = 1; - my $user_roles = $decoded_resp->{'role_assignments'}; - my $len = @{$user_roles}; - if ($len) { - $user_role = $REMOTE_VPN_ROLE_NAME; - } else { - $user_role = ""; - } - } - else { - print "HTTP GET error code: ", $http_resp->code, "\n"; - print "HTTP GET error message: ", $http_resp->message, "\n"; - die "Getting user roles failed \n"; - } -} - - -read_auth_server_conf(); -read_username_passwd(); - -$url_get_admin_token = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_domain = $KEYSTONE_AUTH_URL . "/v3/projects/$PROJECT_ID"; -$url_user_authenticate = $KEYSTONE_AUTH_URL . "/v3/auth/tokens?nocatalog"; -$url_get_role_id = $KEYSTONE_AUTH_URL . "/v3/roles?name=$REMOTE_VPN_ROLE_NAME"; -$url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; - -get_cloud_admin_token(); -get_domain_id(); -get_role_id(); -user_authenticate(); -get_user_roles(); - -if ($user_role eq $REMOTE_VPN_ROLE_NAME) { - exit 0; -} -exit 1; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/auth_server.conf b/gbpservice/nfp/service_vendor_agents/vyos/auth_server.conf deleted file mode 100755 index ef768a8728..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/auth_server.conf +++ /dev/null @@ -1,6 +0,0 @@ -http://10.30.120.97:5000/ -services -neutron -noir0123 -vpn -45fe9bb731054eb4acdae8e15d48a562 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/build_oc_vyos_deb.sh b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh similarity index 85% rename from gbpservice/nfp/service_vendor_agents/vyos/build_oc_vyos_deb.sh rename to gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh index 0df9dc6bf4..8145d8c3ee 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/build_oc_vyos_deb.sh +++ b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh @@ -75,14 +75,9 @@ copy_source_code () { commit_id=`git log | head -1` branch_name=`git rev-parse --abbrev-ref HEAD` echo "Version: $version-$release" > $DEBIAN_PATH/etc/sc-version - #echo "Branch: $branch_name" >> $DEBIAN_PATH/etc/sc-version - #echo $commit_id >> $DEBIAN_PATH/etc/sc-version - #cp -r $SOURCE_CODE_DIR/packages/debian/oc-vyos/* $DEBIAN_PATH/. - #cp -r $SOURCE_CODE_DIR/* $DEBIAN_PATH/. cp -r $SOURCE_CODE_DIR/DEBIAN $DEBIAN_PATH/. cp -r $SOURCE_CODE_DIR/etc $DEBIAN_PATH/. - #cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/. cp -r $SOURCE_CODE_DIR/bin/oc-vyos $DEBIAN_PATH/usr/bin/. cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/usr/share/vyos-oc @@ -90,8 +85,8 @@ copy_source_code () { cp -r $SOURCE_CODE_DIR/src/oc-pbr/interfaces $DEBIAN_PATH/etc/network/. cp -r $SOURCE_CODE_DIR/src/oc-pbr/interface-post-up $DEBIAN_PATH/etc/network/. cp -r $SOURCE_CODE_DIR/src/oc-pbr/management_pbr $DEBIAN_PATH/etc/dhcp3/dhclient-exit-hooks.d/. + # TODO: Do we need this - #cp -r $SOURCE_CODE_DIR/vendor_certs/Sungard/sungard_certs/server/* $DEBIAN_PATH/config/auth/. cp -r $SOURCE_CODE_DIR/src/vyos_init_script/restart_vpn $DEBIAN_PATH/config/scripts/. mv $DEBIAN_PATH/usr/share/vyos-oc/oc-pbr $DEBIAN_PATH/usr/share/ sed -i "s/oc-vyos ([0-9]*.[0-9]*-*[0-9]*)/oc-vyos ($version-$release)/g" $DEBIAN_PATH/DEBIAN/changelog @@ -106,7 +101,7 @@ build_deb_package () { dpkg-deb --build oc-vyos-$version-$release cd $CURDIR - echo "OC Vyos package will be available in : $DEB_PACKAGE_DIR/oc-vyos-$version-$release.deb " + echo "Vyos package will be available in : $DEB_PACKAGE_DIR/oc-vyos-$version-$release.deb " } diff --git a/gbpservice/nfp/service_vendor_agents/vyos/execformat/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/execformat/__init__.py deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py deleted file mode 100755 index 3827054fde..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/execformat/executor.py +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/env python -import sys -import subprocess -import os - -# sys.path.append('/home/vyos/vyos-api/project/') -from vyos_session.configsession import ConfigSession, SessionNotExists, \ - SetupSessionFailed -from vyos_session import utils -import logging -import shlex - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - -try: - session = ConfigSession() -except Exception as err: - logger.error('A session exist already !') - -VYOS_SBIN_DIR = utils.get_config_params('bin', 'vyos_sbin_dir') -VYOS_SHELL_API = utils.get_config_params('bin', 'shell_api_path') - - -class OperationFailed(Exception): - pass - - -class OperationNameError(Exception): - pass - - -class ConfigPathNotCorrect(Exception): - pass - - -def check_operation_name(args): - """ Check if operation/command name is correct. """ - if len(args) == 0: - logger.error('Operation name required') - raise OperationNameError('Operation name required.') - elif args[0] not in ['show', 'set', 'delete', 'edit']: - logger.error('Operation name "%s" not correct' % args[0]) - raise OperationNameError('Operation name not correct.') - return True - - -def _runner(command): - """ - Run shell commands via subprocess.Popen() - """ - # NOTE: - # if Popen(self.args, shell=True, ...) => Execution fails - # if Popen(self.args, ...) => OSError: [Errno 2] No such file or directory - # if self.args = ['/bin/cli-shell-api','showCfg', ...] and - # Popen(self.args, ...) that works but actually we keep using ' - # '.join(self.args). - proc = subprocess.Popen(command, shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # wait for the process to terminate and get stdout/stderr outputs - out, err = proc.communicate() - return out, err, proc.returncode - - -def _op_command(command=None): - command = './op_commands.sh' - command += " " + "\"run show vpn ipsec sa\"" - - proc = subprocess.Popen(command, shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = proc.communicate() - return out - - -class execUtils: - """ Executes possible operations in a Vyos configure session.""" - - def __init__(self, args): - self.args = args - - def execmd(self, nonsession=False): - """ - Performs execution of allowed config operations ['show','set','delete'] - """ - if check_operation_name(self.args): - # prepare executable file to be called - operation_name = self.args[0] - logger.info('Perform operation "%s"' % operation_name) - - if not nonsession: - if self.args[0] == 'show': - self.args[0] = '{0} showCfg'.format( - VYOS_SHELL_API) - else: - self.args[0] = os.path.join(VYOS_SBIN_DIR, - 'my_{0}'.format(self.args[0])) - logger.debug('exec command: "%s"' % ' '.join(self.args)) - - if not nonsession and not session.session_exists(): - raise SessionNotExists('Configure session do not exists') - - if not nonsession: - # result = (stdout, stderr, errcode) - result = _runner(' '.join(self.args)) - else: - result = _op_command() - return (True, result) - - logger.debug('command return code: %s' % result[2]) - - if result[2]: - logger.info('command output: %s' % - ' '.join(result[0].splitlines())) - logger.error('Failed executing operation "%s"' % - operation_name) - raise OperationFailed('Operation failed !') - logger.debug('%s' % ' '.join(result[0].splitlines())) - logger.info('Executing "%s" operation OK' % operation_name) - return (True, result[0]) - - def check_cmd_args(self): - """ - Check that config path is correct before performing execmd() - """ - logger.info('Check specified configuration path existance') - config_path = ' '.join(self.args[1:]) - logger.info('config path: "%s"' % config_path) - cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) - logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # result = (stdout, stderr, errcode) - logger.debug('command return code: %s' % result[2]) - if result[2]: - logger.error('Configuration path is not correct') - raise ConfigPathNotCorrect('Configuration path is not correct') - logger.info('Configuration path is correct') - return True - - def check_cmd_args(self): - """ - Check that config path is correct before performing execmd() - """ - logger.info('Check specified configuration path existance') - config_path = ' '.join(self.args[1:]) - logger.info('config path: "%s"' % config_path) - cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) - logger.debug('exec command: "%s"' % cmd) - proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - errcode = proc.returncode - logger.debug('command return code: %s' % errcode) - if errcode: - logger.error('Configuration path is not correct') - raise ConfigPathNotCorrect('Configuration path is not correct') - logger.info('Configuration path is correct') - return True - - def get_possible_options(self): - """ - Returns list of nodes under specified configuration path - """ - out = [] - try: - self.check_cmd_args() # check config path validation - except ConfigPathNotCorrect: - return False, out # config path is not correct - - config_path = ' '.join(self.args[1:]) - logger.info('Get possible options of config path "%s"' % config_path) - cmd = '{0} listNodes {1}'.format(VYOS_SHELL_API, config_path) - logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # rst = (stdout, stderr, errcode) - logger.debug('command return code: %s' % result[2]) - if not result[0]: - logger.info('No more options for the specified config path') - return True, result[0] - options = shlex.split(result[0]) - logger.debug('List of options : "%s"' % options) - return True, options diff --git a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py deleted file mode 100755 index 0c464f7261..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/execformat/formator.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -import sys -import os -topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." -topdir = os.path.realpath(topdir) -sys.path.insert(0, topdir) -from executor import OperationFailed, execUtils as executor -from vyos_session.utils import logger -from vyosparser import vyos_parser as vparser - - -class ServiceError(Exception): - pass - - -class showConfig(): - - def formator(self, options): - args = ['show'] - service = options[0] - logger.debug("=====>>>>>> args before executor call = %s" % args) - if service in ['protocols', 'nat', 'interfaces', 'firewall']: - args.extend(options) - elif service in ['dns', 'dhcp-server', 'ssh', 'webproxy']: - options.insert(0, 'service') - args.extend(options) - else: - raise ServiceError('unknown such service!') - exe = executor(list(args)) - try: - # if not exe.checkcmd(' '.join(args)): - # logger.error("%s: given args does not match with existing configs!"%args) - # return False - execstate, output = exe.execmd() - logger.debug("=====>>>>>> args after executor call = %s" % args) - except OperationFailed as e: - logger.error(e.message) - return False - if execstate: - return vparser.decode_string(output) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/init_script/oc-vyos deleted file mode 100755 index 850a85e5ed..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/init_script/oc-vyos +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh -# -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA -# -### BEGIN INIT INFO -# Provides: oc-vyos -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: OC vyos service -# Description: Provides the oc-vyos service -### END INIT INFO -set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos -DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services -ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos -fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services -. /lib/lsb/init-functions -export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp -if [ ! -x ${DAEMON} ] ; then -exit 0 -fi -case "$1" in -start) -test "$ENABLED" = "true" || exit 0 -start=1 -## check if pidfile is there -if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi -fi -if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting oc vyos" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? -else -echo "oc-vyos[$pid] is already running" -fi -;; -stop) -test "$ENABLED" = "true" || exit 0 -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping oc vyos" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" -fi -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -;; -restart|force-reload) -test "$ENABLED" = "true" || exit 1 -$0 stop -sleep 2 -$0 start -;; -reload) -test "$ENABLED" = "true" || exit 0 -## check if pidfile is there -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading oc vyos" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "oc vyos is not running or PID file not existing" -fi -;; -status) -test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? -;; -*) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" -exit 1 -;; -esac -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/init_script/restart_vpn deleted file mode 100755 index 2cb8fe4762..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/init_script/restart_vpn +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/vbash -sudo rm /var/run/pluto.pid -vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos.conf deleted file mode 100644 index 1ae8510480..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos.conf +++ /dev/null @@ -1,8 +0,0 @@ -[bin] -vyos_sbin_dir = /opt/vyatta/sbin -shell_api_path = /bin/cli-shell-api - -[log] -logdir=/var/log/oc -logfile=oc-vyos.log -level=ERROR diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py index 4fcfe6313b..60370564f0 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py @@ -24,7 +24,7 @@ sys.path.insert(0, dirname(dirname(abspath(__file__)))) from vyos_session.utils import init_logger -from oc_fw_module import OCFWConfigClass +from fw_module import OCFWConfigClass from edit_persistent_rule import EditPersistentRule from static_ip import StaticIp from flask import Flask, request @@ -44,7 +44,7 @@ app = Flask(__name__) -oc_fw_module = None +fw_module = None e = EditPersistentRule() error_msgs = { @@ -241,10 +241,10 @@ def get_ssl_vpn_conn_state(): @app.route('/configure-firewall-rule', methods=['POST']) def configure_firewall_rule(): - global oc_fw_module + global fw_module firewall_data = request.data try: - response = oc_fw_module.set_up_rule_on_interfaces(firewall_data) + response = fw_module.set_up_rule_on_interfaces(firewall_data) except Exception as err: try: return send_error_response(OCException(err[0], status_code=err[1], @@ -260,9 +260,9 @@ def configure_firewall_rule(): @app.route('/delete-firewall-rule', methods=['DELETE']) def delete_firewall_rule(): - global oc_fw_module + global fw_module try: - response = oc_fw_module.reset_firewall(request.data) + response = fw_module.reset_firewall(request.data) except Exception as err: try: return send_error_response(OCException(err[0], status_code=err[1], @@ -278,10 +278,10 @@ def delete_firewall_rule(): @app.route('/update-firewall-rule', methods=['PUT']) def update_firewall_rule(): - global oc_fw_module + global fw_module try: - oc_fw_module.reset_firewall(request.data) - response = oc_fw_module.set_up_rule_on_interfaces(request.data) + fw_module.reset_firewall(request.data) + response = fw_module.set_up_rule_on_interfaces(request.data) except Exception as err: try: return send_error_response(OCException(err[0], status_code=err[1], @@ -438,7 +438,7 @@ def del_static_ip(): def add_rule(): # configuring sshd to listen on management ip address ip_addr = get_interface_to_bind() - oc_fw_module.run_sshd_on_mgmt_ip(ip_addr) + fw_module.run_sshd_on_mgmt_ip(ip_addr) data = json.loads(request.data) try: @@ -547,8 +547,8 @@ def main(): :type ip_addr: Server listen address """ - global oc_fw_module, vyos_ha_config - oc_fw_module = OCFWConfigClass() + global fw_module, vyos_ha_config + fw_module = OCFWConfigClass() vyos_ha_config = VYOSHAConfig() ip_addr = get_interface_to_bind() signal.signal(signal.SIGTERM, handler) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/__init__.py deleted file mode 100644 index 3ed9fd0f30..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py deleted file mode 100644 index 987cc7e8d6..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/edit_persistent_rule.py +++ /dev/null @@ -1,84 +0,0 @@ -from subprocess import call -import netifaces -import logging -from vyos_dhc import initiate_dhclient -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - -INTERFACE_RULE_FILE = "/etc/udev/rules.d/70-persistent-cd.rules" -ADD_RULE = 'SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="%s", NAME="%s"' - - -class EditPersistentRule(object): - - def __init__(self): - pass - - def add(self, mac_info): - provider_rule, stitching_rule, interface_list = self.get_rule(mac_info) - self.clean_stale_rules(interface_list) - # line = ADD_RULE % (mac, interface) - # initiate_dhclient() - self.delete(mac_info) - try: - call("sudo chown vyos: " - "/etc/udev/rules.d/70-persistent-cd.rules".split() - ) - with open(INTERFACE_RULE_FILE, "a") as myfile: - myfile.write(provider_rule + "\n") - myfile.write(stitching_rule + "\n") - except Exception as err: - logger.error("Failed to add persistent rule for macs -%r " % - mac_info) - raise Exception(err) - finally: - call("sudo chown root:root " - "/etc/udev/rules.d/70-persistent-cd.rules".split() - ) - - def delete(self, mac_info): - pro_cmd = 'sudo sed -i /%s/d %s' % (mac_info['provider_mac'], - INTERFACE_RULE_FILE) - stitch_cmd = 'sudo sed -i /%s/d %s' % (mac_info['stitching_mac'], - INTERFACE_RULE_FILE) - try: - call(pro_cmd.split()) - call(stitch_cmd.split()) - except Exception as err: - logger.error("Failed to delete persistent rule for macs -%r " % - mac_info) - raise Exception(err) - - def get_rule(self, mac_info): - interfaces = netifaces.interfaces() - provider_rule = '' - stitching_rule = '' - interface_list = list() - for interface in interfaces: - physical_interface = netifaces.ifaddresses(interface).get( - netifaces.AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses(interface)[netifaces.AF_LINK][0][ - 'addr'] - - if mac_addr == mac_info['provider_mac']: - interface_list.append(interface) - provider_rule = ADD_RULE % (mac_addr, interface) - elif mac_addr == mac_info['stitching_mac']: - interface_list.append(interface) - stitching_rule = ADD_RULE % (mac_addr, interface) - - return provider_rule, stitching_rule, interface_list - - def clean_stale_rules(self, interface_list): - try: - for interface in interface_list: - cmd = 'sudo sed -i /%s/d %s' % ( - interface, INTERFACE_RULE_FILE) - call(cmd.split()) - except Exception as err: - logger.error("ERROR deleting stale persistent rule. Interfaces: " - "%r . Details: %r" % (interface_list, str(err))) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_constants.py deleted file mode 100644 index 5e417c91e8..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_constants.py +++ /dev/null @@ -1,17 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -actions = ["drop", "reject", "accept", "inspect"] -state = ["established", "invalid", "related"] -availability = ["enable", "disable"] -intercloud = False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py deleted file mode 100755 index b31fb06d8c..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/fw_handler.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python - -from operations import configOpts - -FWN = "firewall name" -ZPZ = "zone-policy zone" - - -class fwHandler(configOpts): - actions = ["drop", "reject", "accept", "inspect"] - state = ["established", "invalid", "related"] - availability = ["enable", "disable"] - - def firewall_config(self, name, suffix): - firewall = [FWN, name, "rule"] - firewall.extend(suffix) - self.set(firewall) - - def zone_config(self, suffix): - zone = [ZPZ] - zone.extend(suffix) - self.set(zone) - - def set_zone_desc(self, zone_name, desc): - description = [zone_name, "description", desc] - self.zone_config(description) - - def set_zone_interface(self, zone_name, iface): - interface = [zone_name, "interface", iface] - self.zone_config(interface) - - def setup_fw_on_zone(self, zone_src, zone_dst, firewall): - fw_on_zone = [zone_src, "from", zone_dst, "name", firewall] - self.zone_config(fw_on_zone) - - def set_default_action(self, name, rule_num, action): - if action in self.actions: - self.set_action[rule_num, "action", action] - self.firewall_config(name, set_action) - - def set_rule_state(self, name, rule_num, state, allow): - if state in self.states and allow in self.availability: - self.set_state[rule_num, "state", state, allow] - self.firewall_config(name, set_state) - - def set_protocol(self, name, rule_num, prot): - protocol = [rule_num, "protocol", prot] - self.firewall_config(name, protocol) - - def set_dest_port(self, name, rule_num, portlist, orient="destination"): - port = [rule_num, orient, "port", portlist] - self.firewall_config(name, port) - - def set_dest_addr(self, name, rule_num, addr_subnet, orient="destination"): - addr = [rule_num, orient, "address", addr_subnet] - self.firewall_config(name, addr) - - def set_src_port(self, name, rule_num, portlist): - self.set_dest_port(name, rule_num, portlist, "source") - - def set_src_addr(self, name, rule_num, addr_subnet): - self.set_dest_addr(name, rule_num, addr_subnet, "source") - - def rule_state(self, name, rule_num, status): - if status in availability: - rule_status = [rule_num, status] - self.firewall_config(name, rule_status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py deleted file mode 100644 index ef652dab29..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/ha_config.py +++ /dev/null @@ -1,364 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -#!/usr/bin/env python -import json -import netifaces -import time -import logging -from netifaces import AF_INET, AF_LINK - -from execformat.executor import session - -from operations import configOpts -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class VYOSHAConfig(configOpts): - """ - Class to configure HA for VYOS. - """ - - def __init__(self): - super(VYOSHAConfig, self).__init__() - pass - - def configure_conntrack_sync(self, ha_config): - """ - :param ha_config: - :return: - """ - ha_config = json.loads(ha_config) - monitoring_info, data_info = self.get_conntrack_request_data( - ha_config) - event_queue_size = monitoring_info["event_queue_size"] - cluster_name = monitoring_info["cluster_name"] - mcast_group = monitoring_info["mcast_group"] - sync_queue_size = monitoring_info["sync_queue_size"] - monitoring_mac = monitoring_info["monitoring_mac"] - - monitoring_interface, monitoring_ip = self._get_interface_name( - dict(monitoring_mac=monitoring_mac), - interface_type='monitoring') - - if not monitoring_interface: - # return {'status': 500, - # 'message': 'Failed to get monitoring interface name'} - logger.error("Failed to configure conntrack for CLUSTER- %r" % - cluster_name) - raise Exception("Conntrack sync configuration failed. Reason - " - "No monitoring interface information found.", - 400, dict(ha_config=ha_config)) - - conntrack_commands = self._set_conntrack( - cluster_name, event_queue_size, mcast_group, - monitoring_interface, sync_queue_size) - interface_vrrp_commands = self.set_vrrp_for_interface(data_info) - - all_commands = conntrack_commands + interface_vrrp_commands - - self._execute_commands(all_commands, ha_config['tenant_id']) - logger.debug("VRRP configured succesfully - %r " % all_commands) - return {'status': 200, 'message': 'VRRP configured succesfully'} - - def set_interface_ha(self, interface_config): - ha_config = json.loads(interface_config) - try: - cluster_name = ha_config["cluster_name"] - vrrp_group = ha_config["vrrp_group"] - data_macs = ha_config["data_macs"] - preempt_delay = ha_config["preempt_delay"] - priority = ha_config["priority"] - vip = ha_config["vip"] - tenant_id = ha_config["tenant_id"] - advertised_interval = ha_config["advertised_interval"] - except KeyError as err: - raise Exception("HA configuration for interface failed. Value " - "not found. %r" % str(err), - 400, dict(interface_config=ha_config)) - interface_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, - vip=vip, preempt_delay=preempt_delay, - priority=priority, cluster_name=cluster_name, - advertised_interval=advertised_interval, - tenant_id=tenant_id) - - interface_vrrp_commands = self.set_vrrp_for_interface(interface_info) - - self._execute_commands(interface_vrrp_commands, interface_info[ - 'tenant_id']) - logger.debug("VRRP succesfully configured for interfaces.") - return {'status': 200, 'message': 'VRRP succesfully configured for ' - 'interfaces'} - - def delete_vrrp(self, vrrp_config): - """ - :param self: - :param vrrp_config: - :return: - This method makes an assumption that detach of an interface will - finally clean the vrrp entry. That's why doesn't raise any - exception, as was observed that even though it succeeds but raises an - exception. Investigation will continue. Also this methods doesn't - clean conntrack explicitly, instead it goes with VM delete. - Exception code will be incorporated once the exception established - case. - """ - vrrp_config = json.loads(vrrp_config) - data_macs = vrrp_config["data_macs"] - # cluster_name = vrrp_config.get("cluster_name", "CLUSTER-1") - - data_interface, data_ip = self._get_interface_name( - dict(data_mac=data_macs['provider_mac']), interface_type='data') - - provider_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface - - data_interface, data_ip = self._get_interface_name( - dict(data_mac=data_macs['stitching_mac']), interface_type='data') - stitching_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface - - session.setup_config_session() - # delete_conntrack_cluster = ("service conntrack-sync " - # "failover-mechanism vrrp sync-group %s" % - # cluster_name) - # try: - # self.delete(group_delete.split()) - # except Exception, err: - # session.discard() - # session.teardown_config_session() - # raise Exception(err) - - try: - self.delete(provider_vrrp_delete.split()) - except Exception as err: - # session.discard() - logger.error("Error deleting provider vrrp %r " % err) - # raise Exception(err) - - try: - self.delete(stitching_vrrp_delete.split()) - except Exception as err: - # session.discard() - logger.error("Error deleting stitching vrrp %r " % err) - # raise Exception(err) - - # try: - # self.delete(delete_conntrack_cluster.split()) - # except Exception, err: - # session.discard() - # session.teardown_config_session() - # raise Exception(err) - # logger.error("Error deleting conntrack - %r " % err) - - session.commit() - time.sleep(5) - session.save() - # REVISIT (VK) This sleep need to get invoked if we see any issue - # with session teardown. - # time.sleep(5) - session.teardown_config_session() - logger.debug("VRRP succesfully deleted for interfaces") - return {'status': 200, 'message': 'VRRP succesfully deleted for ' - 'interfaces'} - - def set_vrrp_for_interface(self, data_info): - interface_commands = list() - direct_call = False - if isinstance(data_info, str): - direct_call = True - data_info = json.loads(data_info) - data_macs = data_info.get("data_macs", {}) - vips = data_info.get("vip", {}) - vrrp_groups = data_info["vrrp_group"] - - for mac_type, mac in data_macs.iteritems(): - # mac_type - provider_mac, stitching_mac - data_mac = dict(data_mac=str(mac)) - vip_type = mac_type.split("_")[0] + "_vip" - vip_ip = vips.get(vip_type) - if mac_type == "provider_mac": - vrrp_group = vrrp_groups["provider_vrrp_group"] - if mac_type == "stitching_mac": - vrrp_group = vrrp_groups["stitching_vrrp_group"] - - interface_name, ip = self._get_interface_name( - data_mac, interface_type='data') - - if not interface_name: - logger.error("Failed to configure VRRP, as unable to get " - "interface name.") - raise Exception('VRRP config failed.Failed to get interface' - ' name to configure vrrp', 400, - dict(data_info=data_info)) - - common_command = "interfaces ethernet %s vrrp vrrp-group %s " % ( - interface_name, vrrp_group) - - interface_address_set = "interfaces ethernet %s address %s " % ( - interface_name, ip) - - advt_interval_set = common_command + "advertise-interval %s " % ( - data_info["advertised_interval"]) - - preempt_set = common_command + "preempt true" - # preempt_set = common_command + "preempt %s" % data_info[ - # "preempt"] - preempt_delay_set = common_command + "preempt-delay %s" % \ - data_info["preempt_delay"] - priority_set = common_command + "priority %s" % data_info[ - "priority"] - rfc_set = common_command + "rfc3768-compatibility" - sync_group_set = common_command + "sync-group %s " % data_info[ - "cluster_name"] - virtual_address_set = common_command + "virtual-address %s" % \ - vip_ip - - interface_commands += [interface_address_set, advt_interval_set, - preempt_set, preempt_delay_set, - priority_set, rfc_set, sync_group_set, - virtual_address_set] - - logger.debug("Interface commands - %r ", interface_commands) - if not direct_call: - return interface_commands - else: - self._execute_commands(interface_commands, data_info.get( - 'tenant_id')) - return dict(message='Interface configured succesfully') - - @staticmethod - def _set_conntrack(cluster_name, event_queue_size, mcast_group, - monitoring_interface, sync_queue_size): - peer_link_set = "interfaces ethernet %s description PEER-LINK" % \ - monitoring_interface - event_queue_set = "service conntrack-sync event-listen-queue-size " \ - "%s" % str(event_queue_size) - cluster_set = "service conntrack-sync failover-mechanism vrrp " \ - "sync-group " + cluster_name - interface_set = "service conntrack-sync interface %s" % \ - monitoring_interface - mcast_set = "service conntrack-sync mcast-group %s " % mcast_group - sync_queue_set = "service conntrack-sync sync-queue-size %s " % \ - str(sync_queue_size) - commands = [peer_link_set, event_queue_set, cluster_set, - interface_set, mcast_set, sync_queue_set] - - logger.debug("Conntrack commands - %r " % commands) - return commands - - @staticmethod - def _get_interface_name(ha_config, interface_type=None): - """ - :param ha_config: - :param interface_type: - :return: - """ - interfaces = netifaces.interfaces() - for interface in interfaces: - physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) - if not physical_interface: - continue - if AF_INET not in netifaces.ifaddresses(interface).keys(): - continue - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - ip_addr = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] - netmask = netifaces.ifaddresses(interface)[AF_INET][0]['netmask'] - if mac_addr == ha_config.get('monitoring_mac', None) and \ - interface_type.lower() == 'monitoring': - return interface, ip_addr - elif (mac_addr == ha_config.get('data_mac', None) and - interface_type.lower() == 'data'): - mlen = sum([bin(int(x)).count('1') for x in - netmask.split('.')]) - ip_addr += ("/" + str(mlen)) - return interface, ip_addr - - logger.error("interface name none, ha_config: %s" % ha_config) - return None, None - - def get_conntrack_request_data(self, ha_config): - try: - monitoring_mac = ha_config["monitoring_mac"] - queue_size = ha_config.get("queue_size", 8) - cluster_name = ha_config["cluster_name"] - mcast_group = ha_config["mcast_group"] - sync_queue_size = ha_config.get("sync_queue_size", 1) - vrrp_group = ha_config["vrrp_group"] - data_macs = ha_config["data_macs"] - preempt_delay = ha_config["preempt_delay"] - priority = ha_config["priority"] - vip = ha_config["vip"] - advertised_interval = ha_config["advertised_interval"] - except KeyError as err: - raise Exception("Parameters missing for conntrack configuration " - "%r" % str(err), 400, {"ha_config": ha_config}) - - monitoring_info = dict(monitoring_mac=monitoring_mac, - event_queue_size=queue_size, - cluster_name=cluster_name, - mcast_group=mcast_group, - sync_queue_size=sync_queue_size) - - data_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, - vip=vip, preempt_delay=preempt_delay, - priority=priority, cluster_name=cluster_name, - advertised_interval=advertised_interval) - - return monitoring_info, data_info - - def get_interface_data(self, interface_config): - try: - data_macs = interface_config["data_macs"] - advertised_interval = interface_config["advertised_interval"] - vrrp_group = interface_config["vrrp_group"] - preempt_delay = interface_config["preempt_delay"] - priority = interface_config["priority"] - vip = interface_config["vip"] - except KeyError: - pass - - data_info = dict(data_macs=data_macs, - advertised_interval=advertised_interval, - vrrp_group=vrrp_group, preempt_delay=preempt_delay, - priority=priority, vip=vip) - - return data_info - - def _execute_commands(self, all_commands, tenant_id=None): - session.setup_config_session() - for command in all_commands: - try: - self.set(command.split()) - except: - logger.error("Failed to configure HA. Tenant - %r" % tenant_id) - session.teardown_config_session() - raise Exception("Failed to configure HA for tenant %s" % - tenant_id, 400, {"commands": all_commands, - "failed_command": command}) - try: - session.commit() - except: - logger.error("Failed to commit HA configuration. Tenant - %r" - % tenant_id) - session.discard() - time.sleep(2) - session.teardown_config_session() - raise Exception("Failed to configure HA for tenant %s" % tenant_id, - 400, {"commands": all_commands, - "failed_command": command}) - time.sleep(5) - session.save() - time.sleep(5) - session.teardown_config_session() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/interface_monitor.sh deleted file mode 100755 index f2ebd12247..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/interface_monitor.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - - function enumerate_net_interfaces { - - echo `date` `ip addr` >> /var/log/oc/vyos_monitor - echo "\n" - echo `date` `sudo netstat -pantl | grep 8888` >>/var/log/oc/vyos_monitor - } - - enumerate_net_interfaces - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py deleted file mode 100644 index 72d97db4d0..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/log_forwarder.py +++ /dev/null @@ -1,57 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import logging -import subprocess - -from vyos_session import utils - -OP_SUCCESS = True -OP_FAILED = False - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class APIHandler(object): - - def __init__(self): - pass - - def run_command(self, command): - proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - out, err = proc.communicate() - if err: - logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) - return None - return out - - def configure_rsyslog_as_client(self, config): - command = """ - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system syslog host %s facility all level %s - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save - """ % (config['server_ip'], config['log_level']) - - try: - out = self.run_command(command) - return OP_SUCCESS - except Exception as ex: - logger.error("Error while configuring rsyslog as client. %s" % ex) - return OP_FAILED diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py deleted file mode 100644 index 53257cfe2d..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/oc_fw_module.py +++ /dev/null @@ -1,356 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -#!/usr/bin/env python -import logging -import json -import netifaces -import time -import fw_constants -import ast -from operations import configOpts -from vyos_session import utils -from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE -from execformat.executor import session - -FWN = 'firewall name' -# oc_fw_identifier = 'oc_fw' -rule = 'rule' -firewall_rules = { - 'protocol': '%s protocol %s', - 'source_ip_address': '%s source address %s', - 'destination_ip_address': '%s destination address %s', - 'source_port': '%s source port %s', - 'destination_port': '%s destination port %s' -} - -firewall_action = {'allow': 'accept', 'deny': 'drop'} - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class OCFWConfigClass(configOpts): - - def __init__(self): - super(OCFWConfigClass, self).__init__() - self.oc_fw_identifier = 'oc_fw' - self.provider_ptg_interfaces = list() - self.rules = list() - - def set_up_rule_on_interfaces(self, firewall): - """ - firewall = {'status': u'PENDING_CREATE', 'name': u'', 'shared': None, - 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', - 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', - 'admin_state_up': True, 'id': u'e9b5ca2f-a721-41b9-be9b-7a6189ddbec5' - , 'firewall_rule_list': [{'protocol': u'tcp', 'description': u'', - 'source_port': None, 'source_ip_address': None, - 'destination_ip_address': None, - 'firewall_policy_id': u'eeb15ef4-ba80-43ca-8f9c-27fa0f48db20', - 'position': 1L, 'destination_port': '80', - 'id': u'b98296cb-335a-4314-83f9-aa5654f296fa', 'name': u'', - 'tenant_id': u'a3d0d8dba0834e1fbff229f5e2b2e440', 'enabled': True, - 'action': u'allow', 'ip_version': 4L, 'shared': False}], - 'description': u''} - - :param firewall: Firewall object - """ - sorted_rule_list, self.provider_ptg_interfaces = list(), list() - - firewall = json.loads(firewall) - fw_rule_list = firewall['firewall_rule_list'] - logger.info("Initiating firewall - %s build. of Tenant: %s" % ( - firewall['id'], firewall['tenant_id'])) - sorted_rule_list = self.sort_rule_list(fw_rule_list, firewall['id']) - try: - self.set_provider_interface(firewall) - except Exception as e: - msg = ("Firewall - %s configuration failed. Tenant : %s Error " - "retrieving PTG's interface %r" % - (firewall['id'], firewall['tenant_id'], str(e))) - logger.error(msg) - raise Exception(msg, 400, dict(config_success=False)) - else: - if not self.provider_ptg_interfaces: - msg = ("No interface was found to configure firewall - %s . " - "Tenant: %s" % - (firewall['id'], firewall['tenant_id'])) - logger.error(msg) - raise Exception(msg, 400, dict(config_success=False)) - - session.setup_config_session() - # FIXME (VK): This will log error also when there is no firewall - # before on the interface. Need to evaluate side effect of this method. - try: - self._ensure_clean_interface() - except: - pass - self.rules = list() - self.add_common_rule() - try: - for fw_rule in sorted_rule_list: - self.create_vyos_fw_rule(fw_rule) - self.configure_interfaces() - for _rule in self.rules: - self.set(_rule.split()) - session.commit() - except Exception as e: - msg = ("Firewall - %s configuration failed. Error: %s " % - (firewall['id'], str(e))) - logger.error(msg) - session.discard() - session.teardown_config_session() - raise Exception(msg, 400, dict(config_success=False)) - else: - msg = "Firewall - %s rules created successfully on %r" % ( - firewall['id'], self.provider_ptg_interfaces) - logger.info(msg) - return {'status': 200, 'config_success': True, 'message': msg} - finally: - session.save() - time.sleep(4) - session.teardown_config_session() - - def add_common_rule(self): - self.oc_fw_identifier = ('oc_fw' + '_' + - self.provider_ptg_interfaces[0]) - default_action = (FWN + ' ' + self.oc_fw_identifier + - ' default-action drop' - ) - common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + - rule + ' 10') - accept_action = (common_fw_rule_prefix + ' action accept') - established_action = (common_fw_rule_prefix + - ' state established enable') - related_action = (common_fw_rule_prefix + - ' state related enable') - self.rules += [default_action, accept_action, established_action, - related_action] - - def create_vyos_fw_rule(self, fw_rule): - if not fw_rule.get('enabled'): - return - - position = str(int(fw_rule.get('position', '100')) + 10) - if position < 1: - position *= 10 - common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + - rule + ' ' + position) - self.rules.append(common_fw_rule_prefix) - self.rules.append(''.join([common_fw_rule_prefix, ' action %s' % - firewall_action[fw_rule['action'.lower()]]]) - ) - try: - self.rules.extend( - [firewall_rules[k] % - (common_fw_rule_prefix, fw_rule[k] - if k not in ['source_port', 'destination_port'] - else fw_rule[k].replace(':', '-')) - for k, v in fw_rule.iteritems() - if fw_rule[k] and k in firewall_rules] - ) - - except Exception as err: - logger.error("Firewall rule retrieval failed . Error - %s" % - str(err)) - raise Exception(err) - - def configure_interfaces(self): - if fw_constants.intercloud: - # TODO(Vikash) Its not always the bridge will have same name every - # time. Its only for intercloud - interface_conf = ("interfaces bridge br0 firewall in name " + - self.oc_fw_identifier) - self.rules += [interface_conf] - else: - # It would be always 1 for now. - for interface in self.provider_ptg_interfaces: - if interface.lower() == 'lo': - continue - interface_conf = ('interfaces ethernet ' + interface + ' ' + - 'firewall out name ' + self.oc_fw_identifier) - self.rules += [interface_conf] - - def reset_firewall(self, firewall): - fw_data = json.loads(firewall) - try: - self.set_provider_interface(fw_data) - except Exception as err: - msg = ("Firewall %s reset failed. Error retrieving PTG's " - "interface- %r" % (fw_data['id'], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - if not self.provider_ptg_interfaces: - msg = ("No interface was found for - %r " % fw_data[ - 'id']) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False, - message="INTERFACE NOT FOUND")) - - session.setup_config_session() - - if fw_constants.intercloud: - bridge_rule = ("interfaces bridge br0 firewall in name " + - self.oc_fw_identifier) - try: - self.delete(bridge_rule.split()) - except Exception as err: - msg = (" Rule deletion on bridge failed - %s " % str( - err)) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - del_interface_rule = ( - 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + - ' ' + 'firewall') - try: - self.delete(del_interface_rule.split()) - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Rule deletion on interface %s failed. ERROR: %s " % - (self.provider_ptg_interfaces[0], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - try: - session.commit() - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Rule deletion commit operation failed for firewall - %s. " - "Error - %s" % (fw_data['id'], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - - # sleep for 2 sec. Got removed in last merge. - time.sleep(2) - self.oc_fw_identifier = ('oc_fw' + '_' + - self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.oc_fw_identifier - try: - self.delete(del_firewall.split()) - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Firewall - %s deletion failed on interface: %r .ERROR %s" - % (fw_data['id'], self.provider_ptg_interfaces[0], - str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - try: - session.commit() - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Session commit failed for firewall deletion : %s. " - "Error - %r " % - (fw_data['id'], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - logger.info("Firewall -%r deleted succesfully" % fw_data[ - 'id']) - - session.save() - # Can be removed if we don't see any issue. - time.sleep(1) - session.teardown_config_session() - - return {'status': 200, 'message': 'Firewall - %s deleted ' - 'succesfully' % fw_data['id'], - 'delete_success': True} - - def sort_rule_list(self, fw_rule_list, fw_id): - fw_rule_list_len = len(fw_rule_list) - rule_list = [-1] * fw_rule_list_len - for rule in fw_rule_list: - ind = rule['position'] - 1 - rule_list[ind] = rule - - if -1 in rule_list: - # raise Exception("Something went wrong") - rule_list = list() - logger.warn("Adding only DROP rule as not received any rules for " - "firewall %s" % fw_id) - return rule_list - - def set_provider_interface(self, firewall): - description = ast.literal_eval(firewall["description"]) - if not description.get('provider_ptg_info'): - raise - provider_ptg_info = description["provider_ptg_info"] - # consumer_ptg_ips = description.get('consumer_ptg_ips', []) - interfaces = netifaces.interfaces() - self.provider_ptg_interfaces = list() - for interface in interfaces: - # IPV4 support only - # (Fixme) what in the case of aliasing? - # ip = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] - # TODO (Vikash) Not reqd for L2 , need to revisit for L3 - # vpn tunnel interface for ssl vpn does not have a mac address - physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - - if mac_addr in provider_ptg_info: - self.provider_ptg_interfaces.append(interface) - - def get_out_and_in_rule(self, fw_rule_list): - in_rule_list = out_rule_list = list() - - for rule in fw_rule_list: - if rule['direction'] == 'in': - in_rule_list.append(rule) - elif rule['direction'] == 'out': - out_rule_list.append(rule) - else: - raise Exception("Not valid direction") - - return in_rule_list, out_rule_list - - def _ensure_clean_interface(self): - del_interface_rule = ( - 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + - ' ' + 'firewall') - self.oc_fw_identifier = ('oc_fw' + '_' + - self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.oc_fw_identifier - try: - self.delete(del_interface_rule.split()) - # delete firewall - self.delete(del_firewall.split()) - except Exception as err: - logger.info("Stale firewall rule deletion on interface %s failed. " - "This method is called with every firewall create to " - "avoid previous stale firewall rule. This message can " - "be ignored." % self.provider_ptg_interfaces[0]) - raise Exception(err) - - def run_sshd_on_mgmt_ip(self, mgmt_ip): - command = "service ssh listen-address %s" % mgmt_ip - session.setup_config_session() - self.set(command.split()) - try: - session.commit() - except: - logger.error("Failed to update sshd listen-address to %s" % - mgmt_ip) - session.discard() - session.teardown_config_session() - return - session.save() - session.teardown_config_session() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py deleted file mode 100755 index c8a4c0e091..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/operations.py +++ /dev/null @@ -1,65 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -#!/usr/bin/env python - -import sys -import os -import logging -topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." -topdir = os.path.realpath(topdir) -sys.path.insert(0, topdir) -from execformat.executor import execUtils, OperationFailed -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class configOpts(object): - - def __init__(self): - pass - - def set_1(self, args): - exe = execUtils(list(args)) - exe.execmd() - - def delete_1(self, args): - exe = execUtils(list(args)) - exe.execmd() - - def show(self, args): - exe = execUtils(list(args)) - res, output = exe.execmd(nonsession=True) - return res, output - - def set(self, args): - args.insert(0, 'set') - exe = execUtils(list(args)) - try: - exe.execmd() - return True - except OperationFailed as e: - logger.error(e.message) - return False - - def delete(self, args): - args.insert(0, 'delete') - exe = execUtils(list(args)) - try: - exe.execmd() - return True - except OperationFailed as e: - logger.error(e.message) - return False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py deleted file mode 100644 index 0724da36aa..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/routes_config_handler.py +++ /dev/null @@ -1,212 +0,0 @@ -import json -import logging -import netifaces -import subprocess -import netaddr -import time - -from vyos_session import utils - -ROUTING_TABLE_BASE = 10 - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class RoutesConfigHandler(object): - - def __init__(self): - super(RoutesConfigHandler, self).__init__() - - def add_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - gateway_ip = route_info['gateway_ip'] - source_interface = self._get_if_name_by_cidr(source_cidr) - try: - interface_number_string = source_interface.split("eth", 1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for configuring " - "routes" % (source_interface)) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - ip_rule_command = "ip rule add from %s table %s" % ( - source_cidr, routing_table_number) - out1 = subprocess.Popen(ip_rule_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - ip_rule_command = "ip rule add to %s table main" % (source_cidr) - out2 = subprocess.Popen(ip_rule_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - ip_route_command = "ip route add table %s default via %s" % ( - routing_table_number, gateway_ip) - out3 = self._add_default_route_in_table(ip_route_command, - routing_table_number) - output = "%s\n%s\n%s" % (out1, out2, out3) - logger.info("Static route configuration result: %s" % (output)) - return json.dumps(dict(status=True)) - - def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" % (table) - command_pipe = subprocess.Popen(route_del_command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" % (err)) - - def _add_default_route_in_table(self, route_cmd, table): - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0: - if "File exists" in err: - self._del_default_route_in_table(table) - else: - logger.error("Adding default route failed: %s" % (route_cmd)) - logger.error("Error: %s" % (err)) - raise Exception("Setting Default Table route failed") - else: - return out - - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" % (route_cmd)) - logger.error("Error: %s" % (err)) - raise Exception("Setting Default Table route failed") - else: - return out - - def _delete_ip_rule(self, cidr): - count = 0 - for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" % (direction, cidr) - while True: - command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0 and "No such file" in err: - break - else: - count = count + 1 - if count >= 10: - logger.error("Deleting policy based routing for CIDR: " - "%s not completed even after 10 attempts" - % (cidr)) - break - - def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" % (table) - command_pipe = subprocess.Popen(route_del_command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" % (err)) - - def _add_default_route_in_table(self, route_cmd, table): - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0: - if "File exists" in err: - self._del_default_route_in_table(table) - else: - logger.error("Adding default route failed: %s" % (route_cmd)) - logger.error("Error: %s" % (err)) - raise Exception("Setting Default Table route failed") - else: - return out - - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" % (route_cmd)) - logger.error("Error: %s" % (err)) - raise Exception("Setting Default Table route failed") - else: - return out - - def _delete_ip_rule(self, cidr): - count = 0 - for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" % (direction, cidr) - while True: - command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0 and "No such file" in err: - break - else: - count = count + 1 - if count >= 10: - logger.error("Deleting policy based routing for CIDR: " - "%s not completed even after 10 attempts" - % (cidr)) - break - - # REVISIT(Magesh): There may be a chance that there are duplicate rules - # May have to do a list and cleanup multiple entries - def delete_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - source_interface = self._get_if_name_by_cidr(source_cidr) - try: - interface_number_string = source_interface.split("eth", 1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for deleting routes" - % (source_interface)) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - self._delete_ip_rule(source_cidr) - ip_route_command = "ip route del table %s default" % ( - routing_table_number) - out = subprocess.Popen(ip_route_command, shell=True, - stdout=subprocess.PIPE).stdout.read() - logger.info("Static route delete result: %s" % (out)) - return json.dumps(dict(status=True)) - - def _get_if_name_by_cidr(self, cidr): - interfaces = netifaces.interfaces() - retry_count = 0 - while True: - all_interfaces_have_ip = True - for interface in interfaces: - inet_list = netifaces.ifaddresses(interface).get( - netifaces.AF_INET) - if not inet_list: - all_interfaces_have_ip = False - for inet_info in inet_list or []: - netmask = inet_info.get('netmask') - ip_address = inet_info.get('addr') - subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and ( - len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): - return interface - ip_address_netmask = '%s/%s' % (ip_address, netmask) - interface_cidr = netaddr.IPNetwork(ip_address_netmask) - if str(interface_cidr.cidr) == cidr: - return interface - # Sometimes the hotplugged interface takes time to get IP - if not all_interfaces_have_ip: - if retry_count < 10: - time.sleep(3) - retry_count = retry_count + 1 - continue - else: - raise Exception("Some of the interfaces do not have " - "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py deleted file mode 100644 index becb0c535e..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server.py +++ /dev/null @@ -1,57 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import signal -import logging -import sys -from vyos_session.utils import init_logger - - -logger = logging.getlogger(__name__) -init_logger(logger) - - -class OCVyOSServer(object): - - def __init__(self): - pass - - -def handler(signum, frame): - if signum in [2, 3, 11, 15]: - logger.info(" Recieved signal: %r. Thus exiting " % signum) - sys.exit() - else: - logger.info(" Caught singal: %r. Ignoring " % signum) - - -def main(argv): - vyos_server = OCVyOSServer() - host = '' - port = 0 - if len(argv) != 5: - print "server.py -h -p " - sys.exit(2) - - # Review - OSM: We should accept -h -p in any order. - if argv[1] == '-h': - host = argv[2] - if argv[3] == '-p': - port = int(argv[4]) - signal.signal(signal.SIGTERM, handler) - signal.signal(signal.SIGINT, handler) - vyos_server.start(vyos_server.server, host, port) - - -if __name__ == '__main__': - main(sys.argv) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py deleted file mode 100644 index 4fcfe6313b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/server2.py +++ /dev/null @@ -1,561 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import sys -import os -import json -import signal -import logging -import ast -import time -from os.path import abspath, dirname - -import netifaces - -sys.path.insert(0, dirname(dirname(abspath(__file__)))) -from vyos_session.utils import init_logger -from oc_fw_module import OCFWConfigClass -from edit_persistent_rule import EditPersistentRule -from static_ip import StaticIp -from flask import Flask, request -from os.path import abspath, dirname -from vpn_api_server import VPNHandler as vpnhandler -from vyos_policy_based_routes import RoutesConfigHandler as routes_handler -from ha_config import VYOSHAConfig -from vyos_exception import OCException -from flask import jsonify -from log_forwarder import APIHandler as apihandler -from stats_parser import APIHandler as stats_apihandler -# sys.path.insert(0, dirname(dirname(abspath(__file__)))) -# sys.path.insert(0, (abspath(__file__))) - -logger = logging.getLogger(__name__) -init_logger(logger) - -app = Flask(__name__) - -oc_fw_module = None -e = EditPersistentRule() - -error_msgs = { - 'unexpected': 'Unexpected VYOS ERROR occurred while %s %s ' -} - - -@app.route('/auth-server-config', methods=['POST']) -def auth_server_config(): - data = json.loads(request.data) - f = open("/usr/share/vyos-oc/auth_server.conf", 'w') - f.write(data['auth_uri']) - f.write('\n') - f.write(data['admin_tenant_name']) - f.write('\n') - f.write(data['admin_user']) - f.write('\n') - f.write(data['admin_password']) - f.write('\n') - f.write(data['remote_vpn_role_name']) - f.write("\n") - f.write(data['project_id']) - f.write("\n") - - try: - host_ip = data['host_mapping'].split()[0] + "/32" - command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' - gateway_ip = os.popen(command).read().strip().strip("'") - status = vpnhandler().configure_static_route("set", host_ip, gateway_ip) - - except Exception as ex: - err = ("Error in adding rvpn route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - try: - if data['host_mapping'].split()[1]: - os.system("sudo chown vyos:users /etc/hosts") - os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) - os.system("sudo chown root:root /etc/hosts") - # with open('/etc/hosts', 'a') as hosts: - # hosts.write(data['host_mapping']) - except Exception as e: - logger.error("Error in writing host mapping in /etc/hosts - %s" % e) - - return json.dumps(dict(status=True)) - - -@app.route('/create-ipsec-site-conn', methods=['POST']) -def create_ipsec_site_conn(): - """ - Open a "configure" session with vyos - "Set" all the parameters - "commit" the changes - """ - try: - data = json.loads(request.data) - status = vpnhandler().create_ipsec_site_conn(data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = "Error in configuring ipsec_site_conection. Reason: %s" % ex - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/create-ipsec-site-tunnel', methods=['POST']) -def create_ipsec_site_tunnel(): - """ - Open a "configure" session with vyos - "Set" all the parameters - "commit" the changes - """ - try: - tunnel = json.loads(request.data) - pcidrs = tunnel['peer_cidrs'] - for pcidr in pcidrs: - tunnel['peer_cidr'] = pcidr - status = vpnhandler().create_ipsec_site_tunnel(tunnel) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in configuring ipsec_site_tunnel. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ipsec-site-tunnel', methods=['DELETE']) -def delete_ipsec_site_tunnel(): - try: - pcidrs = request.args.get('peer_cidrs') - peer_address = request.args.get('peer_address') - local_cidr = request.args.get('local_cidr') - pcidrs = ast.literal_eval(pcidrs) - for pcidr in pcidrs: - tunnel = {} - tunnel['peer_address'] = peer_address - tunnel['local_cidr'] = local_cidr - tunnel['peer_cidr'] = pcidr - status = vpnhandler().delete_ipsec_site_tunnel(tunnel) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in deleting ipsec_site_tunnel. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ipsec-site-conn', methods=['DELETE']) -def delete_ipsec_site_conn(): - try: - peer_address = request.args.get('peer_address') - status = vpnhandler().delete_ipsec_site_conn(peer_address) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in deleting ipsec_site_connection. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/get-ipsec-site-tunnel-state', methods=['GET']) -def get_ipsec_site_tunnel_state(): - try: - peer_address = request.args.get('peer_address') - lcidr = request.args.get('local_cidr') - pcidr = request.args.get('peer_cidr') - tunnel = {} - tunnel['peer_address'] = peer_address - tunnel['local_cidr'] = lcidr - tunnel['peer_cidr'] = pcidr - status, state = vpnhandler().get_ipsec_site_tunnel_state(tunnel) - return json.dumps(dict(state=state)) - except Exception as ex: - err = ("Error in get_ipsec_site_tunnel_state. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/create-ssl-vpn-conn', methods=['POST']) -def create_ssl_vpn_conn(): - try: - data = json.loads(request.data) - status = vpnhandler().create_ssl_vpn_conn(data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in create_ssl_vpn_connection. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/ssl-vpn-push-route', methods=['POST']) -def ssl_vpn_push_route(): - try: - data = json.loads(request.data) - status = vpnhandler().ssl_vpn_push_route(data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in ssl_vpn_push_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ssl-vpn-conn', methods=['DELETE']) -def delete_ssl_vpn_conn(): - try: - tunnel_name = request.args.get('tunnel') - status = vpnhandler().delete_ssl_vpn_conn(tunnel_name) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_ssl_vpn_conn. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ssl-vpn-route', methods=['DELETE']) -def delete_ssl_vpn_route(): - try: - route = request.args.get('route') - status = vpnhandler().delete_ssl_vpn_route(route) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_ssl_vpn_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/get-ssl-vpn-conn-state', methods=['GET']) -def get_ssl_vpn_conn_state(): - try: - tunnel_name = request.args.get('tunnel') - status, state = vpnhandler().get_ssl_vpn_conn_state(tunnel_name) - return json.dumps(dict(status=status, state=state)) - except Exception as ex: - err = ("Error in get_ssl_vpn_conn_state. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/configure-firewall-rule', methods=['POST']) -def configure_firewall_rule(): - global oc_fw_module - firewall_data = request.data - try: - response = oc_fw_module.set_up_rule_on_interfaces(firewall_data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'configuring', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/delete-firewall-rule', methods=['DELETE']) -def delete_firewall_rule(): - global oc_fw_module - try: - response = oc_fw_module.reset_firewall(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'deleting', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/update-firewall-rule', methods=['PUT']) -def update_firewall_rule(): - global oc_fw_module - try: - oc_fw_module.reset_firewall(request.data) - response = oc_fw_module.set_up_rule_on_interfaces(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'updating', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/add-source-route', methods=['POST']) -def add_source_route(): - try: - return routes_handler().add_source_route(request.data) - except Exception as ex: - err = ("Exception in adding source route. %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-source-route', methods=['DELETE']) -def delete_source_route(): - try: - return routes_handler().delete_source_route(request.data) - except Exception as ex: - err = ("Exception in deleting source route. %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/add-stitching-route', methods=['POST']) -def add_stitching_route(): - try: - gateway_ip = json.loads(request.data).get('gateway_ip') - status = vpnhandler().configure_static_route("set", "0.0.0.0/0", gateway_ip) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in add_stitching_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-stitching-route', methods=['DELETE']) -def delete_stitching_route(): - try: - gateway_ip = request.args.get('gateway_ip') - status = vpnhandler().configure_static_route( - "delete", "0.0.0.0/0", gateway_ip) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_stitching_route. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/configure_conntrack_sync', methods=['POST']) -def configure_conntrack_sync(): - global vyos_ha_config - try: - response = vyos_ha_config.configure_conntrack_sync(request.data) - except Exception as err: - # This flask version has issue in implicit way of registering - # error handler. - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'configuring', 'conntrack sync')))) - else: - return jsonify(**response) - - -@app.route('/configure_interface_ha', methods=['POST']) -def configure_interface_ha(): - global vyos_ha_config - try: - response = vyos_ha_config.set_vrrp_for_interface(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict( - err=error_msgs['unexpected'] % ( - 'configuring', 'HA for the interface')))) - else: - return jsonify(**response) - - -@app.route('/delete_vrrp', methods=['DELETE']) -def delete_vrrp(): - global vyos_ha_config - try: - response = vyos_ha_config.delete_vrrp(request.data) - except Exception as err: - try: - return send_error_response(OCException(err[0], status_code=err[1], - payload=err[2])) - except IndexError: - return send_error_response( - OCException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'deleting', 'VRRP')))) - else: - return jsonify(**response) - - -# @app.errorhandler(OCException) -def send_error_response(error): - response = jsonify(error.to_dict()) - response.status_code = error.status_code - return response - - -@app.route('/add_static_ip', methods=['POST']) -def add_static_ip(): - try: - static_ip_obj = StaticIp() - data = json.loads(request.data) - static_ip_obj.configure(data) - except Exception as err: - msg = ("Error adding static IPs for hotplugged interfaces. " - "Data: %r. Error: %r" % (data, str(err))) - logger.error(msg) - return json.dumps(dict(status=False, reason=msg)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/del_static_ip', methods=['DELETE']) -def del_static_ip(): - try: - static_ip_obj = StaticIp() - data = json.loads(request.data) - static_ip_obj.clear(data) - except Exception as err: - msg = ("Error clearing static IPs for hotplugged interfaces. " - "Data: %r. Error: %r" % (data, str(err))) - logger.error(msg) - return json.dumps(dict(status=False, reason=msg)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/add_rule', methods=['POST']) -def add_rule(): - # configuring sshd to listen on management ip address - ip_addr = get_interface_to_bind() - oc_fw_module.run_sshd_on_mgmt_ip(ip_addr) - - data = json.loads(request.data) - try: - EditPersistentRule.add(e, data) - except Exception as err: - logger.error("Error adding persistent rule %r" % str(err)) - return json.dumps(dict(status=False)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/delete_rule', methods=['DELETE']) -def del_rule(): - data = json.loads(request.data) - try: - EditPersistentRule.delete(e, data) - except Exception as err: - logger.error("Error deleting persistent rule %r" % str(err)) - return json.dumps(dict(status=False)) - else: - return json.dumps(dict(status=True)) - - -@app.route('/configure-rsyslog-as-client', methods=['POST']) -def configure_rsyslog_as_client(): - try: - config_data = json.loads(request.data) - status = apihandler().configure_rsyslog_as_client(config_data) - return json.dumps(dict(status=status)) - except Exception as ex: - err = ("Error while conifiguring rsyslog client. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/get-fw-stats', methods=['GET']) -def get_fw_stats(): - try: - mac_address = request.args.get('mac_address') - fw_stats = stats_apihandler().get_fw_stats(mac_address) - return json.dumps(dict(stats=fw_stats)) - except Exception as ex: - err = ("Error while getting firewall stats. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -@app.route('/get-vpn-stats', methods=['GET']) -def get_vpn_stats(): - try: - vpn_stats = stats_apihandler().get_vpn_stats() - return json.dumps(dict(stats=vpn_stats)) - except Exception as ex: - err = ("Error while getting vpn stats. Reason: %s" % ex) - logger.error(err) - return json.dumps(dict(status=False, reason=err)) - - -def handler(signum, frame): - if signum in [2, 3, 9, 11, 15]: - sys.exit(0) - else: - pass - - -def add_management_pbr(): - command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' - gateway_ip = os.popen(command).read().strip().strip("'") - command = 'grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' - src_ip = os.popen(command).read().strip().strip("'") - routes_info = [{'source_cidr': src_ip, 'gateway_ip': gateway_ip}] - routes_handler().add_source_route(json.dumps(routes_info)) - - -def getipaddr(): - # This is an assumption that service management will always gets - # configured on eth0 interface. - return netifaces.ifaddresses('eth0')[2][0]['addr'] - - -def get_interface_to_bind(): - while True: - try: - ip_addr = getipaddr() - logger.info("Management interface up on - %r " % - ''.join([netifaces.ifaddresses('eth0')[17][0][ - 'addr'][:2], - netifaces.ifaddresses('eth0')[17][0][ - 'addr'][-2:], - netifaces.ifaddresses('eth0')[2][0][ - 'addr'].split('.')[-1] - ])) - except ValueError: - logger.error("Management Interface not UP") - time.sleep(5) - except KeyError: - logger.error("Management Interface not FOUND") - time.sleep(5) - else: - break - return ip_addr - - -def main(): - """ - - :type ip_addr: Server listen address - """ - global oc_fw_module, vyos_ha_config - oc_fw_module = OCFWConfigClass() - vyos_ha_config = VYOSHAConfig() - ip_addr = get_interface_to_bind() - signal.signal(signal.SIGTERM, handler) - signal.signal(signal.SIGINT, handler) - app.run(ip_addr, 8888) - logger.info("VYOS Agent started ..... ") - - -if __name__ == '__main__': - main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py deleted file mode 100644 index 0f9f1a0e94..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/static_ip.py +++ /dev/null @@ -1,150 +0,0 @@ - -import logging -import netifaces -import time - -from netifaces import AF_LINK -from operations import configOpts -from execformat.executor import session -from vyos_session.utils import init_logger - -logger = logging.getLogger(__name__) -init_logger(logger) - -COMMAND = "interfaces ethernet %s address %s/%s" - -""" Implements attachment and detachment of fixed IPs to - hot-plugged interfaces based on IP and MAC binding. - -""" - - -class StaticIp(configOpts): - - def __init__(self): - self.hotplug_timeout = 25 - - def save(self): - retries = 100 - while retries: - try: - session.commit() - session.save() - time.sleep(3) - session.teardown_config_session() - return - except Exception: - time.sleep(0.1) - retries -= 1 - - def discard(self): - session.discard() - time.sleep(3) - session.teardown_config_session() - - def check_if_interface_is_up(self, pip, sip): - start_time = time.time() - while time.time() - start_time < self.hotplug_timeout: - interfaces = netifaces.interfaces() - if (pip in interfaces and sip in interfaces): - return True - time.sleep(2) - return False - - def _get_interface_name(self, interface_mac): - interfaces = netifaces.interfaces() - - for interface in interfaces: - if netifaces.ifaddresses(interface)[AF_LINK][0][ - 'addr'] == interface_mac: - return interface - - def configure(self, data): - try: - session.setup_config_session() - ip_mac_map = {} - provider_ip = data['provider_ip'] - provider_mac = data['provider_mac'] - provider_cidr = data['provider_cidr'].split('/')[1] - provider_interface = self._get_interface_name(provider_mac) - - stitching_ip = data['stitching_ip'] - stitching_mac = data['stitching_mac'] - stitching_cidr = data['stitching_cidr'].split('/')[1] - stitching_interface = self._get_interface_name(stitching_mac) - - if not self.check_if_interface_is_up(provider_interface, - stitching_interface): - msg = ("Interfaces are not hotplugged even after waiting " - "for %s seconds." % self.hotplug_timeout) - raise Exception(msg) - - interfaces = netifaces.interfaces() - self.provider_ptg_interfaces = list() - for interface in interfaces: - physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] - if 'eth' in interface: - ip_mac_map.update({interface: mac_addr}) - - for (interface, mac_addr) in ip_mac_map.iteritems(): - if provider_mac == mac_addr: - set_ip = COMMAND % (interface, provider_ip, provider_cidr) - elif stitching_mac == mac_addr: - set_ip = COMMAND % (interface, - stitching_ip, stitching_cidr) - else: - continue - result = self.set(set_ip.split()) - logger.debug("Result of add static ip is %s." % result) - self.save() - except Exception as err: - msg = ("Failed to set static IP. Error: %s" % err) - logger.error(msg) - self.discard() - raise Exception(err) - - def clear(self, data): - try: - session.setup_config_session() - ip_mac_map = {} - provider_ip = data['provider_ip'] - provider_mac = data['provider_mac'] - provider_cidr = data['provider_cidr'].split('/')[1] - - stitching_ip = data['stitching_ip'] - stitching_mac = data['stitching_mac'] - stitching_cidr = data['stitching_cidr'].split('/')[1] - - interfaces = netifaces.interfaces() - self.provider_ptg_interfaces = list() - for interface in interfaces: - physical_interface = netifaces.ifaddresses( - interface).get(AF_LINK) - if not physical_interface: - continue - mac_addr = netifaces.ifaddresses( - interface)[AF_LINK][0]['addr'] - if 'eth' in interface: - ip_mac_map.update({interface: mac_addr}) - - for (interface, mac_addr) in ip_mac_map.iteritems(): - if provider_mac == mac_addr: - del_ip = COMMAND % (interface, provider_ip, provider_cidr) - elif stitching_mac == mac_addr: - del_ip = COMMAND % (interface, - stitching_ip, stitching_cidr) - else: - continue - result = self.delete(del_ip.split()) - logger.debug("Result of delete static IP is %s." % result) - self.save() - except Exception as err: - msg = ("Failed to delete static IP. Error: %s." % err) - logger.error(msg) - self.discard() - raise Exception(msg) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py deleted file mode 100644 index 1f646e303a..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/stats_parser.py +++ /dev/null @@ -1,341 +0,0 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -import logging -import subprocess -import netifaces - -from netifaces import AF_LINK -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class APIHandler(object): - - def __init__(self): - pass - - def run_command(self, command): - proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - out, err = proc.communicate() - if err: - logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) - return None - return out - - def _get_interface_name(self, interface_mac): - interfaces = netifaces.interfaces() - - for interface in interfaces: - try: - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - if mac_addr == interface_mac: - return interface - - except KeyError as keyerr: - logger.error('Unable to Parse Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - return None - - def parse_firewall_stats(self, interface, raw_stats): - """ - sample data for command show_firewall_detail.xsl : - - IPv4 Firewall "oc_fw_eth1": - - Active on (eth1,OUT) - - rule action proto packets bytes - ---- ------ ----- ------- ----- - 11 accept tcp 476405 24805598 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:22 - - 12 accept icmp 1222414 101692572 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 - - 13 drop udp 150770055788 DROP - condition - saddr 11.0.2.0/24 daddr /* - - 14 accept tcp 3589762 238449000 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:80 - - 10000 drop all 0 0 - condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 - - """ - firewall = {} - firewalls = [] - firewall_start = False - table = False - status = None - rule_keys = ['rulepriority', 'packets', 'bytes', 'action', - 'source', 'destination'] - - try: - for line in raw_stats.split('\n'): - words = line.split() - if 'IPv4 Firewall' in line: - firewall_start = True - if 'Active on' in line and interface in line and firewall_start: - status = "Active" - (interface, direction) = words[2][1:-1].split(',') - firewall['interface'] = interface - firewall['dir'] = direction - firewall['rules'] = [] - elif len(words) >= 4: - if words[3] in ['ACCEPT', 'DROP'] and status == "Active": - table = True - rule = dict(zip(rule_keys, words)) - firewall['rules'].append(rule) - elif table and status == "Active": - command = ( - '/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_detail.xsl') - show_fw_data = self.run_command(command) - firewall = self.add_protocol_and_dest_port_info( - firewall, show_fw_data) - logger.info("packed firewall \n %s" % firewall) - firewalls.append(firewall) - break - - except KeyError as keyerr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return firewalls - - def add_protocol_and_dest_port_info(self, firewall, show_fw_data): - firewall_started = False - firewall_info_started = False - firewall_matcher = "Active on (" + firewall['interface'] - firewall_info_end = "-------------" - firewall_info = [] - for line in show_fw_data.split('\n'): - if "IPv4 Firewall" in line: - firewall_started = True - if firewall_matcher in line: - firewall_info_started = True - if firewall_started and firewall_info_started: - firewall_info.append(line) - if firewall_started and firewall_info_started and firewall_info_end in line: - break - try: - for rule in firewall.get('rules', []): - for index, stats in enumerate(firewall_info): - if stats is not '': - extract_stats = stats.split() - if rule['rulepriority'] in extract_stats[0]: - rule['protocol'] = extract_stats[2] - for key in firewall_info[index + 1].split(): - if "dpt:" in key: - rule['dest_port'] = key.split(':')[1] - break - break - - except KeyError as keyerr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return firewall - - def parse_vpn_s2s(self, raw_stats): - """ - sample data for command show-ipsec-sa-detail : - - Peer IP: 192.168.20.194 - Peer ID: 120.0.0.2 - Local IP: 91.0.0.11 - Local ID: 91.0.0.11 - NAT Traversal: no - NAT Source Port: n/a - NAT Dest Port: n/a - - Tunnel 1: - State: up - Inbound SPI: c6621bd8 - Outbound SPI: cbf2ab18 - Encryption: aes128 - Hash: sha1 - PFS Group: 5 - - Local Net: 90.0.0.0/24 - Local Protocol: all - Local Port: all - - Remote Net: 120.0.0.0/24 - Remote Protocol: all - Remote Port: all - - Inbound Bytes: 654.0 - Outbound Bytes: 504.0 - Active Time (s): 289 - Lifetime (s): 1800 - - """ - s2s_connection = {} - s2s_connections = [] - - try: - for line in raw_stats.split('\n'): - key = '' - value = '' - if ':' in line: - key, value = line.split(":") - - if 'Peer IP' in key: - s2s_connection['peerip'] = value.strip(" \t\n\r") - - elif 'Local IP' in key: - s2s_connection['localip'] = value.strip(" \t\n\r") - - elif "Tunnel" in key: - s2s_connection['tunnels'] = [] - tunnel_info = {'tunnel': - key.strip(" \t\n\r").split(" ")[-1]} - - elif "Inbound Bytes" in key: - tunnel_info['in'] = value.strip(" \t\n\r") - - elif "Outbound Bytes" in key: - tunnel_info['out'] = value.strip(" \t\n\r") - s2s_connection['tunnels'].append(tunnel_info) - s2s_connections.append(s2s_connection) - s2s_connection = {} - - except KeyError as keyerr: - logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return s2s_connections - - def parse_vpn_remote(self, raw_stats): - """ - sample data for command vyatta-show-ovpn.pl --mode=server : - - OpenVPN server status on vtun0 [] - - Client CN Remote IP Tunnel IP TX byte RX byte Connected Since - --------- --------- --------- ------- ------- --------------- - UNDEF 192.168.2.81 192.168.200.4 8.0K 2.7K Tue Mar 8 09:01:05 2016 - """ - table = False - remote_connection = {} - remote_connections = [] - keys = ['clientCN', 'remoteip', 'tunnelip', - 'in', 'out', 'connected_since'] - - try: - for line in raw_stats.split('\n'): - if "Client CN" in line: - table = True - elif len(line.split()) >= 5 and table and "---" not in line: - value_list = line.split()[:-5] - connected_since = " ".join(line.split()[5:]) - clients = filter(lambda value: value.strip(), value_list) - clients.append(connected_since) - remote_connection = dict(zip(keys, clients)) - remote_connections.append(remote_connection) - - except KeyError as keyerr: - logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return remote_connections - - def get_fw_stats(self, mac_address): - """ - sample data for command show_firewall_statistics.xsl : - - IPv4 Firewall "oc_fw_eth1": - - Active on (eth1,OUT) - - rule packets bytes action source destination - ---- ------- ----- ------ ------ ----------- - 11 476.22K 24.80M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 12 1.22M 101.66M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 13 3.43G 150.73G DROP 11.0.1.0/24 11.0.2.0/24 - 14 3.59M 238.39M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 10000 0 0 DROP 0.0.0.0/0 0.0.0.0/0 - - """ - interface = None - parsed_stats = {} - - command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') - - raw_stats = self.run_command(command) - interface = self._get_interface_name(mac_address) - if not interface: - logger.error('No interface available for mac address: %s' % - mac_address) - return parsed_stats - parsed_stats = self.parse_firewall_stats(interface, raw_stats) - - logger.info("Firewall stats Data, \n %s" % parsed_stats) - return parsed_stats - - def get_vpn_stats(self): - vpn_parsed_data = {} - command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-op-vpn.pl ' + - '--show-ipsec-sa-detail') - - raw_ipsec_stats = self.run_command(command) - if raw_ipsec_stats: - ipsec_parsed_data = self.parse_vpn_s2s(raw_ipsec_stats) - if ipsec_parsed_data: - vpn_parsed_data['ipsec'] = ipsec_parsed_data - else: - logger.warning("Empty IPSec VPN Stats") - else: - logger.warning("Empty IPSec VPN Stats") - - command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-show-ovpn.pl ' + - '--mode=server') - - raw_remote_stats = self.run_command(command) - if raw_remote_stats: - remote_parsed_data = self.parse_vpn_remote(raw_remote_stats) - if remote_parsed_data: - vpn_parsed_data['remote'] = remote_parsed_data - else: - logger.warning("Empty Remote VPN Stats") - else: - logger.warning("Empty Remote VPN Stats") - - logger.info("VPN stats Data, \n %s" % vpn_parsed_data) - return vpn_parsed_data diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py deleted file mode 100644 index 599a22832b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vpn_api_server.py +++ /dev/null @@ -1,465 +0,0 @@ -#!/usr/bin/env python -import logging -import json -import netifaces -import netaddr -import socket -import fcntl -import struct -import array -import time -import ast -import copy -import subprocess -import os -from netaddr import IPNetwork, IPAddress -from operations import configOpts -from vyos_session import utils -from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE -#from vyos_session.configsession import ConfigSession as session -from execformat.executor import session - -OP_SUCCESS = True -OP_FAILED = False - -OP_COMMAND_SCRIPT = "/usr/share/vyos-oc/vpn_op_commands.pl" - -IPSEC_SITE2SITE_COMMANDS = { - 'ike': [ - 'set vpn ipsec ike-group %s proposal 1', - 'set vpn ipsec ike-group %s proposal 1 encryption %s', - 'set vpn ipsec ike-group %s proposal 1 hash %s', - 'set vpn ipsec ike-group %s proposal 2 encryption %s', - 'set vpn ipsec ike-group %s proposal 2 hash %s', - 'set vpn ipsec ike-group %s lifetime %d', - 'set vpn ipsec ike-group %s dead-peer-detection action restart', - 'set vpn ipsec ike-group %s dead-peer-detection interval %s', - 'set vpn ipsec ike-group %s dead-peer-detection timeout %s'], - 'esp': [ - 'set vpn ipsec esp-group %s proposal 1', - 'set vpn ipsec esp-group %s proposal 1 encryption %s', - 'set vpn ipsec esp-group %s proposal 1 hash %s', - 'set vpn ipsec esp-group %s proposal 2 encryption %s', - 'set vpn ipsec esp-group %s proposal 2 hash %s', - 'set vpn ipsec esp-group %s lifetime %d', - 'set vpn ipsec auto-update 60'], - 'conn': [ - 'set vpn ipsec ipsec-interfaces interface %s', - 'set vpn ipsec site-to-site peer %s \ - authentication mode pre-shared-secret', - 'set vpn ipsec site-to-site peer %s \ - authentication pre-shared-secret %s', - 'set vpn ipsec site-to-site peer %s default-esp-group %s', - 'set vpn ipsec site-to-site peer %s ike-group %s', - 'set vpn ipsec site-to-site peer %s local-address %s', - 'set vpn ipsec site-to-site peer %s authentication remote-id %s', - 'set vpn ipsec site-to-site peer %s tunnel %d local prefix %s', - 'set vpn ipsec site-to-site peer %s tunnel %d remote prefix %s', - 'set vpn ipsec site-to-site peer %s authentication id %s'], - 'delete': [ - 'delete vpn ipsec site-to-site peer %s', - 'delete vpn ipsec site-to-site peer %s tunnel %s', - 'delete vpn ipsec'], - 'show': [ - 'show vpn ipsec sa peer %s']} - -SSL_VPN_COMMANDS = { - 'create': [ - 'set interfaces openvpn %s', - 'set interfaces openvpn %s mode server', - 'set interfaces openvpn %s server subnet %s', - 'set interfaces openvpn %s tls ca-cert-file /config/auth/ca.crt', - 'set interfaces openvpn %s tls cert-file /config/auth/server.crt', - 'set interfaces openvpn %s tls dh-file /config/auth/dh.pem', - 'set interfaces openvpn %s tls key-file /config/auth/server.key', - 'set interfaces openvpn %s server push-route %s', - 'set interfaces openvpn %s openvpn-option \ - "--client-cert-not-required --script-security 3 \ - --auth-user-pass-verify /usr/share/vyos-oc/auth_pam.pl via-file"'], - #'set interfaces openvpn %s local-host %s'], - 'delete': [ - 'delete interfaces openvpn %s', - 'delete interfaces openvpn vtun0 server push-route %s']} - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class NoInterfaceOnCidr(Exception): - - def __init__(self, **kwargs): - self.message = _("No interface in the network '%(cidr)s'") % kwargs - - -class VPNHandler(configOpts): - - def __init__(self): - super(VPNHandler, self).__init__() - - def create_ipsec_site_conn(self, ctx): - session.setup_config_session() - siteconn = ctx['siteconns'][0] - self._create_ike_group(siteconn['ikepolicy'], - siteconn['connection']['dpd']) - self._create_esp_group(siteconn['ipsecpolicy']) - self._create_ipsec_site_conn(ctx) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def create_ipsec_site_tunnel(self, tunnel): - session.setup_config_session() - self._create_ipsec_site_tunnel(tunnel) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def _ipsec_get_tunnel_idx(self, tunnel): - command = 'perl' - command += " " + OP_COMMAND_SCRIPT - command += " " + 'get_ipsec_tunnel_idx' - command += " " + tunnel['peer_address'] - command += " " + tunnel['local_cidr'] - command += " " + tunnel['peer_cidr'] - proc = subprocess.Popen( - command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - tunidx = out.split('=')[1] - return int(tunidx) - - def _ipsec_get_tunnel_count(self, tunnel): - command = 'perl' - command += " " + OP_COMMAND_SCRIPT - command += " " + 'get_ipsec_tunnel_count' - command += " " + tunnel['peer_address'] - proc = subprocess.Popen( - command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - tuncount = out.split('=')[1] - return int(tuncount) - - def delete_ipsec_site_tunnel(self, tunnel): - try: - session.setup_config_session() - self._delete_ipsec_site_tunnel(tunnel) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - except Exception as ex: - logger.error("Error in deleting ipsec site tunnel. %s" % ex) - return OP_FAILED - - def delete_ipsec_site_conn(self, peer_address): - try: - session.setup_config_session() - self._delete_ipsec_site_conn(peer_address) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - except Exception as ex: - logger.error("Error in deleting ipsec site connection. %s" % ex) - return OP_FAILED - - def create_ssl_vpn_conn(self, ctx): - session.setup_config_session() - self._create_ssl_vpn_conn(ctx) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def ssl_vpn_push_route(self, route): - session.setup_config_session() - self._ssl_vpn_push_route(route) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def delete_ssl_vpn_conn(self, tunnel): - session.setup_config_session() - self._delete_ssl_vpn_conn(tunnel) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def delete_ssl_vpn_route(self, route): - session.setup_config_session() - self._delete_ssl_vpn_route(route) - session.commit() - session.save() - time.sleep(2) - session.teardown_config_session() - return OP_SUCCESS - - def get_ssl_vpn_conn_state(self, peer_address): - return OP_SUCCESS, 'UP' - - def get_ipsec_site_tunnel_state(self, tunnel): - tunidx = self._ipsec_get_tunnel_idx(tunnel) - command = 'perl' - command += " " + OP_COMMAND_SCRIPT - command += " " + 'get_ipsec_tunnel_state' - command += " " + tunnel['peer_address'] - command += " " + str(tunidx) - proc = subprocess.Popen( - command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - state = out.split('=')[1] - state = state[:-1] - return OP_SUCCESS, state - - def _delete_ipsec_site_tunnel(self, tunnel): - tunidx = self._ipsec_get_tunnel_idx(tunnel) - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - cmd = cmds['delete'][1] - - cmd = cmd % (tunnel['peer_address'], tunidx) - - self._set_commands([cmd]) - - def _delete_ipsec_site_conn(self, peer_address): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - #cmd = cmds['delete'][0] - - #cmd = cmd % peer_address - cmd = cmds['delete'][2] - - self._set_commands([cmd]) - - def _delete_ssl_vpn_conn(self, tunnel): - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - cmd = cmds['delete'][0] - - cmd = cmd % tunnel - - self._set_commands([cmd]) - - def _delete_ssl_vpn_route(self, route): - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - cmd = cmds['delete'][1] - cmd = cmd % route - self._set_commands([cmd]) - - def _set_commands(self, cmds): - for cmd in cmds: - print cmd - self.set_1(cmd.split(' ')) - - def _create_ike_group(self, ike, dpd): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - ike_cmds = cmds['ike'] - - ike_cmds[0] = ike_cmds[0] % (ike['name']) - ike_cmds[1] = ike_cmds[1] % (ike['name'], ike['encryption_algorithm']) - ike_cmds[2] = ike_cmds[2] % (ike['name'], ike['auth_algorithm']) - ike_cmds[3] = ike_cmds[3] % (ike['name'], ike['encryption_algorithm']) - ike_cmds[4] = ike_cmds[4] % (ike['name'], ike['auth_algorithm']) - ike_cmds[5] = ike_cmds[5] % (ike['name'], ike['lifetime']['value']) - ike_cmds[6] = ike_cmds[6] % ike['name'] - ike_cmds[7] = ike_cmds[7] % (ike['name'], dpd['interval']) - ike_cmds[8] = ike_cmds[8] % (ike['name'], dpd['timeout']) - self._set_commands(ike_cmds) - - def _create_esp_group(self, esp): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - esp_cmds = cmds['esp'] - - esp_cmds[0] = esp_cmds[0] % (esp['name']) - esp_cmds[1] = esp_cmds[1] % (esp['name'], esp['encryption_algorithm']) - esp_cmds[2] = esp_cmds[2] % (esp['name'], esp['auth_algorithm']) - esp_cmds[3] = esp_cmds[3] % (esp['name'], esp['encryption_algorithm']) - esp_cmds[4] = esp_cmds[4] % (esp['name'], esp['auth_algorithm']) - esp_cmds[5] = esp_cmds[5] % (esp['name'], esp['lifetime']['value']) - - self._set_commands(esp_cmds) - - def _create_ipsec_site_tunnel(self, tunnel): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - conn_cmds = cmds['conn'] - tun_cmds = ['', ''] - - tunidx = self._ipsec_get_tunnel_count(tunnel) + 1 - """ - Neutron + GBP model supports only one local subnet. - For now also assuming only one peer cidr. - """ - tun_cmds[0] = conn_cmds[7] % ( - tunnel['peer_address'], tunidx, tunnel['local_cidr']) - tun_cmds[1] = conn_cmds[8] % ( - tunnel['peer_address'], tunidx, tunnel['peer_cidrs'][0]) - - self._set_commands(tun_cmds) - - def _get_vrrp_group(self, ifname): - command = ( - "vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) - #vrrp_ifname = ifname + "v" + os.popen(command).read().strip() - return os.popen(command).read().strip() - - def _create_ipsec_site_conn(self, ctx): - cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - conn_cmds = cmds['conn'] - - """ - Get the name of the interface which has ipaddr from - the local cidr on which vpn service is launched. - Also get the ip addr assigned to it - """ - ifname, ip = self._get_if_details_by_cidr(ctx['service']['cidr']) - - conn = ctx['siteconns'][0]['connection'] - esp = ctx['siteconns'][0]['ipsecpolicy'] - ike = ctx['siteconns'][0]['ikepolicy'] - - vrrp_cmd = None - if conn['stitching_fixed_ip'] and conn.get('standby_fip', None): - logger.debug("Get vrrp group number for interface %s" % ifname) - group_no = self._get_vrrp_group(ifname) - ip = conn['stitching_fixed_ip'] - vrrp_cmd = ( - 'set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn') % (ifname, - group_no) - ifname = ifname + "v" + str(group_no) - logger.info("vrrp interface name: %s" % ifname) - - conn_cmds[0] = conn_cmds[0] % (ifname) - conn_cmds[1] = conn_cmds[1] % (conn['peer_address']) - conn_cmds[2] = conn_cmds[2] % (conn['peer_address'], conn['psk']) - conn_cmds[3] = conn_cmds[3] % (conn['peer_address'], esp['name']) - conn_cmds[4] = conn_cmds[4] % (conn['peer_address'], ike['name']) - conn_cmds[5] = conn_cmds[5] % (conn['peer_address'], ip) - conn_cmds[6] = conn_cmds[6] % (conn['peer_address'], conn['peer_id']) - - """ - Neutron + GBP model supports only one local subnet. - For now also assuming only one peer cidr. - """ - conn_cmds[7] = conn_cmds[7] % ( - conn['peer_address'], 1, conn['tunnel_local_cidr']) - conn_cmds[8] = conn_cmds[8] % ( - conn['peer_address'], 1, conn['peer_cidrs'][0]) - conn_cmds[9] = conn_cmds[9] % (conn['peer_address'], conn['access_ip']) - if vrrp_cmd: - conn_cmds.append(vrrp_cmd) - - self._set_commands(conn_cmds) - - def _create_ssl_vpn_conn(self, ctx): - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - conn = ctx['sslvpnconns'][0]['connection'] - cidr = ctx['service']['cidr'] - - conn_cmds = cmds['create'] - - conn_cmds[0] = conn_cmds[0] % ('vtun0') - conn_cmds[1] = conn_cmds[1] % ('vtun0') - conn_cmds[2] = conn_cmds[2] % ( - 'vtun0', conn['client_address_pool_cidr']) - conn_cmds[3] = conn_cmds[3] % ('vtun0') - conn_cmds[4] = conn_cmds[4] % ('vtun0') - conn_cmds[5] = conn_cmds[5] % ('vtun0') - conn_cmds[6] = conn_cmds[6] % ('vtun0') - conn_cmds[7] = conn_cmds[7] % ('vtun0', cidr) - conn_cmds[8] = conn_cmds[8] % ('vtun0') - #conn_cmds[9] = conn_cmds[9] % ('vtun0', conn['stitching_fixed_ip']) - - self._set_commands(conn_cmds) - - def _ssl_vpn_push_route(self, route): - - cmds = copy.deepcopy(SSL_VPN_COMMANDS) - conn_cmds = cmds['create'] - route_cmds = [''] - - route_cmds[0] = conn_cmds[7] % ('vtun0', route['route']) - self._set_commands(route_cmds) - - def configure_static_route(self, action, cidr, gateway_ip): - if action == "set": - route_cmd = ("%s protocols static route %s next-hop" - " %s distance 1" % (action, cidr, gateway_ip)) - else: - route_cmd = "%s protocols static route %s" % (action, cidr) - # The config module we use everywhere else is not used here - # because of the issue mentioned here: - # http://vyatta38.rssing.com/chan-10627532/all_p7.html - # Note: The issue is inconsistent, but not seen anymore with this - # new approach of setting configuration - utils._alternate_set_and_commit(route_cmd) - # session.setup_config_session() - # self._set_commands([route_cmd]) - # session.commit() - # time.sleep(2) - # session.teardown_config_session() - return OP_SUCCESS - - def _get_all_ifs(self): - max_possible = 128 # arbitrary. raise if needed. - bytes = max_possible * 32 - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - names = array.array('B', '\0' * bytes) - outbytes = struct.unpack('iL', fcntl.ioctl( - s.fileno(), - 0x8912, # SIOCGIFCONF - struct.pack('iL', bytes, names.buffer_info()[0]) - ))[0] - namestr = names.tostring() - lst = [] - for i in range(0, outbytes, 40): - name = namestr[i:i + 16].split('\0', 1)[0] - ip = namestr[i + 20:i + 24] - lst.append((name, ip)) - return lst - - def _format_ip(self, addr): - return str(ord(addr[0])) + '.' + \ - str(ord(addr[1])) + '.' + \ - str(ord(addr[2])) + '.' + \ - str(ord(addr[3])) - - def _get_if_details_by_cidr(self, cidr): - """ - Get interface name and ip address which is in the - given cidr - """ - # It is observed sometimes that infs take time to get ip address - logger.info("IPSec: get interface ip and name for cidr %s." % cidr) - retry_count = 0 - while True: - ifs = self._get_all_ifs() - for inf in ifs: - ifname = inf[0] - if 'v' in ifname: - continue - ip = self._format_ip(inf[1]) - if IPAddress(ip) in IPNetwork(cidr): - logger.info("Found interface %s for cidr %s" % (ifname, - cidr)) - return ifname, ip - if retry_count < 10: - time.sleep(1) - retry_count += 1 - continue - break - - raise NoInterfaceOnCidr(cidr=cidr) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos-oc-log deleted file mode 100644 index 25c48e9e1a..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos-oc-log +++ /dev/null @@ -1,24 +0,0 @@ -/var/log/oc/vyos_monitor { - weekly - rotate 12 - size 10M - compress - delaycompress - missingok - notifempty - create 644 vyos users -} -/var/log/oc/oc-vyos.log { - monthly - rotate 12 - size 10M - compress - delaycompress - missingok - notifempty - create 644 vyos users - postrotate - sudo /etc/init.d/oc-vyos restart - endscript -} - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_dhc.py deleted file mode 100644 index 3cf064c37b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_dhc.py +++ /dev/null @@ -1,16 +0,0 @@ -import netifaces -import shlex -import subprocess - - -def initiate_dhclient(): - interfaces = netifaces.interfaces() - for interface in interfaces: - cmd = "sudo dhclient %s" % interface - args = shlex.split(cmd) - if not netifaces.ifaddresses(interface).get(netifaces.AF_INET): - output, error = subprocess.Popen( - args, stdout=subprocess.PIPE, - stderr=subprocess.PIPE).communicate() - if error: - raise diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py deleted file mode 100644 index 3e19171b95..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_exception.py +++ /dev/null @@ -1,16 +0,0 @@ -class OCException(Exception): - """ - """ - status_code = 400 - - def __init__(self, message, status_code=None, payload=None): - Exception.__init__(self) - self.message = message - if status_code: - self.status_code = status_code - self.payload = payload - - def to_dict(self): - rv = dict(self.payload or ()) - rv["message"] = self.message - return rv diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py deleted file mode 100644 index 2b79fc9909..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc_config_server/vyos_policy_based_routes.py +++ /dev/null @@ -1,251 +0,0 @@ -import copy -import json -import logging -import netifaces -import subprocess -import netaddr -import time - -from execformat.executor import session -from operations import configOpts -from vyos_session import utils - - -ROUTING_TABLE_BASE = 10 - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -VYOS_PBR_COMMANDS = { - 'policy_route': [ - 'set policy route %s rule %s protocol all', - 'set policy route %s rule %s set table %s', - 'set policy route %s rule %s source address %s'], - 'table_route': [ - 'set protocols static table %s route %s next-hop %s'], - 'interface_pbr': [ - 'set interfaces ethernet %s policy route %s'], - 'delete': [ - 'delete interfaces ethernet %s policy route %s', - 'delete policy route %s', - 'delete protocols static table %s'], - 'show': [ - 'show policy route %s', - 'show protocols static table %s', - 'show interfaces ethernet %s policy route']} - - -class RoutesConfigHandler(configOpts): - - def __init__(self): - super(RoutesConfigHandler, self).__init__() - self.vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" - - def _run_command(self, command): - try: - exec_pipe = subprocess.Popen(command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - except Exception as err: - message = 'Executing command %s failed with error %s' % ( - command, err) - logger.error(message) - return False - - cmd_output, cmd_error = exec_pipe.communicate() - if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' % ( - command, cmd_error) - logger.error(message) - return False - else: - logger.debug('command output: %s', cmd_output) - return True - - def _begin_command(self): - begin_cmd = "%s begin" % (self.vyos_wrapper) - if self._run_command(begin_cmd): - return True - else: - return False - - def _discard_changes(self): - discard_cmd = "%s discard" % (self.vyos_wrapper) - if self._run_command(discard_cmd): - return True - else: - return False - - def _set_commands(self, cmds): - for cmd in cmds: - set_cmd = "%s %s" % (self.vyos_wrapper, cmd) - if not self._run_command(set_cmd): - return False - return True - - def _commit_command(self): - commit_cmd = "%s commit" % (self.vyos_wrapper) - if self._run_command(commit_cmd): - return True - else: - return False - - def _save_command(self): - save_cmd = "%s save" % (self.vyos_wrapper) - if self._run_command(save_cmd): - return True - else: - return False - - def _configure_vyos(self, configure_commands): - if not self._begin_command(): - logger.error("Starting a vyos session failed") - return False - - if not self._set_commands(configure_commands): - logger.error("Executing commands %s failed" % (configure_commands)) - self._discard_changes() - return False - - if not self._commit_command(): - logger.error("Committing %s failed" % (configure_commands)) - self._discard_changes() - return False - - if not self._save_command(): - logger.error("Saving %s failed" % (configure_commands)) - self._discard_changes() - return False - - return True - - def _configure_policy_route(self, source_cidr, gateway_ip, - source_interface): - try: - interface_number_string = source_interface.split("eth", 1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for configuring " - "routes" % (source_interface)) - msg = "Wrong interface %s retrieved for source %s" % ( - source_interface, source_cidr) - raise Exception(msg) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - pbr_name = "%s_%s" % ("pbr", source_interface) - cmds = copy.deepcopy(VYOS_PBR_COMMANDS) - pbr_commands = [] - pbr_commands.append(cmds['policy_route'][0] % (pbr_name, "1")) - pbr_commands.append(cmds['policy_route'][1] % ( - pbr_name, "1", routing_table_number)) - pbr_commands.append( - cmds['policy_route'][2] % (pbr_name, "1", source_cidr)) - - pbr_commands.append(cmds['table_route'][0] % ( - routing_table_number, "0.0.0.0/0", gateway_ip)) - - pbr_commands.append( - cmds['interface_pbr'][0] % (source_interface, pbr_name)) - - if not self._configure_vyos(pbr_commands): - logger.error("Configuring Policy Based Routing failed") - raise Exception("Pbr failed %s" % pbr_commands) - else: - return True - - def add_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - gateway_ip = route_info['gateway_ip'] - source_interface = self._get_if_name_by_cidr(source_cidr) - try: - self._delete_policy_route(source_cidr, source_interface) - except Exception as err: - logger.debug("Trying to clear any existing routes before " - "setting source routing failed with error: %s" - % (err)) - try: - self._configure_policy_route( - source_cidr, gateway_ip, source_interface) - except Exception as err: - message = ("Configuring Policy based route failed. " - "Error: %s" % (err)) - raise Exception(message) - return json.dumps(dict(status=True)) - - # FIXME: When invoked on delete path we have to propagate the error - def _delete_policy_route(self, source_cidr, source_interface): - try: - interface_number_string = source_interface.split("eth", 1)[1] - except IndexError: - logger.error("Retrieved wrong interface %s for configuring " - "routes" % (source_interface)) - msg = "Wrong interface %s retrieved for source %s" % ( - source_interface, source_cidr) - raise Exception(msg) - routing_table_number = ROUTING_TABLE_BASE + int( - interface_number_string.split('v')[0]) - pbr_name = "%s_%s" % ("pbr", source_interface) - cmds = copy.deepcopy(VYOS_PBR_COMMANDS) - - delete_pbr_commands = [] - delete_pbr_commands.append(cmds['delete'][0] % ( - source_interface, pbr_name)) - if not self._configure_vyos(delete_pbr_commands): - logger.warn("Deleting PBR failed") - - delete_pbr_commands = [] - delete_pbr_commands.append(cmds['delete'][1] % (pbr_name)) - if not self._configure_vyos(delete_pbr_commands): - logger.warn("Deleting PBR failed") - - delete_pbr_commands = [] - delete_pbr_commands.append(cmds['delete'][2] % (routing_table_number)) - if not self._configure_vyos(delete_pbr_commands): - logger.warn("Deleting PBR failed") - - return - - def delete_source_route(self, routes_info): - routes_info = json.loads(routes_info) - for route_info in routes_info: - source_cidr = route_info['source_cidr'] - source_interface = self._get_if_name_by_cidr(source_cidr, - delete=True) - if source_interface: - self._delete_policy_route(source_cidr, source_interface) - return json.dumps(dict(status=True)) - - def _get_if_name_by_cidr(self, cidr, delete=False): - interfaces = netifaces.interfaces() - retry_count = 0 - while True: - all_interfaces_have_ip = True - for interface in interfaces: - inet_list = netifaces.ifaddresses(interface).get( - netifaces.AF_INET) - if not inet_list: - all_interfaces_have_ip = False - for inet_info in inet_list or []: - netmask = inet_info.get('netmask') - ip_address = inet_info.get('addr') - subnet_prefix = cidr.split("/") - if (ip_address == subnet_prefix[0] and ( - len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): - return interface - ip_address_netmask = '%s/%s' % (ip_address, netmask) - interface_cidr = netaddr.IPNetwork(ip_address_netmask) - if str(interface_cidr.cidr) == cidr: - return interface - # Sometimes the hotplugged interface takes time to get IP - if not all_interfaces_have_ip: - if retry_count < 15: - if delete: - return None - time.sleep(2) - retry_count = retry_count + 1 - continue - else: - raise Exception("Some of the interfaces do not have " - "IP Address") diff --git a/gbpservice/nfp/service_vendor_agents/vyos/op_commands.sh b/gbpservice/nfp/service_vendor_agents/vyos/op_commands.sh deleted file mode 100755 index a3aab4d1f1..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/op_commands.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/vbash -cmd1="$1" -source /opt/vyatta/etc/functions/script-template -eval "$cmd1" -echo $? -#run show vpn ipsec sa diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/vpn_op_commands.pl deleted file mode 100644 index 5c6317a604..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/vpn_op_commands.pl +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl - -#Usage: sudo perl op_commands.pl get_tunnel_state peer_ip tunnel-id - - -use lib "/opt/vyatta/share/perl5/"; -use Vyatta::VPN::OPMode; -use Data::Dumper qw(Dumper); - -sub get_ipsec_tunnel_count { - my @args = @_; - - my $peer = $args[1]; - my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); - $DB::single = 1; - my $count = $#tunnel_hash; - $count = ($count + 1)/2; - print "tunnels=$count"; - return $count; -} - -sub get_ipsec_tunnel_idx { - my @args = @_; - - my $peer = $args[1]; - my $lcidr = $args[2]; - my $pcidr = $args[3]; - - my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); - my $count = ($#tunnel_hash + 1)/2; - $DB::single = 1; - for my $i (0..$count) { - my $tun = $tunnel_hash[$i+1]; - my $lsnet = $tun->{_lsnet}; - my $rsnet = $tun->{_rsnet}; - if ($lcidr == $lsnet && $pcidr == $rsnet) { - print "tunnel=$tun->{_tunnelnum} \n"; - return $tun->{_tunnelnum}; - } - } - print "tunnel=-1"; - return -1; -} - -sub get_ipsec_tunnel_state { - my @args = @_; - - #args[0] will be subroutine name - - my $peer = $args[1]; - my $tunnel = $args[2]; - - my $tunidx = $tunnel + $tunnel - 1; - my @tunnel_hash = Vyatta::VPN::OPMode::get_tunnel_info_peer($peer); - - my $state = $tunnel_hash[$tunidx]->{_state}; - - print "state=$state\n"; - - return $state -} - -#print Dumper \@ARGV; - -my $call=$ARGV[0]; -$call->(@ARGV); diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/oc-vyos deleted file mode 100755 index 850a85e5ed..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/oc-vyos +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh -# -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA -# -### BEGIN INIT INFO -# Provides: oc-vyos -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: OC vyos service -# Description: Provides the oc-vyos service -### END INIT INFO -set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos -DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services -ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos -fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services -. /lib/lsb/init-functions -export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp -if [ ! -x ${DAEMON} ] ; then -exit 0 -fi -case "$1" in -start) -test "$ENABLED" = "true" || exit 0 -start=1 -## check if pidfile is there -if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi -fi -if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting oc vyos" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? -else -echo "oc-vyos[$pid] is already running" -fi -;; -stop) -test "$ENABLED" = "true" || exit 0 -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping oc vyos" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" -fi -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -;; -restart|force-reload) -test "$ENABLED" = "true" || exit 1 -$0 stop -sleep 2 -$0 start -;; -reload) -test "$ENABLED" = "true" || exit 0 -## check if pidfile is there -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading oc vyos" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "oc vyos is not running or PID file not existing" -fi -;; -status) -test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? -;; -*) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" -exit 1 -;; -esac -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/restart_vpn deleted file mode 100644 index 2cb8fe4762..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_init_script/restart_vpn +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/vbash -sudo rm /var/run/pluto.pid -vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/__init__.py deleted file mode 100644 index 3ed9fd0f30..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'root' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py deleted file mode 100644 index 54c88a85ce..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/configsession.py +++ /dev/null @@ -1,156 +0,0 @@ -import os -from uuid import uuid4 -from utils import get_config_params, _run, clean_environ, init_logger -import logging - -logger = logging.getLogger(__name__) -init_logger(logger) - -VYOS_SHELL_API = get_config_params('bin', 'shell_api_path') -VYOS_SBIN_DIR = get_config_params('bin', 'vyos_sbin_dir') -VYOS_SAVE_SCRIPT = 'vyatta-save-config.pl' - -# Create/Get the logger object -# logger = init_logger() - - -class SessionAlreadyExists(Exception): - pass - - -class SetupSessionFailed(Exception): - pass - - -class OperationFailed(Exception): - pass - - -class SessionNotExists(Exception): - pass - - -class Session(object): - """ - Return the session instance if exists. Else, create new one. - SessionAlreadyExists exception raised on the second instantiation. - """ - _ref = None - - def __new__(cls, *args, **kw): - if cls._ref is not None: - raise SessionAlreadyExists('A session exist already !') - cls._ref = super(Session, cls).__new__(cls, *args, **kw) - return cls._ref - - -class ConfigSession(Session): - """ - Create and manage a Vyos config session. - This is a singleton subclass of Session class which ensures that one and - one config session only is opened. - To create instance you have to call setup_config_session() method. - """ - - def setup_config_session(self): - """ - Setup vyos session. A random uuid is generated as a sesssion identifier - ($PPID -Shell PID- could be used as well). - """ - - identifier = uuid4() - env = dict() - env['VYATTA_CHANGES_ONLY_DIR'] = \ - '/opt/vyatta/config/tmp/changes_only_{0}'.format(identifier) - env['VYATTA_CONFIG_TEMPLATE'] = '/opt/vyatta/share/vyatta-cfg/templates' - env['VYATTA_ACTIVE_CONFIGURATION_DIR'] = '/opt/vyatta/config/active' - env['VYATTA_EDIT_LEVEL'] = '/' - env['VYATTA_TEMP_CONFIG_DIR'] = '/opt/vyatta/config/tmp/new_config_{' \ - '0}'.format(identifier) - env['VYATTA_TEMPLATE_LEVEL'] = '/' - env['VYATTA_CONFIG_TMP'] = '/opt/vyatta/config/tmp/tmp_{0}'.format( - identifier) - # Add vyos session environment to system environment. - # This is not good but actually it seems that is the only way to - # handle a persistant vyos session after spawning a shell. - os.environ.update(env) - logger.info('Setting up a configuration session for Vyos') - # Spawn shell and setup vyos config session - if _run('{0} setupSession'.format(VYOS_SHELL_API)): - # Unset vyos session environment and raise an exception - logger.error('Could not create configuration session') - logger.info('Cleaning up session environment variables') - clean_environ(env) - raise SetupSessionFailed('Could not create session !') - self.session_id = identifier - self.session_envs = env - logger.debug('Session identifier is %s', identifier) - logger.debug('Session environment variables: %s', env) - logger.info('Configuration session is set up') - return True - - def session_exists(self): - """ - Test if a vyos config session is set up - """ - return False if _run('{0} inSession'.format(VYOS_SHELL_API)) else True - - def teardown_config_session(self): - """ - End current configuration session. - """ - if not self.session_exists(): - logger.warn('Teardown failed. No session available !') - return False - - if not _run('{0} teardownSession'.format(VYOS_SHELL_API)): - logger.info('Cleaning up session environment variables') - logger.info('Closing Vyos config session') - clean_environ(self.session_envs) - return True - - logger.error('Failed to teardown current config session') - logger.warn('The Vyos config session may still open !') - return False - - def session_changed(self): - """ - Returns if Vyos configuration was changed from current session - """ - if _run('{0} sessionChanged'.format(VYOS_SHELL_API)): - return False - logger.warn('Vyos configuration was changed from current session') - return True - - def commit(self): - """ - Returns True if commit action succeed. False otherwise. - """ - out = _run(os.path.join(VYOS_SBIN_DIR, 'my_commit -l'), output=True) - if not out: - logger.error('Commit changes failed') - raise OperationFailed('[ERROR] Commit changes failed !') - logger.info('Changes successfully commited') - return True - - def discard(self): - """ - Undo config modifications - """ - out = _run(os.path.join(VYOS_SBIN_DIR, 'my_discard'), output=True) - if not out: - raise OperationFailed('[ERROR] Discard changes failed !') - # return out.splitlines()[0] - return out - - def save(self): - """ - Save applied modifications. Changes still persistent even after - system reboot. - """ - out = _run(os.path.join(VYOS_SBIN_DIR, VYOS_SAVE_SCRIPT), output=True) - if not out: - logger.error('Saving changes failed') - raise OperationFailed('[ERROR] Save changes failed !') - logger.info('%s', out) - return True diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py deleted file mode 100644 index 361f21f1ea..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos_session/utils.py +++ /dev/null @@ -1,179 +0,0 @@ -import ConfigParser -import subprocess -import os -import logging -import logging.handlers as handlers - -# In production environment CONFIG_DIR should be /etc/pyatta/ -CONFIG_DIR = "/usr/share/vyos-oc" -CONFIG_FILE_NAME = "oc-vyos.conf" -AVAILABLE_LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL'] -DEFAULT_LOG_LEVEL = 'INFO' - -logger = logging.getLogger(__name__) - - -def get_config_params(section, key): - """ - To get specific parameters valuers from config file - """ - config = ConfigParser.SafeConfigParser() - config.readfp(open(os.path.join(CONFIG_DIR, CONFIG_FILE_NAME))) - return config.get(section, key) - - -def get_log_level(): - """ - Get and check log level value from pyatta.conf file. - """ - log_level = get_config_params('log', 'level') - if log_level not in AVAILABLE_LOG_LEVELS: - print('[ERROR] Unknown log level !') - return DEFAULT_LOG_LEVEL - return log_level - - -def get_log_filehandler(): - """ - Create file handler which logs messages. - """ - log_dir = get_config_params('log', 'logdir') - log_file = get_config_params('log', 'logfile') - log_file_path = os.path.join(log_dir, log_file) - if not os.path.exists(log_dir) or not os.path.exists(log_file_path): - try: - os.makedirs(log_dir) - open(log_file_path, 'a').close() - except OSError as exception: - print exception - return False - print "[INFO] Create log file %s" % log_file_path - # create file handler - fh = logging.FileHandler(log_file_path, 'a') - fh.setLevel(eval('logging.{0}'.format(get_log_level()))) - return fh - - -def init_logger(logger): - """ - Initialize logger object for logging application's activities to a - specific file. - """ - # create logger - logger.setLevel(eval('logging.{0}'.format(get_log_level()))) - # create formatter and add it to the handlers - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - ' - '%(message)s') - file_handler = get_log_filehandler() - file_handler.setFormatter(formatter) - # add the handlers to the logger - logger.addHandler(file_handler) - - formatter = logging.Formatter('vyos %(name)s %(funcName)s() %(levelname)s ' - '%(message)s') - sys_handler = handlers.SysLogHandler(address=('localhost', 514)) - sys_handler.setFormatter(formatter) - sys_handler.setLevel(logging.DEBUG) - logger.addHandler(sys_handler) - - -def _run(cmd, output=False): - """ - To run command easier - """ - # FIXME: This whole code taken from someones personal github implementation - # is really messy !!!! - if output: - try: - logger.debug('exec command: "%s"', cmd) - exec_pipe = subprocess.Popen(cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - except Exception as err: - message = 'Executing command %s failed with error %s' % (cmd, err) - logger.error(message) - return False - - cmd_output, cmd_error = exec_pipe.communicate() - # VPN commits succeed but we are getting perl locale warnings on stderr - if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s. Output is: %s' % ( - cmd, cmd_error, cmd_output) - logger.error(message) - return False - else: - logger.debug('command output: %s', cmd_output) - return True - else: - try: - logger.debug('exec command: "%s"', cmd) - out = subprocess.check_call(cmd, shell=True) # returns 0 for True - except subprocess.CalledProcessError as err: - logger.error('command execution failed with Error: %s', err) - out = 1 # returns 1 for False - logger.debug('command return code: %s', out) - return out - -# Alternate implementation for configuring vyos - The whole pyatta module -# is replaced with this one method. This was required top fix the following -# issue :http://vyatta38.rssing.com/chan-10627532/all_p7.html -# Not sure if the other commands also may fails or if there is an issue with -# the way the config module does things - - -def _alternate_set_and_commit(cmd): - try: - vyos_wrapper = "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper" - begin_cmd = "%s begin" % (vyos_wrapper) - set_cmd = "%s %s" % (vyos_wrapper, cmd) - commit_cmd = "%s commit" % (vyos_wrapper) - save_cmd = "%s save" % (vyos_wrapper) - end_cmd = "%s end" % (vyos_wrapper) - command = "%s;%s;%s;%s;%s" % (begin_cmd, set_cmd, commit_cmd, save_cmd, - end_cmd) - logger.debug('exec command: "%s"', command) - exec_pipe = subprocess.Popen(command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - except Exception as err: - message = 'Executing command %s failed with error %s' % (command, err) - logger.error(message) - return False - - cmd_output, cmd_error = exec_pipe.communicate() - # VPN commits succeed but we are getting perl locale warnings on stderr - if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s' % ( - command, cmd_error) - logger.error(message) - return False - else: - logger.debug('command output: %s', cmd_output) - return True - - -def clean_environ(env): - """ - Delete some envionment variables from system. - """ - for key in env.keys(): - if os.environ.get('key'): - del os.environ[key] - - -def ip2network(ip): - quads = ip.split('.') - netw = 0 - for i in range(4): - netw = (netw << 8) | int(len(quads) > i and quads[i] or 0) - return netw - - -def get_ip_address_with_netmask(ip, netmask): - prefix = bin(ip2network(netmask)).count('1') - ip_addr = ip + "/" + str(prefix) - return ip_addr - - -# initilize the logger for this module -init_logger(logger) From 76af066d682a3352d6260155ded9ec666573f15f Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 30 Jun 2016 18:57:49 +0530 Subject: [PATCH 012/157] renamed vyos-oc to vyos --- .../service_vendor_agents/vyos/__init__.py | 0 .../vyos/build_vyos_deb.sh | 4 +- .../service_vendor_agents/vyos/oc-pbr/README | 14 - .../vyos/oc-pbr/controller_route | 0 .../vyos/oc-pbr/dhclient-script | 327 ------------------ .../vyos/oc-pbr/interface-post-up | 2 - .../vyos/oc-pbr/interfaces | 59 ---- .../vyos/oc-pbr/management_pbr | 11 - .../vyos/oc-pbr/no-default-route | 12 - .../nfp/service_vendor_agents/vyos/oc-pbr/pbr | 2 - .../vyos/oc-pbr/pbr_init | 98 ------ .../vyos/oc-pbr/rc.local | 19 - .../vyos/oc-vyos/DEBIAN/postinst | 4 +- .../vyos/oc-vyos/bin/oc-vyos | 26 +- .../vyos/oc-vyos/src/auth_pam.pl | 2 +- .../oc-vyos/src/auth_pam_domain_verify.pl | 2 +- .../oc-vyos/src/oc_config_server/server2.py | 2 +- .../src/oc_config_server/vpn_api_server.py | 4 +- .../vyos/oc-vyos/src/vyos_session/utils.py | 2 +- 19 files changed, 21 insertions(+), 569 deletions(-) delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/__init__.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/README delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/controller_route delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/dhclient-script delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interface-post-up delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interfaces delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/management_pbr delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/no-default-route delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr_init delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/rc.local diff --git a/gbpservice/nfp/service_vendor_agents/vyos/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh index 8145d8c3ee..5019c6cc81 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh +++ b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh @@ -80,7 +80,7 @@ copy_source_code () { cp -r $SOURCE_CODE_DIR/etc $DEBIAN_PATH/. cp -r $SOURCE_CODE_DIR/bin/oc-vyos $DEBIAN_PATH/usr/bin/. - cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/usr/share/vyos-oc + cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/usr/share/vyos cp -r $SOURCE_CODE_DIR/src/oc-pbr/interfaces $DEBIAN_PATH/etc/network/. cp -r $SOURCE_CODE_DIR/src/oc-pbr/interface-post-up $DEBIAN_PATH/etc/network/. @@ -88,7 +88,7 @@ copy_source_code () { # TODO: Do we need this cp -r $SOURCE_CODE_DIR/src/vyos_init_script/restart_vpn $DEBIAN_PATH/config/scripts/. - mv $DEBIAN_PATH/usr/share/vyos-oc/oc-pbr $DEBIAN_PATH/usr/share/ + mv $DEBIAN_PATH/usr/share/vyos/oc-pbr $DEBIAN_PATH/usr/share/ sed -i "s/oc-vyos ([0-9]*.[0-9]*-*[0-9]*)/oc-vyos ($version-$release)/g" $DEBIAN_PATH/DEBIAN/changelog sed -i "/^Source:/c Source: oc-vyos-$version-$release" $DEBIAN_PATH/DEBIAN/control sed -i "s/^Version:.*/Version: $version-$release/g" $DEBIAN_PATH/DEBIAN/control diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/README deleted file mode 100644 index 9a29ea0b1f..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/README +++ /dev/null @@ -1,14 +0,0 @@ -1) Add the following line in /etc/rc.local file as give in sample rc.local file - sudo bash /usr/share/oc-pbr/pbr_init & -2) Modify the interfaces file to looks like given sample interfaces file - -3) mkdir -p /usr/share/oc-pbr - -4) copy pbr_init and pbr to /usr/share/oc-pbr - - -vyos agent (server2.py) adds route to the controller node received from pushed -configuration, and also writes a route in the -/usr/share/oc-pbr/controller_route file. This is to make the added route -persistent even if the instance is rebooted. -controller_route is called from pbr_init file. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/controller_route b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/controller_route deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/dhclient-script b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/dhclient-script deleted file mode 100755 index a1a2423149..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/dhclient-script +++ /dev/null @@ -1,327 +0,0 @@ -#!/bin/vbash - -# dhclient-script for Linux. Dan Halbert, March, 1997. -# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. -# Modified for Debian. Matt Zimmerman and Eloy Paris, December 2003 -# Modified to remove useless tests for antiquated kernel versions that -# this doesn't even work with anyway, and introduces a dependency on /usr -# being mounted, which causes cosmetic errors on hosts that NFS mount /usr -# Andrew Pollock, February 2005 -# Modified to work on point-to-point links. Andrew Pollock, June 2005 -# Modified to support passing the parameters called with to the hooks. Andrew Pollock, November 2005 - -# 'ip' just looks too weird. /sbin/ip looks less weird. -ip=/sbin/ip - - -# modified make_resolv_conf () for Vyatta system below -make_resolv_conf() { - local new_resolv_conf="/etc/resolv.conf.dhclient-new-$interface" - local old_resolv_conf="/etc/resolv.conf.dhclient-old-$interface" - mv -f $new_resolv_conf $old_resolv_conf - if [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then - if [ -n "$new_domain_name" ]; then - echo search $new_domain_name >>$new_resolv_conf - fi - if [ -n "$new_domain_name_servers" ]; then - for nameserver in $new_domain_name_servers; do - echo nameserver $nameserver >>$new_resolv_conf - done - fi - elif [ "x${new_dhcp6_name_servers}" != x ] ; then - if [ "x${new_dhcp6_domain_search}" != x ] ; then - echo search ${new_dhcp6_domain_search} >> $new_resolv_conf - fi - for nameserver in ${new_dhcp6_name_servers} ; do - echo nameserver ${nameserver} >> $new_resolv_conf - done - else - echo " " > $new_resolv_conf - fi - - /opt/vyatta/sbin/vyatta_update_resolv.pl --dhclient-script 1 - if ! diff -q $old_resolv_conf $new_resolv_conf >&/dev/null; then - if [ -d /opt/vyatta/config/active/service/dns/forwarding ]; then - /opt/vyatta/sbin/vyatta-dns-forwarding.pl --update-dnsforwarding --outside-cli >&/dev/null - fi - fi - rm -f $old_resolv_conf -} - -run_hook() { - local script="$1" - local exit_status - shift # discard the first argument, then the rest are the script's - - if [ -f $script ]; then - . $script "$@" - fi - - - if [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; then - logger -p daemon.err "$script returned non-zero exit status $exit_status" - save_exit_status=$exit_status - fi - - return $exit_status -} - -run_hookdir() { - local dir="$1" - local exit_status - shift # See run_hook - - if [ -d "$dir" ]; then - for script in $(run-parts --list $dir); do - run_hook $script "$@" || true - exit_status=$? - done - fi - - return $exit_status -} - -# Must be used on exit. Invokes the local dhcp client exit hooks, if any. -exit_with_hooks() { - exit_status=$1 - - # Source the documented exit-hook script, if it exists - if ! run_hook /etc/dhcp3/dhclient-exit-hooks "$@"; then - exit_status=$? - fi - - # Now run scripts in the Debian-specific directory. - if ! run_hookdir /etc/dhcp3/dhclient-exit-hooks.d "$@"; then - exit_status=$? - fi - - exit $exit_status -} - -get_prefix() { - # use existing perl module to compute prefix - # one line don't bother with script - perl -MNetAddr::IP \ - -e '$ip = new NetAddr::IP(@ARGV); print $ip->masklen(), "\n"' $* -} - -set_hostname() { - local current_hostname=$(hostname) - if [ -z "$current_hostname" -o "$current_hostname" = "(none)" ]; then - hostname "$new_host_name" - fi -} - -set_address() { - if [ -n "$old_ip_address" ] && - [ "$old_ip_address" != "$new_ip_address" -o "$old_prefix" != "$new_prefix" ] ; then - # Clear out route cache and ARP tables and all addresses and routes - ip -family inet addr flush dev $interface - fi - - if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ] || - [ -z "$old_ip_address" -o "$old_ip_address" != "$new_ip_address" ] || - [ -z "$old_prefix" -o "$old_prefix" != "$new_prefix" ] ; then - ip -family inet addr add $new_ip_address/$new_prefix \ - broadcast $new_broadcast_address dev $interface - fi - - if [ -n "$new_interface_mtu" ] && - [ ! "$old_interface_mtu" = "$new_interface_mtu" ]; then - ip link set $interface mtu $new_interface_mtu - fi -} - -# Administrative for DHCP routes. Should be configurable -ZEBRA_ROUTE_DHCP=210 - -update_routers() { - if [ -n "$old_routers" ]; then - # No change just renewing - if [ "$reason" = "RENEW" -a "$old_routers" = "$new_routers" ]; then - return 0 - fi - - for router in $old_routers; do - if [ "$old_subnet_mask" == "255.255.255.255" ]; then - vtysh -c "conf t" -c "no ip route $router $interface $ZEBRA_ROUTE_DHCP" - fi - if [ "eth0" == "$interface" ]; then - vtysh -c "conf t" -c "no ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" - fi - done - fi - - for router in $new_routers; do - # point to point - if [ "$new_subnet_mask" == "255.255.255.255" ]; then - vtysh -c "conf t" -c "ip route $router $interface $ZEBRA_ROUTE_DHCP" - fi - if [ "eth0" == "$interface" ]; then - vtysh -c "conf t" -c "ip route 0.0.0.0/0 $router 2" - fi - done - # Making vrrp interface down and up adds back our static route - intf=`ip ad | grep $interface'v' | awk '{print $2}' | grep '@' |cut -f1 -d'@'` - if [ 'x'$intf != x ]; then - sudo ifconfig $intf down - sudo ifconfig $intf up - fi -} - -if [ -n "$new_subnet_mask" ]; then - new_prefix=$(get_prefix $new_ip_address $new_subnet_mask) -fi -if [ -n "$old_subnet_mask" ]; then - old_prefix=$(get_prefix $old_ip_address $old_subnet_mask) -fi -if [ -n "$new_interface_mtu" ]; then - # Vyatta configuration overrides response from server to allow user - # to work around broken ISP's - mtu_path=$(/opt/vyatta/sbin/vyatta-interfaces.pl --dev=$interface --path) - if [ -r $mtu_path ]; then - read new_interface_mtu < $mtu_path - fi - - # The 576 MTU is only used for X.25 and dialup connections - # where the admin wants low latency. Such a low MTU can cause - # problems with UDP traffic, among other things. As such, - # disallow MTUs from 576 and below by default, so that broken - # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc). - if [ $new_interface_mtu -le 576 ]; then - new_interface_mtu= - fi -fi - -# The action starts here - -# Invoke the local dhcp client enter hooks, if they exist. -run_hook /etc/dhcp3/dhclient-enter-hooks -run_hookdir /etc/dhcp3/dhclient-enter-hooks.d - -# Execute the operation -case "$reason" in - MEDIUM) - # Do nothing - ;; - - PREINIT) - ip -family inet addr flush dev $interface - ip link set $interface up - - if [ -n "$DHCLIENT_DELAY" ] && [ $DHCLIENT_DELAY -gt 0 ]; then - sleep $DHCLIENT_DELAY - fi - ;; - - ARPCHECK|ARPSEND) - if [ -z "$new_ip_address" ] || [ -z "$interface" ] || - arping -q -f -c 2 -w 3 -D -I $interface $new_ip_address; then - exit_with_hooks 0 - else - exit_with_hooks 1 - fi - ;; - - BOUND|RENEW|REBIND|REBOOT) - set_hostname - - make_resolv_conf - set_address - update_routers - - exit_with_hooks 0 - ;; - - EXPIRE|FAIL|RELEASE|STOP) - new_routers=""; update_routers - - if [ -n "$old_ip_address" ]; then - ip -family inet addr flush dev ${interface} - fi - if [ "$reason" = "STOP" ]; then - ip link set ${interface} down - fi - - make_resolv_conf - ;; - - TIMEOUT) - if [ -n "$new_routers" ]; then - ip -family inet addr add $new_ip_address/$new_prefix \ - broadcast $new_broadcast_address dev $interface - - set -- $new_routers - first_router="$1" - - if ping -q -c 1 -I $interface $first_router ; then - make_resolv_conf - set_address - update_routers - - exit_with_hooks 0 - fi - ip -family inet addr flush dev $interface - # Note: this exits with interface still up - # see Debian bug #144666 - fi - exit_with_hooks 2 "$@" - ;; - - PREINIT6) - # Ensure interface is up. - ${ip} link set ${interface} up - - exit_with_hooks 0 - ;; - - BOUND6) - if [ x${new_ip6_address} != x ] && [ x${new_ip6_prefixlen} != x ] ; then - ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ - dev ${interface} scope global - fi - - # Check for nameserver options. - make_resolv_conf - - exit_with_hooks 0 - ;; - - RENEW6|REBIND6) - # Make sure nothing has moved around on us. - - # Nameservers/domains/etc. - if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || - [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then - make_resolv_conf - fi - - exit_with_hooks 0 - ;; - - DEPREF6) - if [ x${new_ip6_prefixlen} = x ] ; then - exit_with_hooks 2; - fi - - ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ - dev ${interface} scope global preferred_lft 0 - - exit_with_hooks 0 - ;; - - EXPIRE6|RELEASE6|STOP6) - if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then - exit_with_hooks 2; - fi - - ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ - dev ${interface} - - make_resolv_conf - exit_with_hooks 0 - ;; - -esac - -exit_with_hooks 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interface-post-up deleted file mode 100755 index 56862e7f18..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interface-post-up +++ /dev/null @@ -1,2 +0,0 @@ -/sbin/route del default dev $IFACE -echo 1 > /proc/sys/net/ipv4/conf/$IFACE/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interfaces deleted file mode 100644 index 72cf17c415..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/interfaces +++ /dev/null @@ -1,59 +0,0 @@ -# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or -# /usr/share/doc/ifupdown/examples for more information. - -# The loopback network interface -auto lo -iface lo inet loopback - -auto eth0 -iface eth0 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth1 -iface eth1 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth2 -iface eth2 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth3 -iface eth3 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth4 -iface eth4 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth5 -iface eth5 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth6 -iface eth6 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth7 -iface eth7 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth8 -iface eth8 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth9 -iface eth9 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth10 -iface eth10 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth11 -iface eth11 inet dhcp -post-up /etc/network/interface-post-up - -allow-hotplug eth12 -iface eth12 inet dhcp -post-up /etc/network/interface-post-up - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/management_pbr deleted file mode 100755 index ed5776260b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/management_pbr +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -echo "dhclient: $reason" -case $reason in - BOUND|RENEW|REBIND|REBOOT) - if [ "eth0" == $interface ]; then - sudo bash /usr/share/oc-pbr/pbr_init & - echo "Management pbr is set" - fi - ;; -esac - diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/no-default-route deleted file mode 100755 index 885672d274..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/no-default-route +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -case $reason in - BOUND|RENEW|REBIND|REBOOT) - if [ "eth0" == $interface ]; then - echo $new_routers > /usr/share/oc-pbr/eth0_route - #unset new_routers - else - unset new_routers - fi - echo "Default gateway has been cleared" - ;; -esac diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr deleted file mode 100755 index 90e91c1464..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/vbash -sudo ip route add default via $@ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr_init deleted file mode 100755 index e3fe31c7ce..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/pbr_init +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -#Converts decimal to ip address -function dec2ip () { - local ip dec=$1 - for e in {3..0} - do - ((octet = dec / (256 ** e) )) - ((dec -= octet * 256 ** e)) - ip+=$delim$octet - delim=. - done - echo $ip -} - -#Converts ip notation to decimal -function ip2dec () { - local a b c d ip=$1 - IFS=. read -r a b c d <<< "$ip" - echo $((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d)) -} - - -#sleep 20 -flag=0 -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -all_interfaces=`/sbin/ifconfig | grep "Link encap" | grep -v "127.0.0.1" |cut -d: -d " " -f 1` -index=0 -for i in $all_interfaces; do - if [ "$i" == "eth0" ] || [ "$i" == "eth1" ] - then - while true - do - ip_addr=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $4 }'` - if [ $ip_addr ] - then - #echo "GOT IP for interface $i" - #flag=1 - break - fi - done - bcast_ip=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $6 }'`; - mask=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $8 }'`; - dec_bcast_ip=$(ip2dec $bcast_ip) - dec_mask=$(ip2dec $mask) - dec_net_ip=$(($dec_bcast_ip & $dec_mask)) - net_ip=$(dec2ip $dec_net_ip) - interfaces[$index]=$i - ip_addresses[$index]=$ip_addr - network_id[$index]=$net_ip - filename="/var/lib/dhcp3/dhclient_"$i"_lease" - #route=`grep "option routers" $filename |tail -1| cut -d: -d " " -f5` - route=`grep "new_routers" $filename |tail -1| cut -d: -d "=" -f2| tr -d "'"` - default_route[$index]=$route - #echo "$index ${default_route[$index]}" - if [ "$i" == "eth0" ] && [ $flag == 0 ] - then - table_name=$i"_table" - table_id=`expr $index + 5` - is_present=`grep "$table_name" /etc/iproute2/rt_tables` - if [ "$is_present" == "" ] - then - echo $table_id $table_name >> /etc/iproute2/rt_tables - fi - `ip route add default via ${default_route[$index]} table $table_name` - `ip rule del from ${ip_addresses[$index]} table $table_name` - `ip rule add from ${ip_addresses[$index]} table $table_name` - echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route - #echo "configured pbr for interface $i" - fi - #index=`expr $index + 1` - ((index++)) - fi -done - -index=0 -for interface in ${interfaces[*]}; do - #echo "$index ${default_route[$index]}" - if [ "$interface" == "eth1" ] && [ $flag == 0 ] - then - #echo "Set default route on $interface ${default_route[$index]} $index" - cmd="bash /usr/share/oc-pbr/pbr ${default_route[$index]}" - #sudo su - vyos -c "$cmd" - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]} - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper end - #source /opt/vyatta/etc/functions/script-template - #eval "set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]}" - #eval "commit" - #eval "exit" - fi - #index=`expr $index + 1` - ((index++)) -done - -#bash /usr/share/oc-pbr/controller_route -echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/rc.local b/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/rc.local deleted file mode 100755 index 2a68541436..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-pbr/rc.local +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -e -# -# rc.local -# -# This script is executed at the end of each multiuser runlevel. -# value on error. -# -# In order to enable or disable this script just change the execution -# bits. -# -# By default this script does nothing. - -# Do not remove the following call to vyatta-postconfig-bootup.script. -# Any boot time workarounds should be put in script below so that they -# get preserved for the new image during image upgrade. -POSTCONFIG=/opt/vyatta/etc/config/scripts/vyatta-postconfig-bootup.script -[ -x $POSTCONFIG ] && $POSTCONFIG -sudo bash /usr/share/oc-pbr/pbr_init & -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst index 746e9467e1..e977d43578 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst @@ -8,6 +8,6 @@ sudo update-rc.d oc-vyos defaults sudo mkdir -p /var/log/oc touch /var/log/oc/oc-vyos.log echo "" > /var/log/oc/vyos_monitor -sudo chown vyos:users -R /var/log/oc /usr/share/vyos-oc /usr/share/oc-pbr +sudo chown vyos:users -R /var/log/oc /usr/share/vyos /usr/share/oc-pbr cp /usr/share/oc-pbr/dhclient-script /sbin/dhclient-script -sudo cp /usr/share/vyos-oc/oc_config_server/vyos-oc-log /etc/logrotate.d/vyos-oc-log +sudo cp /usr/share/vyos/oc_config_server/vyos-log /etc/logrotate.d/vyos-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos index c4eea201e5..802d5def1b 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos @@ -1,24 +1,20 @@ #!/usr/bin/env python + +# 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 # -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# 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 sys -# sys.path.append("/home/vikash/vyos-oc") -sys.path.append("/usr/share/vyos-oc") +sys.path.append("/usr/share/vyos") from oc_config_server.server2 import main -#sys.argv=[__name__, '-h', '0', '-p', 8888] main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl index 3cf31fa4cb..6e22af4d0e 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl @@ -81,7 +81,7 @@ sub read_auth_server_conf { # Get auth server conf from file - my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; + my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos/auth_server.conf"; if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl index d5d32c58f7..330e15a694 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl @@ -73,7 +73,7 @@ sub read_auth_server_conf { # Get auth server conf from file - my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos-oc/auth_server.conf"; + my $AUTH_SERVER_CONF_FILE = "/usr/share/vyos/auth_server.conf"; if (!open (AUTHFILE, $AUTH_SERVER_CONF_FILE)) { print "Could not open auth file : $AUTH_SERVER_CONF_FILE\n"; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py index 60370564f0..710d48573e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py @@ -55,7 +55,7 @@ @app.route('/auth-server-config', methods=['POST']) def auth_server_config(): data = json.loads(request.data) - f = open("/usr/share/vyos-oc/auth_server.conf", 'w') + f = open("/usr/share/vyos/auth_server.conf", 'w') f.write(data['auth_uri']) f.write('\n') f.write(data['admin_tenant_name']) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py index 599a22832b..6a4b7ca97f 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py @@ -22,7 +22,7 @@ OP_SUCCESS = True OP_FAILED = False -OP_COMMAND_SCRIPT = "/usr/share/vyos-oc/vpn_op_commands.pl" +OP_COMMAND_SCRIPT = "/usr/share/vyos/vpn_op_commands.pl" IPSEC_SITE2SITE_COMMANDS = { 'ike': [ @@ -75,7 +75,7 @@ 'set interfaces openvpn %s server push-route %s', 'set interfaces openvpn %s openvpn-option \ "--client-cert-not-required --script-security 3 \ - --auth-user-pass-verify /usr/share/vyos-oc/auth_pam.pl via-file"'], + --auth-user-pass-verify /usr/share/vyos/auth_pam.pl via-file"'], #'set interfaces openvpn %s local-host %s'], 'delete': [ 'delete interfaces openvpn %s', diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py index 361f21f1ea..35cd3a4eb3 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py @@ -5,7 +5,7 @@ import logging.handlers as handlers # In production environment CONFIG_DIR should be /etc/pyatta/ -CONFIG_DIR = "/usr/share/vyos-oc" +CONFIG_DIR = "/usr/share/vyos" CONFIG_FILE_NAME = "oc-vyos.conf" AVAILABLE_LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL'] DEFAULT_LOG_LEVEL = 'INFO' From a5e6257a577f9ee582d3bf675ba37d1fdc78afbb Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 30 Jun 2016 19:08:41 +0530 Subject: [PATCH 013/157] renamed oc-vyos dir and dependencies to vyos --- .../vyos/build_vyos_deb.sh | 12 ++++---- .../vyos/oc-vyos/DEBIAN/changelog | 2 +- .../vyos/oc-vyos/DEBIAN/control | 4 +-- .../vyos/oc-vyos/DEBIAN/postinst | 4 +-- .../vyos/oc-vyos/bin/{oc-vyos => vyos} | 0 .../vyos/oc-vyos/etc/init.d/oc-vyos | 28 +++++++++---------- .../vyos/oc-vyos/src/init_script/oc-vyos | 28 +++++++++---------- .../vyos/oc-vyos/src/oc-vyos.conf | 2 +- .../oc-vyos/src/oc_config_server/vyos-oc-log | 4 +-- .../vyos/oc-vyos/src/vyos_init_script/oc-vyos | 28 +++++++++---------- .../vyos/oc-vyos/src/vyos_session/utils.py | 2 +- 11 files changed, 57 insertions(+), 57 deletions(-) rename gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/{oc-vyos => vyos} (100%) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh index 5019c6cc81..60964ede23 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh +++ b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh @@ -6,7 +6,7 @@ SOURCE_CODE_DIR=$1 DEB_PACKAGE_DIR=$1/deb-packages version=$2 release=$3 -DEBIAN_PATH=$DEB_PACKAGE_DIR/oc-vyos-$version-$release +DEBIAN_PATH=$DEB_PACKAGE_DIR/vyos-$version-$release print_usage () { @@ -79,7 +79,7 @@ copy_source_code () { cp -r $SOURCE_CODE_DIR/DEBIAN $DEBIAN_PATH/. cp -r $SOURCE_CODE_DIR/etc $DEBIAN_PATH/. - cp -r $SOURCE_CODE_DIR/bin/oc-vyos $DEBIAN_PATH/usr/bin/. + cp -r $SOURCE_CODE_DIR/bin/vyos $DEBIAN_PATH/usr/bin/. cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/usr/share/vyos cp -r $SOURCE_CODE_DIR/src/oc-pbr/interfaces $DEBIAN_PATH/etc/network/. @@ -89,8 +89,8 @@ copy_source_code () { # TODO: Do we need this cp -r $SOURCE_CODE_DIR/src/vyos_init_script/restart_vpn $DEBIAN_PATH/config/scripts/. mv $DEBIAN_PATH/usr/share/vyos/oc-pbr $DEBIAN_PATH/usr/share/ - sed -i "s/oc-vyos ([0-9]*.[0-9]*-*[0-9]*)/oc-vyos ($version-$release)/g" $DEBIAN_PATH/DEBIAN/changelog - sed -i "/^Source:/c Source: oc-vyos-$version-$release" $DEBIAN_PATH/DEBIAN/control + sed -i "s/vyos ([0-9]*.[0-9]*-*[0-9]*)/vyos ($version-$release)/g" $DEBIAN_PATH/DEBIAN/changelog + sed -i "/^Source:/c Source: vyos-$version-$release" $DEBIAN_PATH/DEBIAN/control sed -i "s/^Version:.*/Version: $version-$release/g" $DEBIAN_PATH/DEBIAN/control } @@ -98,10 +98,10 @@ build_deb_package () { CURDIR=${PWD} cd $DEB_PACKAGE_DIR - dpkg-deb --build oc-vyos-$version-$release + dpkg-deb --build vyos-$version-$release cd $CURDIR - echo "Vyos package will be available in : $DEB_PACKAGE_DIR/oc-vyos-$version-$release.deb " + echo "Vyos package will be available in : $DEB_PACKAGE_DIR/vyos-$version-$release.deb " } diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog index 2f1cf59cbc..102b258564 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog @@ -1,4 +1,4 @@ -oc-vyos (2.5) UNRELEASED; urgency=low +vyos (2.5) UNRELEASED; urgency=low * Initial release. (Closes: #XXXXXX) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control index f67107c412..e2e82fbdde 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control @@ -1,5 +1,5 @@ -Package: oc-vyos -Source: oc-vyos +Package: vyos +Source: vyos Version: 2.5 Architecture: all Maintainer: Mahesh Kurund diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst index e977d43578..37547e2e19 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst @@ -4,9 +4,9 @@ #sed -i '/exit 0/i sudo bash /usr/share/oc-pbr/pbr_init &' /etc/rc.local sudo chown -R root:vyattacfg /config/auth/ sudo chown -R root:vyattacfg /config/scripts/ -sudo update-rc.d oc-vyos defaults +sudo update-rc.d vyos defaults sudo mkdir -p /var/log/oc -touch /var/log/oc/oc-vyos.log +touch /var/log/oc/vyos.log echo "" > /var/log/oc/vyos_monitor sudo chown vyos:users -R /var/log/oc /usr/share/vyos /usr/share/oc-pbr cp /usr/share/oc-pbr/dhclient-script /sbin/dhclient-script diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/vyos similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/vyos diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos index 850a85e5ed..f5d790b8f6 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos @@ -14,23 +14,23 @@ # One Convergence, Inc., USA # ### BEGIN INIT INFO -# Provides: oc-vyos +# Provides: vyos # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: OC vyos service -# Description: Provides the oc-vyos service +# Description: Provides the vyos service ### END INIT INFO set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos +PIDFILE=/var/run/elastic_services/vyos.pid +LOGFILE=/var/log/elastic_services/vyos.log +DAEMON=/usr/bin/vyos DAEMON_ARGS="--log-file=$LOGFILE" DAEMON_DIR=/var/run/elastic_services ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos +if test -f /etc/default/vyos; then +. /etc/default/vyos fi mkdir -p /var/run/elastic_services mkdir -p /var/log/elastic_services @@ -59,8 +59,8 @@ fi if [ $start -eq 1 ]; then ## ensure stale processes killed set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e log_daemon_msg "Starting oc vyos" # We have completely messed up the rc level scripts @@ -68,7 +68,7 @@ sudo chown vyos:users -R /var/run/elastic_services sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS log_end_msg $? else -echo "oc-vyos[$pid] is already running" +echo "vyos[$pid] is already running" fi ;; stop) @@ -90,8 +90,8 @@ echo "PID file not existing" fi ## ensure stale processes killed set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e ;; restart|force-reload) @@ -120,10 +120,10 @@ fi ;; status) test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +status_of_proc -p $PIDFILE $DAEMON vyos && exit 0 || exit $? ;; *) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +log_action_msg "Usage: /etc/init.d/vyos {start|stop|restart|force-reload|reload|status}" exit 1 ;; esac diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos index 850a85e5ed..f5d790b8f6 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos @@ -14,23 +14,23 @@ # One Convergence, Inc., USA # ### BEGIN INIT INFO -# Provides: oc-vyos +# Provides: vyos # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: OC vyos service -# Description: Provides the oc-vyos service +# Description: Provides the vyos service ### END INIT INFO set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos +PIDFILE=/var/run/elastic_services/vyos.pid +LOGFILE=/var/log/elastic_services/vyos.log +DAEMON=/usr/bin/vyos DAEMON_ARGS="--log-file=$LOGFILE" DAEMON_DIR=/var/run/elastic_services ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos +if test -f /etc/default/vyos; then +. /etc/default/vyos fi mkdir -p /var/run/elastic_services mkdir -p /var/log/elastic_services @@ -59,8 +59,8 @@ fi if [ $start -eq 1 ]; then ## ensure stale processes killed set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e log_daemon_msg "Starting oc vyos" # We have completely messed up the rc level scripts @@ -68,7 +68,7 @@ sudo chown vyos:users -R /var/run/elastic_services sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS log_end_msg $? else -echo "oc-vyos[$pid] is already running" +echo "vyos[$pid] is already running" fi ;; stop) @@ -90,8 +90,8 @@ echo "PID file not existing" fi ## ensure stale processes killed set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e ;; restart|force-reload) @@ -120,10 +120,10 @@ fi ;; status) test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +status_of_proc -p $PIDFILE $DAEMON vyos && exit 0 || exit $? ;; *) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +log_action_msg "Usage: /etc/init.d/vyos {start|stop|restart|force-reload|reload|status}" exit 1 ;; esac diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf index 1ae8510480..9ef2c62706 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf @@ -4,5 +4,5 @@ shell_api_path = /bin/cli-shell-api [log] logdir=/var/log/oc -logfile=oc-vyos.log +logfile=vyos.log level=ERROR diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log index 25c48e9e1a..926d4fa2b6 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log @@ -8,7 +8,7 @@ notifempty create 644 vyos users } -/var/log/oc/oc-vyos.log { +/var/log/oc/vyos.log { monthly rotate 12 size 10M @@ -18,7 +18,7 @@ notifempty create 644 vyos users postrotate - sudo /etc/init.d/oc-vyos restart + sudo /etc/init.d/vyos restart endscript } diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos index 850a85e5ed..f5d790b8f6 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos @@ -14,23 +14,23 @@ # One Convergence, Inc., USA # ### BEGIN INIT INFO -# Provides: oc-vyos +# Provides: vyos # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: OC vyos service -# Description: Provides the oc-vyos service +# Description: Provides the vyos service ### END INIT INFO set -e -PIDFILE=/var/run/elastic_services/oc-vyos.pid -LOGFILE=/var/log/elastic_services/oc-vyos.log -DAEMON=/usr/bin/oc-vyos +PIDFILE=/var/run/elastic_services/vyos.pid +LOGFILE=/var/log/elastic_services/vyos.log +DAEMON=/usr/bin/vyos DAEMON_ARGS="--log-file=$LOGFILE" DAEMON_DIR=/var/run/elastic_services ENABLED=true -if test -f /etc/default/oc-vyos; then -. /etc/default/oc-vyos +if test -f /etc/default/vyos; then +. /etc/default/vyos fi mkdir -p /var/run/elastic_services mkdir -p /var/log/elastic_services @@ -59,8 +59,8 @@ fi if [ $start -eq 1 ]; then ## ensure stale processes killed set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e log_daemon_msg "Starting oc vyos" # We have completely messed up the rc level scripts @@ -68,7 +68,7 @@ sudo chown vyos:users -R /var/run/elastic_services sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS log_end_msg $? else -echo "oc-vyos[$pid] is already running" +echo "vyos[$pid] is already running" fi ;; stop) @@ -90,8 +90,8 @@ echo "PID file not existing" fi ## ensure stale processes killed set +e -running_processes=`ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/oc-vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 +running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` +[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e ;; restart|force-reload) @@ -120,10 +120,10 @@ fi ;; status) test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON oc-vyos && exit 0 || exit $? +status_of_proc -p $PIDFILE $DAEMON vyos && exit 0 || exit $? ;; *) -log_action_msg "Usage: /etc/init.d/oc-vyos {start|stop|restart|force-reload|reload|status}" +log_action_msg "Usage: /etc/init.d/vyos {start|stop|restart|force-reload|reload|status}" exit 1 ;; esac diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py index 35cd3a4eb3..386c1ee4f3 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py @@ -6,7 +6,7 @@ # In production environment CONFIG_DIR should be /etc/pyatta/ CONFIG_DIR = "/usr/share/vyos" -CONFIG_FILE_NAME = "oc-vyos.conf" +CONFIG_FILE_NAME = "vyos.conf" AVAILABLE_LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL'] DEFAULT_LOG_LEVEL = 'INFO' From 279a896ab55620c6900bce8f688b2e127c49bcb0 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 30 Jun 2016 19:20:02 +0530 Subject: [PATCH 014/157] renamed oc-pbr and dependencies to vyos --- .../vyos/oc-vyos/bin/vyos | 20 ------------------- .../vyos/{oc-vyos => vyos}/DEBIAN/changelog | 0 .../vyos/{oc-vyos => vyos}/DEBIAN/control | 0 .../vyos/{oc-vyos => vyos}/DEBIAN/postinst | 6 +++--- .../vyos/{oc-vyos => vyos}/DEBIAN/postrm | 0 .../vyos/{oc-vyos => vyos}/etc/init.d/oc-vyos | 0 .../vyos/{oc-vyos => vyos}/src/LICENSE README | 0 .../vyos/{oc-vyos => vyos}/src/__init__.py | 0 .../vyos/{oc-vyos => vyos}/src/auth_pam.pl | 0 .../src/auth_pam_domain_verify.pl | 0 .../{oc-vyos => vyos}/src/auth_server.conf | 0 .../src/execformat/__init__.py | 0 .../src/execformat/executor.py | 0 .../src/execformat/formator.py | 0 .../{oc-vyos => vyos}/src/init_script/oc-vyos | 0 .../src/init_script/restart_vpn | 0 .../vyos/{oc-vyos => vyos}/src/oc-pbr/README | 8 ++++---- .../src/oc-pbr/controller_route | 0 .../src/oc-pbr/dhclient-script | 0 .../src/oc-pbr/interface-post-up | 0 .../{oc-vyos => vyos}/src/oc-pbr/interfaces | 0 .../src/oc-pbr/management_pbr | 2 +- .../src/oc-pbr/no-default-route | 2 +- .../vyos/{oc-vyos => vyos}/src/oc-pbr/pbr | 0 .../{oc-vyos => vyos}/src/oc-pbr/pbr_init | 4 ++-- .../{oc-vyos => vyos}/src/oc-pbr/rc.local | 2 +- .../vyos/{oc-vyos => vyos}/src/oc-vyos.conf | 0 .../src/oc_config_server/__init__.py | 0 .../oc_config_server/edit_persistent_rule.py | 0 .../src/oc_config_server/fw_constants.py | 0 .../src/oc_config_server/fw_handler.py | 0 .../src/oc_config_server/ha_config.py | 0 .../src/oc_config_server/interface_monitor.sh | 0 .../src/oc_config_server/log_forwarder.py | 0 .../src/oc_config_server/oc_fw_module.py | 0 .../src/oc_config_server/operations.py | 0 .../oc_config_server/routes_config_handler.py | 0 .../src/oc_config_server/server.py | 0 .../src/oc_config_server/server2.py | 0 .../src/oc_config_server/static_ip.py | 0 .../src/oc_config_server/stats_parser.py | 0 .../src/oc_config_server/vpn_api_server.py | 0 .../src/oc_config_server/vyos-oc-log | 0 .../src/oc_config_server/vyos_dhc.py | 0 .../src/oc_config_server/vyos_exception.py | 0 .../vyos_policy_based_routes.py | 0 .../vyos/{oc-vyos => vyos}/src/op_commands.sh | 0 .../{oc-vyos => vyos}/src/vpn_op_commands.pl | 0 .../src/vyos_init_script/oc-vyos | 0 .../src/vyos_init_script/restart_vpn | 0 .../src/vyos_session/__init__.py | 0 .../src/vyos_session/configsession.py | 0 .../src/vyos_session/utils.py | 0 53 files changed, 12 insertions(+), 32 deletions(-) delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/vyos rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/DEBIAN/changelog (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/DEBIAN/control (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/DEBIAN/postinst (73%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/DEBIAN/postrm (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/etc/init.d/oc-vyos (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/LICENSE README (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/auth_pam.pl (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/auth_pam_domain_verify.pl (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/auth_server.conf (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/execformat/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/execformat/executor.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/execformat/formator.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/init_script/oc-vyos (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/init_script/restart_vpn (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/README (65%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/controller_route (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/dhclient-script (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/interface-post-up (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/interfaces (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/management_pbr (78%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/no-default-route (79%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/pbr (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/pbr_init (96%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-pbr/rc.local (92%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc-vyos.conf (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/edit_persistent_rule.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/fw_constants.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/fw_handler.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/ha_config.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/interface_monitor.sh (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/log_forwarder.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/oc_fw_module.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/operations.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/routes_config_handler.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/server.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/server2.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/static_ip.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/stats_parser.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/vpn_api_server.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/vyos-oc-log (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/vyos_dhc.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/vyos_exception.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/oc_config_server/vyos_policy_based_routes.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/op_commands.sh (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/vpn_op_commands.pl (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/vyos_init_script/oc-vyos (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/vyos_init_script/restart_vpn (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/vyos_session/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/vyos_session/configsession.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{oc-vyos => vyos}/src/vyos_session/utils.py (100%) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/vyos b/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/vyos deleted file mode 100755 index 802d5def1b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/bin/vyos +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python - -# 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 sys - -sys.path.append("/usr/share/vyos") - -from oc_config_server.server2 import main -main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/changelog similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/changelog rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/changelog diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/control similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/control rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/control diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postinst similarity index 73% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postinst index 37547e2e19..d7a3892f32 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postinst +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postinst @@ -1,13 +1,13 @@ #!/bin/bash #sed -i '/pbr_init/d' /etc/rc.local -#sed -i '/exit 0/i sudo bash /usr/share/oc-pbr/pbr_init &' /etc/rc.local +#sed -i '/exit 0/i sudo bash /usr/share/vyos-pbr/pbr_init &' /etc/rc.local sudo chown -R root:vyattacfg /config/auth/ sudo chown -R root:vyattacfg /config/scripts/ sudo update-rc.d vyos defaults sudo mkdir -p /var/log/oc touch /var/log/oc/vyos.log echo "" > /var/log/oc/vyos_monitor -sudo chown vyos:users -R /var/log/oc /usr/share/vyos /usr/share/oc-pbr -cp /usr/share/oc-pbr/dhclient-script /sbin/dhclient-script +sudo chown vyos:users -R /var/log/oc /usr/share/vyos /usr/share/vyos-pbr +cp /usr/share/vyos-pbr/dhclient-script /sbin/dhclient-script sudo cp /usr/share/vyos/oc_config_server/vyos-log /etc/logrotate.d/vyos-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postrm similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/DEBIAN/postrm rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postrm diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/vyos/etc/init.d/oc-vyos similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/etc/init.d/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/etc/init.d/oc-vyos diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/LICENSE README b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/LICENSE README similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/LICENSE README rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/LICENSE README diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam.pl similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam.pl rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam.pl diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam_domain_verify.pl similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_pam_domain_verify.pl rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam_domain_verify.pl diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_server.conf b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_server.conf similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/auth_server.conf rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_server.conf diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/executor.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/executor.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/executor.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/formator.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/execformat/formator.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/formator.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/oc-vyos similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/oc-vyos diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/restart_vpn similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/init_script/restart_vpn rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/restart_vpn diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/README similarity index 65% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/README rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/README index 9a29ea0b1f..d01c9d7cbf 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/README +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/README @@ -1,14 +1,14 @@ 1) Add the following line in /etc/rc.local file as give in sample rc.local file - sudo bash /usr/share/oc-pbr/pbr_init & + sudo bash /usr/share/vyos-pbr/pbr_init & 2) Modify the interfaces file to looks like given sample interfaces file -3) mkdir -p /usr/share/oc-pbr +3) mkdir -p /usr/share/vyos-pbr -4) copy pbr_init and pbr to /usr/share/oc-pbr +4) copy pbr_init and pbr to /usr/share/vyos-pbr vyos agent (server2.py) adds route to the controller node received from pushed configuration, and also writes a route in the -/usr/share/oc-pbr/controller_route file. This is to make the added route +/usr/share/vyos-pbr/controller_route file. This is to make the added route persistent even if the instance is rebooted. controller_route is called from pbr_init file. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/controller_route b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/controller_route similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/controller_route rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/controller_route diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/dhclient-script b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/dhclient-script similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/dhclient-script rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/dhclient-script diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interface-post-up similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interface-post-up rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interface-post-up diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interfaces similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/interfaces rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interfaces diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/management_pbr similarity index 78% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/management_pbr rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/management_pbr index ed5776260b..74f9c4fdc3 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/management_pbr +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/management_pbr @@ -3,7 +3,7 @@ echo "dhclient: $reason" case $reason in BOUND|RENEW|REBIND|REBOOT) if [ "eth0" == $interface ]; then - sudo bash /usr/share/oc-pbr/pbr_init & + sudo bash /usr/share/vyos-pbr/pbr_init & echo "Management pbr is set" fi ;; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/no-default-route similarity index 79% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/no-default-route rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/no-default-route index 885672d274..0acc48e6c9 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/no-default-route +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/no-default-route @@ -2,7 +2,7 @@ case $reason in BOUND|RENEW|REBIND|REBOOT) if [ "eth0" == $interface ]; then - echo $new_routers > /usr/share/oc-pbr/eth0_route + echo $new_routers > /usr/share/vyos-pbr/eth0_route #unset new_routers else unset new_routers diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr_init similarity index 96% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr_init rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr_init index e3fe31c7ce..10b09a9c02 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/pbr_init +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr_init @@ -79,7 +79,7 @@ for interface in ${interfaces[*]}; do if [ "$interface" == "eth1" ] && [ $flag == 0 ] then #echo "Set default route on $interface ${default_route[$index]} $index" - cmd="bash /usr/share/oc-pbr/pbr ${default_route[$index]}" + cmd="bash /usr/share/vyos-pbr/pbr ${default_route[$index]}" #sudo su - vyos -c "$cmd" #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]} @@ -94,5 +94,5 @@ for interface in ${interfaces[*]}; do ((index++)) done -#bash /usr/share/oc-pbr/controller_route +#bash /usr/share/vyos-pbr/controller_route echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/rc.local b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/rc.local similarity index 92% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/rc.local rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/rc.local index 2a68541436..76a4b9b4f7 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-pbr/rc.local +++ b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/rc.local @@ -15,5 +15,5 @@ # get preserved for the new image during image upgrade. POSTCONFIG=/opt/vyatta/etc/config/scripts/vyatta-postconfig-bootup.script [ -x $POSTCONFIG ] && $POSTCONFIG -sudo bash /usr/share/oc-pbr/pbr_init & +sudo bash /usr/share/vyos-pbr/pbr_init & exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-vyos.conf similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc-vyos.conf rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-vyos.conf diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/edit_persistent_rule.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/edit_persistent_rule.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/edit_persistent_rule.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_constants.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_constants.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_constants.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_handler.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/fw_handler.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_handler.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/ha_config.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/ha_config.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/ha_config.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/interface_monitor.sh similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/interface_monitor.sh rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/interface_monitor.sh diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/log_forwarder.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/log_forwarder.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/log_forwarder.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/oc_fw_module.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/oc_fw_module.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/oc_fw_module.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/operations.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/operations.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/operations.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/routes_config_handler.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/routes_config_handler.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/routes_config_handler.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server2.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/server2.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server2.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/static_ip.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/static_ip.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/static_ip.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/stats_parser.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/stats_parser.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/stats_parser.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vpn_api_server.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vpn_api_server.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vpn_api_server.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos-oc-log similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos-oc-log rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos-oc-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_dhc.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_dhc.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_dhc.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_exception.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_exception.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_exception.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_policy_based_routes.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/oc_config_server/vyos_policy_based_routes.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_policy_based_routes.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/op_commands.sh b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/op_commands.sh similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/op_commands.sh rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/op_commands.sh diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vpn_op_commands.pl similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vpn_op_commands.pl rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vpn_op_commands.pl diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/oc-vyos similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/oc-vyos diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/restart_vpn similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_init_script/restart_vpn rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/restart_vpn diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/configsession.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/configsession.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/configsession.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/utils.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/oc-vyos/src/vyos_session/utils.py rename to gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/utils.py From de35fe20287532145fa2d3c67ca82bbdf85a87e7 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 10:47:51 +0530 Subject: [PATCH 015/157] renamed oc-pbr inside src to vyos-pbr, renamed outer vyos to agent --- .../vyos/{vyos => agent}/DEBIAN/changelog | 0 .../vyos/{vyos => agent}/DEBIAN/control | 4 +-- .../vyos/agent/DEBIAN/postinst | 11 +++++++ .../vyos/{vyos => agent}/DEBIAN/postrm | 0 .../service_vendor_agents/vyos/agent/bin/vyos | 20 +++++++++++++ .../oc-vyos => agent/etc/init.d/vyos} | 29 +++++++++---------- .../vyos/{vyos => agent}/src/LICENSE README | 0 .../vyos/{vyos => agent}/src/__init__.py | 0 .../vyos/{vyos => agent}/src/auth_pam.pl | 0 .../src/auth_pam_domain_verify.pl | 0 .../vyos/{vyos => agent}/src/auth_server.conf | 0 .../src/execformat/__init__.py | 0 .../src/execformat/executor.py | 0 .../src/execformat/formator.py | 0 .../init.d => agent/src/init_script}/oc-vyos | 0 .../src/init_script/restart_vpn | 0 .../vyos/{vyos => agent}/src/oc-vyos.conf | 0 .../src/oc_config_server/__init__.py | 0 .../oc_config_server/edit_persistent_rule.py | 0 .../src/oc_config_server/fw_constants.py | 0 .../src/oc_config_server/fw_handler.py | 0 .../src/oc_config_server/ha_config.py | 0 .../src/oc_config_server/interface_monitor.sh | 0 .../src/oc_config_server/log_forwarder.py | 0 .../src/oc_config_server/oc_fw_module.py | 0 .../src/oc_config_server/operations.py | 0 .../oc_config_server/routes_config_handler.py | 0 .../src/oc_config_server/server.py | 0 .../src/oc_config_server/server2.py | 0 .../src/oc_config_server/static_ip.py | 0 .../src/oc_config_server/stats_parser.py | 0 .../src/oc_config_server/vpn_api_server.py | 0 .../src/oc_config_server/vyos-oc-log | 0 .../src/oc_config_server/vyos_dhc.py | 0 .../src/oc_config_server/vyos_exception.py | 0 .../vyos_policy_based_routes.py | 0 .../vyos/{vyos => agent}/src/op_commands.sh | 0 .../{vyos => agent}/src/vpn_op_commands.pl | 0 .../src/oc-pbr => agent/src/vyos-pbr}/README | 0 .../src/vyos-pbr}/controller_route | 0 .../src/vyos-pbr}/dhclient-script | 0 .../src/vyos-pbr}/interface-post-up | 0 .../oc-pbr => agent/src/vyos-pbr}/interfaces | 0 .../src/vyos-pbr}/management_pbr | 0 .../src/vyos-pbr}/no-default-route | 0 .../src/oc-pbr => agent/src/vyos-pbr}/pbr | 0 .../oc-pbr => agent/src/vyos-pbr}/pbr_init | 0 .../oc-pbr => agent/src/vyos-pbr}/rc.local | 0 .../src/vyos_init_script}/oc-vyos | 0 .../src/vyos_init_script/restart_vpn | 0 .../src/vyos_session/__init__.py | 0 .../src/vyos_session/configsession.py | 0 .../{vyos => agent}/src/vyos_session/utils.py | 0 .../vyos/build_vyos_deb.sh | 8 ++--- .../vyos/vyos/DEBIAN/postinst | 13 --------- 55 files changed, 51 insertions(+), 34 deletions(-) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/DEBIAN/changelog (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/DEBIAN/control (62%) create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/DEBIAN/postrm (100%) create mode 100755 gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/vyos_init_script/oc-vyos => agent/etc/init.d/vyos} (79%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/LICENSE README (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/auth_pam.pl (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/auth_pam_domain_verify.pl (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/auth_server.conf (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/execformat/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/execformat/executor.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/execformat/formator.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/etc/init.d => agent/src/init_script}/oc-vyos (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/init_script/restart_vpn (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc-vyos.conf (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/edit_persistent_rule.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/fw_constants.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/fw_handler.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/ha_config.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/interface_monitor.sh (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/log_forwarder.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/oc_fw_module.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/operations.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/routes_config_handler.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/server.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/server2.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/static_ip.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/stats_parser.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/vpn_api_server.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/vyos-oc-log (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/vyos_dhc.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/vyos_exception.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/oc_config_server/vyos_policy_based_routes.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/op_commands.sh (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/vpn_op_commands.pl (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/README (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/controller_route (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/dhclient-script (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/interface-post-up (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/interfaces (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/management_pbr (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/no-default-route (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/pbr (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/pbr_init (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/oc-pbr => agent/src/vyos-pbr}/rc.local (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos/src/init_script => agent/src/vyos_init_script}/oc-vyos (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/vyos_init_script/restart_vpn (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/vyos_session/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/vyos_session/configsession.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/{vyos => agent}/src/vyos_session/utils.py (100%) delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postinst diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/changelog rename to gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control similarity index 62% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/control rename to gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control index e2e82fbdde..3abd4fda59 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/control +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control @@ -2,7 +2,7 @@ Package: vyos Source: vyos Version: 2.5 Architecture: all -Maintainer: Mahesh Kurund +Maintainer: One Convergence Section: devel Priority: optional -Description: oc vyos package +Description: vyos package diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst new file mode 100755 index 0000000000..414be74299 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst @@ -0,0 +1,11 @@ +#!/bin/bash + +sudo chown -R root:vyattacfg /config/auth/ +sudo chown -R root:vyattacfg /config/scripts/ +sudo update-rc.d vyos defaults +sudo mkdir -p /var/log/vyos +touch /var/log/vyos/vyos.log +echo "" > /var/log/vyos/vyos_monitor +sudo chown vyos:users -R /var/log/vyos /usr/share/vyos /usr/share/vyos-pbr +cp /usr/share/vyos-pbr/dhclient-script /sbin/dhclient-script +sudo cp /usr/share/vyos/oc_config_server/vyos-log /etc/logrotate.d/vyos-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postrm rename to gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos new file mode 100755 index 0000000000..802d5def1b --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# 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 sys + +sys.path.append("/usr/share/vyos") + +from oc_config_server.server2 import main +main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos similarity index 79% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos index f5d790b8f6..e5b6326387 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos @@ -1,18 +1,17 @@ #! /bin/sh # -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# 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. + ### BEGIN INIT INFO # Provides: vyos # Required-Start: $remote_fs $syslog @@ -62,7 +61,7 @@ set +e running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` [ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e -log_daemon_msg "Starting oc vyos" +log_daemon_msg "Starting Vyos Agent" # We have completely messed up the rc level scripts sudo chown vyos:users -R /var/run/elastic_services sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS @@ -78,7 +77,7 @@ set +e kill -0 `cat $PIDFILE` > /dev/null 2>&1 if [ $? -eq 0 ]; then set -e -log_daemon_msg "Stopping oc vyos" +log_daemon_msg "Stopping Vyos Agent" start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} log_end_msg $? else @@ -108,14 +107,14 @@ set +e kill -0 `cat $PIDFILE` > /dev/null 2>&1 if [ $? -eq 0 ]; then set -e -log_daemon_msg "Reloading oc vyos" +log_daemon_msg "Reloading vyos agent" start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE log_end_msg $? else echo "No process with PID `cat $PIDFILE` found running, removing the PID file" fi else -echo "oc vyos is not running or PID file not existing" +echo "Vyos agent is not running or PID file not existing" fi ;; status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/LICENSE README b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/LICENSE README similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/LICENSE README rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/LICENSE README diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam.pl rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_pam_domain_verify.pl rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_server.conf b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_server.conf similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/auth_server.conf rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_server.conf diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/executor.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/execformat/formator.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/etc/init.d/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/oc-vyos similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/etc/init.d/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/oc-vyos diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/restart_vpn rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc-vyos.conf similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-vyos.conf rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc-vyos.conf diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/edit_persistent_rule.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_constants.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/fw_handler.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/ha_config.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/interface_monitor.sh rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/log_forwarder.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/oc_fw_module.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/operations.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/routes_config_handler.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/server2.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/static_ip.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/stats_parser.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vpn_api_server.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos-oc-log rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_dhc.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_exception.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc_config_server/vyos_policy_based_routes.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/op_commands.sh b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/op_commands.sh similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/op_commands.sh rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/op_commands.sh diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vpn_op_commands.pl rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/README rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/controller_route b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/controller_route similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/controller_route rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/controller_route diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/dhclient-script b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/dhclient-script similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/dhclient-script rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/dhclient-script diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interface-post-up similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interface-post-up rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interface-post-up diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interfaces b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interfaces similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/interfaces rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interfaces diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/management_pbr similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/management_pbr rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/management_pbr diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/no-default-route rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/pbr_init rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/rc.local b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/rc.local similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/oc-pbr/rc.local rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/rc.local diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/oc-vyos similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/init_script/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/oc-vyos diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/restart_vpn similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_init_script/restart_vpn rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/restart_vpn diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/configsession.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/vyos/src/vyos_session/utils.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh index 60964ede23..71c94e8153 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh +++ b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh @@ -82,13 +82,13 @@ copy_source_code () { cp -r $SOURCE_CODE_DIR/bin/vyos $DEBIAN_PATH/usr/bin/. cp -r $SOURCE_CODE_DIR/src $DEBIAN_PATH/usr/share/vyos - cp -r $SOURCE_CODE_DIR/src/oc-pbr/interfaces $DEBIAN_PATH/etc/network/. - cp -r $SOURCE_CODE_DIR/src/oc-pbr/interface-post-up $DEBIAN_PATH/etc/network/. - cp -r $SOURCE_CODE_DIR/src/oc-pbr/management_pbr $DEBIAN_PATH/etc/dhcp3/dhclient-exit-hooks.d/. + cp -r $SOURCE_CODE_DIR/src/vyos-pbr/interfaces $DEBIAN_PATH/etc/network/. + cp -r $SOURCE_CODE_DIR/src/vyos-pbr/interface-post-up $DEBIAN_PATH/etc/network/. + cp -r $SOURCE_CODE_DIR/src/vyos-pbr/management_pbr $DEBIAN_PATH/etc/dhcp3/dhclient-exit-hooks.d/. # TODO: Do we need this cp -r $SOURCE_CODE_DIR/src/vyos_init_script/restart_vpn $DEBIAN_PATH/config/scripts/. - mv $DEBIAN_PATH/usr/share/vyos/oc-pbr $DEBIAN_PATH/usr/share/ + mv $DEBIAN_PATH/usr/share/vyos/vyos-pbr $DEBIAN_PATH/usr/share/ sed -i "s/vyos ([0-9]*.[0-9]*-*[0-9]*)/vyos ($version-$release)/g" $DEBIAN_PATH/DEBIAN/changelog sed -i "/^Source:/c Source: vyos-$version-$release" $DEBIAN_PATH/DEBIAN/control sed -i "s/^Version:.*/Version: $version-$release/g" $DEBIAN_PATH/DEBIAN/control diff --git a/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postinst deleted file mode 100755 index d7a3892f32..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/vyos/DEBIAN/postinst +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -#sed -i '/pbr_init/d' /etc/rc.local -#sed -i '/exit 0/i sudo bash /usr/share/vyos-pbr/pbr_init &' /etc/rc.local -sudo chown -R root:vyattacfg /config/auth/ -sudo chown -R root:vyattacfg /config/scripts/ -sudo update-rc.d vyos defaults -sudo mkdir -p /var/log/oc -touch /var/log/oc/vyos.log -echo "" > /var/log/oc/vyos_monitor -sudo chown vyos:users -R /var/log/oc /usr/share/vyos /usr/share/vyos-pbr -cp /usr/share/vyos-pbr/dhclient-script /sbin/dhclient-script -sudo cp /usr/share/vyos/oc_config_server/vyos-log /etc/logrotate.d/vyos-log From 60b8da5d18f315d6d669c7496c2c1a0f6062fc20 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 11:08:27 +0530 Subject: [PATCH 016/157] imports sorted --- .../vyos/agent/src/execformat/executor.py | 14 +- .../vyos/agent/src/execformat/formator.py | 11 +- .../oc_config_server/edit_persistent_rule.py | 3 +- .../agent/src/oc_config_server/ha_config.py | 7 +- .../src/oc_config_server/oc_fw_module.py | 11 +- .../agent/src/oc_config_server/operations.py | 10 +- .../oc_config_server/routes_config_handler.py | 4 +- .../vyos/agent/src/oc_config_server/server.py | 4 +- .../agent/src/oc_config_server/server2.py | 28 +- .../agent/src/oc_config_server/static_ip.py | 4 +- .../src/oc_config_server/stats_parser.py | 2 +- .../src/oc_config_server/vpn_api_server.py | 27 +- .../agent/src/oc_config_server/vyos_dhc.py | 3 +- .../vyos_policy_based_routes.py | 5 +- .../agent/src/vyos_session/configsession.py | 313 +++++++++--------- .../vyos/agent/src/vyos_session/utils.py | 4 +- 16 files changed, 228 insertions(+), 222 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py index 3827054fde..a9d08c25fa 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py @@ -1,14 +1,14 @@ #!/usr/bin/env python -import sys -import subprocess +import logging import os +import shlex +import subprocess +import sys -# sys.path.append('/home/vyos/vyos-api/project/') -from vyos_session.configsession import ConfigSession, SessionNotExists, \ - SetupSessionFailed from vyos_session import utils -import logging -import shlex +# sys.path.append('/home/vyos/vyos-api/project/') +from vyos_session.configsession import (ConfigSession, SessionNotExists, + SetupSessionFailed) logger = logging.getLogger(__name__) utils.init_logger(logger) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py index 0c464f7261..022b121294 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py @@ -1,12 +1,15 @@ #!/usr/bin/env python -import sys import os +import sys + +from executor import execUtils as executor +from executor import OperationFailed +from vyos_session.utils import logger +from vyosparser import vyos_parser as vparser + topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." topdir = os.path.realpath(topdir) sys.path.insert(0, topdir) -from executor import OperationFailed, execUtils as executor -from vyos_session.utils import logger -from vyosparser import vyos_parser as vparser class ServiceError(Exception): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py index 987cc7e8d6..727458ec65 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py @@ -1,6 +1,7 @@ +import logging from subprocess import call + import netifaces -import logging from vyos_dhc import initiate_dhclient from vyos_session import utils diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py index ef652dab29..800244e4ae 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py @@ -13,13 +13,12 @@ #!/usr/bin/env python import json -import netifaces -import time import logging -from netifaces import AF_INET, AF_LINK +import time +import netifaces from execformat.executor import session - +from netifaces import AF_INET, AF_LINK from operations import configOpts from vyos_session import utils diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py index 53257cfe2d..9161f22b97 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py @@ -11,17 +11,18 @@ # strictly forbidden unless prior written permission is obtained from # One Convergence, Inc., USA +import ast +import json #!/usr/bin/env python import logging -import json -import netifaces import time + import fw_constants -import ast +import netifaces +from execformat.executor import session +from netifaces import AF_BRIDGE, AF_INET, AF_INET6, AF_LINK, AF_PACKET from operations import configOpts from vyos_session import utils -from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE -from execformat.executor import session FWN = 'firewall name' # oc_fw_identifier = 'oc_fw' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py index c8a4c0e091..5972b85b9e 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py @@ -13,14 +13,16 @@ #!/usr/bin/env python -import sys -import os import logging +import os +import sys + +from execformat.executor import OperationFailed, execUtils +from vyos_session import utils + topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." topdir = os.path.realpath(topdir) sys.path.insert(0, topdir) -from execformat.executor import execUtils, OperationFailed -from vyos_session import utils logger = logging.getLogger(__name__) utils.init_logger(logger) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py index 0724da36aa..287fcb1414 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py @@ -1,10 +1,10 @@ import json import logging -import netifaces import subprocess -import netaddr import time +import netaddr +import netifaces from vyos_session import utils ROUTING_TABLE_BASE = 10 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py index becb0c535e..53bc0b0c76 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py @@ -11,11 +11,11 @@ # strictly forbidden unless prior written permission is obtained from # One Convergence, Inc., USA -import signal import logging +import signal import sys -from vyos_session.utils import init_logger +from vyos_session.utils import init_logger logger = logging.getlogger(__name__) init_logger(logger) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py index 710d48573e..934bef6b20 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py @@ -11,31 +11,29 @@ # strictly forbidden unless prior written permission is obtained from # One Convergence, Inc., USA -import sys -import os +import ast import json -import signal import logging -import ast +import os +import signal +import sys import time from os.path import abspath, dirname import netifaces - -sys.path.insert(0, dirname(dirname(abspath(__file__)))) -from vyos_session.utils import init_logger -from fw_module import OCFWConfigClass from edit_persistent_rule import EditPersistentRule -from static_ip import StaticIp -from flask import Flask, request -from os.path import abspath, dirname -from vpn_api_server import VPNHandler as vpnhandler -from vyos_policy_based_routes import RoutesConfigHandler as routes_handler +from flask import Flask, jsonify, request +from fw_module import OCFWConfigClass from ha_config import VYOSHAConfig -from vyos_exception import OCException -from flask import jsonify from log_forwarder import APIHandler as apihandler +from static_ip import StaticIp from stats_parser import APIHandler as stats_apihandler +from vpn_api_server import VPNHandler as vpnhandler +from vyos_exception import OCException +from vyos_policy_based_routes import RoutesConfigHandler as routes_handler +from vyos_session.utils import init_logger + +sys.path.insert(0, dirname(dirname(abspath(__file__)))) # sys.path.insert(0, dirname(dirname(abspath(__file__)))) # sys.path.insert(0, (abspath(__file__))) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py index 0f9f1a0e94..8d93e2bef4 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py @@ -1,11 +1,11 @@ import logging -import netifaces import time +import netifaces +from execformat.executor import session from netifaces import AF_LINK from operations import configOpts -from execformat.executor import session from vyos_session.utils import init_logger logger = logging.getLogger(__name__) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py index 1f646e303a..9205df0f20 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py @@ -13,8 +13,8 @@ import logging import subprocess -import netifaces +import netifaces from netifaces import AF_LINK from vyos_session import utils diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py index 6a4b7ca97f..9dabc3cf0e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py @@ -1,23 +1,24 @@ #!/usr/bin/env python -import logging -import json -import netifaces -import netaddr -import socket -import fcntl -import struct import array -import time import ast import copy -import subprocess +import fcntl +import json +import logging import os -from netaddr import IPNetwork, IPAddress -from operations import configOpts -from vyos_session import utils -from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE +import socket +import struct +import subprocess +import time + +import netaddr +import netifaces #from vyos_session.configsession import ConfigSession as session from execformat.executor import session +from netaddr import IPAddress, IPNetwork +from netifaces import AF_BRIDGE, AF_INET, AF_INET6, AF_LINK, AF_PACKET +from operations import configOpts +from vyos_session import utils OP_SUCCESS = True OP_FAILED = False diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py index 3cf064c37b..63a494652c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py @@ -1,7 +1,8 @@ -import netifaces import shlex import subprocess +import netifaces + def initiate_dhclient(): interfaces = netifaces.interfaces() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py index 2b79fc9909..e33be4fa40 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py @@ -1,16 +1,15 @@ import copy import json import logging -import netifaces import subprocess -import netaddr import time +import netaddr +import netifaces from execformat.executor import session from operations import configOpts from vyos_session import utils - ROUTING_TABLE_BASE = 10 logger = logging.getLogger(__name__) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py index 54c88a85ce..f9dd6cfffd 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py @@ -1,156 +1,157 @@ -import os -from uuid import uuid4 -from utils import get_config_params, _run, clean_environ, init_logger -import logging - -logger = logging.getLogger(__name__) -init_logger(logger) - -VYOS_SHELL_API = get_config_params('bin', 'shell_api_path') -VYOS_SBIN_DIR = get_config_params('bin', 'vyos_sbin_dir') -VYOS_SAVE_SCRIPT = 'vyatta-save-config.pl' - -# Create/Get the logger object -# logger = init_logger() - - -class SessionAlreadyExists(Exception): - pass - - -class SetupSessionFailed(Exception): - pass - - -class OperationFailed(Exception): - pass - - -class SessionNotExists(Exception): - pass - - -class Session(object): - """ - Return the session instance if exists. Else, create new one. - SessionAlreadyExists exception raised on the second instantiation. - """ - _ref = None - - def __new__(cls, *args, **kw): - if cls._ref is not None: - raise SessionAlreadyExists('A session exist already !') - cls._ref = super(Session, cls).__new__(cls, *args, **kw) - return cls._ref - - -class ConfigSession(Session): - """ - Create and manage a Vyos config session. - This is a singleton subclass of Session class which ensures that one and - one config session only is opened. - To create instance you have to call setup_config_session() method. - """ - - def setup_config_session(self): - """ - Setup vyos session. A random uuid is generated as a sesssion identifier - ($PPID -Shell PID- could be used as well). - """ - - identifier = uuid4() - env = dict() - env['VYATTA_CHANGES_ONLY_DIR'] = \ - '/opt/vyatta/config/tmp/changes_only_{0}'.format(identifier) - env['VYATTA_CONFIG_TEMPLATE'] = '/opt/vyatta/share/vyatta-cfg/templates' - env['VYATTA_ACTIVE_CONFIGURATION_DIR'] = '/opt/vyatta/config/active' - env['VYATTA_EDIT_LEVEL'] = '/' - env['VYATTA_TEMP_CONFIG_DIR'] = '/opt/vyatta/config/tmp/new_config_{' \ - '0}'.format(identifier) - env['VYATTA_TEMPLATE_LEVEL'] = '/' - env['VYATTA_CONFIG_TMP'] = '/opt/vyatta/config/tmp/tmp_{0}'.format( - identifier) - # Add vyos session environment to system environment. - # This is not good but actually it seems that is the only way to - # handle a persistant vyos session after spawning a shell. - os.environ.update(env) - logger.info('Setting up a configuration session for Vyos') - # Spawn shell and setup vyos config session - if _run('{0} setupSession'.format(VYOS_SHELL_API)): - # Unset vyos session environment and raise an exception - logger.error('Could not create configuration session') - logger.info('Cleaning up session environment variables') - clean_environ(env) - raise SetupSessionFailed('Could not create session !') - self.session_id = identifier - self.session_envs = env - logger.debug('Session identifier is %s', identifier) - logger.debug('Session environment variables: %s', env) - logger.info('Configuration session is set up') - return True - - def session_exists(self): - """ - Test if a vyos config session is set up - """ - return False if _run('{0} inSession'.format(VYOS_SHELL_API)) else True - - def teardown_config_session(self): - """ - End current configuration session. - """ - if not self.session_exists(): - logger.warn('Teardown failed. No session available !') - return False - - if not _run('{0} teardownSession'.format(VYOS_SHELL_API)): - logger.info('Cleaning up session environment variables') - logger.info('Closing Vyos config session') - clean_environ(self.session_envs) - return True - - logger.error('Failed to teardown current config session') - logger.warn('The Vyos config session may still open !') - return False - - def session_changed(self): - """ - Returns if Vyos configuration was changed from current session - """ - if _run('{0} sessionChanged'.format(VYOS_SHELL_API)): - return False - logger.warn('Vyos configuration was changed from current session') - return True - - def commit(self): - """ - Returns True if commit action succeed. False otherwise. - """ - out = _run(os.path.join(VYOS_SBIN_DIR, 'my_commit -l'), output=True) - if not out: - logger.error('Commit changes failed') - raise OperationFailed('[ERROR] Commit changes failed !') - logger.info('Changes successfully commited') - return True - - def discard(self): - """ - Undo config modifications - """ - out = _run(os.path.join(VYOS_SBIN_DIR, 'my_discard'), output=True) - if not out: - raise OperationFailed('[ERROR] Discard changes failed !') - # return out.splitlines()[0] - return out - - def save(self): - """ - Save applied modifications. Changes still persistent even after - system reboot. - """ - out = _run(os.path.join(VYOS_SBIN_DIR, VYOS_SAVE_SCRIPT), output=True) - if not out: - logger.error('Saving changes failed') - raise OperationFailed('[ERROR] Save changes failed !') - logger.info('%s', out) - return True +import logging +import os +from uuid import uuid4 + +from utils import _run, clean_environ, get_config_params, init_logger + +logger = logging.getLogger(__name__) +init_logger(logger) + +VYOS_SHELL_API = get_config_params('bin', 'shell_api_path') +VYOS_SBIN_DIR = get_config_params('bin', 'vyos_sbin_dir') +VYOS_SAVE_SCRIPT = 'vyatta-save-config.pl' + +# Create/Get the logger object +# logger = init_logger() + + +class SessionAlreadyExists(Exception): + pass + + +class SetupSessionFailed(Exception): + pass + + +class OperationFailed(Exception): + pass + + +class SessionNotExists(Exception): + pass + + +class Session(object): + """ + Return the session instance if exists. Else, create new one. + SessionAlreadyExists exception raised on the second instantiation. + """ + _ref = None + + def __new__(cls, *args, **kw): + if cls._ref is not None: + raise SessionAlreadyExists('A session exist already !') + cls._ref = super(Session, cls).__new__(cls, *args, **kw) + return cls._ref + + +class ConfigSession(Session): + """ + Create and manage a Vyos config session. + This is a singleton subclass of Session class which ensures that one and + one config session only is opened. + To create instance you have to call setup_config_session() method. + """ + + def setup_config_session(self): + """ + Setup vyos session. A random uuid is generated as a sesssion identifier + ($PPID -Shell PID- could be used as well). + """ + + identifier = uuid4() + env = dict() + env['VYATTA_CHANGES_ONLY_DIR'] = \ + '/opt/vyatta/config/tmp/changes_only_{0}'.format(identifier) + env['VYATTA_CONFIG_TEMPLATE'] = '/opt/vyatta/share/vyatta-cfg/templates' + env['VYATTA_ACTIVE_CONFIGURATION_DIR'] = '/opt/vyatta/config/active' + env['VYATTA_EDIT_LEVEL'] = '/' + env['VYATTA_TEMP_CONFIG_DIR'] = '/opt/vyatta/config/tmp/new_config_{' \ + '0}'.format(identifier) + env['VYATTA_TEMPLATE_LEVEL'] = '/' + env['VYATTA_CONFIG_TMP'] = '/opt/vyatta/config/tmp/tmp_{0}'.format( + identifier) + # Add vyos session environment to system environment. + # This is not good but actually it seems that is the only way to + # handle a persistant vyos session after spawning a shell. + os.environ.update(env) + logger.info('Setting up a configuration session for Vyos') + # Spawn shell and setup vyos config session + if _run('{0} setupSession'.format(VYOS_SHELL_API)): + # Unset vyos session environment and raise an exception + logger.error('Could not create configuration session') + logger.info('Cleaning up session environment variables') + clean_environ(env) + raise SetupSessionFailed('Could not create session !') + self.session_id = identifier + self.session_envs = env + logger.debug('Session identifier is %s', identifier) + logger.debug('Session environment variables: %s', env) + logger.info('Configuration session is set up') + return True + + def session_exists(self): + """ + Test if a vyos config session is set up + """ + return False if _run('{0} inSession'.format(VYOS_SHELL_API)) else True + + def teardown_config_session(self): + """ + End current configuration session. + """ + if not self.session_exists(): + logger.warn('Teardown failed. No session available !') + return False + + if not _run('{0} teardownSession'.format(VYOS_SHELL_API)): + logger.info('Cleaning up session environment variables') + logger.info('Closing Vyos config session') + clean_environ(self.session_envs) + return True + + logger.error('Failed to teardown current config session') + logger.warn('The Vyos config session may still open !') + return False + + def session_changed(self): + """ + Returns if Vyos configuration was changed from current session + """ + if _run('{0} sessionChanged'.format(VYOS_SHELL_API)): + return False + logger.warn('Vyos configuration was changed from current session') + return True + + def commit(self): + """ + Returns True if commit action succeed. False otherwise. + """ + out = _run(os.path.join(VYOS_SBIN_DIR, 'my_commit -l'), output=True) + if not out: + logger.error('Commit changes failed') + raise OperationFailed('[ERROR] Commit changes failed !') + logger.info('Changes successfully commited') + return True + + def discard(self): + """ + Undo config modifications + """ + out = _run(os.path.join(VYOS_SBIN_DIR, 'my_discard'), output=True) + if not out: + raise OperationFailed('[ERROR] Discard changes failed !') + # return out.splitlines()[0] + return out + + def save(self): + """ + Save applied modifications. Changes still persistent even after + system reboot. + """ + out = _run(os.path.join(VYOS_SBIN_DIR, VYOS_SAVE_SCRIPT), output=True) + if not out: + logger.error('Saving changes failed') + raise OperationFailed('[ERROR] Save changes failed !') + logger.info('%s', out) + return True diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py index 386c1ee4f3..a4e97dc24f 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py @@ -1,8 +1,8 @@ import ConfigParser -import subprocess -import os import logging import logging.handlers as handlers +import os +import subprocess # In production environment CONFIG_DIR should be /etc/pyatta/ CONFIG_DIR = "/usr/share/vyos" From 3c83cd790d18a2b7fa03cca702cb1f50a913260c Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 11:19:21 +0530 Subject: [PATCH 017/157] removed unused variables and imports --- .../vyos/agent/src/execformat/executor.py | 1 - .../vyos/agent/src/oc_config_server/edit_persistent_rule.py | 1 - .../vyos/agent/src/oc_config_server/ha_config.py | 1 - .../vyos/agent/src/oc_config_server/log_forwarder.py | 2 +- .../vyos/agent/src/oc_config_server/oc_fw_module.py | 2 +- .../vyos/agent/src/oc_config_server/server2.py | 2 +- .../vyos/agent/src/oc_config_server/vpn_api_server.py | 5 ----- .../agent/src/oc_config_server/vyos_policy_based_routes.py | 1 - 8 files changed, 3 insertions(+), 12 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py index a9d08c25fa..b602f3b09b 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py @@ -3,7 +3,6 @@ import os import shlex import subprocess -import sys from vyos_session import utils # sys.path.append('/home/vyos/vyos-api/project/') diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py index 727458ec65..54e7490c0b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py @@ -2,7 +2,6 @@ from subprocess import call import netifaces -from vyos_dhc import initiate_dhclient from vyos_session import utils logger = logging.getLogger(__name__) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py index 800244e4ae..12d686acc5 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py @@ -33,7 +33,6 @@ class VYOSHAConfig(configOpts): def __init__(self): super(VYOSHAConfig, self).__init__() - pass def configure_conntrack_sync(self, ha_config): """ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py index 72d97db4d0..751c0ef484 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py @@ -50,7 +50,7 @@ def configure_rsyslog_as_client(self, config): """ % (config['server_ip'], config['log_level']) try: - out = self.run_command(command) + self.run_command(command) return OP_SUCCESS except Exception as ex: logger.error("Error while configuring rsyslog as client. %s" % ex) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py index 9161f22b97..f0d543c890 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py @@ -20,7 +20,7 @@ import fw_constants import netifaces from execformat.executor import session -from netifaces import AF_BRIDGE, AF_INET, AF_INET6, AF_LINK, AF_PACKET +from netifaces import AF_LINK from operations import configOpts from vyos_session import utils diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py index 934bef6b20..f215fbc13a 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py @@ -71,7 +71,7 @@ def auth_server_config(): host_ip = data['host_mapping'].split()[0] + "/32" command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' gateway_ip = os.popen(command).read().strip().strip("'") - status = vpnhandler().configure_static_route("set", host_ip, gateway_ip) + vpnhandler().configure_static_route("set", host_ip, gateway_ip) except Exception as ex: err = ("Error in adding rvpn route. Reason: %s" % ex) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py index 9dabc3cf0e..541d971b0c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py @@ -1,9 +1,7 @@ #!/usr/bin/env python import array -import ast import copy import fcntl -import json import logging import os import socket @@ -11,12 +9,9 @@ import subprocess import time -import netaddr -import netifaces #from vyos_session.configsession import ConfigSession as session from execformat.executor import session from netaddr import IPAddress, IPNetwork -from netifaces import AF_BRIDGE, AF_INET, AF_INET6, AF_LINK, AF_PACKET from operations import configOpts from vyos_session import utils diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py index e33be4fa40..b075d9bc74 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py @@ -6,7 +6,6 @@ import netaddr import netifaces -from execformat.executor import session from operations import configOpts from vyos_session import utils From 2188b1ef0c5d2d94fad08ecae339c512cdb5bd25 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 11:31:28 +0530 Subject: [PATCH 018/157] added headers --- .../oc_config_server/edit_persistent_rule.py | 12 ++++++++ .../src/oc_config_server/fw_constants.py | 19 ++++++------ .../agent/src/oc_config_server/fw_handler.py | 12 +++++++- .../agent/src/oc_config_server/ha_config.py | 20 ++++++------- .../src/oc_config_server/interface_monitor.sh | 12 ++++++++ .../src/oc_config_server/log_forwarder.py | 19 ++++++------ .../src/oc_config_server/oc_fw_module.py | 20 ++++++------- .../agent/src/oc_config_server/operations.py | 21 ++++++-------- .../oc_config_server/routes_config_handler.py | 12 ++++++++ .../vyos/agent/src/oc_config_server/server.py | 19 ++++++------ .../agent/src/oc_config_server/server2.py | 22 +++++++------- .../agent/src/oc_config_server/static_ip.py | 11 +++++++ .../src/oc_config_server/stats_parser.py | 27 ++++++++--------- .../src/oc_config_server/vpn_api_server.py | 29 +++++++++---------- .../agent/src/oc_config_server/vyos-oc-log | 4 +-- .../agent/src/oc_config_server/vyos_dhc.py | 12 ++++++++ .../src/oc_config_server/vyos_exception.py | 13 +++++++++ .../vyos_policy_based_routes.py | 15 +++++++++- 18 files changed, 192 insertions(+), 107 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py index 54e7490c0b..81a0c40d15 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py @@ -1,3 +1,15 @@ +# 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 logging from subprocess import call diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py index 5e417c91e8..d7ad755ea9 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py @@ -1,15 +1,14 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# 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. actions = ["drop", "reject", "accept", "inspect"] state = ["established", "invalid", "related"] diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py index b31fb06d8c..159069ab8b 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py @@ -1,4 +1,14 @@ -#!/usr/bin/env python +# 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 operations import configOpts diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py index 12d686acc5..910d08875e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py @@ -1,17 +1,15 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# 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. -#!/usr/bin/env python import json import logging import time diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh index f2ebd12247..5d61513469 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh @@ -1,5 +1,17 @@ #!/usr/bin/env bash +# 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. + function enumerate_net_interfaces { echo `date` `ip addr` >> /var/log/oc/vyos_monitor diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py index 751c0ef484..936cec1c14 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py @@ -1,15 +1,14 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. import logging import subprocess diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py index f0d543c890..06cc480798 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py @@ -1,19 +1,17 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# 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 ast import json -#!/usr/bin/env python import logging import time diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py index 5972b85b9e..3204bcff0a 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py @@ -1,17 +1,14 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA - -#!/usr/bin/env python +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. import logging import os diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py index 287fcb1414..b4c74de215 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py @@ -1,3 +1,15 @@ +# 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 json import logging import subprocess diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py index 53bc0b0c76..7f216c34ab 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py @@ -1,15 +1,14 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. import logging import signal diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py index f215fbc13a..778f53db13 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py @@ -1,15 +1,14 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# 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 ast import json @@ -317,7 +316,8 @@ def delete_source_route(): def add_stitching_route(): try: gateway_ip = json.loads(request.data).get('gateway_ip') - status = vpnhandler().configure_static_route("set", "0.0.0.0/0", gateway_ip) + status = vpnhandler().configure_static_route("set", "0.0.0.0/0", + gateway_ip) return json.dumps(dict(status=status)) except Exception as ex: err = ("Error in add_stitching_route. Reason: %s" % ex) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py index 8d93e2bef4..35292371ab 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py @@ -1,3 +1,14 @@ +# 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 logging import time diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py index 9205df0f20..e1ec784d62 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py @@ -1,15 +1,14 @@ -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2015, One Convergence, Inc., USA -# All Rights Reserved. +# 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 # -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. +# http://www.apache.org/licenses/LICENSE-2.0 # -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. import logging import subprocess @@ -93,7 +92,8 @@ def parse_firewall_stats(self, interface, raw_stats): words = line.split() if 'IPv4 Firewall' in line: firewall_start = True - if 'Active on' in line and interface in line and firewall_start: + if 'Active on' in line and interface in line and ( + firewall_start): status = "Active" (interface, direction) = words[2][1:-1].split(',') firewall['interface'] = interface @@ -138,7 +138,8 @@ def add_protocol_and_dest_port_info(self, firewall, show_fw_data): firewall_info_started = True if firewall_started and firewall_info_started: firewall_info.append(line) - if firewall_started and firewall_info_started and firewall_info_end in line: + if firewall_started and firewall_info_started and ( + firewall_info_end in line): break try: for rule in firewall.get('rules', []): @@ -292,7 +293,7 @@ def get_fw_stats(self, mac_address): 10000 0 0 DROP 0.0.0.0/0 0.0.0.0/0 """ - interface = None + parsed_stats = {} command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py index 541d971b0c..2964c3d23c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py @@ -1,4 +1,15 @@ -#!/usr/bin/env python +# 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 array import copy import fcntl @@ -9,7 +20,6 @@ import subprocess import time -#from vyos_session.configsession import ConfigSession as session from execformat.executor import session from netaddr import IPAddress, IPNetwork from operations import configOpts @@ -72,7 +82,6 @@ 'set interfaces openvpn %s openvpn-option \ "--client-cert-not-required --script-security 3 \ --auth-user-pass-verify /usr/share/vyos/auth_pam.pl via-file"'], - #'set interfaces openvpn %s local-host %s'], 'delete': [ 'delete interfaces openvpn %s', 'delete interfaces openvpn vtun0 server push-route %s']} @@ -234,9 +243,6 @@ def _delete_ipsec_site_tunnel(self, tunnel): def _delete_ipsec_site_conn(self, peer_address): cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) - #cmd = cmds['delete'][0] - - #cmd = cmd % peer_address cmd = cmds['delete'][2] self._set_commands([cmd]) @@ -308,7 +314,6 @@ def _create_ipsec_site_tunnel(self, tunnel): def _get_vrrp_group(self, ifname): command = ( "vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) - #vrrp_ifname = ifname + "v" + os.popen(command).read().strip() return os.popen(command).read().strip() def _create_ipsec_site_conn(self, ctx): @@ -333,8 +338,8 @@ def _create_ipsec_site_conn(self, ctx): ip = conn['stitching_fixed_ip'] vrrp_cmd = ( 'set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn') % (ifname, - group_no) + 'run-transition-scripts master /config/scripts/restart_vpn' + ) % (ifname, group_no) ifname = ifname + "v" + str(group_no) logger.info("vrrp interface name: %s" % ifname) @@ -377,7 +382,6 @@ def _create_ssl_vpn_conn(self, ctx): conn_cmds[6] = conn_cmds[6] % ('vtun0') conn_cmds[7] = conn_cmds[7] % ('vtun0', cidr) conn_cmds[8] = conn_cmds[8] % ('vtun0') - #conn_cmds[9] = conn_cmds[9] % ('vtun0', conn['stitching_fixed_ip']) self._set_commands(conn_cmds) @@ -402,11 +406,6 @@ def configure_static_route(self, action, cidr, gateway_ip): # Note: The issue is inconsistent, but not seen anymore with this # new approach of setting configuration utils._alternate_set_and_commit(route_cmd) - # session.setup_config_session() - # self._set_commands([route_cmd]) - # session.commit() - # time.sleep(2) - # session.teardown_config_session() return OP_SUCCESS def _get_all_ifs(self): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log index 926d4fa2b6..2e03d44323 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log @@ -1,4 +1,4 @@ -/var/log/oc/vyos_monitor { +/var/log/vyos/vyos_monitor { weekly rotate 12 size 10M @@ -8,7 +8,7 @@ notifempty create 644 vyos users } -/var/log/oc/vyos.log { +/var/log/vyos/vyos.log { monthly rotate 12 size 10M diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py index 63a494652c..e04d326ff4 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py @@ -1,3 +1,15 @@ +# 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 shlex import subprocess diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py index 3e19171b95..c8aefc7d1b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py @@ -1,3 +1,16 @@ +# 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. + + class OCException(Exception): """ """ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py index b075d9bc74..eb9e6eae6c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py @@ -1,3 +1,15 @@ +# 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 copy import json import logging @@ -230,7 +242,8 @@ def _get_if_name_by_cidr(self, cidr, delete=False): ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") if (ip_address == subnet_prefix[0] and ( - len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + len(subnet_prefix) == 1 or ( + subnet_prefix[1] == "32"))): return interface ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) From 502a0c7b9dd9860b0ec15ee89d10dd8b2e6417e8 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 12:42:57 +0530 Subject: [PATCH 019/157] remaining OC references --- .../vyos/agent/DEBIAN/postinst | 2 +- .../service_vendor_agents/vyos/agent/bin/vyos | 2 +- .../vyos/agent/etc/init.d/vyos | 4 +-- .../__init__.py | 0 .../edit_persistent_rule.py | 0 .../fw_constants.py | 0 .../fw_handler.py | 0 .../fw_module.py} | 29 ++++++++--------- .../ha_config.py | 0 .../interface_monitor.sh | 0 .../log_forwarder.py | 0 .../operations.py | 0 .../routes_config_handler.py | 0 .../server.py | 4 +-- .../server2.py | 32 +++++++++---------- .../static_ip.py | 0 .../stats_parser.py | 4 +-- .../vpn_api_server.py | 0 .../vyos-oc-log => config_server/vyos-log} | 0 .../vyos_dhc.py | 0 .../vyos_exception.py | 2 +- .../vyos_policy_based_routes.py | 0 .../vyos/agent/src/execformat/executor.py | 13 +++++++- .../vyos/agent/src/execformat/formator.py | 13 +++++++- .../agent/src/init_script/{oc-vyos => vyos} | 10 +++--- .../agent/src/{oc-vyos.conf => vyos.conf} | 0 .../src/vyos_init_script/{oc-vyos => vyos} | 10 +++--- .../agent/src/vyos_session/configsession.py | 12 +++++++ .../vyos/agent/src/vyos_session/utils.py | 12 +++++++ 29 files changed, 97 insertions(+), 52 deletions(-) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/__init__.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/edit_persistent_rule.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/fw_constants.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/fw_handler.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server/oc_fw_module.py => config_server/fw_module.py} (94%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/ha_config.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/interface_monitor.sh (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/log_forwarder.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/operations.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/routes_config_handler.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/server.py (95%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/server2.py (94%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/static_ip.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/stats_parser.py (99%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/vpn_api_server.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server/vyos-oc-log => config_server/vyos-log} (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/vyos_dhc.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/vyos_exception.py (96%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc_config_server => config_server}/vyos_policy_based_routes.py (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/{oc-vyos => vyos} (94%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/{oc-vyos.conf => vyos.conf} (100%) rename gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/{oc-vyos => vyos} (94%) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst index 414be74299..c0776e9fba 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst @@ -8,4 +8,4 @@ touch /var/log/vyos/vyos.log echo "" > /var/log/vyos/vyos_monitor sudo chown vyos:users -R /var/log/vyos /usr/share/vyos /usr/share/vyos-pbr cp /usr/share/vyos-pbr/dhclient-script /sbin/dhclient-script -sudo cp /usr/share/vyos/oc_config_server/vyos-log /etc/logrotate.d/vyos-log +sudo cp /usr/share/vyos/config_server/vyos-log /etc/logrotate.d/vyos-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos index 802d5def1b..ed0a7d4523 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos @@ -16,5 +16,5 @@ import sys sys.path.append("/usr/share/vyos") -from oc_config_server.server2 import main +from config_server.server2 import main main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos index e5b6326387..bac0d2172d 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos @@ -18,8 +18,8 @@ # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Short-Description: OC vyos service -# Description: Provides the vyos service +# Short-Description: Vyos agent service +# Description: Provides the vyos agent service ### END INIT INFO set -e PIDFILE=/var/run/elastic_services/vyos.pid diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/__init__.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/__init__.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/__init__.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/__init__.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/edit_persistent_rule.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/edit_persistent_rule.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/edit_persistent_rule.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_constants.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_constants.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_constants.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_handler.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/fw_handler.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_handler.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py similarity index 94% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 06cc480798..0f7380c2e8 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/oc_fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -23,7 +23,6 @@ from vyos_session import utils FWN = 'firewall name' -# oc_fw_identifier = 'oc_fw' rule = 'rule' firewall_rules = { 'protocol': '%s protocol %s', @@ -39,11 +38,11 @@ utils.init_logger(logger) -class OCFWConfigClass(configOpts): +class VyosFWConfigClass(configOpts): def __init__(self): - super(OCFWConfigClass, self).__init__() - self.oc_fw_identifier = 'oc_fw' + super(VyosFWConfigClass, self).__init__() + self.fw_identifier = 'fw' self.provider_ptg_interfaces = list() self.rules = list() @@ -122,12 +121,12 @@ def set_up_rule_on_interfaces(self, firewall): session.teardown_config_session() def add_common_rule(self): - self.oc_fw_identifier = ('oc_fw' + '_' + + self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) - default_action = (FWN + ' ' + self.oc_fw_identifier + + default_action = (FWN + ' ' + self.fw_identifier + ' default-action drop' ) - common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + + common_fw_rule_prefix = (FWN + ' ' + self.fw_identifier + ' ' + rule + ' 10') accept_action = (common_fw_rule_prefix + ' action accept') established_action = (common_fw_rule_prefix + @@ -144,7 +143,7 @@ def create_vyos_fw_rule(self, fw_rule): position = str(int(fw_rule.get('position', '100')) + 10) if position < 1: position *= 10 - common_fw_rule_prefix = (FWN + ' ' + self.oc_fw_identifier + ' ' + + common_fw_rule_prefix = (FWN + ' ' + self.fw_identifier + ' ' + rule + ' ' + position) self.rules.append(common_fw_rule_prefix) self.rules.append(''.join([common_fw_rule_prefix, ' action %s' % @@ -170,7 +169,7 @@ def configure_interfaces(self): # TODO(Vikash) Its not always the bridge will have same name every # time. Its only for intercloud interface_conf = ("interfaces bridge br0 firewall in name " + - self.oc_fw_identifier) + self.fw_identifier) self.rules += [interface_conf] else: # It would be always 1 for now. @@ -178,7 +177,7 @@ def configure_interfaces(self): if interface.lower() == 'lo': continue interface_conf = ('interfaces ethernet ' + interface + ' ' + - 'firewall out name ' + self.oc_fw_identifier) + 'firewall out name ' + self.fw_identifier) self.rules += [interface_conf] def reset_firewall(self, firewall): @@ -202,7 +201,7 @@ def reset_firewall(self, firewall): if fw_constants.intercloud: bridge_rule = ("interfaces bridge br0 firewall in name " + - self.oc_fw_identifier) + self.fw_identifier) try: self.delete(bridge_rule.split()) except Exception as err: @@ -235,9 +234,9 @@ def reset_firewall(self, firewall): # sleep for 2 sec. Got removed in last merge. time.sleep(2) - self.oc_fw_identifier = ('oc_fw' + '_' + + self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.oc_fw_identifier + del_firewall = FWN + ' ' + self.fw_identifier try: self.delete(del_firewall.split()) except Exception as err: @@ -325,9 +324,9 @@ def _ensure_clean_interface(self): del_interface_rule = ( 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + ' ' + 'firewall') - self.oc_fw_identifier = ('oc_fw' + '_' + + self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.oc_fw_identifier + del_firewall = FWN + ' ' + self.fw_identifier try: self.delete(del_interface_rule.split()) # delete firewall diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/ha_config.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/interface_monitor.sh similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/interface_monitor.sh rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/interface_monitor.sh diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/log_forwarder.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/operations.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/routes_config_handler.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py similarity index 95% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py index 7f216c34ab..c6a01819e0 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py @@ -20,7 +20,7 @@ init_logger(logger) -class OCVyOSServer(object): +class VyOSServer(object): def __init__(self): pass @@ -35,7 +35,7 @@ def handler(signum, frame): def main(argv): - vyos_server = OCVyOSServer() + vyos_server = VyOSServer() host = '' port = 0 if len(argv) != 5: diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py similarity index 94% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py index 778f53db13..bce7eec62e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py @@ -22,13 +22,13 @@ import netifaces from edit_persistent_rule import EditPersistentRule from flask import Flask, jsonify, request -from fw_module import OCFWConfigClass +from fw_module import VyosFWConfigClass from ha_config import VYOSHAConfig from log_forwarder import APIHandler as apihandler from static_ip import StaticIp from stats_parser import APIHandler as stats_apihandler from vpn_api_server import VPNHandler as vpnhandler -from vyos_exception import OCException +from vyos_exception import VyosException from vyos_policy_based_routes import RoutesConfigHandler as routes_handler from vyos_session.utils import init_logger @@ -244,11 +244,11 @@ def configure_firewall_rule(): response = fw_module.set_up_rule_on_interfaces(firewall_data) except Exception as err: try: - return send_error_response(OCException(err[0], status_code=err[1], + return send_error_response(VyosException(err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( - OCException(str(err), status_code=500, + VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( 'configuring', 'firewall')))) else: @@ -262,11 +262,11 @@ def delete_firewall_rule(): response = fw_module.reset_firewall(request.data) except Exception as err: try: - return send_error_response(OCException(err[0], status_code=err[1], + return send_error_response(VyosException(err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( - OCException(str(err), status_code=500, + VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( 'deleting', 'firewall')))) else: @@ -281,11 +281,11 @@ def update_firewall_rule(): response = fw_module.set_up_rule_on_interfaces(request.data) except Exception as err: try: - return send_error_response(OCException(err[0], status_code=err[1], + return send_error_response(VyosException(err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( - OCException(str(err), status_code=500, + VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( 'updating', 'firewall')))) else: @@ -347,11 +347,11 @@ def configure_conntrack_sync(): # This flask version has issue in implicit way of registering # error handler. try: - return send_error_response(OCException(err[0], status_code=err[1], + return send_error_response(VyosException(err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( - OCException(str(err), status_code=500, + VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( 'configuring', 'conntrack sync')))) else: @@ -365,11 +365,11 @@ def configure_interface_ha(): response = vyos_ha_config.set_vrrp_for_interface(request.data) except Exception as err: try: - return send_error_response(OCException(err[0], status_code=err[1], + return send_error_response(VyosException(err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( - OCException(str(err), status_code=500, + VyosException(str(err), status_code=500, payload=dict( err=error_msgs['unexpected'] % ( 'configuring', 'HA for the interface')))) @@ -384,18 +384,18 @@ def delete_vrrp(): response = vyos_ha_config.delete_vrrp(request.data) except Exception as err: try: - return send_error_response(OCException(err[0], status_code=err[1], + return send_error_response(VyosException(err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( - OCException(str(err), status_code=500, + VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( 'deleting', 'VRRP')))) else: return jsonify(**response) -# @app.errorhandler(OCException) +# @app.errorhandler(VyosException) def send_error_response(error): response = jsonify(error.to_dict()) response.status_code = error.status_code @@ -546,7 +546,7 @@ def main(): :type ip_addr: Server listen address """ global fw_module, vyos_ha_config - fw_module = OCFWConfigClass() + fw_module = VyosFWConfigClass() vyos_ha_config = VYOSHAConfig() ip_addr = get_interface_to_bind() signal.signal(signal.SIGTERM, handler) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/static_ip.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py similarity index 99% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py index e1ec784d62..266e426507 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py @@ -57,7 +57,7 @@ def parse_firewall_stats(self, interface, raw_stats): """ sample data for command show_firewall_detail.xsl : - IPv4 Firewall "oc_fw_eth1": + IPv4 Firewall "fw_eth1": Active on (eth1,OUT) @@ -280,7 +280,7 @@ def get_fw_stats(self, mac_address): """ sample data for command show_firewall_statistics.xsl : - IPv4 Firewall "oc_fw_eth1": + IPv4 Firewall "fw_eth1": Active on (eth1,OUT) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vpn_api_server.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos-log similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos-oc-log rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos-log diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_dhc.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_dhc.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_dhc.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_exception.py similarity index 96% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_exception.py index c8aefc7d1b..b8b7c6deaa 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_exception.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_exception.py @@ -11,7 +11,7 @@ # under the License. -class OCException(Exception): +class VyosException(Exception): """ """ status_code = 400 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc_config_server/vyos_policy_based_routes.py rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py index b602f3b09b..383c6d3d34 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py @@ -1,4 +1,15 @@ -#!/usr/bin/env python +# 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 logging import os import shlex diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py index 022b121294..b525457119 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py @@ -1,4 +1,15 @@ -#!/usr/bin/env python +# 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 os import sys diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/vyos similarity index 94% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/vyos index f5d790b8f6..1ae23f372b 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/vyos @@ -19,7 +19,7 @@ # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Short-Description: OC vyos service +# Short-Description: vyos service # Description: Provides the vyos service ### END INIT INFO set -e @@ -62,7 +62,7 @@ set +e running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` [ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e -log_daemon_msg "Starting oc vyos" +log_daemon_msg "Starting vyos agent" # We have completely messed up the rc level scripts sudo chown vyos:users -R /var/run/elastic_services sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS @@ -78,7 +78,7 @@ set +e kill -0 `cat $PIDFILE` > /dev/null 2>&1 if [ $? -eq 0 ]; then set -e -log_daemon_msg "Stopping oc vyos" +log_daemon_msg "Stopping vyos agent" start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} log_end_msg $? else @@ -108,14 +108,14 @@ set +e kill -0 `cat $PIDFILE` > /dev/null 2>&1 if [ $? -eq 0 ]; then set -e -log_daemon_msg "Reloading oc vyos" +log_daemon_msg "Reloading Vyos agent" start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE log_end_msg $? else echo "No process with PID `cat $PIDFILE` found running, removing the PID file" fi else -echo "oc vyos is not running or PID file not existing" +echo "Vyos agent is not running or PID file not existing" fi ;; status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc-vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf similarity index 100% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/oc-vyos.conf rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/oc-vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/vyos similarity index 94% rename from gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/oc-vyos rename to gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/vyos index f5d790b8f6..6ca96848a3 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/oc-vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/vyos @@ -19,7 +19,7 @@ # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Short-Description: OC vyos service +# Short-Description: vyos service # Description: Provides the vyos service ### END INIT INFO set -e @@ -62,7 +62,7 @@ set +e running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` [ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 set -e -log_daemon_msg "Starting oc vyos" +log_daemon_msg "Starting Vyos agent" # We have completely messed up the rc level scripts sudo chown vyos:users -R /var/run/elastic_services sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS @@ -78,7 +78,7 @@ set +e kill -0 `cat $PIDFILE` > /dev/null 2>&1 if [ $? -eq 0 ]; then set -e -log_daemon_msg "Stopping oc vyos" +log_daemon_msg "Stopping Vyos agent" start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} log_end_msg $? else @@ -108,14 +108,14 @@ set +e kill -0 `cat $PIDFILE` > /dev/null 2>&1 if [ $? -eq 0 ]; then set -e -log_daemon_msg "Reloading oc vyos" +log_daemon_msg "Reloading vyos agent" start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE log_end_msg $? else echo "No process with PID `cat $PIDFILE` found running, removing the PID file" fi else -echo "oc vyos is not running or PID file not existing" +echo "Vyos agent is not running or PID file not existing" fi ;; status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py index f9dd6cfffd..d4bf8f2518 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py @@ -1,3 +1,15 @@ +# 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 logging import os from uuid import uuid4 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py index a4e97dc24f..9d94f7f5b3 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py @@ -1,3 +1,15 @@ +# 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 ConfigParser import logging import logging.handlers as handlers From 0ebbf315215f8d5acbf5403c6df562fa10e39b1c Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 12:58:17 +0530 Subject: [PATCH 020/157] bug fix --- gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf index 9ef2c62706..d0577bac32 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf @@ -3,6 +3,6 @@ vyos_sbin_dir = /opt/vyatta/sbin shell_api_path = /bin/cli-shell-api [log] -logdir=/var/log/oc +logdir=/var/log/vyos logfile=vyos.log level=ERROR From f51c2386e688e09b7eb44c72ba31d900dee65c50 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 15:06:18 +0530 Subject: [PATCH 021/157] enhancements --- .../vyos/agent/src/config_server/server2.py | 38 +++++++++---------- .../vyos/agent/src/vyos.conf | 2 +- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py index bce7eec62e..0607d47288 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py @@ -33,8 +33,6 @@ from vyos_session.utils import init_logger sys.path.insert(0, dirname(dirname(abspath(__file__)))) -# sys.path.insert(0, dirname(dirname(abspath(__file__)))) -# sys.path.insert(0, (abspath(__file__))) logger = logging.getLogger(__name__) init_logger(logger) @@ -244,12 +242,12 @@ def configure_firewall_rule(): response = fw_module.set_up_rule_on_interfaces(firewall_data) except Exception as err: try: - return send_error_response(VyosException(err[0], status_code=err[1], - payload=err[2])) + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( + payload=dict(err=error_msgs['unexpected'] % ( 'configuring', 'firewall')))) else: return jsonify(**response) @@ -262,12 +260,12 @@ def delete_firewall_rule(): response = fw_module.reset_firewall(request.data) except Exception as err: try: - return send_error_response(VyosException(err[0], status_code=err[1], - payload=err[2])) + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( + payload=dict(err=error_msgs['unexpected'] % ( 'deleting', 'firewall')))) else: return jsonify(**response) @@ -281,12 +279,12 @@ def update_firewall_rule(): response = fw_module.set_up_rule_on_interfaces(request.data) except Exception as err: try: - return send_error_response(VyosException(err[0], status_code=err[1], - payload=err[2])) + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( + payload=dict(err=error_msgs['unexpected'] % ( 'updating', 'firewall')))) else: return jsonify(**response) @@ -347,12 +345,12 @@ def configure_conntrack_sync(): # This flask version has issue in implicit way of registering # error handler. try: - return send_error_response(VyosException(err[0], status_code=err[1], - payload=err[2])) + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( + payload=dict(err=error_msgs['unexpected'] % ( 'configuring', 'conntrack sync')))) else: return jsonify(**response) @@ -365,12 +363,12 @@ def configure_interface_ha(): response = vyos_ha_config.set_vrrp_for_interface(request.data) except Exception as err: try: - return send_error_response(VyosException(err[0], status_code=err[1], - payload=err[2])) + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( VyosException(str(err), status_code=500, - payload=dict( + payload=dict( err=error_msgs['unexpected'] % ( 'configuring', 'HA for the interface')))) else: @@ -384,12 +382,12 @@ def delete_vrrp(): response = vyos_ha_config.delete_vrrp(request.data) except Exception as err: try: - return send_error_response(VyosException(err[0], status_code=err[1], - payload=err[2])) + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) except IndexError: return send_error_response( VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( + payload=dict(err=error_msgs['unexpected'] % ( 'deleting', 'VRRP')))) else: return jsonify(**response) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf index d0577bac32..65608518fb 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf @@ -5,4 +5,4 @@ shell_api_path = /bin/cli-shell-api [log] logdir=/var/log/vyos logfile=vyos.log -level=ERROR +level=DEBUG From 07ec21a0ac2d739d7c96b2c878ab9a04ef3e927e Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 15:34:59 +0530 Subject: [PATCH 022/157] enhancements --- .../vyos/agent/DEBIAN/postrm | 1 - .../vyos/agent/src/auth_pam.pl | 9 --- .../vyos/agent/src/auth_pam_domain_verify.pl | 9 --- .../src/config_server/edit_persistent_rule.py | 2 - .../vyos/agent/src/config_server/fw_module.py | 1 - .../vyos/agent/src/config_server/ha_config.py | 29 ---------- .../config_server/routes_config_handler.py | 56 ------------------- .../vyos/agent/src/config_server/server2.py | 3 - .../vyos/agent/src/execformat/formator.py | 3 - .../vyos/agent/src/vpn_op_commands.pl | 2 - .../vyos/agent/src/vyos-pbr/no-default-route | 1 - .../vyos/agent/src/vyos-pbr/pbr_init | 22 +------- .../agent/src/vyos_session/configsession.py | 4 -- 13 files changed, 1 insertion(+), 141 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm index 4b88c70985..b2c5a9f56d 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm @@ -1,3 +1,2 @@ #!/bin/bash echo "" -#sed -i '/pbr_init/d' /etc/rc.local diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl index 6e22af4d0e..5b3d73460b 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl @@ -101,7 +101,6 @@ sub read_auth_server_conf { chomp $REMOTE_VPN_ROLE_NAME; chomp $SERVICE_PROJECT_ID; - #$DB::single = 1; close(AUTHFILE); } @@ -139,16 +138,13 @@ sub read_username_passwd { sub get_cloud_admin_token { - #$DB::single = 1; my $http_req = HTTP::Request->new(POST => $url_get_admin_token); $http_req->header('content-type' => 'application/json'); $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; - #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; $json_string = to_json($get_admin_token_data); $http_req->content($json_string); - #$http_req->content($get_admin_token_data); my $http_resp = $httpclient->request($http_req); if ($http_resp->is_success) { my $message = $http_resp->decoded_content; @@ -165,7 +161,6 @@ sub get_cloud_admin_token { sub get_domain_id { my $http_req = HTTP::Request->new(GET => $url_get_domain); - #$DB::single = 1; $http_req->header('content-type' => 'application/json'); $http_req->header('x-auth-token' => $admin_token_id); @@ -187,7 +182,6 @@ sub get_domain_id { sub get_role_id { my $http_req = HTTP::Request->new(GET => $url_get_role_id); - #$DB::single = 1; $http_req->header('content-type' => 'application/json'); $http_req->header('x-auth-token' => $admin_token_id); @@ -222,7 +216,6 @@ sub user_authenticate { if ($http_resp->is_success) { my $message = $http_resp->decoded_content; - #$DB::single = 1; my $decoded_resp = decode_json($message); $user_token_id = $http_resp->headers->{'x-subject-token'}; $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; @@ -239,7 +232,6 @@ sub user_authenticate { sub get_user_roles { $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); - #$DB::single = 1; $http_req->header('content-type' => 'application/json'); $http_req->header('x-auth-token' => $admin_token_id); @@ -247,7 +239,6 @@ sub get_user_roles { if ($http_resp->is_success) { my $message = $http_resp->decoded_content; my $decoded_resp = decode_json($message); - #$DB::single = 1; my $user_roles = $decoded_resp->{'role_assignments'}; my $len = @{$user_roles}; if ($len) { diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl index 330e15a694..b0f2f312ab 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl @@ -93,7 +93,6 @@ sub read_auth_server_conf { chomp $REMOTE_VPN_ROLE_NAME; chomp $PROJECT_ID; - #$DB::single = 1; close(AUTHFILE); } @@ -131,16 +130,13 @@ sub read_username_passwd { sub get_cloud_admin_token { - #$DB::single = 1; my $http_req = HTTP::Request->new(POST => $url_get_admin_token); $http_req->header('content-type' => 'application/json'); $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"name"} = $cloud_admin_username; $get_admin_token_data->{"auth"}{"identity"}{"password"}{"user"}{"password"} = $cloud_admin_password; - #$get_admin_token_data->{"auth"}{"scope"}{"project"}{"name"} = $cloud_admin_projname; $json_string = to_json($get_admin_token_data); $http_req->content($json_string); - #$http_req->content($get_admin_token_data); my $http_resp = $httpclient->request($http_req); if ($http_resp->is_success) { my $message = $http_resp->decoded_content; @@ -157,7 +153,6 @@ sub get_cloud_admin_token { sub get_domain_id { my $http_req = HTTP::Request->new(GET => $url_get_domain); - #$DB::single = 1; $http_req->header('content-type' => 'application/json'); $http_req->header('x-auth-token' => $admin_token_id); @@ -177,7 +172,6 @@ sub get_domain_id { sub get_role_id { my $http_req = HTTP::Request->new(GET => $url_get_role_id); - #$DB::single = 1; $http_req->header('content-type' => 'application/json'); $http_req->header('x-auth-token' => $admin_token_id); @@ -210,7 +204,6 @@ sub user_authenticate { if ($http_resp->is_success) { my $message = $http_resp->decoded_content; - #$DB::single = 1; my $decoded_resp = decode_json($message); $user_token_id = $http_resp->headers->{'x-subject-token'}; $user_id = $decoded_resp->{'token'}->{'user'}->{'id'}; @@ -227,7 +220,6 @@ sub user_authenticate { sub get_user_roles { $url_get_role_assignment = $KEYSTONE_AUTH_URL . "/v3/role_assignments?user.id=$user_id&role.id=$user_role_id"; my $http_req = HTTP::Request->new(GET => $url_get_role_assignment); - #$DB::single = 1; $http_req->header('content-type' => 'application/json'); $http_req->header('x-auth-token' => $admin_token_id); @@ -235,7 +227,6 @@ sub get_user_roles { if ($http_resp->is_success) { my $message = $http_resp->decoded_content; my $decoded_resp = decode_json($message); - #$DB::single = 1; my $user_roles = $decoded_resp->{'role_assignments'}; my $len = @{$user_roles}; if ($len) { diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/edit_persistent_rule.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/edit_persistent_rule.py index 81a0c40d15..1f5a46fae6 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/edit_persistent_rule.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/edit_persistent_rule.py @@ -31,8 +31,6 @@ def __init__(self): def add(self, mac_info): provider_rule, stitching_rule, interface_list = self.get_rule(mac_info) self.clean_stale_rules(interface_list) - # line = ADD_RULE % (mac, interface) - # initiate_dhclient() self.delete(mac_info) try: call("sudo chown vyos: " diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 0f7380c2e8..37e2cf9478 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -296,7 +296,6 @@ def set_provider_interface(self, firewall): for interface in interfaces: # IPV4 support only # (Fixme) what in the case of aliasing? - # ip = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] # TODO (Vikash) Not reqd for L2 , need to revisit for L3 # vpn tunnel interface for ssl vpn does not have a mac address physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py index 910d08875e..69fd40c36d 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py @@ -51,8 +51,6 @@ def configure_conntrack_sync(self, ha_config): interface_type='monitoring') if not monitoring_interface: - # return {'status': 500, - # 'message': 'Failed to get monitoring interface name'} logger.error("Failed to configure conntrack for CLUSTER- %r" % cluster_name) raise Exception("Conntrack sync configuration failed. Reason - " @@ -114,7 +112,6 @@ def delete_vrrp(self, vrrp_config): """ vrrp_config = json.loads(vrrp_config) data_macs = vrrp_config["data_macs"] - # cluster_name = vrrp_config.get("cluster_name", "CLUSTER-1") data_interface, data_ip = self._get_interface_name( dict(data_mac=data_macs['provider_mac']), interface_type='data') @@ -126,44 +123,21 @@ def delete_vrrp(self, vrrp_config): stitching_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface session.setup_config_session() - # delete_conntrack_cluster = ("service conntrack-sync " - # "failover-mechanism vrrp sync-group %s" % - # cluster_name) - # try: - # self.delete(group_delete.split()) - # except Exception, err: - # session.discard() - # session.teardown_config_session() - # raise Exception(err) try: self.delete(provider_vrrp_delete.split()) except Exception as err: - # session.discard() logger.error("Error deleting provider vrrp %r " % err) - # raise Exception(err) try: self.delete(stitching_vrrp_delete.split()) except Exception as err: - # session.discard() logger.error("Error deleting stitching vrrp %r " % err) - # raise Exception(err) - # try: - # self.delete(delete_conntrack_cluster.split()) - # except Exception, err: - # session.discard() - # session.teardown_config_session() - # raise Exception(err) - # logger.error("Error deleting conntrack - %r " % err) session.commit() time.sleep(5) session.save() - # REVISIT (VK) This sleep need to get invoked if we see any issue - # with session teardown. - # time.sleep(5) session.teardown_config_session() logger.debug("VRRP succesfully deleted for interfaces") return {'status': 200, 'message': 'VRRP succesfully deleted for ' @@ -180,7 +154,6 @@ def set_vrrp_for_interface(self, data_info): vrrp_groups = data_info["vrrp_group"] for mac_type, mac in data_macs.iteritems(): - # mac_type - provider_mac, stitching_mac data_mac = dict(data_mac=str(mac)) vip_type = mac_type.split("_")[0] + "_vip" vip_ip = vips.get(vip_type) @@ -209,8 +182,6 @@ def set_vrrp_for_interface(self, data_info): data_info["advertised_interval"]) preempt_set = common_command + "preempt true" - # preempt_set = common_command + "preempt %s" % data_info[ - # "preempt"] preempt_delay_set = common_command + "preempt-delay %s" % \ data_info["preempt_delay"] priority_set = common_command + "priority %s" % data_info[ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py index b4c74de215..b4279c9dfb 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py @@ -114,62 +114,6 @@ def _delete_ip_rule(self, cidr): % (cidr)) break - def _del_default_route_in_table(self, table): - route_del_command = "ip route del table %s default" % (table) - command_pipe = subprocess.Popen(route_del_command, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Deleting default route failed: %s" % (err)) - - def _add_default_route_in_table(self, route_cmd, table): - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0: - if "File exists" in err: - self._del_default_route_in_table(table) - else: - logger.error("Adding default route failed: %s" % (route_cmd)) - logger.error("Error: %s" % (err)) - raise Exception("Setting Default Table route failed") - else: - return out - - command_pipe = subprocess.Popen(route_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - if command_pipe.returncode != 0: - logger.error("Adding default route failed: %s" % (route_cmd)) - logger.error("Error: %s" % (err)) - raise Exception("Setting Default Table route failed") - else: - return out - - def _delete_ip_rule(self, cidr): - count = 0 - for direction in ["from", "to"]: - ip_rule_cmd = "ip rule del %s %s" % (direction, cidr) - while True: - command_pipe = subprocess.Popen(ip_rule_cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = command_pipe.communicate() - # Delete the existing default route if any and retry - if command_pipe.returncode != 0 and "No such file" in err: - break - else: - count = count + 1 - if count >= 10: - logger.error("Deleting policy based routing for CIDR: " - "%s not completed even after 10 attempts" - % (cidr)) - break - # REVISIT(Magesh): There may be a chance that there are duplicate rules # May have to do a list and cleanup multiple entries def delete_source_route(self, routes_info): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py index 0607d47288..f200d310f8 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py @@ -79,8 +79,6 @@ def auth_server_config(): os.system("sudo chown vyos:users /etc/hosts") os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) os.system("sudo chown root:root /etc/hosts") - # with open('/etc/hosts', 'a') as hosts: - # hosts.write(data['host_mapping']) except Exception as e: logger.error("Error in writing host mapping in /etc/hosts - %s" % e) @@ -393,7 +391,6 @@ def delete_vrrp(): return jsonify(**response) -# @app.errorhandler(VyosException) def send_error_response(error): response = jsonify(error.to_dict()) response.status_code = error.status_code diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py index b525457119..43c9b19fde 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py @@ -42,9 +42,6 @@ def formator(self, options): raise ServiceError('unknown such service!') exe = executor(list(args)) try: - # if not exe.checkcmd(' '.join(args)): - # logger.error("%s: given args does not match with existing configs!"%args) - # return False execstate, output = exe.execmd() logger.debug("=====>>>>>> args after executor call = %s" % args) except OperationFailed as e: diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl index 5c6317a604..223379ecbb 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl @@ -45,7 +45,6 @@ sub get_ipsec_tunnel_idx { sub get_ipsec_tunnel_state { my @args = @_; - #args[0] will be subroutine name my $peer = $args[1]; my $tunnel = $args[2]; @@ -60,7 +59,6 @@ sub get_ipsec_tunnel_state { return $state } -#print Dumper \@ARGV; my $call=$ARGV[0]; $call->(@ARGV); diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route index 0acc48e6c9..150c0ef911 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route @@ -3,7 +3,6 @@ case $reason in BOUND|RENEW|REBIND|REBOOT) if [ "eth0" == $interface ]; then echo $new_routers > /usr/share/vyos-pbr/eth0_route - #unset new_routers else unset new_routers fi diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init index 10b09a9c02..7d356dd561 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init @@ -21,7 +21,6 @@ function ip2dec () { } -#sleep 20 flag=0 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin all_interfaces=`/sbin/ifconfig | grep "Link encap" | grep -v "127.0.0.1" |cut -d: -d " " -f 1` @@ -34,9 +33,7 @@ for i in $all_interfaces; do ip_addr=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $4 }'` if [ $ip_addr ] then - #echo "GOT IP for interface $i" - #flag=1 - break + break fi done bcast_ip=`/sbin/ifconfig $i | grep "inet " | awk -F'[: ]+' '{ print $6 }'`; @@ -49,10 +46,8 @@ for i in $all_interfaces; do ip_addresses[$index]=$ip_addr network_id[$index]=$net_ip filename="/var/lib/dhcp3/dhclient_"$i"_lease" - #route=`grep "option routers" $filename |tail -1| cut -d: -d " " -f5` route=`grep "new_routers" $filename |tail -1| cut -d: -d "=" -f2| tr -d "'"` default_route[$index]=$route - #echo "$index ${default_route[$index]}" if [ "$i" == "eth0" ] && [ $flag == 0 ] then table_name=$i"_table" @@ -66,33 +61,18 @@ for i in $all_interfaces; do `ip rule del from ${ip_addresses[$index]} table $table_name` `ip rule add from ${ip_addresses[$index]} table $table_name` echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route - #echo "configured pbr for interface $i" fi - #index=`expr $index + 1` ((index++)) fi done index=0 for interface in ${interfaces[*]}; do - #echo "$index ${default_route[$index]}" if [ "$interface" == "eth1" ] && [ $flag == 0 ] then - #echo "Set default route on $interface ${default_route[$index]} $index" cmd="bash /usr/share/vyos-pbr/pbr ${default_route[$index]}" - #sudo su - vyos -c "$cmd" - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]} - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit - #/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper end - #source /opt/vyatta/etc/functions/script-template - #eval "set protocols static route 0.0.0.0/0 next-hop ${default_route[$index]}" - #eval "commit" - #eval "exit" fi - #index=`expr $index + 1` ((index++)) done -#bash /usr/share/vyos-pbr/controller_route echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py index d4bf8f2518..c80be9bb44 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py @@ -23,9 +23,6 @@ VYOS_SBIN_DIR = get_config_params('bin', 'vyos_sbin_dir') VYOS_SAVE_SCRIPT = 'vyatta-save-config.pl' -# Create/Get the logger object -# logger = init_logger() - class SessionAlreadyExists(Exception): pass @@ -153,7 +150,6 @@ def discard(self): out = _run(os.path.join(VYOS_SBIN_DIR, 'my_discard'), output=True) if not out: raise OperationFailed('[ERROR] Discard changes failed !') - # return out.splitlines()[0] return out def save(self): From 56dce7cc324e43adb5c4ff9bd952cd29d23dda85 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 1 Jul 2016 16:49:47 +0530 Subject: [PATCH 023/157] dib fixes --- .../diskimage-create/vyos/customize_vyos.sh | 9 ++------ .../vyos/vyos_image_create.py | 23 ++++--------------- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh index dbdcf0019c..ecb3bf393b 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh +++ b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh @@ -16,11 +16,6 @@ set firewall syn-cookies 'enable' set firewall twa-hazards-protection 'disable' set 'policy' set protocols 'static' -#set system config-management commit-revisions '20' -#set system console device ttyS0 speed '9600' -#set system syslog global facility all level 'notice' -#set system syslog global facility protocols level 'debug' - # delete non-working repository delete system package repository community @@ -47,9 +42,9 @@ sudo apt-get -o Acquire::Check-Valid-Until=false update sudo apt-get -y install python-netifaces python-flask python-netaddr # get oc-vyos package -sudo apt-get -y --force-yes install oc-vyos +sudo apt-get -y --force-yes install vyos -set system task-scheduler task health-monitor executable path '/usr/share/vyos-oc/oc_config_server/interface_monitor.sh' +set system task-scheduler task health-monitor executable path '/usr/share/vyos/config_server/interface_monitor.sh' set system task-scheduler task health-monitor interval '5m' # delete the local repo diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py index d76a358468..c5dcfa8efc 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py @@ -21,14 +21,14 @@ def parse_json(j_file): def update_vyos_repo(): vyos_vendor_dir = ("%s/../../../../nfp/service_vendor_agents/vyos/" % cur_dir) - service = 'oc-vyos' + service = 'agent' version = '2' release = '1' subprocess.call(['rm', '-rf', "%s/%s/deb-packages" % (vyos_vendor_dir, service)]) os.chdir(vyos_vendor_dir) ret = subprocess.call(['bash', - 'build_oc_vyos_deb.sh', + 'build_vyos_deb.sh', service, version, release]) @@ -38,9 +38,9 @@ def update_vyos_repo(): subprocess.call(["rm", "-rf", "/var/www/html/vyos"]) subprocess.call(["mkdir", "-p", "/var/www/html/vyos/amd64"]) - vyos_agent_deb = ("%s/%s/deb-packages/%s-%s-%s.deb" + vyos_agent_deb = ("%s/%s/deb-packages/vyos-%s-%s.deb" % (vyos_vendor_dir, service, - service, version, release)) + version, release)) subprocess.call(["cp", vyos_agent_deb, "/var/www/html/vyos/amd64/"]) # update repo Packages.gz @@ -66,14 +66,9 @@ def packer_build(): # packer expects VM size in MB conf_packer['builders'][0]['disk_size'] = conf['packer']['image_size'] * 1024 # packer exptects new output dir name for each run, packer creates the dir - #timestamp = datetime.datetime.now().strftime('%I%M%p-%d-%m-%Y') - #output_dir = "./output_" + timestamp - #conf_packer['builders'][0]['output_directory'] = output_dir # update VM output file name filepath = os.environ.get('ISO_IMAGE', '-1') iso = os.path.basename(filepath) - #vm_name = iso[:-4] + '.qcow2' - #conf_packer['builders'][0]['vm_name'] = vm_name # update the packer.json file with open('packer.json', 'w') as f: @@ -87,14 +82,6 @@ def packer_build(): if ret: print "ERROR: packer build failed" - ''' - # move to vyos image to output directory - old_file = output_dir + "/" + vm_name - new_file = "./output/vyos.qcow2" - ret = subprocess.call(["mv", old_file, new_file]) - if ret: - print "ERROR: unable to move file" - ''' image_path = "%s/output/%s.qcow2" % (cur_dir, "vyos") print("Image location: %s" % image_path) with open("/tmp/image_path", "w") as f: @@ -151,7 +138,7 @@ def get_vyos_iso(): if(sums.find(iso_file)) > 0: sha1sum_web = sums.split(' ')[0] - # calcualte the sha1 of downloaded file + # calculate the sha1 of downloaded file sha1sum_local = commands.getoutput("sha1sum %s" % (iso_path + iso_file)).split(' ')[0] if not sha1sum_web == sha1sum_local: From cd1da97d3cf15151f9d0cad427d9c38717804eb6 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 4 Jul 2016 14:36:02 +0530 Subject: [PATCH 024/157] json to jsonutils --- .../vyos/agent/src/config_server/fw_module.py | 15 ++- .../vyos/agent/src/config_server/ha_config.py | 19 ++- .../config_server/routes_config_handler.py | 13 +- .../vyos/agent/src/config_server/server.py | 2 +- .../vyos/agent/src/config_server/server2.py | 125 +++++++++--------- .../agent/src/config_server/stats_parser.py | 6 +- .../agent/src/config_server/vpn_api_server.py | 5 +- .../config_server/vyos_policy_based_routes.py | 15 ++- .../vyos/agent/src/execformat/executor.py | 5 +- .../vyos/agent/src/execformat/formator.py | 2 +- .../vyos/agent/src/vyos_session/utils.py | 4 +- 11 files changed, 109 insertions(+), 102 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 37e2cf9478..04bb63c01f 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -11,12 +11,13 @@ # under the License. import ast -import json +import fw_constants import logging +import netifaces import time -import fw_constants -import netifaces +from oslo_serialization import jsonutils + from execformat.executor import session from netifaces import AF_LINK from operations import configOpts @@ -66,7 +67,7 @@ def set_up_rule_on_interfaces(self, firewall): """ sorted_rule_list, self.provider_ptg_interfaces = list(), list() - firewall = json.loads(firewall) + firewall = jsonutils.loads(firewall) fw_rule_list = firewall['firewall_rule_list'] logger.info("Initiating firewall - %s build. of Tenant: %s" % ( firewall['id'], firewall['tenant_id'])) @@ -92,7 +93,7 @@ def set_up_rule_on_interfaces(self, firewall): # before on the interface. Need to evaluate side effect of this method. try: self._ensure_clean_interface() - except: + except Exception: pass self.rules = list() self.add_common_rule() @@ -181,7 +182,7 @@ def configure_interfaces(self): self.rules += [interface_conf] def reset_firewall(self, firewall): - fw_data = json.loads(firewall) + fw_data = jsonutils.loads(firewall) try: self.set_provider_interface(fw_data) except Exception as err: @@ -343,7 +344,7 @@ def run_sshd_on_mgmt_ip(self, mgmt_ip): self.set(command.split()) try: session.commit() - except: + except Exception: logger.error("Failed to update sshd listen-address to %s" % mgmt_ip) session.discard() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py index 69fd40c36d..2dfc372b04 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py @@ -10,11 +10,11 @@ # License for the specific language governing permissions and limitations # under the License. -import json -import logging +import netifaces import time -import netifaces +from oslo_serialization import jsonutils + from execformat.executor import session from netifaces import AF_INET, AF_LINK from operations import configOpts @@ -37,7 +37,7 @@ def configure_conntrack_sync(self, ha_config): :param ha_config: :return: """ - ha_config = json.loads(ha_config) + ha_config = jsonutils.loads(ha_config) monitoring_info, data_info = self.get_conntrack_request_data( ha_config) event_queue_size = monitoring_info["event_queue_size"] @@ -69,7 +69,7 @@ def configure_conntrack_sync(self, ha_config): return {'status': 200, 'message': 'VRRP configured succesfully'} def set_interface_ha(self, interface_config): - ha_config = json.loads(interface_config) + ha_config = jsonutils.loads(interface_config) try: cluster_name = ha_config["cluster_name"] vrrp_group = ha_config["vrrp_group"] @@ -110,7 +110,7 @@ def delete_vrrp(self, vrrp_config): Exception code will be incorporated once the exception established case. """ - vrrp_config = json.loads(vrrp_config) + vrrp_config = jsonutils.loads(vrrp_config) data_macs = vrrp_config["data_macs"] data_interface, data_ip = self._get_interface_name( @@ -134,7 +134,6 @@ def delete_vrrp(self, vrrp_config): except Exception as err: logger.error("Error deleting stitching vrrp %r " % err) - session.commit() time.sleep(5) session.save() @@ -148,7 +147,7 @@ def set_vrrp_for_interface(self, data_info): direct_call = False if isinstance(data_info, str): direct_call = True - data_info = json.loads(data_info) + data_info = jsonutils.loads(data_info) data_macs = data_info.get("data_macs", {}) vips = data_info.get("vip", {}) vrrp_groups = data_info["vrrp_group"] @@ -308,7 +307,7 @@ def _execute_commands(self, all_commands, tenant_id=None): for command in all_commands: try: self.set(command.split()) - except: + except Exception: logger.error("Failed to configure HA. Tenant - %r" % tenant_id) session.teardown_config_session() raise Exception("Failed to configure HA for tenant %s" % @@ -316,7 +315,7 @@ def _execute_commands(self, all_commands, tenant_id=None): "failed_command": command}) try: session.commit() - except: + except Exception: logger.error("Failed to commit HA configuration. Tenant - %r" % tenant_id) session.discard() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py index b4279c9dfb..dcfed99ffb 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py @@ -10,13 +10,14 @@ # License for the specific language governing permissions and limitations # under the License. -import json import logging import subprocess import time - import netaddr import netifaces + +from oslo_serialization import jsonutils + from vyos_session import utils ROUTING_TABLE_BASE = 10 @@ -31,7 +32,7 @@ def __init__(self): super(RoutesConfigHandler, self).__init__() def add_source_route(self, routes_info): - routes_info = json.loads(routes_info) + routes_info = jsonutils.loads(routes_info) for route_info in routes_info: source_cidr = route_info['source_cidr'] gateway_ip = route_info['gateway_ip'] @@ -56,7 +57,7 @@ def add_source_route(self, routes_info): routing_table_number) output = "%s\n%s\n%s" % (out1, out2, out3) logger.info("Static route configuration result: %s" % (output)) - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) def _del_default_route_in_table(self, table): route_del_command = "ip route del table %s default" % (table) @@ -117,7 +118,7 @@ def _delete_ip_rule(self, cidr): # REVISIT(Magesh): There may be a chance that there are duplicate rules # May have to do a list and cleanup multiple entries def delete_source_route(self, routes_info): - routes_info = json.loads(routes_info) + routes_info = jsonutils.loads(routes_info) for route_info in routes_info: source_cidr = route_info['source_cidr'] source_interface = self._get_if_name_by_cidr(source_cidr) @@ -134,7 +135,7 @@ def delete_source_route(self, routes_info): out = subprocess.Popen(ip_route_command, shell=True, stdout=subprocess.PIPE).stdout.read() logger.info("Static route delete result: %s" % (out)) - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) def _get_if_name_by_cidr(self, cidr): interfaces = netifaces.interfaces() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py index c6a01819e0..3cbf31ce91 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py @@ -39,7 +39,7 @@ def main(argv): host = '' port = 0 if len(argv) != 5: - print "server.py -h -p " + logger.info("server.py -h -p ") sys.exit(2) # Review - OSM: We should accept -h -p in any order. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py index f200d310f8..5cd45ddceb 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py @@ -11,15 +11,17 @@ # under the License. import ast -import json import logging +import netifaces import os import signal import sys import time -from os.path import abspath, dirname -import netifaces +from os.path import abspath +from os.path import dirname +from oslo_serialization import jsonutils + from edit_persistent_rule import EditPersistentRule from flask import Flask, jsonify, request from fw_module import VyosFWConfigClass @@ -49,7 +51,7 @@ @app.route('/auth-server-config', methods=['POST']) def auth_server_config(): - data = json.loads(request.data) + data = jsonutils.loads(request.data) f = open("/usr/share/vyos/auth_server.conf", 'w') f.write(data['auth_uri']) f.write('\n') @@ -66,14 +68,15 @@ def auth_server_config(): try: host_ip = data['host_mapping'].split()[0] + "/32" - command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + command = ('grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease' + ' |tail -1| cut -d: -d "=" -f2') gateway_ip = os.popen(command).read().strip().strip("'") vpnhandler().configure_static_route("set", host_ip, gateway_ip) except Exception as ex: err = ("Error in adding rvpn route. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) try: if data['host_mapping'].split()[1]: os.system("sudo chown vyos:users /etc/hosts") @@ -82,7 +85,7 @@ def auth_server_config(): except Exception as e: logger.error("Error in writing host mapping in /etc/hosts - %s" % e) - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) @app.route('/create-ipsec-site-conn', methods=['POST']) @@ -93,13 +96,13 @@ def create_ipsec_site_conn(): "commit" the changes """ try: - data = json.loads(request.data) + data = jsonutils.loads(request.data) status = vpnhandler().create_ipsec_site_conn(data) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = "Error in configuring ipsec_site_conection. Reason: %s" % ex logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/create-ipsec-site-tunnel', methods=['POST']) @@ -110,16 +113,16 @@ def create_ipsec_site_tunnel(): "commit" the changes """ try: - tunnel = json.loads(request.data) + tunnel = jsonutils.loads(request.data) pcidrs = tunnel['peer_cidrs'] for pcidr in pcidrs: tunnel['peer_cidr'] = pcidr status = vpnhandler().create_ipsec_site_tunnel(tunnel) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in configuring ipsec_site_tunnel. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/delete-ipsec-site-tunnel', methods=['DELETE']) @@ -135,11 +138,11 @@ def delete_ipsec_site_tunnel(): tunnel['local_cidr'] = local_cidr tunnel['peer_cidr'] = pcidr status = vpnhandler().delete_ipsec_site_tunnel(tunnel) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in deleting ipsec_site_tunnel. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/delete-ipsec-site-conn', methods=['DELETE']) @@ -147,11 +150,11 @@ def delete_ipsec_site_conn(): try: peer_address = request.args.get('peer_address') status = vpnhandler().delete_ipsec_site_conn(peer_address) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in deleting ipsec_site_connection. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/get-ipsec-site-tunnel-state', methods=['GET']) @@ -165,35 +168,35 @@ def get_ipsec_site_tunnel_state(): tunnel['local_cidr'] = lcidr tunnel['peer_cidr'] = pcidr status, state = vpnhandler().get_ipsec_site_tunnel_state(tunnel) - return json.dumps(dict(state=state)) + return jsonutils.dumps(dict(state=state)) except Exception as ex: err = ("Error in get_ipsec_site_tunnel_state. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/create-ssl-vpn-conn', methods=['POST']) def create_ssl_vpn_conn(): try: - data = json.loads(request.data) + data = jsonutils.loads(request.data) status = vpnhandler().create_ssl_vpn_conn(data) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in create_ssl_vpn_connection. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/ssl-vpn-push-route', methods=['POST']) def ssl_vpn_push_route(): try: - data = json.loads(request.data) + data = jsonutils.loads(request.data) status = vpnhandler().ssl_vpn_push_route(data) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in ssl_vpn_push_route. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/delete-ssl-vpn-conn', methods=['DELETE']) @@ -201,11 +204,11 @@ def delete_ssl_vpn_conn(): try: tunnel_name = request.args.get('tunnel') status = vpnhandler().delete_ssl_vpn_conn(tunnel_name) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in delete_ssl_vpn_conn. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/delete-ssl-vpn-route', methods=['DELETE']) @@ -213,11 +216,11 @@ def delete_ssl_vpn_route(): try: route = request.args.get('route') status = vpnhandler().delete_ssl_vpn_route(route) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in delete_ssl_vpn_route. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/get-ssl-vpn-conn-state', methods=['GET']) @@ -225,11 +228,11 @@ def get_ssl_vpn_conn_state(): try: tunnel_name = request.args.get('tunnel') status, state = vpnhandler().get_ssl_vpn_conn_state(tunnel_name) - return json.dumps(dict(status=status, state=state)) + return jsonutils.dumps(dict(status=status, state=state)) except Exception as ex: err = ("Error in get_ssl_vpn_conn_state. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/configure-firewall-rule', methods=['POST']) @@ -295,7 +298,7 @@ def add_source_route(): except Exception as ex: err = ("Exception in adding source route. %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/delete-source-route', methods=['DELETE']) @@ -305,20 +308,20 @@ def delete_source_route(): except Exception as ex: err = ("Exception in deleting source route. %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/add-stitching-route', methods=['POST']) def add_stitching_route(): try: - gateway_ip = json.loads(request.data).get('gateway_ip') + gateway_ip = jsonutils.loads(request.data).get('gateway_ip') status = vpnhandler().configure_static_route("set", "0.0.0.0/0", gateway_ip) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in add_stitching_route. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/delete-stitching-route', methods=['DELETE']) @@ -327,11 +330,11 @@ def delete_stitching_route(): gateway_ip = request.args.get('gateway_ip') status = vpnhandler().configure_static_route( "delete", "0.0.0.0/0", gateway_ip) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error in delete_stitching_route. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/configure_conntrack_sync', methods=['POST']) @@ -401,30 +404,30 @@ def send_error_response(error): def add_static_ip(): try: static_ip_obj = StaticIp() - data = json.loads(request.data) + data = jsonutils.loads(request.data) static_ip_obj.configure(data) except Exception as err: msg = ("Error adding static IPs for hotplugged interfaces. " "Data: %r. Error: %r" % (data, str(err))) logger.error(msg) - return json.dumps(dict(status=False, reason=msg)) + return jsonutils.dumps(dict(status=False, reason=msg)) else: - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) @app.route('/del_static_ip', methods=['DELETE']) def del_static_ip(): try: static_ip_obj = StaticIp() - data = json.loads(request.data) + data = jsonutils.loads(request.data) static_ip_obj.clear(data) except Exception as err: msg = ("Error clearing static IPs for hotplugged interfaces. " "Data: %r. Error: %r" % (data, str(err))) logger.error(msg) - return json.dumps(dict(status=False, reason=msg)) + return jsonutils.dumps(dict(status=False, reason=msg)) else: - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) @app.route('/add_rule', methods=['POST']) @@ -433,38 +436,38 @@ def add_rule(): ip_addr = get_interface_to_bind() fw_module.run_sshd_on_mgmt_ip(ip_addr) - data = json.loads(request.data) + data = jsonutils.loads(request.data) try: EditPersistentRule.add(e, data) except Exception as err: logger.error("Error adding persistent rule %r" % str(err)) - return json.dumps(dict(status=False)) + return jsonutils.dumps(dict(status=False)) else: - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) @app.route('/delete_rule', methods=['DELETE']) def del_rule(): - data = json.loads(request.data) + data = jsonutils.loads(request.data) try: EditPersistentRule.delete(e, data) except Exception as err: logger.error("Error deleting persistent rule %r" % str(err)) - return json.dumps(dict(status=False)) + return jsonutils.dumps(dict(status=False)) else: - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) @app.route('/configure-rsyslog-as-client', methods=['POST']) def configure_rsyslog_as_client(): try: - config_data = json.loads(request.data) + config_data = jsonutils.loads(request.data) status = apihandler().configure_rsyslog_as_client(config_data) - return json.dumps(dict(status=status)) + return jsonutils.dumps(dict(status=status)) except Exception as ex: err = ("Error while conifiguring rsyslog client. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/get-fw-stats', methods=['GET']) @@ -472,22 +475,22 @@ def get_fw_stats(): try: mac_address = request.args.get('mac_address') fw_stats = stats_apihandler().get_fw_stats(mac_address) - return json.dumps(dict(stats=fw_stats)) + return jsonutils.dumps(dict(stats=fw_stats)) except Exception as ex: err = ("Error while getting firewall stats. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) @app.route('/get-vpn-stats', methods=['GET']) def get_vpn_stats(): try: vpn_stats = stats_apihandler().get_vpn_stats() - return json.dumps(dict(stats=vpn_stats)) + return jsonutils.dumps(dict(stats=vpn_stats)) except Exception as ex: err = ("Error while getting vpn stats. Reason: %s" % ex) logger.error(err) - return json.dumps(dict(status=False, reason=err)) + return jsonutils.dumps(dict(status=False, reason=err)) def handler(signum, frame): @@ -498,12 +501,14 @@ def handler(signum, frame): def add_management_pbr(): - command = 'grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + command = ('grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease' + ' |tail -1| cut -d: -d "=" -f2') gateway_ip = os.popen(command).read().strip().strip("'") - command = 'grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease |tail -1| cut -d: -d "=" -f2' + command = ('grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease' + ' |tail -1| cut -d: -d "=" -f2') src_ip = os.popen(command).read().strip().strip("'") routes_info = [{'source_cidr': src_ip, 'gateway_ip': gateway_ip}] - routes_handler().add_source_route(json.dumps(routes_info)) + routes_handler().add_source_route(jsonutils.dumps(routes_info)) def getipaddr(): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py index 266e426507..3cbbddd058 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py @@ -244,9 +244,9 @@ def parse_vpn_remote(self, raw_stats): OpenVPN server status on vtun0 [] - Client CN Remote IP Tunnel IP TX byte RX byte Connected Since - --------- --------- --------- ------- ------- --------------- - UNDEF 192.168.2.81 192.168.200.4 8.0K 2.7K Tue Mar 8 09:01:05 2016 + Client CN Remote IP Tunnel IP TX byte RX byte Connected Since + --------- --------- --------- ------- ------- --------------- + UNDEF 192.168.2.81 192.168.200.4 8.0K 2.7K Tue Mar 8 09:01:05 2016 """ table = False remote_connection = {} diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py index 2964c3d23c..736f6e7e6e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py @@ -21,7 +21,8 @@ import time from execformat.executor import session -from netaddr import IPAddress, IPNetwork +from netaddr import IPAddress +from netaddr import IPNetwork from operations import configOpts from vyos_session import utils @@ -263,7 +264,7 @@ def _delete_ssl_vpn_route(self, route): def _set_commands(self, cmds): for cmd in cmds: - print cmd + logger.debug(cmd) self.set_1(cmd.split(' ')) def _create_ike_group(self, ike, dpd): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py index eb9e6eae6c..271d9b822e 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py @@ -11,13 +11,14 @@ # under the License. import copy -import json import logging +import netaddr +import netifaces import subprocess import time -import netaddr -import netifaces +from oslo_serialization import jsonutils + from operations import configOpts from vyos_session import utils @@ -164,7 +165,7 @@ def _configure_policy_route(self, source_cidr, gateway_ip, return True def add_source_route(self, routes_info): - routes_info = json.loads(routes_info) + routes_info = jsonutils.loads(routes_info) for route_info in routes_info: source_cidr = route_info['source_cidr'] gateway_ip = route_info['gateway_ip'] @@ -182,7 +183,7 @@ def add_source_route(self, routes_info): message = ("Configuring Policy based route failed. " "Error: %s" % (err)) raise Exception(message) - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) # FIXME: When invoked on delete path we have to propagate the error def _delete_policy_route(self, source_cidr, source_interface): @@ -218,14 +219,14 @@ def _delete_policy_route(self, source_cidr, source_interface): return def delete_source_route(self, routes_info): - routes_info = json.loads(routes_info) + routes_info = jsonutils.loads(routes_info) for route_info in routes_info: source_cidr = route_info['source_cidr'] source_interface = self._get_if_name_by_cidr(source_cidr, delete=True) if source_interface: self._delete_policy_route(source_cidr, source_interface) - return json.dumps(dict(status=True)) + return jsonutils.dumps(dict(status=True)) def _get_if_name_by_cidr(self, cidr, delete=False): interfaces = netifaces.interfaces() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py index 383c6d3d34..fd45358586 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py @@ -16,9 +16,8 @@ import subprocess from vyos_session import utils -# sys.path.append('/home/vyos/vyos-api/project/') -from vyos_session.configsession import (ConfigSession, SessionNotExists, - SetupSessionFailed) +from vyos_session.configsession import (ConfigSession, + SessionNotExists) logger = logging.getLogger(__name__) utils.init_logger(logger) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py index 43c9b19fde..a4c8f3131f 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py @@ -27,7 +27,7 @@ class ServiceError(Exception): pass -class showConfig(): +class showConfig(object): def formator(self, options): args = ['show'] diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py index 9d94f7f5b3..3e522a02e6 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py @@ -57,9 +57,9 @@ def get_log_filehandler(): os.makedirs(log_dir) open(log_file_path, 'a').close() except OSError as exception: - print exception + logger.error(exception) return False - print "[INFO] Create log file %s" % log_file_path + logger.info("[INFO] Create log file %s" % log_file_path) # create file handler fh = logging.FileHandler(log_file_path, 'a') fh.setLevel(eval('logging.{0}'.format(get_log_level()))) From c92b093b67ac9f9e011b9f4e997e04e305e96eb3 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 4 Jul 2016 15:53:33 +0530 Subject: [PATCH 025/157] removed HA references; fixed all remainder flake8 errors --- .../agent/src/config_server/fw_handler.py | 77 ---- .../vyos/agent/src/config_server/fw_module.py | 11 +- .../vyos/agent/src/config_server/ha_config.py | 330 ----------------- .../agent/src/config_server/log_forwarder.py | 12 +- .../agent/src/config_server/operations.py | 3 +- .../config_server/routes_config_handler.py | 7 +- .../vyos/agent/src/config_server/server2.py | 95 +---- .../vyos/agent/src/config_server/static_ip.py | 2 +- .../agent/src/config_server/stats_parser.py | 342 ------------------ .../agent/src/config_server/vpn_api_server.py | 20 - .../vyos/agent/src/execformat/executor.py | 6 +- .../agent/src/vyos_session/configsession.py | 8 +- .../vyos/agent/src/vyos_session/utils.py | 4 +- 13 files changed, 35 insertions(+), 882 deletions(-) delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_handler.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_handler.py deleted file mode 100755 index 159069ab8b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_handler.py +++ /dev/null @@ -1,77 +0,0 @@ -# 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 operations import configOpts - -FWN = "firewall name" -ZPZ = "zone-policy zone" - - -class fwHandler(configOpts): - actions = ["drop", "reject", "accept", "inspect"] - state = ["established", "invalid", "related"] - availability = ["enable", "disable"] - - def firewall_config(self, name, suffix): - firewall = [FWN, name, "rule"] - firewall.extend(suffix) - self.set(firewall) - - def zone_config(self, suffix): - zone = [ZPZ] - zone.extend(suffix) - self.set(zone) - - def set_zone_desc(self, zone_name, desc): - description = [zone_name, "description", desc] - self.zone_config(description) - - def set_zone_interface(self, zone_name, iface): - interface = [zone_name, "interface", iface] - self.zone_config(interface) - - def setup_fw_on_zone(self, zone_src, zone_dst, firewall): - fw_on_zone = [zone_src, "from", zone_dst, "name", firewall] - self.zone_config(fw_on_zone) - - def set_default_action(self, name, rule_num, action): - if action in self.actions: - self.set_action[rule_num, "action", action] - self.firewall_config(name, set_action) - - def set_rule_state(self, name, rule_num, state, allow): - if state in self.states and allow in self.availability: - self.set_state[rule_num, "state", state, allow] - self.firewall_config(name, set_state) - - def set_protocol(self, name, rule_num, prot): - protocol = [rule_num, "protocol", prot] - self.firewall_config(name, protocol) - - def set_dest_port(self, name, rule_num, portlist, orient="destination"): - port = [rule_num, orient, "port", portlist] - self.firewall_config(name, port) - - def set_dest_addr(self, name, rule_num, addr_subnet, orient="destination"): - addr = [rule_num, orient, "address", addr_subnet] - self.firewall_config(name, addr) - - def set_src_port(self, name, rule_num, portlist): - self.set_dest_port(name, rule_num, portlist, "source") - - def set_src_addr(self, name, rule_num, addr_subnet): - self.set_dest_addr(name, rule_num, addr_subnet, "source") - - def rule_state(self, name, rule_num, status): - if status in availability: - rule_status = [rule_num, status] - self.firewall_config(name, rule_status) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 04bb63c01f..2b7409ac0d 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -122,8 +122,7 @@ def set_up_rule_on_interfaces(self, firewall): session.teardown_config_session() def add_common_rule(self): - self.fw_identifier = ('fw' + '_' + - self.provider_ptg_interfaces[0]) + self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) default_action = (FWN + ' ' + self.fw_identifier + ' default-action drop' ) @@ -235,8 +234,7 @@ def reset_firewall(self, firewall): # sleep for 2 sec. Got removed in last merge. time.sleep(2) - self.fw_identifier = ('fw' + '_' + - self.provider_ptg_interfaces[0]) + self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) del_firewall = FWN + ' ' + self.fw_identifier try: self.delete(del_firewall.split()) @@ -297,7 +295,7 @@ def set_provider_interface(self, firewall): for interface in interfaces: # IPV4 support only # (Fixme) what in the case of aliasing? - # TODO (Vikash) Not reqd for L2 , need to revisit for L3 + # TODO(Vikash) Not reqd for L2 , need to revisit for L3 # vpn tunnel interface for ssl vpn does not have a mac address physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) if not physical_interface: @@ -324,8 +322,7 @@ def _ensure_clean_interface(self): del_interface_rule = ( 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + ' ' + 'firewall') - self.fw_identifier = ('fw' + '_' + - self.provider_ptg_interfaces[0]) + self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) del_firewall = FWN + ' ' + self.fw_identifier try: self.delete(del_interface_rule.split()) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py deleted file mode 100644 index 2dfc372b04..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/ha_config.py +++ /dev/null @@ -1,330 +0,0 @@ -# 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 netifaces -import time - -from oslo_serialization import jsonutils - -from execformat.executor import session -from netifaces import AF_INET, AF_LINK -from operations import configOpts -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class VYOSHAConfig(configOpts): - """ - Class to configure HA for VYOS. - """ - - def __init__(self): - super(VYOSHAConfig, self).__init__() - - def configure_conntrack_sync(self, ha_config): - """ - :param ha_config: - :return: - """ - ha_config = jsonutils.loads(ha_config) - monitoring_info, data_info = self.get_conntrack_request_data( - ha_config) - event_queue_size = monitoring_info["event_queue_size"] - cluster_name = monitoring_info["cluster_name"] - mcast_group = monitoring_info["mcast_group"] - sync_queue_size = monitoring_info["sync_queue_size"] - monitoring_mac = monitoring_info["monitoring_mac"] - - monitoring_interface, monitoring_ip = self._get_interface_name( - dict(monitoring_mac=monitoring_mac), - interface_type='monitoring') - - if not monitoring_interface: - logger.error("Failed to configure conntrack for CLUSTER- %r" % - cluster_name) - raise Exception("Conntrack sync configuration failed. Reason - " - "No monitoring interface information found.", - 400, dict(ha_config=ha_config)) - - conntrack_commands = self._set_conntrack( - cluster_name, event_queue_size, mcast_group, - monitoring_interface, sync_queue_size) - interface_vrrp_commands = self.set_vrrp_for_interface(data_info) - - all_commands = conntrack_commands + interface_vrrp_commands - - self._execute_commands(all_commands, ha_config['tenant_id']) - logger.debug("VRRP configured succesfully - %r " % all_commands) - return {'status': 200, 'message': 'VRRP configured succesfully'} - - def set_interface_ha(self, interface_config): - ha_config = jsonutils.loads(interface_config) - try: - cluster_name = ha_config["cluster_name"] - vrrp_group = ha_config["vrrp_group"] - data_macs = ha_config["data_macs"] - preempt_delay = ha_config["preempt_delay"] - priority = ha_config["priority"] - vip = ha_config["vip"] - tenant_id = ha_config["tenant_id"] - advertised_interval = ha_config["advertised_interval"] - except KeyError as err: - raise Exception("HA configuration for interface failed. Value " - "not found. %r" % str(err), - 400, dict(interface_config=ha_config)) - interface_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, - vip=vip, preempt_delay=preempt_delay, - priority=priority, cluster_name=cluster_name, - advertised_interval=advertised_interval, - tenant_id=tenant_id) - - interface_vrrp_commands = self.set_vrrp_for_interface(interface_info) - - self._execute_commands(interface_vrrp_commands, interface_info[ - 'tenant_id']) - logger.debug("VRRP succesfully configured for interfaces.") - return {'status': 200, 'message': 'VRRP succesfully configured for ' - 'interfaces'} - - def delete_vrrp(self, vrrp_config): - """ - :param self: - :param vrrp_config: - :return: - This method makes an assumption that detach of an interface will - finally clean the vrrp entry. That's why doesn't raise any - exception, as was observed that even though it succeeds but raises an - exception. Investigation will continue. Also this methods doesn't - clean conntrack explicitly, instead it goes with VM delete. - Exception code will be incorporated once the exception established - case. - """ - vrrp_config = jsonutils.loads(vrrp_config) - data_macs = vrrp_config["data_macs"] - - data_interface, data_ip = self._get_interface_name( - dict(data_mac=data_macs['provider_mac']), interface_type='data') - - provider_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface - - data_interface, data_ip = self._get_interface_name( - dict(data_mac=data_macs['stitching_mac']), interface_type='data') - stitching_vrrp_delete = "interfaces ethernet %s vrrp" % data_interface - - session.setup_config_session() - - try: - self.delete(provider_vrrp_delete.split()) - except Exception as err: - logger.error("Error deleting provider vrrp %r " % err) - - try: - self.delete(stitching_vrrp_delete.split()) - except Exception as err: - logger.error("Error deleting stitching vrrp %r " % err) - - session.commit() - time.sleep(5) - session.save() - session.teardown_config_session() - logger.debug("VRRP succesfully deleted for interfaces") - return {'status': 200, 'message': 'VRRP succesfully deleted for ' - 'interfaces'} - - def set_vrrp_for_interface(self, data_info): - interface_commands = list() - direct_call = False - if isinstance(data_info, str): - direct_call = True - data_info = jsonutils.loads(data_info) - data_macs = data_info.get("data_macs", {}) - vips = data_info.get("vip", {}) - vrrp_groups = data_info["vrrp_group"] - - for mac_type, mac in data_macs.iteritems(): - data_mac = dict(data_mac=str(mac)) - vip_type = mac_type.split("_")[0] + "_vip" - vip_ip = vips.get(vip_type) - if mac_type == "provider_mac": - vrrp_group = vrrp_groups["provider_vrrp_group"] - if mac_type == "stitching_mac": - vrrp_group = vrrp_groups["stitching_vrrp_group"] - - interface_name, ip = self._get_interface_name( - data_mac, interface_type='data') - - if not interface_name: - logger.error("Failed to configure VRRP, as unable to get " - "interface name.") - raise Exception('VRRP config failed.Failed to get interface' - ' name to configure vrrp', 400, - dict(data_info=data_info)) - - common_command = "interfaces ethernet %s vrrp vrrp-group %s " % ( - interface_name, vrrp_group) - - interface_address_set = "interfaces ethernet %s address %s " % ( - interface_name, ip) - - advt_interval_set = common_command + "advertise-interval %s " % ( - data_info["advertised_interval"]) - - preempt_set = common_command + "preempt true" - preempt_delay_set = common_command + "preempt-delay %s" % \ - data_info["preempt_delay"] - priority_set = common_command + "priority %s" % data_info[ - "priority"] - rfc_set = common_command + "rfc3768-compatibility" - sync_group_set = common_command + "sync-group %s " % data_info[ - "cluster_name"] - virtual_address_set = common_command + "virtual-address %s" % \ - vip_ip - - interface_commands += [interface_address_set, advt_interval_set, - preempt_set, preempt_delay_set, - priority_set, rfc_set, sync_group_set, - virtual_address_set] - - logger.debug("Interface commands - %r ", interface_commands) - if not direct_call: - return interface_commands - else: - self._execute_commands(interface_commands, data_info.get( - 'tenant_id')) - return dict(message='Interface configured succesfully') - - @staticmethod - def _set_conntrack(cluster_name, event_queue_size, mcast_group, - monitoring_interface, sync_queue_size): - peer_link_set = "interfaces ethernet %s description PEER-LINK" % \ - monitoring_interface - event_queue_set = "service conntrack-sync event-listen-queue-size " \ - "%s" % str(event_queue_size) - cluster_set = "service conntrack-sync failover-mechanism vrrp " \ - "sync-group " + cluster_name - interface_set = "service conntrack-sync interface %s" % \ - monitoring_interface - mcast_set = "service conntrack-sync mcast-group %s " % mcast_group - sync_queue_set = "service conntrack-sync sync-queue-size %s " % \ - str(sync_queue_size) - commands = [peer_link_set, event_queue_set, cluster_set, - interface_set, mcast_set, sync_queue_set] - - logger.debug("Conntrack commands - %r " % commands) - return commands - - @staticmethod - def _get_interface_name(ha_config, interface_type=None): - """ - :param ha_config: - :param interface_type: - :return: - """ - interfaces = netifaces.interfaces() - for interface in interfaces: - physical_interface = netifaces.ifaddresses(interface).get(AF_LINK) - if not physical_interface: - continue - if AF_INET not in netifaces.ifaddresses(interface).keys(): - continue - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - ip_addr = netifaces.ifaddresses(interface)[AF_INET][0]['addr'] - netmask = netifaces.ifaddresses(interface)[AF_INET][0]['netmask'] - if mac_addr == ha_config.get('monitoring_mac', None) and \ - interface_type.lower() == 'monitoring': - return interface, ip_addr - elif (mac_addr == ha_config.get('data_mac', None) and - interface_type.lower() == 'data'): - mlen = sum([bin(int(x)).count('1') for x in - netmask.split('.')]) - ip_addr += ("/" + str(mlen)) - return interface, ip_addr - - logger.error("interface name none, ha_config: %s" % ha_config) - return None, None - - def get_conntrack_request_data(self, ha_config): - try: - monitoring_mac = ha_config["monitoring_mac"] - queue_size = ha_config.get("queue_size", 8) - cluster_name = ha_config["cluster_name"] - mcast_group = ha_config["mcast_group"] - sync_queue_size = ha_config.get("sync_queue_size", 1) - vrrp_group = ha_config["vrrp_group"] - data_macs = ha_config["data_macs"] - preempt_delay = ha_config["preempt_delay"] - priority = ha_config["priority"] - vip = ha_config["vip"] - advertised_interval = ha_config["advertised_interval"] - except KeyError as err: - raise Exception("Parameters missing for conntrack configuration " - "%r" % str(err), 400, {"ha_config": ha_config}) - - monitoring_info = dict(monitoring_mac=monitoring_mac, - event_queue_size=queue_size, - cluster_name=cluster_name, - mcast_group=mcast_group, - sync_queue_size=sync_queue_size) - - data_info = dict(vrrp_group=vrrp_group, data_macs=data_macs, - vip=vip, preempt_delay=preempt_delay, - priority=priority, cluster_name=cluster_name, - advertised_interval=advertised_interval) - - return monitoring_info, data_info - - def get_interface_data(self, interface_config): - try: - data_macs = interface_config["data_macs"] - advertised_interval = interface_config["advertised_interval"] - vrrp_group = interface_config["vrrp_group"] - preempt_delay = interface_config["preempt_delay"] - priority = interface_config["priority"] - vip = interface_config["vip"] - except KeyError: - pass - - data_info = dict(data_macs=data_macs, - advertised_interval=advertised_interval, - vrrp_group=vrrp_group, preempt_delay=preempt_delay, - priority=priority, vip=vip) - - return data_info - - def _execute_commands(self, all_commands, tenant_id=None): - session.setup_config_session() - for command in all_commands: - try: - self.set(command.split()) - except Exception: - logger.error("Failed to configure HA. Tenant - %r" % tenant_id) - session.teardown_config_session() - raise Exception("Failed to configure HA for tenant %s" % - tenant_id, 400, {"commands": all_commands, - "failed_command": command}) - try: - session.commit() - except Exception: - logger.error("Failed to commit HA configuration. Tenant - %r" - % tenant_id) - session.discard() - time.sleep(2) - session.teardown_config_session() - raise Exception("Failed to configure HA for tenant %s" % tenant_id, - 400, {"commands": all_commands, - "failed_command": command}) - time.sleep(5) - session.save() - time.sleep(5) - session.teardown_config_session() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py index 936cec1c14..a5d334fe24 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py @@ -41,12 +41,12 @@ def run_command(self, command): return out def configure_rsyslog_as_client(self, config): - command = """ - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system syslog host %s facility all level %s - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit - /opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save - """ % (config['server_ip'], config['log_level']) + command = ("/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin " + "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper set system " + "syslog host %s facility all level %s" + "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit" + "/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save" % ( + config['server_ip'], config['log_level'])) try: self.run_command(command) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py index 3204bcff0a..9f8a35f370 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py @@ -14,7 +14,8 @@ import os import sys -from execformat.executor import OperationFailed, execUtils +from execformat.executor import execUtils +from execformat.executor import OperationFailed from vyos_session import utils topdir = os.path.dirname(os.path.realpath(__file__)) + "../.." diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py index dcfed99ffb..a065971ade 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py @@ -11,10 +11,10 @@ # under the License. import logging -import subprocess -import time import netaddr import netifaces +import subprocess +import time from oslo_serialization import jsonutils @@ -152,7 +152,8 @@ def _get_if_name_by_cidr(self, cidr): ip_address = inet_info.get('addr') subnet_prefix = cidr.split("/") if (ip_address == subnet_prefix[0] and ( - len(subnet_prefix) == 1 or subnet_prefix[1] == "32")): + len(subnet_prefix) == 1 or subnet_prefix[ + 1] == "32")): return interface ip_address_netmask = '%s/%s' % (ip_address, netmask) interface_cidr = netaddr.IPNetwork(ip_address_netmask) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py index 5cd45ddceb..2f4cb5a3de 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py @@ -23,12 +23,12 @@ from oslo_serialization import jsonutils from edit_persistent_rule import EditPersistentRule -from flask import Flask, jsonify, request +from flask import Flask +from flask import jsonify +from flask import request from fw_module import VyosFWConfigClass -from ha_config import VYOSHAConfig from log_forwarder import APIHandler as apihandler from static_ip import StaticIp -from stats_parser import APIHandler as stats_apihandler from vpn_api_server import VPNHandler as vpnhandler from vyos_exception import VyosException from vyos_policy_based_routes import RoutesConfigHandler as routes_handler @@ -249,7 +249,7 @@ def configure_firewall_rule(): return send_error_response( VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( - 'configuring', 'firewall')))) + 'configuring', 'firewall')))) else: return jsonify(**response) @@ -267,7 +267,7 @@ def delete_firewall_rule(): return send_error_response( VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( - 'deleting', 'firewall')))) + 'deleting', 'firewall')))) else: return jsonify(**response) @@ -286,7 +286,7 @@ def update_firewall_rule(): return send_error_response( VyosException(str(err), status_code=500, payload=dict(err=error_msgs['unexpected'] % ( - 'updating', 'firewall')))) + 'updating', 'firewall')))) else: return jsonify(**response) @@ -337,63 +337,6 @@ def delete_stitching_route(): return jsonutils.dumps(dict(status=False, reason=err)) -@app.route('/configure_conntrack_sync', methods=['POST']) -def configure_conntrack_sync(): - global vyos_ha_config - try: - response = vyos_ha_config.configure_conntrack_sync(request.data) - except Exception as err: - # This flask version has issue in implicit way of registering - # error handler. - try: - return send_error_response(VyosException( - err[0], status_code=err[1], payload=err[2])) - except IndexError: - return send_error_response( - VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'configuring', 'conntrack sync')))) - else: - return jsonify(**response) - - -@app.route('/configure_interface_ha', methods=['POST']) -def configure_interface_ha(): - global vyos_ha_config - try: - response = vyos_ha_config.set_vrrp_for_interface(request.data) - except Exception as err: - try: - return send_error_response(VyosException( - err[0], status_code=err[1], payload=err[2])) - except IndexError: - return send_error_response( - VyosException(str(err), status_code=500, - payload=dict( - err=error_msgs['unexpected'] % ( - 'configuring', 'HA for the interface')))) - else: - return jsonify(**response) - - -@app.route('/delete_vrrp', methods=['DELETE']) -def delete_vrrp(): - global vyos_ha_config - try: - response = vyos_ha_config.delete_vrrp(request.data) - except Exception as err: - try: - return send_error_response(VyosException( - err[0], status_code=err[1], payload=err[2])) - except IndexError: - return send_error_response( - VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'deleting', 'VRRP')))) - else: - return jsonify(**response) - - def send_error_response(error): response = jsonify(error.to_dict()) response.status_code = error.status_code @@ -470,29 +413,6 @@ def configure_rsyslog_as_client(): return jsonutils.dumps(dict(status=False, reason=err)) -@app.route('/get-fw-stats', methods=['GET']) -def get_fw_stats(): - try: - mac_address = request.args.get('mac_address') - fw_stats = stats_apihandler().get_fw_stats(mac_address) - return jsonutils.dumps(dict(stats=fw_stats)) - except Exception as ex: - err = ("Error while getting firewall stats. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/get-vpn-stats', methods=['GET']) -def get_vpn_stats(): - try: - vpn_stats = stats_apihandler().get_vpn_stats() - return jsonutils.dumps(dict(stats=vpn_stats)) - except Exception as ex: - err = ("Error while getting vpn stats. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - def handler(signum, frame): if signum in [2, 3, 9, 11, 15]: sys.exit(0) @@ -545,9 +465,8 @@ def main(): :type ip_addr: Server listen address """ - global fw_module, vyos_ha_config + global fw_module fw_module = VyosFWConfigClass() - vyos_ha_config = VYOSHAConfig() ip_addr = get_interface_to_bind() signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py index 35292371ab..89ea9fceac 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py @@ -11,9 +11,9 @@ # under the License. import logging +import netifaces import time -import netifaces from execformat.executor import session from netifaces import AF_LINK from operations import configOpts diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py deleted file mode 100644 index 3cbbddd058..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/stats_parser.py +++ /dev/null @@ -1,342 +0,0 @@ -# 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 logging -import subprocess - -import netifaces -from netifaces import AF_LINK -from vyos_session import utils - -logger = logging.getLogger(__name__) -utils.init_logger(logger) - - -class APIHandler(object): - - def __init__(self): - pass - - def run_command(self, command): - proc = subprocess.Popen(command, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - out, err = proc.communicate() - if err: - logger.error("Unable to run command %s, ERROR- %s" % - (command, err)) - return None - return out - - def _get_interface_name(self, interface_mac): - interfaces = netifaces.interfaces() - - for interface in interfaces: - try: - mac_addr = netifaces.ifaddresses(interface)[AF_LINK][0]['addr'] - if mac_addr == interface_mac: - return interface - - except KeyError as keyerr: - logger.error('Unable to Parse Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - return None - - def parse_firewall_stats(self, interface, raw_stats): - """ - sample data for command show_firewall_detail.xsl : - - IPv4 Firewall "fw_eth1": - - Active on (eth1,OUT) - - rule action proto packets bytes - ---- ------ ----- ------- ----- - 11 accept tcp 476405 24805598 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:22 - - 12 accept icmp 1222414 101692572 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 - - 13 drop udp 150770055788 DROP - condition - saddr 11.0.2.0/24 daddr /* - - 14 accept tcp 3589762 238449000 - condition - saddr 11.0.1.0/24 daddr 11.0.2.0/24 tcp dpt:80 - - 10000 drop all 0 0 - condition - saddr 0.0.0.0/0 daddr 0.0.0.0/0 - - """ - firewall = {} - firewalls = [] - firewall_start = False - table = False - status = None - rule_keys = ['rulepriority', 'packets', 'bytes', 'action', - 'source', 'destination'] - - try: - for line in raw_stats.split('\n'): - words = line.split() - if 'IPv4 Firewall' in line: - firewall_start = True - if 'Active on' in line and interface in line and ( - firewall_start): - status = "Active" - (interface, direction) = words[2][1:-1].split(',') - firewall['interface'] = interface - firewall['dir'] = direction - firewall['rules'] = [] - elif len(words) >= 4: - if words[3] in ['ACCEPT', 'DROP'] and status == "Active": - table = True - rule = dict(zip(rule_keys, words)) - firewall['rules'].append(rule) - elif table and status == "Active": - command = ( - '/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_detail.xsl') - show_fw_data = self.run_command(command) - firewall = self.add_protocol_and_dest_port_info( - firewall, show_fw_data) - logger.info("packed firewall \n %s" % firewall) - firewalls.append(firewall) - break - - except KeyError as keyerr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return firewalls - - def add_protocol_and_dest_port_info(self, firewall, show_fw_data): - firewall_started = False - firewall_info_started = False - firewall_matcher = "Active on (" + firewall['interface'] - firewall_info_end = "-------------" - firewall_info = [] - for line in show_fw_data.split('\n'): - if "IPv4 Firewall" in line: - firewall_started = True - if firewall_matcher in line: - firewall_info_started = True - if firewall_started and firewall_info_started: - firewall_info.append(line) - if firewall_started and firewall_info_started and ( - firewall_info_end in line): - break - try: - for rule in firewall.get('rules', []): - for index, stats in enumerate(firewall_info): - if stats is not '': - extract_stats = stats.split() - if rule['rulepriority'] in extract_stats[0]: - rule['protocol'] = extract_stats[2] - for key in firewall_info[index + 1].split(): - if "dpt:" in key: - rule['dest_port'] = key.split(':')[1] - break - break - - except KeyError as keyerr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Firewall Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return firewall - - def parse_vpn_s2s(self, raw_stats): - """ - sample data for command show-ipsec-sa-detail : - - Peer IP: 192.168.20.194 - Peer ID: 120.0.0.2 - Local IP: 91.0.0.11 - Local ID: 91.0.0.11 - NAT Traversal: no - NAT Source Port: n/a - NAT Dest Port: n/a - - Tunnel 1: - State: up - Inbound SPI: c6621bd8 - Outbound SPI: cbf2ab18 - Encryption: aes128 - Hash: sha1 - PFS Group: 5 - - Local Net: 90.0.0.0/24 - Local Protocol: all - Local Port: all - - Remote Net: 120.0.0.0/24 - Remote Protocol: all - Remote Port: all - - Inbound Bytes: 654.0 - Outbound Bytes: 504.0 - Active Time (s): 289 - Lifetime (s): 1800 - - """ - s2s_connection = {} - s2s_connections = [] - - try: - for line in raw_stats.split('\n'): - key = '' - value = '' - if ':' in line: - key, value = line.split(":") - - if 'Peer IP' in key: - s2s_connection['peerip'] = value.strip(" \t\n\r") - - elif 'Local IP' in key: - s2s_connection['localip'] = value.strip(" \t\n\r") - - elif "Tunnel" in key: - s2s_connection['tunnels'] = [] - tunnel_info = {'tunnel': - key.strip(" \t\n\r").split(" ")[-1]} - - elif "Inbound Bytes" in key: - tunnel_info['in'] = value.strip(" \t\n\r") - - elif "Outbound Bytes" in key: - tunnel_info['out'] = value.strip(" \t\n\r") - s2s_connection['tunnels'].append(tunnel_info) - s2s_connections.append(s2s_connection) - s2s_connection = {} - - except KeyError as keyerr: - logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse IPSec VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return s2s_connections - - def parse_vpn_remote(self, raw_stats): - """ - sample data for command vyatta-show-ovpn.pl --mode=server : - - OpenVPN server status on vtun0 [] - - Client CN Remote IP Tunnel IP TX byte RX byte Connected Since - --------- --------- --------- ------- ------- --------------- - UNDEF 192.168.2.81 192.168.200.4 8.0K 2.7K Tue Mar 8 09:01:05 2016 - """ - table = False - remote_connection = {} - remote_connections = [] - keys = ['clientCN', 'remoteip', 'tunnelip', - 'in', 'out', 'connected_since'] - - try: - for line in raw_stats.split('\n'): - if "Client CN" in line: - table = True - elif len(line.split()) >= 5 and table and "---" not in line: - value_list = line.split()[:-5] - connected_since = " ".join(line.split()[5:]) - clients = filter(lambda value: value.strip(), value_list) - clients.append(connected_since) - remote_connection = dict(zip(keys, clients)) - remote_connections.append(remote_connection) - - except KeyError as keyerr: - logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'KeyError: {}'.format(keyerr)) - - except IndexError as inderr: - logger.error('Unable to Parse Remote VPN Stats Data, ' + - 'IndexError: {}'.format(inderr)) - - return remote_connections - - def get_fw_stats(self, mac_address): - """ - sample data for command show_firewall_statistics.xsl : - - IPv4 Firewall "fw_eth1": - - Active on (eth1,OUT) - - rule packets bytes action source destination - ---- ------- ----- ------ ------ ----------- - 11 476.22K 24.80M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 12 1.22M 101.66M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 13 3.43G 150.73G DROP 11.0.1.0/24 11.0.2.0/24 - 14 3.59M 238.39M ACCEPT 11.0.1.0/24 11.0.2.0/24 - 10000 0 0 DROP 0.0.0.0/0 0.0.0.0/0 - - """ - - parsed_stats = {} - - command = ('/opt/vyatta/bin/vyatta-show-firewall.pl "all_all" ' + - '/opt/vyatta/share/xsl/show_firewall_statistics.xsl') - - raw_stats = self.run_command(command) - interface = self._get_interface_name(mac_address) - if not interface: - logger.error('No interface available for mac address: %s' % - mac_address) - return parsed_stats - parsed_stats = self.parse_firewall_stats(interface, raw_stats) - - logger.info("Firewall stats Data, \n %s" % parsed_stats) - return parsed_stats - - def get_vpn_stats(self): - vpn_parsed_data = {} - command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-op-vpn.pl ' + - '--show-ipsec-sa-detail') - - raw_ipsec_stats = self.run_command(command) - if raw_ipsec_stats: - ipsec_parsed_data = self.parse_vpn_s2s(raw_ipsec_stats) - if ipsec_parsed_data: - vpn_parsed_data['ipsec'] = ipsec_parsed_data - else: - logger.warning("Empty IPSec VPN Stats") - else: - logger.warning("Empty IPSec VPN Stats") - - command = ('sudo /opt/vyatta/bin/sudo-users/vyatta-show-ovpn.pl ' + - '--mode=server') - - raw_remote_stats = self.run_command(command) - if raw_remote_stats: - remote_parsed_data = self.parse_vpn_remote(raw_remote_stats) - if remote_parsed_data: - vpn_parsed_data['remote'] = remote_parsed_data - else: - logger.warning("Empty Remote VPN Stats") - else: - logger.warning("Empty Remote VPN Stats") - - logger.info("VPN stats Data, \n %s" % vpn_parsed_data) - return vpn_parsed_data diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py index 736f6e7e6e..d3abea3222 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py @@ -14,7 +14,6 @@ import copy import fcntl import logging -import os import socket import struct import subprocess @@ -312,11 +311,6 @@ def _create_ipsec_site_tunnel(self, tunnel): self._set_commands(tun_cmds) - def _get_vrrp_group(self, ifname): - command = ( - "vbash -c -i 'show vrrp' | grep %s | awk '{print $2}'" % ifname) - return os.popen(command).read().strip() - def _create_ipsec_site_conn(self, ctx): cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) conn_cmds = cmds['conn'] @@ -332,18 +326,6 @@ def _create_ipsec_site_conn(self, ctx): esp = ctx['siteconns'][0]['ipsecpolicy'] ike = ctx['siteconns'][0]['ikepolicy'] - vrrp_cmd = None - if conn['stitching_fixed_ip'] and conn.get('standby_fip', None): - logger.debug("Get vrrp group number for interface %s" % ifname) - group_no = self._get_vrrp_group(ifname) - ip = conn['stitching_fixed_ip'] - vrrp_cmd = ( - 'set interfaces ethernet %s vrrp vrrp-group %s ' - 'run-transition-scripts master /config/scripts/restart_vpn' - ) % (ifname, group_no) - ifname = ifname + "v" + str(group_no) - logger.info("vrrp interface name: %s" % ifname) - conn_cmds[0] = conn_cmds[0] % (ifname) conn_cmds[1] = conn_cmds[1] % (conn['peer_address']) conn_cmds[2] = conn_cmds[2] % (conn['peer_address'], conn['psk']) @@ -361,8 +343,6 @@ def _create_ipsec_site_conn(self, ctx): conn_cmds[8] = conn_cmds[8] % ( conn['peer_address'], 1, conn['peer_cidrs'][0]) conn_cmds[9] = conn_cmds[9] % (conn['peer_address'], conn['access_ip']) - if vrrp_cmd: - conn_cmds.append(vrrp_cmd) self._set_commands(conn_cmds) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py index fd45358586..7646e59104 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py @@ -15,9 +15,9 @@ import shlex import subprocess +from vyos_session.configsession import ConfigSession +from vyos_session.configsession import SessionNotExists from vyos_session import utils -from vyos_session.configsession import (ConfigSession, - SessionNotExists) logger = logging.getLogger(__name__) utils.init_logger(logger) @@ -81,7 +81,7 @@ def _op_command(command=None): return out -class execUtils: +class execUtils(object): """ Executes possible operations in a Vyos configure session.""" def __init__(self, args): diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py index c80be9bb44..3bfb0a0f0d 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/configsession.py @@ -14,7 +14,10 @@ import os from uuid import uuid4 -from utils import _run, clean_environ, get_config_params, init_logger +from utils import _run +from utils import clean_environ +from utils import get_config_params +from utils import init_logger logger = logging.getLogger(__name__) init_logger(logger) @@ -72,7 +75,8 @@ def setup_config_session(self): env = dict() env['VYATTA_CHANGES_ONLY_DIR'] = \ '/opt/vyatta/config/tmp/changes_only_{0}'.format(identifier) - env['VYATTA_CONFIG_TEMPLATE'] = '/opt/vyatta/share/vyatta-cfg/templates' + env['VYATTA_CONFIG_TEMPLATE'] = ('/opt/vyatta/share/' + 'vyatta-cfg/templates') env['VYATTA_ACTIVE_CONFIGURATION_DIR'] = '/opt/vyatta/config/active' env['VYATTA_EDIT_LEVEL'] = '/' env['VYATTA_TEMP_CONFIG_DIR'] = '/opt/vyatta/config/tmp/new_config_{' \ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py index 3e522a02e6..02069e5e48 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_session/utils.py @@ -109,8 +109,8 @@ def _run(cmd, output=False): cmd_output, cmd_error = exec_pipe.communicate() # VPN commits succeed but we are getting perl locale warnings on stderr if exec_pipe.returncode != 0: - message = 'Executing command %s failed with error %s. Output is: %s' % ( - cmd, cmd_error, cmd_output) + message = ('Executing command %s failed with error %s. ' + 'Output is: %s' % (cmd, cmd_error, cmd_output)) logger.error(message) return False else: From daa466b611c9d0015d01a212d015946f0c832c26 Mon Sep 17 00:00:00 2001 From: dpaks Date: Tue, 5 Jul 2016 16:08:40 +0530 Subject: [PATCH 026/157] proper import of jsonutils lib; dib changes for new packages --- .../vyos/agent/src/config_server/fw_module.py | 3 +-- .../vyos/agent/src/config_server/routes_config_handler.py | 3 +-- .../vyos/agent/src/config_server/server2.py | 2 +- .../vyos/agent/src/config_server/vyos_policy_based_routes.py | 3 +-- .../tests/contrib/diskimage-create/vyos/customize_vyos.sh | 3 ++- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 2b7409ac0d..11bb9d9eb2 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -12,12 +12,11 @@ import ast import fw_constants +import jsonutils import logging import netifaces import time -from oslo_serialization import jsonutils - from execformat.executor import session from netifaces import AF_LINK from operations import configOpts diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py index a065971ade..29368c9763 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py @@ -10,14 +10,13 @@ # License for the specific language governing permissions and limitations # under the License. +import jsonutils import logging import netaddr import netifaces import subprocess import time -from oslo_serialization import jsonutils - from vyos_session import utils ROUTING_TABLE_BASE = 10 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py index 2f4cb5a3de..fb9637fe80 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py @@ -11,6 +11,7 @@ # under the License. import ast +import jsonutils import logging import netifaces import os @@ -20,7 +21,6 @@ from os.path import abspath from os.path import dirname -from oslo_serialization import jsonutils from edit_persistent_rule import EditPersistentRule from flask import Flask diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py index 271d9b822e..c28a177be0 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py @@ -11,14 +11,13 @@ # under the License. import copy +import jsonutils import logging import netaddr import netifaces import subprocess import time -from oslo_serialization import jsonutils - from operations import configOpts from vyos_session import utils diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh index ecb3bf393b..0b7b20a99f 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh +++ b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh @@ -39,7 +39,8 @@ save # update the repo sudo apt-get -o Acquire::Check-Valid-Until=false update # install dependent packages -sudo apt-get -y install python-netifaces python-flask python-netaddr +sudo apt-get -y install python-pip python-netifaces python-flask python-netaddr +sudo pip install ez_setup jsonutils # get oc-vyos package sudo apt-get -y --force-yes install vyos From 455e8e2d096ca73433222dc49c284dca3de5fd10 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 7 Jul 2016 10:44:32 +0530 Subject: [PATCH 027/157] jsonutils workaround --- .../vyos/agent/src/config_server/fw_module.py | 2 +- .../vyos/agent/src/config_server/routes_config_handler.py | 2 +- .../vyos/agent/src/config_server/server2.py | 2 +- .../vyos/agent/src/config_server/vyos_policy_based_routes.py | 2 +- .../tests/contrib/diskimage-create/vyos/customize_vyos.sh | 3 +-- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 11bb9d9eb2..8bea732f7c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -12,7 +12,7 @@ import ast import fw_constants -import jsonutils +import json as jsonutils import logging import netifaces import time diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py index 29368c9763..224d77ba66 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/routes_config_handler.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -import jsonutils +import json as jsonutils import logging import netaddr import netifaces diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py index fb9637fe80..e00ed2bdb9 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py @@ -11,7 +11,7 @@ # under the License. import ast -import jsonutils +import json as jsonutils import logging import netifaces import os diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py index c28a177be0..66432b5a99 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py @@ -11,7 +11,7 @@ # under the License. import copy -import jsonutils +import json as jsonutils import logging import netaddr import netifaces diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh index 0b7b20a99f..ecb3bf393b 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh +++ b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh @@ -39,8 +39,7 @@ save # update the repo sudo apt-get -o Acquire::Check-Valid-Until=false update # install dependent packages -sudo apt-get -y install python-pip python-netifaces python-flask python-netaddr -sudo pip install ez_setup jsonutils +sudo apt-get -y install python-netifaces python-flask python-netaddr # get oc-vyos package sudo apt-get -y --force-yes install vyos From c52c93a5fdbe58401b58d10937f1bdf8c4a85ef8 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 7 Jul 2016 14:11:04 +0530 Subject: [PATCH 028/157] remaining oc refs removed --- .../tests/contrib/diskimage-create/vyos/customize_vyos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh index ecb3bf393b..7bb2902ee0 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh +++ b/gbpservice/tests/contrib/diskimage-create/vyos/customize_vyos.sh @@ -41,7 +41,7 @@ sudo apt-get -o Acquire::Check-Valid-Until=false update # install dependent packages sudo apt-get -y install python-netifaces python-flask python-netaddr -# get oc-vyos package +# get vyos package sudo apt-get -y --force-yes install vyos set system task-scheduler task health-monitor executable path '/usr/share/vyos/config_server/interface_monitor.sh' From ae8975bd1b11df54fcdcfbef31a002213764c257 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 11 Jul 2016 10:03:52 +0530 Subject: [PATCH 029/157] review comments addressed except for class headers --- .../vyos/agent/DEBIAN/changelog | 14 ++- .../vyos/agent/DEBIAN/control | 14 ++- .../vyos/agent/DEBIAN/postinst | 12 ++ .../vyos/agent/DEBIAN/postrm | 13 ++ .../vyos/agent/etc/init.d/vyos | 112 ++++++++++-------- .../vyos/agent/src/LICENSE README | 2 - .../vyos/agent/src/auth_pam.pl | 12 ++ .../vyos/agent/src/auth_pam_domain_verify.pl | 12 ++ .../vyos/agent/src/auth_server.conf | 12 ++ .../agent/src/config_server/fw_constants.py | 7 +- .../vyos/agent/src/config_server/fw_module.py | 76 +++++------- .../agent/src/config_server/log_forwarder.py | 8 +- .../agent/src/config_server/operations.py | 2 +- .../vyos/agent/src/config_server/server.py | 4 +- .../vyos/agent/src/config_server/static_ip.py | 4 +- .../agent/src/config_server/vpn_api_server.py | 34 +++--- .../config_server/vyos_policy_based_routes.py | 4 +- .../vyos/agent/src/execformat/formator.py | 2 +- .../vyos/agent/src/init_script/restart_vpn | 13 ++ .../vyos/agent/src/license_readme | 14 +++ .../vyos/agent/src/op_commands.sh | 14 ++- .../vyos/agent/src/vpn_op_commands.pl | 14 ++- .../vyos/agent/src/vyos-pbr/README | 12 ++ .../vyos/agent/src/vyos-pbr/interface-post-up | 12 ++ .../vyos/agent/src/vyos-pbr/management_pbr | 13 ++ .../vyos/agent/src/vyos-pbr/no-default-route | 13 ++ .../vyos/agent/src/vyos-pbr/pbr | 13 ++ .../vyos/agent/src/vyos-pbr/pbr_init | 12 ++ .../vyos/agent/src/vyos.conf | 12 ++ .../agent/src/vyos_init_script/restart_vpn | 13 ++ .../vyos/build_vyos_deb.sh | 12 ++ 31 files changed, 375 insertions(+), 136 deletions(-) delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/agent/src/LICENSE README create mode 100644 gbpservice/nfp/service_vendor_agents/vyos/agent/src/license_readme diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog index 102b258564..4fe9d13bb6 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog @@ -1,4 +1,16 @@ -vyos (2.5) UNRELEASED; urgency=low +# 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. + +vyos (2.0) INITIAL RELEASE; urgency=low * Initial release. (Closes: #XXXXXX) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control index 3abd4fda59..3661c85602 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control @@ -1,6 +1,18 @@ +# 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. + Package: vyos Source: vyos -Version: 2.5 +Version: 2.0 Architecture: all Maintainer: One Convergence Section: devel diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst index c0776e9fba..78055a213c 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postinst @@ -1,5 +1,17 @@ #!/bin/bash +# 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. + sudo chown -R root:vyattacfg /config/auth/ sudo chown -R root:vyattacfg /config/scripts/ sudo update-rc.d vyos defaults diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm index b2c5a9f56d..8357694dd9 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm @@ -1,2 +1,15 @@ #!/bin/bash + +# 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. + echo "" diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos index bac0d2172d..d36f31861f 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/etc/init.d/vyos @@ -22,71 +22,79 @@ # Description: Provides the vyos agent service ### END INIT INFO set -e -PIDFILE=/var/run/elastic_services/vyos.pid -LOGFILE=/var/log/elastic_services/vyos.log +PIDFILE=/var/run/vyos/vyos.pid +LOGFILE=/var/log/vyos/vyos.log DAEMON=/usr/bin/vyos DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services +DAEMON_DIR=/var/run/vyos ENABLED=true + if test -f /etc/default/vyos; then -. /etc/default/vyos + . /etc/default/vyos fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services + +mkdir -p /var/run/vyos +mkdir -p /var/log/vyos . /lib/lsb/init-functions export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp +export TMPDIR=/var/lib/vyos/tmp + if [ ! -x ${DAEMON} ] ; then -exit 0 + exit 0 fi + case "$1" in start) test "$ENABLED" = "true" || exit 0 start=1 ## check if pidfile is there if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi + pid=`cat $PIDFILE` + ## check if pid is there + if [ "1$pid" -ne "1" ]; then + ## check if process with pid not running + set +e + kill -0 $pid > /dev/null 2>&1 + [ $? -eq 0 ] && start=0 + set -e + fi fi + if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting Vyos Agent" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? + ## ensure stale processes killed + set +e + running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` + [ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 + set -e + log_daemon_msg "Starting Vyos Agent" + # We have completely messed up the rc level scripts + sudo chown vyos:users -R /var/run/vyos + sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS + log_end_msg $? else -echo "vyos[$pid] is already running" + echo "vyos[$pid] is already running" fi + ;; stop) test "$ENABLED" = "true" || exit 0 + if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping Vyos Agent" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? + set +e + kill -0 `cat $PIDFILE` > /dev/null 2>&1 + if [ $? -eq 0 ]; then + set -e + log_daemon_msg "Stopping Vyos Agent" + start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} + log_end_msg $? + else + echo "No process with PID `cat $PIDFILE` found running, removing the PID file" + fi + rm $PIDFILE else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" + echo "PID file not existing" fi + ## ensure stale processes killed set +e running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` @@ -101,21 +109,23 @@ $0 start ;; reload) test "$ENABLED" = "true" || exit 0 + ## check if pidfile is there if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading vyos agent" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? + set +e + kill -0 `cat $PIDFILE` > /dev/null 2>&1 + if [ $? -eq 0 ]; then + set -e + log_daemon_msg "Reloading vyos agent" + start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE + log_end_msg $? + else + echo "No process with PID `cat $PIDFILE` found running, removing the PID file" + fi else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "Vyos agent is not running or PID file not existing" + echo "Vyos agent is not running or PID file not existing" fi + ;; status) test "$ENABLED" = "true" || exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/LICENSE README b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/LICENSE README deleted file mode 100644 index 81526a2dc4..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/LICENSE README +++ /dev/null @@ -1,2 +0,0 @@ -configsession.py and utils.py are opens source files and originally taken from -"https://github.com/abessifi/pyatta". \ No newline at end of file diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl index 5b3d73460b..face3217bf 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam.pl @@ -1,5 +1,17 @@ #!/usr/bin/perl +# 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. + use Data::Dumper; local $Data::Dumper::Terse =1; use JSON; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl index b0f2f312ab..2729c34ee3 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_pam_domain_verify.pl @@ -1,5 +1,17 @@ #!/usr/bin/perl +# 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. + use Data::Dumper; local $Data::Dumper::Terse =1; use JSON; diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_server.conf b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_server.conf index ef768a8728..c78bdbcb15 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_server.conf +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/auth_server.conf @@ -1,3 +1,15 @@ +# 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. + http://10.30.120.97:5000/ services neutron diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_constants.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_constants.py index d7ad755ea9..8aad936840 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_constants.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_constants.py @@ -10,7 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -actions = ["drop", "reject", "accept", "inspect"] -state = ["established", "invalid", "related"] -availability = ["enable", "disable"] -intercloud = False +ACTIONS = ["drop", "reject", "accept", "inspect"] +STATE = ["established", "invalid", "related"] +AVAILABILITY = ["enable", "disable"] diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 8bea732f7c..2901efc106 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -11,7 +11,6 @@ # under the License. import ast -import fw_constants import json as jsonutils import logging import netifaces @@ -19,10 +18,10 @@ from execformat.executor import session from netifaces import AF_LINK -from operations import configOpts +from operations import ConfigOpts from vyos_session import utils -FWN = 'firewall name' +FW_NAME = 'firewall name' rule = 'rule' firewall_rules = { 'protocol': '%s protocol %s', @@ -37,8 +36,12 @@ logger = logging.getLogger(__name__) utils.init_logger(logger) +''' Firewall module of VyOS agent. -class VyosFWConfigClass(configOpts): +''' + + +class VyosFWConfigClass(ConfigOpts): def __init__(self): super(VyosFWConfigClass, self).__init__() @@ -122,10 +125,10 @@ def set_up_rule_on_interfaces(self, firewall): def add_common_rule(self): self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) - default_action = (FWN + ' ' + self.fw_identifier + + default_action = (FW_NAME + ' ' + self.fw_identifier + ' default-action drop' ) - common_fw_rule_prefix = (FWN + ' ' + self.fw_identifier + ' ' + + common_fw_rule_prefix = (FW_NAME + ' ' + self.fw_identifier + ' ' + rule + ' 10') accept_action = (common_fw_rule_prefix + ' action accept') established_action = (common_fw_rule_prefix + @@ -142,7 +145,7 @@ def create_vyos_fw_rule(self, fw_rule): position = str(int(fw_rule.get('position', '100')) + 10) if position < 1: position *= 10 - common_fw_rule_prefix = (FWN + ' ' + self.fw_identifier + ' ' + + common_fw_rule_prefix = (FW_NAME + ' ' + self.fw_identifier + ' ' + rule + ' ' + position) self.rules.append(common_fw_rule_prefix) self.rules.append(''.join([common_fw_rule_prefix, ' action %s' % @@ -164,20 +167,13 @@ def create_vyos_fw_rule(self, fw_rule): raise Exception(err) def configure_interfaces(self): - if fw_constants.intercloud: - # TODO(Vikash) Its not always the bridge will have same name every - # time. Its only for intercloud - interface_conf = ("interfaces bridge br0 firewall in name " + - self.fw_identifier) + # It would be always 1 for now. + for interface in self.provider_ptg_interfaces: + if interface.lower() == 'lo': + continue + interface_conf = ('interfaces ethernet ' + interface + ' ' + + 'firewall out name ' + self.fw_identifier) self.rules += [interface_conf] - else: - # It would be always 1 for now. - for interface in self.provider_ptg_interfaces: - if interface.lower() == 'lo': - continue - interface_conf = ('interfaces ethernet ' + interface + ' ' + - 'firewall out name ' + self.fw_identifier) - self.rules += [interface_conf] def reset_firewall(self, firewall): fw_data = jsonutils.loads(firewall) @@ -198,29 +194,19 @@ def reset_firewall(self, firewall): session.setup_config_session() - if fw_constants.intercloud: - bridge_rule = ("interfaces bridge br0 firewall in name " + - self.fw_identifier) - try: - self.delete(bridge_rule.split()) - except Exception as err: - msg = (" Rule deletion on bridge failed - %s " % str( - err)) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) - else: - del_interface_rule = ( - 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + - ' ' + 'firewall') - try: - self.delete(del_interface_rule.split()) - except Exception as err: - session.discard() - session.teardown_config_session() - msg = ("Rule deletion on interface %s failed. ERROR: %s " % - (self.provider_ptg_interfaces[0], str(err))) - logger.error(msg) - raise Exception(msg, 400, dict(delete_success=False)) + del_interface_rule = ( + 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + + ' ' + 'firewall') + try: + self.delete(del_interface_rule.split()) + except Exception as err: + session.discard() + session.teardown_config_session() + msg = ("Rule deletion on interface %s failed. ERROR: %s " % + (self.provider_ptg_interfaces[0], str(err))) + logger.error(msg) + raise Exception(msg, 400, dict(delete_success=False)) + try: session.commit() except Exception as err: @@ -234,7 +220,7 @@ def reset_firewall(self, firewall): # sleep for 2 sec. Got removed in last merge. time.sleep(2) self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.fw_identifier + del_firewall = FW_NAME + ' ' + self.fw_identifier try: self.delete(del_firewall.split()) except Exception as err: @@ -322,7 +308,7 @@ def _ensure_clean_interface(self): 'interfaces ethernet ' + self.provider_ptg_interfaces[0] + ' ' + 'firewall') self.fw_identifier = ('fw' + '_' + self.provider_ptg_interfaces[0]) - del_firewall = FWN + ' ' + self.fw_identifier + del_firewall = FW_NAME + ' ' + self.fw_identifier try: self.delete(del_interface_rule.split()) # delete firewall diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py index a5d334fe24..04f5b87ce2 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/log_forwarder.py @@ -15,8 +15,8 @@ from vyos_session import utils -OP_SUCCESS = True -OP_FAILED = False +SUCCESS = True +FAILED = False logger = logging.getLogger(__name__) utils.init_logger(logger) @@ -50,7 +50,7 @@ def configure_rsyslog_as_client(self, config): try: self.run_command(command) - return OP_SUCCESS + return SUCCESS except Exception as ex: logger.error("Error while configuring rsyslog as client. %s" % ex) - return OP_FAILED + return FAILED diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py index 9f8a35f370..102e054a2d 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py @@ -26,7 +26,7 @@ utils.init_logger(logger) -class configOpts(object): +class ConfigOpts(object): def __init__(self): pass diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py index 3cbf31ce91..1896c188e6 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py @@ -20,7 +20,7 @@ init_logger(logger) -class VyOSServer(object): +class VyosServer(object): def __init__(self): pass @@ -35,7 +35,7 @@ def handler(signum, frame): def main(argv): - vyos_server = VyOSServer() + vyos_server = VyosServer() host = '' port = 0 if len(argv) != 5: diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py index 89ea9fceac..af8c64d637 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/static_ip.py @@ -16,7 +16,7 @@ from execformat.executor import session from netifaces import AF_LINK -from operations import configOpts +from operations import ConfigOpts from vyos_session.utils import init_logger logger = logging.getLogger(__name__) @@ -30,7 +30,7 @@ """ -class StaticIp(configOpts): +class StaticIp(ConfigOpts): def __init__(self): self.hotplug_timeout = 25 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py index d3abea3222..672055f481 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py @@ -22,11 +22,11 @@ from execformat.executor import session from netaddr import IPAddress from netaddr import IPNetwork -from operations import configOpts +from operations import ConfigOpts from vyos_session import utils -OP_SUCCESS = True -OP_FAILED = False +SUCCESS = True +FAILED = False OP_COMMAND_SCRIPT = "/usr/share/vyos/vpn_op_commands.pl" @@ -96,7 +96,7 @@ def __init__(self, **kwargs): self.message = _("No interface in the network '%(cidr)s'") % kwargs -class VPNHandler(configOpts): +class VPNHandler(ConfigOpts): def __init__(self): super(VPNHandler, self).__init__() @@ -112,7 +112,7 @@ def create_ipsec_site_conn(self, ctx): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS def create_ipsec_site_tunnel(self, tunnel): session.setup_config_session() @@ -121,7 +121,7 @@ def create_ipsec_site_tunnel(self, tunnel): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS def _ipsec_get_tunnel_idx(self, tunnel): command = 'perl' @@ -159,10 +159,10 @@ def delete_ipsec_site_tunnel(self, tunnel): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS except Exception as ex: logger.error("Error in deleting ipsec site tunnel. %s" % ex) - return OP_FAILED + return FAILED def delete_ipsec_site_conn(self, peer_address): try: @@ -172,10 +172,10 @@ def delete_ipsec_site_conn(self, peer_address): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS except Exception as ex: logger.error("Error in deleting ipsec site connection. %s" % ex) - return OP_FAILED + return FAILED def create_ssl_vpn_conn(self, ctx): session.setup_config_session() @@ -184,7 +184,7 @@ def create_ssl_vpn_conn(self, ctx): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS def ssl_vpn_push_route(self, route): session.setup_config_session() @@ -193,7 +193,7 @@ def ssl_vpn_push_route(self, route): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS def delete_ssl_vpn_conn(self, tunnel): session.setup_config_session() @@ -202,7 +202,7 @@ def delete_ssl_vpn_conn(self, tunnel): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS def delete_ssl_vpn_route(self, route): session.setup_config_session() @@ -211,10 +211,10 @@ def delete_ssl_vpn_route(self, route): session.save() time.sleep(2) session.teardown_config_session() - return OP_SUCCESS + return SUCCESS def get_ssl_vpn_conn_state(self, peer_address): - return OP_SUCCESS, 'UP' + return SUCCESS, 'UP' def get_ipsec_site_tunnel_state(self, tunnel): tunidx = self._ipsec_get_tunnel_idx(tunnel) @@ -230,7 +230,7 @@ def get_ipsec_site_tunnel_state(self, tunnel): out, err = proc.communicate() state = out.split('=')[1] state = state[:-1] - return OP_SUCCESS, state + return SUCCESS, state def _delete_ipsec_site_tunnel(self, tunnel): tunidx = self._ipsec_get_tunnel_idx(tunnel) @@ -387,7 +387,7 @@ def configure_static_route(self, action, cidr, gateway_ip): # Note: The issue is inconsistent, but not seen anymore with this # new approach of setting configuration utils._alternate_set_and_commit(route_cmd) - return OP_SUCCESS + return SUCCESS def _get_all_ifs(self): max_possible = 128 # arbitrary. raise if needed. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py index 66432b5a99..e697e4e3f4 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py @@ -18,7 +18,7 @@ import subprocess import time -from operations import configOpts +from operations import ConfigOpts from vyos_session import utils ROUTING_TABLE_BASE = 10 @@ -46,7 +46,7 @@ 'show interfaces ethernet %s policy route']} -class RoutesConfigHandler(configOpts): +class RoutesConfigHandler(ConfigOpts): def __init__(self): super(RoutesConfigHandler, self).__init__() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py index a4c8f3131f..54644b6c68 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/formator.py @@ -27,7 +27,7 @@ class ServiceError(Exception): pass -class showConfig(object): +class ShowConfig(object): def formator(self, options): args = ['show'] diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn index 2cb8fe4762..7981efb427 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn @@ -1,3 +1,16 @@ #!/bin/vbash + +# 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. + sudo rm /var/run/pluto.pid vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/license_readme b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/license_readme new file mode 100644 index 0000000000..23e8babb85 --- /dev/null +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/license_readme @@ -0,0 +1,14 @@ +# 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. + +configsession.py and utils.py are open source files and originally taken from +"https://github.com/abessifi/pyatta". \ No newline at end of file diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/op_commands.sh b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/op_commands.sh index a3aab4d1f1..7be7e16076 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/op_commands.sh +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/op_commands.sh @@ -1,6 +1,18 @@ #!/bin/vbash + +# 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. + cmd1="$1" source /opt/vyatta/etc/functions/script-template eval "$cmd1" echo $? -#run show vpn ipsec sa diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl index 223379ecbb..dc60021838 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vpn_op_commands.pl @@ -1,8 +1,18 @@ #!/usr/bin/perl -#Usage: sudo perl op_commands.pl get_tunnel_state peer_ip tunnel-id - +# 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. +#Usage: sudo perl op_commands.pl get_tunnel_state peer_ip tunnel-id use lib "/opt/vyatta/share/perl5/"; use Vyatta::VPN::OPMode; use Data::Dumper qw(Dumper); diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README index d01c9d7cbf..53356b3e1c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README @@ -1,3 +1,15 @@ +# 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. + 1) Add the following line in /etc/rc.local file as give in sample rc.local file sudo bash /usr/share/vyos-pbr/pbr_init & 2) Modify the interfaces file to looks like given sample interfaces file diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interface-post-up b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interface-post-up index 56862e7f18..1410b199dd 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interface-post-up +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/interface-post-up @@ -1,2 +1,14 @@ +# 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. + /sbin/route del default dev $IFACE echo 1 > /proc/sys/net/ipv4/conf/$IFACE/arp_ignore diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/management_pbr b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/management_pbr index 74f9c4fdc3..c76dd95712 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/management_pbr +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/management_pbr @@ -1,4 +1,17 @@ #!/bin/bash + +# 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. + echo "dhclient: $reason" case $reason in BOUND|RENEW|REBIND|REBOOT) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route index 150c0ef911..1b99349ba2 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/no-default-route @@ -1,4 +1,17 @@ #!/bin/bash + +# 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. + case $reason in BOUND|RENEW|REBIND|REBOOT) if [ "eth0" == $interface ]; then diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr index 90e91c1464..50ce788225 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr @@ -1,2 +1,15 @@ #!/bin/vbash + +# 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. + sudo ip route add default via $@ diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init index 7d356dd561..daf8069611 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/pbr_init @@ -1,5 +1,17 @@ #!/bin/bash +# 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. + #Converts decimal to ip address function dec2ip () { local ip dec=$1 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf index 65608518fb..4a2982b609 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos.conf @@ -1,3 +1,15 @@ +# 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. + [bin] vyos_sbin_dir = /opt/vyatta/sbin shell_api_path = /bin/cli-shell-api diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/restart_vpn index 2cb8fe4762..7981efb427 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/restart_vpn +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/restart_vpn @@ -1,3 +1,16 @@ #!/bin/vbash + +# 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. + sudo rm /var/run/pluto.pid vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh index 71c94e8153..a7c35efab8 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh +++ b/gbpservice/nfp/service_vendor_agents/vyos/build_vyos_deb.sh @@ -1,5 +1,17 @@ #! /bin/bash +# 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. + set -e SOURCE_CODE_DIR=$1 From 077fc5c28e9934d5890573621844e6634594a429 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 11 Jul 2016 10:20:49 +0530 Subject: [PATCH 030/157] review comments addressed except for class headers --- .../service_vendor_agents/vyos/agent/DEBIAN/control | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control index 3661c85602..a0ea052954 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control @@ -1,15 +1,3 @@ -# 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. - Package: vyos Source: vyos Version: 2.0 From 920370e0aec98f6390c55a7998f9b63e915c0f08 Mon Sep 17 00:00:00 2001 From: dpaks Date: Tue, 12 Jul 2016 10:43:33 +0530 Subject: [PATCH 031/157] Sometimes PBR addition doesn't work properly when interfaces don't get leased IPs. This fix waits for a definite period of time till the interface gets an IP. --- .../dhclient-exit-hooks.d/haproxy_routing | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing b/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing index d3ca20072a..fec50a304b 100644 --- a/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing +++ b/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing @@ -1,7 +1,6 @@ #!/bin/bash #set -x -#echo "interface : $interface" -#echo "new routers : $new_routers" + #Converts decimal to ip address function dec2ip () { local ip dec=$1 @@ -26,16 +25,28 @@ function ip2dec () { all_interfaces=`ifconfig | grep "Link encap" | grep -v "127.0.0.1" |cut -d: -d " " -f 1`; index=0; for i in $all_interfaces; do - if [ "$i" != "lo" ] #&& [ "$i" != "eth0" ] - #if [ "$i" == "$interface" ] + if [ "$i" != "lo" ] then - ip_addr=`ip addr show $i | grep "inet " | grep -v "/32" | awk -F'[/ ]+' '{ print $3 }'` + interface_ip_configure_time=30 + while [[ $interface_ip_configure_time -gt 0 ]]; do + ip_addr=`ip addr show $i | grep "inet " | grep -v "/32" | awk -F'[/ ]+' '{ print $3 }'` + if [[ -z $ip_addr ]]; then + sleep 5 + else + break + fi + ((interface_ip_configure_time-=5)) + done + if [[ -z $ip_addr ]]; then + echo "Hotplugged interface $i doesn't have an IP address. Hence, EXITING!!!" >&2 + exit 1 + fi + bcast_ip=`ip addr show $i | grep "inet " | grep -v "/32" | awk -F'[/ ]+' '{ print $6 }'`; filename="/var/lib/dhcp/dhclient."$i".leases" if [ "$i" == "$interface" ] then - #mask=`grep "option subnet-mask" $filename |tail -1| awk -F'[; ]+' '{ print $4 }'` mask=$new_subnet_mask else mask=`grep "option subnet-mask" $filename |tail -1| awk -F'[; ]+' '{ print $4 }'` @@ -72,7 +83,6 @@ for i in $all_interfaces; do fi index=`expr $index + 1` - #echo $net_ip_with_mask $i $mask_num `ip route flush dev $i` `ip route add $net_ip_with_mask dev $i` @@ -93,8 +103,6 @@ echo ${default_route[*]} index=0 echo $interface for interface in ${interfaces[*]}; do - #if [ "$interface1" == "$interface" ] - #then table_name=$interface"_table" mask_num=`ip addr show dev $interface | grep -m2 "inet " | grep -v "/32" | awk -F'[: ]+' '{ print $3 }'|cut -d '/' -f 2` net_ip_with_mask="${network_id[$index]}/${mask_num}" @@ -113,6 +121,5 @@ for interface in ${interfaces[*]}; do fi `ip rule add from ${ip_addresses[$index]} table $table_name` index=`expr $index + 1` - #fi done From 293a36684e263215e479348da6f86c4c4d628eec Mon Sep 17 00:00:00 2001 From: dpaks Date: Tue, 12 Jul 2016 11:35:47 +0530 Subject: [PATCH 032/157] indentation fix --- .../etc/dhcp/dhclient-exit-hooks.d/haproxy_routing | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing b/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing index fec50a304b..741e53de29 100644 --- a/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing +++ b/gbpservice/nfp/service_vendor_agents/haproxy/haproxy-agent/etc/dhcp/dhclient-exit-hooks.d/haproxy_routing @@ -35,7 +35,7 @@ for i in $all_interfaces; do else break fi - ((interface_ip_configure_time-=5)) + ((interface_ip_configure_time-=5)) done if [[ -z $ip_addr ]]; then echo "Hotplugged interface $i doesn't have an IP address. Hence, EXITING!!!" >&2 From 78b28b8d3803d5076f1252c26c2a463723e6e013 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Tue, 12 Jul 2016 17:12:50 +0530 Subject: [PATCH 033/157] Re-organized the lib/nfp and added comments --- devstack/lib/nfp | 511 +++++++++++++++++++++++----------------------- devstack/settings | 3 +- 2 files changed, 260 insertions(+), 254 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 6f23d676de..530f58bd6a 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -1,15 +1,42 @@ -#!/bin/bash - -TOP_DIR=$PWD - +# lib/nfp +# functions - functions specific to nfp implementation + +# Dependencies: +# ``functions`` file +# ``DEST`` must be defined + +# ``stack.sh`` calls the entry points in this order: +# +# - prepare_nfp_image_builder +# - install_nfpgbpservice +# - init_nfpgbpservice +# - assign_user_role_credential +# - create_nfp_gbp_resources +# - create_nfp_image +# - launch_[configurator/visibility]VM +# - nfp_logs_forword +# - copy_nfp_files_and_start_process +# +# ``unstack.sh`` calls the entry points in this order: + +# Set up default directories +DEVSTACK_DIR=$PWD NFPSERVICE_DIR=$DEST/gbp -DISK_IMAGE_DIR=$DEST/gbp/gbpservice/tests/contrib NEUTRON_CONF_DIR=/etc/neutron NEUTRON_CONF=$NEUTRON_CONF_DIR/neutron.conf NFP_CONF_DIR=/etc/nfp +DISKIMAGE_CREATE_DIR=$NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create + +# Save trace setting +XTRACE=$(set +o | grep xtrace) +set +o xtrace +# Functions +# --------- + +# prepare_nfp_image_builder() - Install the requirements for dib function prepare_nfp_image_builder { - sudo -H -E pip install -r $DISK_IMAGE_DIR/diskimage-create/requirements.txt + sudo -H -E pip install -r $DISKIMAGE_CREATE_DIR/requirements.txt sudo apt-get install -y --force-yes qemu-utils sudo apt-get install -y --force-yes dpkg-dev if [[ $NFP_DEVSTACK_MODE != base ]]; then @@ -17,7 +44,94 @@ function prepare_nfp_image_builder { fi } +# install_nfpgbpservice() - Collect source and prepare +function install_nfpgbpservice { + git_clone $GBPSERVICE_REPO $NFPSERVICE_DIR $GBPSERVICE_BRANCH + mv $NFPSERVICE_DIR/test-requirements.txt $NFPSERVICE_DIR/_test-requirements.txt + setup_develop $NFPSERVICE_DIR + mv -f $NEUTRON_CONF_DIR/policy.json $NEUTRON_CONF_DIR/policy.json.original 2>/dev/null; true + cp -f $NFPSERVICE_DIR/etc/policy.json $NEUTRON_CONF_DIR/policy.json + mv $NFPSERVICE_DIR/_test-requirements.txt $NFPSERVICE_DIR/test-requirements.txt +} + +# init_nfpgbpservice() - Initialize databases, etc. +function init_nfpgbpservice { + # Run GBP db migrations + gbp-db-manage --config-file $NEUTRON_CONF --config-file /$Q_PLUGIN_CONF_FILE upgrade head + iniset $NEUTRON_CONF DEFAULT policy_dirs $NFP_CONF_DIR +} + +function assign_user_role_credential { + source $DEVSTACK_DIR/openrc admin admin + + serviceTenantID=`keystone tenant-list | grep "service" | awk '{print $2}'` + serviceRoleID=`keystone role-list | grep "service" | awk '{print $2}'` + adminRoleID=`keystone role-list | grep "admin" | awk '{print $2}'` + + keystone user-role-add --user nova --tenant $serviceTenantID --role $serviceRoleID + keystone user-role-add --user neutron --tenant $serviceTenantID --role $adminRoleID +} + +function create_ext_net { + source $DEVSTACK_DIR/stackrc + + EXT_NET_NAME=ext-net + EXT_NET_SUBNET_NAME=ext-net-subnet + EXT_NET_GATEWAY=$EXT_NET_GATEWAY + EXT_NET_ALLOCATION_POOL_START=$EXT_NET_ALLOCATION_POOL_START + EXT_NET_ALLOCATION_POOL_END=$EXT_NET_ALLOCATION_POOL_END + EXT_NET_CIDR=$EXT_NET_CIDR + + source $DEVSTACK_DIR/openrc neutron service + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + neutron net-create --router:external=true --shared $EXT_NET_NAME + neutron subnet-create --ip_version 4 --gateway $EXT_NET_GATEWAY --name $EXT_NET_SUBNET_NAME --allocation-pool start=$EXT_NET_ALLOCATION_POOL_START,end=$EXT_NET_ALLOCATION_POOL_END $EXT_NET_NAME $EXT_NET_CIDR +} + +function create_ep_and_nsp { + subnet_id=`neutron net-list | grep "$EXT_NET_NAME" | awk '{print $6}'` + gbp external-segment-create --ip-version 4 --cidr $EXT_NET_CIDR --external-route destination=0.0.0.0/0,nexthop= --shared True --subnet_id=$subnet_id default + gbp nat-pool-create --ip-version 4 --ip-pool $EXT_NET_CIDR --external-segment default --shared True default + gbp ep-create --external-segments default ext_connect + gbp nsp-create --network-service-params type=ip_pool,name=vip_ip,value=nat_pool svc_mgmt_fip_policy +} + +function create_advance_sharing_ptg { + gbp l3policy-create --ip-version 4 --ip-pool 121.0.0.0/20 --proxy-ip-pool=192.167.0.0/24 --subnet-prefix-length 20 advanced_services_sharing_l3p + gbp l2policy-create --l3-policy advanced_services_sharing_l3p advance_sharing_l2p + gbp group-create --l2-policy advance_sharing_l2p Advance_Sharing_PTG +} + +function create_nfp_gbp_resources { + source $DEVSTACK_DIR/openrc neutron service + + if [[ $NFP_DEVSTACK_MODE = base ]]; then + IMAGE_NAME="reference_configurator_image" + FLAVOR=m1.nfp-tiny + gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=None --vendor NFP base_mode_lb + gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME,flavor=$FLAVOR --vendor NFP base_mode_fw_vm + else + gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=nova --vendor NFP lb_profile + gbp service-profile-create --servicetype LOADBALANCERV2 --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy_lbaasv2,device_type=nova,flavor=m1.small --vendor NFP lbv2_profile + gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vyos_fw_profile + gbp service-profile-create --servicetype VPN --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vpn_profile + if [[ $NFP_DEVSTACK_MODE = enterprise ]]; then + gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=asav,device_type=nova --vendor NFP asav_fw_profile + fi + create_ext_net + create_ep_and_nsp + create_advance_sharing_ptg + fi + gbp l3policy-create --ip-version 4 --proxy-ip-pool=192.169.0.0/24 --ip-pool 120.0.0.0/24 --subnet-prefix-length 24 service_management + gbp l2policy-create --l3-policy service_management svc_management_ptg + gbp group-create svc_management_ptg --service_management True --l2-policy svc_management_ptg + neutron router-gateway-clear l3p_service_management +} + function create_port_for_vm { +# $1 is image_name if [[ $1 = configurator ]]; then instance_name=$ConfiguratorInstanceName else @@ -29,7 +143,6 @@ function create_port_for_vm { IpAddr_purge_last=${IpAddr_extractor::-1} IpAddr=${IpAddr_purge_last//\"/} echo "IpAddr of port($PortId): $IpAddr" - if [[ $1 = configurator ]]; then configurator_image_name=$1 configurator_port_id=$PortId @@ -46,8 +159,9 @@ function configure_vis_ip_addr_in_docker { sed -i "s/VIS_VM_IP_ADDRESS/"$visibility_ip"/" $NFPSERVICE_DIR/gbpservice/nfp/configurator/Dockerfile } +# create_nfp_image() - Create and upload the service images function create_nfp_image { - source $TOP_DIR/openrc neutron service + source $DEVSTACK_DIR/openrc neutron service unset OS_USER_DOMAIN_ID unset OS_PROJECT_DOMAIN_ID @@ -56,7 +170,6 @@ function create_nfp_image { sudo service apache2 restart if [[ $NFP_DEVSTACK_MODE = base ]]; then - RefConfiguratorQcow2ImageName=reference_configurator_image echo "Building Image: $RefConfiguratorQcow2ImageName" sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/ref_configurator_conf.json @@ -64,18 +177,14 @@ function create_nfp_image { echo "Uploading Image: $RefConfiguratorQcow2ImageName" glance image-create --name $RefConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $RefConfiguratorQcow2Image openstack --os-cloud=devstack-admin flavor create --ram 512 --disk 3 --vcpus 1 m1.nfp-tiny - else - if [[ $NFP_DEVSTACK_MODE = enterprise ]]; then - ConfiguratorQcow2ImageName=configurator ConfiguratorInstanceName="configuratorVM_instance" create_port_for_vm $ConfiguratorQcow2ImageName - if [[ $ConfiguratorQcow2Image = build ]]; then echo "Building Image: $ConfiguratorQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/configurator_conf.json $TOP_DIR/local.conf + sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/configurator_conf.json $DEVSTACK_DIR/local.conf ConfiguratorQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $ConfiguratorQcow2ImageName" @@ -84,18 +193,15 @@ function create_nfp_image { VisibilityQcow2ImageName=visibility VisibilityInstanceName="VisibilityVM_instance" create_port_for_vm $VisibilityQcow2ImageName - if [[ $VisibilityQcow2Image = build ]]; then - # edits the docker file to add visibility vm IP address configure_vis_ip_addr_in_docker - # prepare visibility source, this is needed for diskimage build cd /home/stack/ sudo rm -rf visibility sudo git clone https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git -b $VISIBILITY_GIT_BRANCH echo "Building Image: $VisibilityQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/visibility_disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/visibility_conf.json $TOP_DIR/local.conf + sudo python $DISK_IMAGE_DIR/diskimage-create/visibility_disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/visibility_conf.json $DEVSTACK_DIR/local.conf VisibilityQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $VisibilityQcow2ImageName" @@ -104,23 +210,21 @@ function create_nfp_image { AsavQcow2ImageName=asav echo "Uploading Image: $AsavQcow2ImageName" glance image-create --name $AsavQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $AsavQcow2Image + PaloAltoQcow2ImageName=paloalto echo "Uploading Image: $PaloAltoQcow2ImageName" glance image-create --name $PaloAltoQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $PaloAltoQcow2Image - else - ConfiguratorQcow2ImageName=configurator ConfiguratorInstanceName="configuratorVM_instance" create_port_for_vm $ConfiguratorQcow2ImageName if [[ $ConfiguratorQcow2Image = build ]]; then echo "Building Image: $ConfiguratorQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/configurator_conf.json $TOP_DIR/local.conf + sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/configurator_conf.json $DEVSTACK_DIR/local.conf ConfiguratorQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $ConfiguratorQcow2ImageName" glance image-create --name $ConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $ConfiguratorQcow2Image - fi VyosQcow2ImageName=vyos @@ -143,7 +247,6 @@ function create_nfp_image { Haproxy_LBaasV2_Qcow2Image_Name=haproxy_lbaasv2 echo "Uploading Image: $Haproxy_LBaasV2_Qcow2Image_Name" glance image-create --name $Haproxy_LBaasV2_Qcow2Image_Name --disk-format qcow2 --container-format bare --visibility public --file $Haproxy_LBaasV2_Qcow2Image - fi # restore the apache2 setting that we did above @@ -151,32 +254,122 @@ function create_nfp_image { sudo service apache2 restart } -function init_nfpgbpservice { - # Run GBP db migrations - gbp-db-manage --config-file $NEUTRON_CONF --config-file /$Q_PLUGIN_CONF_FILE upgrade head - iniset $NEUTRON_CONF DEFAULT policy_dirs $NFP_CONF_DIR +function configure_configurator_user_data { + CUR_DIR=$PWD + sudo rm -rf /opt/configurator_user_data + sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/configurator_user_data /opt/. + cd /opt + sudo rm -rf my.key my.key.pub + sudo ssh-keygen -t rsa -N "" -f my.key + value=`sudo cat my.key.pub` + sudo echo $value + sudo sed -i "8 i\ -\ $value" configurator_user_data + sudo sed -i '9d' configurator_user_data + cd $CUR_DIR } -function install_nfpgbpservice { - git_clone $GBPSERVICE_REPO $NFPSERVICE_DIR $GBPSERVICE_BRANCH - mv $NFPSERVICE_DIR/test-requirements.txt $NFPSERVICE_DIR/_test-requirements.txt - setup_develop $NFPSERVICE_DIR - mv -f $NEUTRON_CONF_DIR/policy.json $NEUTRON_CONF_DIR/policy.json.original 2>/dev/null; true - cp -f $NFPSERVICE_DIR/etc/policy.json $NEUTRON_CONF_DIR/policy.json - mv $NFPSERVICE_DIR/_test-requirements.txt $NFPSERVICE_DIR/test-requirements.txt +function launch_configuratorVM { + echo "Collecting ImageId : for $configurator_image_name" + ImageId=`glance image-list | grep $configurator_image_name | awk '{print $2}'` + if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then + echo $ImageId + else + echo "No image found with name $configurator_image_name ..." + exit + fi + + configure_configurator_user_data + nova boot --flavor m1.medium --user-data /opt/configurator_user_data --image $ImageId --nic port-id=$configurator_port_id $ConfiguratorInstanceName + sleep 10 } -function assign_user_role_credential { - source $TOP_DIR/openrc admin admin - serviceTenantID=`keystone tenant-list | grep "service" | awk '{print $2}'` - serviceRoleID=`keystone role-list | grep "service" | awk '{print $2}'` - adminRoleID=`keystone role-list | grep "admin" | awk '{print $2}'` - keystone user-role-add --user nova --tenant $serviceTenantID --role $serviceRoleID - keystone user-role-add --user neutron --tenant $serviceTenantID --role $adminRoleID +function configure_visibility_user_data { +# $1 is the Visibility VM's IP address + CUR_DIR=$PWD + visibility_vm_ip=$1 + sudo rm -rf /opt/visibility_user_data + sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. + cd /opt + sudo rm -rf my.key my.key.pub + sudo ssh-keygen -t rsa -N "" -f my.key + value=`sudo cat my.key.pub` + sudo echo $value + sudo sed -i "s||${value}|" visibility_user_data + sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data + sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data + sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data + sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data + cd $CUR_DIR +} + +function attach_security_groups { + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + SecGroup="allow_all" + nova secgroup-create $SecGroup "allow all traffic" + nova secgroup-add-rule $SecGroup udp 1 65535 120.0.0.0/24 + nova secgroup-add-rule $SecGroup icmp -1 -1 120.0.0.0/24 + nova secgroup-add-rule $SecGroup tcp 1 65535 120.0.0.0/24 + nova secgroup-add-rule $SecGroup tcp 80 80 0.0.0.0/0 + nova secgroup-add-rule $SecGroup udp 514 514 0.0.0.0/0 + nova secgroup-add-rule $SecGroup tcp 443 443 0.0.0.0/0 + + nova add-secgroup $VisibilityInstanceName $SecGroup +} + +function launch_visibilityVM { + neutron net-create visibility-network + neutron subnet-create visibility-network 188.0.0.0/24 --name visibility-subnet + neutron router-create visibility-router + neutron router-gateway-set visibility-router $EXT_NET_NAME + neutron router-interface-add visibility-router visibility-subnet + ExtPortId=$(neutron port-create visibility-network | grep ' id ' | awk '{print $4}') + fip_id=$(neutron floatingip-create $EXT_NET_NAME | grep ' id '| awk '{print $4}') + neutron floatingip-associate $fip_id $ExtPortId + IpAddr_extractor=`neutron port-list --format value|grep $ExtPortId|awk '{print $6}'` + IpAddr_purge_last=${IpAddr_extractor::-1} + IpAddr2=${IpAddr_purge_last//\"/} + echo "Collecting IpAddr : for $ExtPortId" + echo $IpAddr2 + + echo "Collecting ImageId : for $visibility_image_name" + ImageId=`glance image-list|grep $visibility_image_name |awk '{print $2}'` + if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then + echo $ImageId + else + echo "No image found with name $visibility_image_name ..." + exit + fi + + configure_visibility_user_data $visibility_ip + echo "Launching Visibility image" + nova boot --image $ImageId --flavor m1.xlarge --user-data /opt/visibility_user_data --nic port-id=$visibility_port_id --nic port-id=$ExtPortId $VisibilityInstanceName + sleep 10 + attach_security_groups +} + +function nfp_logs_forword { + VISIBILITY_CONF="/etc/rsyslog.d/visibility.conf" + SYSLOG_CONFIG="/etc/rsyslog.conf" + log_facility=local1 + + sudo sed -i '/#$ModLoad imudp/ s/^#//' $SYSLOG_CONFIG + sudo sed -i '/#$UDPServerRun 514/ s/^#//' $SYSLOG_CONFIG + echo "Successfully enabled UDP in syslog" + + visibility_vm_ip_address=$(neutron floatingip-list --format value | grep "$IpAddr2" | awk '{print $3}') + echo "$log_facility.* @$visibility_vm_ip_address:514" | sudo tee $VISIBILITY_CONF + echo "Created $VISIBILITY_CONF file" + + sudo service rsyslog restart + if [ $? -ne 0 ]; then + echo "ERROR: Failed to restart rsyslog" + fi } function namespace_delete { - source $1/openrc neutron service + source $DEVSTACK_DIR/openrc neutron service #Deletion namespace NFP_P=`sudo ip netns | grep "nfp-proxy"` @@ -204,7 +397,6 @@ function namespace_delete { function namespace_create { SERVICE_MGMT_NET="l2p_svc_management_ptg" - cidr="/24" echo "Creating new namespace nfp-proxy...." #new namespace with name proxy @@ -256,7 +448,7 @@ function namespace_create { #get port id from router nampace port=`sudo ip netns exec $nm_space ip a | grep "tap" | tail -n 1 | awk '{print $7}'` - #get tag_id form port in ovs-bridge + #get tag_id form port in ovs-bridge tag_id=`sudo ovs-vsctl list port $port | grep "tag" | tail -n 1 | awk '{print $3}'` sudo ovs-vsctl set port pt1 tag=$tag_id @@ -266,253 +458,68 @@ function namespace_create { sudo ip netns exec nfp-proxy ip link set lo up sudo ip link set pt1 up - PING=`sudo ip netns exec nfp-proxy ping $2 -q -c 2 > /dev/null` + PING=`sudo ip netns exec nfp-proxy ping $configurator_ip -q -c 2 > /dev/null` if [ ${#PING} -eq 0 ]; then - echo "nfp-proxy namespcace creation success and reaching to $2" + echo "nfp-proxy namespcace creation success and reaching to $configurator_ip" else - echo "Fails reaching to $2" + echo "Fails reaching to $configurator_ip" fi sudo ip netns exec nfp-proxy /usr/bin/nfp_proxy --config-file=/etc/nfp_proxy.ini } -function create_ext_net { - source $TOP_DIR/stackrc - EXT_NET_NAME=ext-net - EXT_NET_SUBNET_NAME=ext-net-subnet - EXT_NET_GATEWAY=$EXT_NET_GATEWAY - EXT_NET_ALLOCATION_POOL_START=$EXT_NET_ALLOCATION_POOL_START - EXT_NET_ALLOCATION_POOL_END=$EXT_NET_ALLOCATION_POOL_END - EXT_NET_CIDR=$EXT_NET_CIDR - - source $TOP_DIR/openrc neutron service - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - neutron net-create --router:external=true --shared $EXT_NET_NAME - neutron subnet-create --ip_version 4 --gateway $EXT_NET_GATEWAY --name $EXT_NET_SUBNET_NAME --allocation-pool start=$EXT_NET_ALLOCATION_POOL_START,end=$EXT_NET_ALLOCATION_POOL_END $EXT_NET_NAME $EXT_NET_CIDR -} - -function create_ep_and_nsp { - subnet_id=`neutron net-list | grep "$EXT_NET_NAME" | awk '{print $6}'` - - gbp external-segment-create --ip-version 4 --cidr $EXT_NET_CIDR --external-route destination=0.0.0.0/0,nexthop= --shared True --subnet_id=$subnet_id default - gbp nat-pool-create --ip-version 4 --ip-pool $EXT_NET_CIDR --external-segment default --shared True default - gbp ep-create --external-segments default ext_connect - gbp nsp-create --network-service-params type=ip_pool,name=vip_ip,value=nat_pool svc_mgmt_fip_policy -} - -function create_advance_sharing_ptg { - gbp l3policy-create --ip-version 4 --ip-pool 121.0.0.0/20 --proxy-ip-pool=192.167.0.0/24 --subnet-prefix-length 20 advanced_services_sharing_l3p - gbp l2policy-create --l3-policy advanced_services_sharing_l3p advance_sharing_l2p - gbp group-create --l2-policy advance_sharing_l2p Advance_Sharing_PTG -} - -function create_nfp_gbp_resources { - source $TOP_DIR/openrc neutron service - - if [[ $NFP_DEVSTACK_MODE = base ]]; then - - IMAGE_NAME="reference_configurator_image" - FLAVOR=m1.nfp-tiny - gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=None --vendor NFP base_mode_lb - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME,flavor=$FLAVOR --vendor NFP base_mode_fw_vm - - else - - gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=nova --vendor NFP lb_profile - gbp service-profile-create --servicetype LOADBALANCERV2 --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy_lbaasv2,device_type=nova,flavor=m1.small --vendor NFP lbv2_profile - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vyos_fw_profile - gbp service-profile-create --servicetype VPN --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vpn_profile - - if [[ $NFP_DEVSTACK_MODE = enterprise ]]; then - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=asav,device_type=nova --vendor NFP asav_fw_profile - fi - create_ext_net - create_ep_and_nsp - create_advance_sharing_ptg - - fi - - gbp l3policy-create --ip-version 4 --proxy-ip-pool=192.169.0.0/24 --ip-pool 120.0.0.0/24 --subnet-prefix-length 24 service_management - gbp l2policy-create --l3-policy service_management svc_management_ptg - - gbp group-create svc_management_ptg --service_management True --l2-policy svc_management_ptg - neutron router-gateway-clear l3p_service_management -} - -function configure_configurator_user_data { - CUR_DIR=$PWD - sudo rm -rf /opt/configurator_user_data - sudo cp -r $DEST/gbp/devstack/exercises/nfp_service/user-data/configurator_user_data /opt/. - cd /opt - sudo rm -rf my.key my.key.pub - sudo ssh-keygen -t rsa -N "" -f my.key - value=`sudo cat my.key.pub` - sudo echo $value - sudo sed -i "8 i\ -\ $value" configurator_user_data - sudo sed -i '9d' configurator_user_data - cd $CUR_DIR -} - -function launch_configuratorVM { - echo "Collecting ImageId : for $configurator_image_name" - ImageId=`glance image-list | grep $configurator_image_name | awk '{print $2}'` - if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then - echo $ImageId - else - echo "No image found with name $configurator_image_name ..." - exit - fi - - configure_configurator_user_data - nova boot --flavor m1.medium --user-data /opt/configurator_user_data --image $ImageId --nic port-id=$configurator_port_id $ConfiguratorInstanceName - sleep 10 -} - function copy_nfp_files_and_start_process { cd /opt/stack/gbp/gbpservice/nfp - sudo cp -r bin/nfp /usr/bin/ + sudo cp -r bin/nfp /usr/bin/ sudo chmod +x /usr/bin/nfp sudo rm -rf /etc/nfp_* - sudo cp -r bin/nfp_orchestrator.ini /etc/ - sudo cp -r bin/nfp_proxy_agent.ini /etc/ + sudo cp -r bin/nfp_orchestrator.ini /etc/ + sudo cp -r bin/nfp_proxy_agent.ini /etc/ [[ $NFP_DEVSTACK_MODE != base ]] && sudo cp -r bin/nfp_config_orch.ini /etc/ - sudo cp -r bin/nfp_proxy.ini /etc/nfp_proxy.ini - sudo cp -r bin/nfp_proxy /usr/bin/ + sudo cp -r bin/nfp_proxy.ini /etc/nfp_proxy.ini + sudo cp -r bin/nfp_proxy /usr/bin/ if [[ $NFP_DEVSTACK_MODE = base ]]; then - IpAddr=127.0.0.1 - CONFIGURATOR_PORT=8080 + configurator_ip=127.0.0.1 + configurator_port=8080 else - CONFIGURATOR_PORT=8070 - IpAddr=$configurator_ip + configurator_ip=$configurator_ip + configurator_port=8070 fi + echo "Configuring proxy.ini .... with rest_server_address as $configurator_ip:$configurator_port" + sudo sed -i "s/rest_server_address=*.*/rest_server_address=$configurator_ip/g" /etc/nfp_proxy.ini + sudo sed -i "s/rest_server_port= *.*/rest_server_port=$configurator_port/g" /etc/nfp_proxy.ini - echo "Configuring proxy.ini .... with rest_server_address as $IpAddr" - sudo sed -i "s/rest_server_address=*.*/rest_server_address=$IpAddr/g" /etc/nfp_proxy.ini - sudo sed -i "s/rest_server_port= *.*/rest_server_port=$CONFIGURATOR_PORT/g" /etc/nfp_proxy.ini + sed -i 's#source.*#source '$DEVSTACK_DIR'/openrc demo demo#g' /opt/stack/gbp/devstack/exercises/nfp_service/*.sh + source $DEVSTACK_DIR/functions-common - sed -i 's#source.*#source '$TOP_DIR'/openrc demo demo#g' /opt/stack/gbp/devstack/exercises/nfp_service/*.sh - source $TOP_DIR/functions-common - - echo "Starting orchestrator >>>> under screen named : nfp_orchestrator" + echo "Starting orchestrator >>>> under screen named : nfp_orchestrator" run_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file /opt/stack/logs/nfp_orchestrator.log" sleep 4 - echo "Starting proxy_agent >>>> under screen named : nfp_proxy_agent" + echo "Starting proxy_agent >>>> under screen named : nfp_proxy_agent" run_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file /opt/stack/logs/nfp_proxy_agent.log" sleep 4 echo "Starting proxy server under Namespace : nfp-proxy namespace >>>> under screen named : nfp_proxy" - run_process nfp_proxy "source $NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete $TOP_DIR; namespace_create $TOP_DIR $IpAddr" + run_process nfp_proxy "source $NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete; namespace_create" sleep 10 if [[ $NFP_DEVSTACK_MODE != base ]]; then - echo "Starting nfp config orchestrator >>>> under screen named : nfp_config_orchestrator" + echo "Starting nfp config orchestrator >>>> under screen named : nfp_config_orchestrator" run_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file /opt/stack/logs/nfp_config_orchestrator.log" else cd pecan/api sudo python setup.py develop - echo "Starting nfp_base_configurator >>>> under screen named : nfp_base_configurator" + echo "Starting nfp_base_configurator >>>> under screen named : nfp_base_configurator" run_process nfp_base_configurator "cd /opt/stack/gbp/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" fi sleep 1 echo "Running gbp-db-manage" - source $TOP_DIR/openrc neutron service + source $DEVSTACK_DIR/openrc neutron service gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head sleep 2 echo "NFP configuration done...!! " } - -function nfp_logs_forword { - VISIBILITY_CONF="/etc/rsyslog.d/visibility.conf" - SYSLOG_CONFIG="/etc/rsyslog.conf" - log_facility=local1 - - sudo sed -i '/#$ModLoad imudp/ s/^#//' $SYSLOG_CONFIG - sudo sed -i '/#$UDPServerRun 514/ s/^#//' $SYSLOG_CONFIG - echo "Successfully enabled UDP in syslog" - - visibility_vm_ip_address=$(neutron floatingip-list --format value | grep "$IpAddr2" | awk '{print $3}') - echo "$log_facility.* @$visibility_vm_ip_address:514" | sudo tee $VISIBILITY_CONF - echo "Created $VISIBILITY_CONF file" - - sudo service rsyslog restart - if [ $? -ne 0 ]; then - echo "ERROR: Failed to restart rsyslog" - fi -} - -function configure_visibility_user_data { - CUR_DIR=$PWD - visibility_vm_ip=$1 - - sudo rm -rf /opt/visibility_user_data - sudo cp -r $DEST/gbp/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. - cd /opt - - sudo rm -rf my.key my.key.pub - sudo ssh-keygen -t rsa -N "" -f my.key - value=`sudo cat my.key.pub` - sudo echo $value - sudo sed -i "s||${value}|" visibility_user_data - - sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data - sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data - sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data - sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data - - cd $CUR_DIR -} - -function attach_security_groups { - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - - SecGroup="allow_all" - nova secgroup-create $SecGroup "allow all traffic" - nova secgroup-add-rule $SecGroup udp 1 65535 120.0.0.0/24 - nova secgroup-add-rule $SecGroup icmp -1 -1 120.0.0.0/24 - nova secgroup-add-rule $SecGroup tcp 1 65535 120.0.0.0/24 - nova secgroup-add-rule $SecGroup tcp 80 80 0.0.0.0/0 - nova secgroup-add-rule $SecGroup udp 514 514 0.0.0.0/0 - nova secgroup-add-rule $SecGroup tcp 443 443 0.0.0.0/0 -} - -function launch_visibilityVM { - neutron net-create visibility-network - neutron subnet-create visibility-network 188.0.0.0/24 --name visibility-subnet - neutron router-create visibility-router - neutron router-gateway-set visibility-router $EXT_NET_NAME - neutron router-interface-add visibility-router visibility-subnet - ExtPortId=$(neutron port-create visibility-network | grep ' id ' | awk '{print $4}') - - fip_id=$(neutron floatingip-create $EXT_NET_NAME | grep ' id '| awk '{print $4}') - neutron floatingip-associate $fip_id $ExtPortId - - IpAddr_extractor=`neutron port-list --format value|grep $ExtPortId|awk '{print $6}'` - IpAddr_purge_last=${IpAddr_extractor::-1} - IpAddr2=${IpAddr_purge_last//\"/} - echo "Collecting IpAddr : for $ExtPortId" - echo $IpAddr2 - - configure_visibility_user_data $visibility_ip - - echo "Collecting ImageId : for $visibility_image_name" - ImageId=`glance image-list|grep $visibility_image_name |awk '{print $2}'` - if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then - echo $ImageId - else - echo "No image found with name $visibility_image_name ..." - exit - fi - - attach_security_groups - echo "Launching Visibility image" - nova boot --image $ImageId --flavor m1.xlarge --user-data /opt/visibility_user_data --nic port-id=$visibility_port_id --nic port-id=$ExtPortId $VisibilityInstanceName - - sleep 10 - nova add-secgroup $VisibilityInstanceName $SecGroup -} diff --git a/devstack/settings b/devstack/settings index 478e42d069..b7907e1b93 100755 --- a/devstack/settings +++ b/devstack/settings @@ -47,8 +47,7 @@ if [[ $ENABLE_NFP = True ]]; then enable_service nfp_orchestrator enable_service nfp_proxy enable_service nfp_proxy_agent - [[ $NFP_DEVSTACK_MODE = base ]] && enable_service nfp_base_configurator - [[ $NFP_DEVSTACK_MODE != base ]] && enable_service nfp_config_orchestrator + [[ $NFP_DEVSTACK_MODE = base ]] && enable_service nfp_base_configurator || enable_service nfp_config_orchestrator fi OVS_PHYSICAL_BRIDGE=br-ex From 7af605c2d65d63ea929b9889e6b07b49cbc02b13 Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 13 Jul 2016 11:40:44 +0530 Subject: [PATCH 034/157] review comments addressed except for class headers --- .../nfp/configurator/agents/agent_base.py | 2 +- .../nfp/configurator/agents/firewall.py | 2 +- .../drivers/firewall/vyos/vyos_fw_driver.py | 389 ++++++-------- .../vyos/agent/DEBIAN/changelog | 2 - .../vyos/agent/DEBIAN/control | 2 +- .../vyos/agent/DEBIAN/postrm | 15 - .../service_vendor_agents/vyos/agent/bin/vyos | 2 +- .../vyos/agent/src/config_server/fw_module.py | 10 +- .../agent/src/config_server/operations.py | 4 +- .../vyos/agent/src/config_server/server.py | 474 ++++++++++++++++- .../vyos/agent/src/config_server/server2.py | 478 ------------------ .../agent/src/config_server/vpn_api_server.py | 2 +- .../vyos/agent/src/config_server/vyos_dhc.py | 29 -- .../config_server/vyos_policy_based_routes.py | 3 +- .../vyos/agent/src/execformat/executor.py | 23 +- .../vyos/agent/src/init_script/restart_vpn | 16 - .../vyos/agent/src/init_script/vyos | 130 ----- .../vyos/agent/src/vyos-pbr/README | 2 +- .../vyos/agent/src/vyos_init_script/vyos | 130 ----- 19 files changed, 631 insertions(+), 1084 deletions(-) delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py delete mode 100644 gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_dhc.py delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/vyos delete mode 100755 gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/vyos diff --git a/gbpservice/nfp/configurator/agents/agent_base.py b/gbpservice/nfp/configurator/agents/agent_base.py index fdd509e0f7..8275a998b0 100644 --- a/gbpservice/nfp/configurator/agents/agent_base.py +++ b/gbpservice/nfp/configurator/agents/agent_base.py @@ -68,7 +68,7 @@ def process_request(self, sa_req_list, notification_data): # In case of malformed input, send failure notification if not self.validate_request(sa_req_list, notification_data): - # TODO(JAGADISH): Need to send failure notification + # REVISIT(JAGADISH): Need to send failure notification return # Multiple request data blobs needs batch processing. Send batch diff --git a/gbpservice/nfp/configurator/agents/firewall.py b/gbpservice/nfp/configurator/agents/firewall.py index e7110c2065..a9e0d07152 100644 --- a/gbpservice/nfp/configurator/agents/firewall.py +++ b/gbpservice/nfp/configurator/agents/firewall.py @@ -289,7 +289,7 @@ def invoke_driver_for_plugin_api(self, ev): agent_info, firewall['id'], firewall) except Exception as err: - # TODO(VIKASH) Is it correct to raise ? As the subsequent + # REVISIT(VIKASH) Is it correct to raise ? As the subsequent # attempt to clean will only re-raise the last one.And it # can go on and on and may not be ever recovered. self.plugin_rpc.set_firewall_status( diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index 1df9aee6a4..89679953a4 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -22,10 +22,56 @@ vyos_fw_constants as const) from gbpservice.nfp.configurator.lib import constants as common_const from gbpservice.nfp.configurator.lib import fw_constants as fw_const +from nntplib import resp LOG = nfp_logging.getLogger(__name__) +""" REST API wrapper class that provides POST method to +communicate with the Service VM. + +""" + + +class RestApi(object): + + def __init__(self, timeout): + self.timeout = timeout + + def post(self, url, data): + """ Invokes REST POST call to the Service VM. + + :param url: URL to connect. + :param data: data to be sent. + + Returns: SUCCESS/Error message + + """ + + try: + data = jsonutils.dumps(data) + resp = requests.post(url, data, timeout=self.timeout) + except requests.exceptions.ConnectionError as err: + msg = ("Failed to establish connection to the service at URL: %r. " + "ERROR: %r" % (url, str(err).capitalize())) + return msg + except Exception as err: + msg = ("Failed to issue POST call " + "to service. URL: %r, Data: %r. Error: %r" % + (url, data, str(err).capitalize())) + return msg + + try: + result = resp.json() + except ValueError as err: + msg = ("Unable to parse response, invalid JSON. URL: " + "%r. %r" % (url, str(err).capitalize())) + return msg + if resp.status_code not in common_const.SUCCESS_CODES: + return result + return common_const.STATUS_SUCCESS + + """ Firewall generic configuration driver for handling device configuration requests. @@ -75,38 +121,27 @@ def _configure_static_ips(self, resource_data): msg = ("Initiating POST request to add static IPs for primary " "service at: %r" % mgmt_ip) LOG.info(msg) - try: - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to primary service at: " - "%r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while adding " - "static IPs for primary service at: %r. " - "ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + err_msg = ("Static IP POST request to the VyOS firewall " + "service at %s failed. " % url) try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response, invalid JSON. URL: " - "%r. %r" % (url, str(err).capitalize())) - LOG.error(msg) - return msg - if not result['status']: - msg = ("Error adding static IPs. URL: %r. Reason: %s." % - (url, result['reason'])) - LOG.error(msg) - return msg + resp = self.rest_api.post(url, data) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - msg = ("Static IPs successfully added.") - LOG.info(msg) - return common_const.STATUS_SUCCESS + if resp is common_const.STATUS_SUCCESS: + msg = ("Static IPs successfully added for service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r, Reason: %r" % + (resp['status'], resp['reason'])) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def configure_interfaces(self, context, resource_data): """ Configure interfaces for the service VM. @@ -141,10 +176,6 @@ def configure_interfaces(self, context, resource_data): "Error: %s" % (mgmt_ip, err)) LOG.error(msg) return result_log_forward - else: - msg = ("Configured log forwarding for service at %s. " - "Result: %s" % (mgmt_ip, result_log_forward)) - LOG.info(msg) try: result_static_ips = self._configure_static_ips(resource_data) @@ -155,9 +186,6 @@ def configure_interfaces(self, context, resource_data): else: if result_static_ips != common_const.STATUS_SUCCESS: return result_static_ips - else: - msg = ("Added static IPs. Result: %s" % result_static_ips) - LOG.info(msg) rule_info = dict( provider_mac=resource_data['provider_mac'], @@ -169,36 +197,27 @@ def configure_interfaces(self, context, resource_data): msg = ("Initiating POST request to add persistent rule to primary " "service at: %r" % mgmt_ip) LOG.info(msg) - try: - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to primary service at: " - "%r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while adding " - "persistent rule of primary service at: %r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + err_msg = ("Add persistent rule POST request to the VyOS firewall " + "service at %s failed. " % url) try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response, invalid JSON. URL: " - "%r. %r" % (url, str(err).capitalize())) - LOG.error(msg) - return msg - if not result['status']: - msg = ("Error adding persistent rule. URL: %r" % url) - LOG.error(msg) - return msg + resp = self.rest_api.post(url, data) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - msg = ("Persistent rule successfully added.") - LOG.info(msg) - return common_const.STATUS_SUCCESS + if resp is common_const.STATUS_SUCCESS: + msg = ("Persistent rule successfully added for " + "service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r" % resp['status']) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def _clear_static_ips(self, resource_data): """ Clear static IPs for provider and stitching @@ -230,6 +249,7 @@ def _clear_static_ips(self, resource_data): msg = ("Initiating POST request to remove static IPs for primary " "service at: %r" % mgmt_ip) LOG.info(msg) + try: resp = requests.delete(url, data=data, timeout=self.timeout) except requests.exceptions.ConnectionError as err: @@ -351,12 +371,8 @@ def configure_routes(self, context, resource_data): source_cidrs = resource_data.get('source_cidrs') gateway_ip = resource_data.get('gateway_ip') - # REVISIT(VK): This was all along bad way, don't know why at all it - # was done like this. - url = const.request_url % (mgmt_ip, self.port, 'add-source-route') - active_configured = False route_info = [] for source_cidr in source_cidrs: route_info.append({'source_cidr': source_cidr, @@ -365,42 +381,27 @@ def configure_routes(self, context, resource_data): msg = ("Initiating POST request to configure route of " "primary service at: %r" % mgmt_ip) LOG.info(msg) + + err_msg = ("Configure routes POST request to the VyOS firewall " + "service at %s failed. " % url) try: - resp = requests.post(url, data=data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to service at: " - "%r. ERROR: %r" % (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while configuring " - "route of service at: %r ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + resp = self.rest_api.post(url, data) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - if resp.status_code in common_const.SUCCESS_CODES: - message = jsonutils.loads(resp.text) - if message.get("status", False): - msg = ("Route configured successfully for VYOS" - " service at: %r" % mgmt_ip) - LOG.info(msg) - active_configured = True - else: - msg = ("Configure source route failed on service with" - " status %s %s" - % (resp.status_code, message.get("reason", None))) - LOG.error(msg) - return msg + if resp is common_const.STATUS_SUCCESS: + msg = ("Configured routes successfully for service at %r." % url) + LOG.info(msg) + return resp - msg = ("Route configuration status : %r " - % (active_configured)) - LOG.info(msg) - if active_configured: - return common_const.STATUS_SUCCESS - else: - return ("Failed to configure source route. Response code: %s." - "Response Content: %r" % (resp.status_code, resp.content)) + err_msg += (("Status code: %r, Reason: %r" % + (resp['status'], resp['reason'])) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def clear_routes(self, context, resource_data): """ Clear routes for the service VM. @@ -473,6 +474,7 @@ class FwaasDriver(FwGenericConfigDriver): def __init__(self, conf): self.conf = conf self.timeout = const.REST_TIMEOUT + self.rest_api = RestApi(self.timeout) self.host = self.conf.host self.port = const.CONFIGURATION_SERVER_PORT super(FwaasDriver, self).__init__() @@ -503,44 +505,6 @@ def _get_firewall_attribute(self, firewall): LOG.debug(msg) return description['vm_management_ip'] - def _print_exception(self, exception_type, err, - url, operation, response=None): - """ Abstract class for printing log messages - - :param exception_type: Name of the exception as a string - :param err: Either error of type Exception or error code - :param url: Service url - :param operation: Create, update or delete - :param response: Response content from Service VM - - """ - - if exception_type == 'ConnectionError': - msg = ("Error occurred while connecting to firewall " - "service at URL: %r. Firewall not %sd. %s. " - % (url, operation, str(err).capitalize())) - LOG.error(msg) - elif exception_type == 'RequestException': - msg = ("Unexpected error occurred while connecting to " - "firewall service at URL: %r. Firewall not %sd. %s" - % (url, operation, str(err).capitalize())) - LOG.error(msg) - elif exception_type == 'ValueError': - msg = ("Unable to parse the response. Invalid " - "JSON from URL: %r. Firewall not %sd. %s. %r" - % (url, operation, str(err).capitalize(), response)) - LOG.error(msg) - elif exception_type == 'UnexpectedError': - msg = ("Unexpected error occurred while connecting to service " - "at URL: %r. Firewall not %sd. %s. %r" - % (url, operation, str(err).capitalize(), response)) - LOG.error(msg) - elif exception_type == 'Failure': - msg = ("Firewall not %sd. URL: %r. Response " - "code from server: %r. %r" - % (operation, url, err, response)) - LOG.error(msg) - def create_firewall(self, context, firewall, host): """ Implements firewall creation @@ -565,43 +529,28 @@ def create_firewall(self, context, firewall, host): " %r. URL: %s" % (firewall['id'], firewall['tenant_id'], url)) LOG.info(msg) data = jsonutils.dumps(firewall) - try: - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - self._print_exception('ConnectionError', err, url, 'create') - raise requests.exceptions.ConnectionError(err) - except requests.exceptions.RequestException as err: - self._print_exception('RequestException', err, url, 'create') - raise requests.exceptions.RequestException(err) - msg = ("POSTed the configuration to Service VM") - LOG.debug(msg) - if resp.status_code in common_const.SUCCESS_CODES: - try: - resp_payload = resp.json() - if resp_payload['config_success']: - msg = ("Configured Firewall successfully. URL: %s" - % url) - LOG.info(msg) - return common_const.STATUS_ACTIVE - else: - self._print_exception('Failure', - resp.status_code, url, - 'create', resp.content) - return common_const.STATUS_ERROR - except ValueError as err: - self._print_exception('ValueError', err, url, - 'create', resp.content) - return common_const.STATUS_ERROR - except Exception as err: - self._print_exception('UnexpectedError', err, url, - 'create', resp.content) - return common_const.STATUS_ERROR - else: - self._print_exception('Failure', resp.status_code, url, - 'create', resp.content) + err_msg = ("Configure firewall POST request to the VyOS " + "service at %s failed. " % url) + try: + resp = self.rest_api.post(url, data) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) return common_const.STATUS_ERROR + if resp is common_const.STATUS_SUCCESS: + msg = ("Configured firewall successfully for service at %r." % url) + LOG.info(msg) + return common_const.STATUS_ACTIVE + + err_msg += (("Status code: %r, Response Content: %r" % + (resp['status'], resp)) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return common_const.STATUS_ERROR + def update_firewall(self, context, firewall, host): """ Implements firewall updation @@ -622,19 +571,27 @@ def update_firewall(self, context, firewall, host): msg = ("Initiating UPDATE request. URL: %s" % url) LOG.info(msg) data = jsonutils.dumps(firewall) + + err_msg = ("Update firewall POST request to the VyOS " + "service at %s failed. " % url) try: - resp = requests.put(url, data=data, timeout=self.timeout) + resp = self.rest_api.post(url, data) except Exception as err: - self._print_exception('UnexpectedError', err, url, 'update') - raise Exception(err) - if resp.status_code == 200: - msg = ("Successful UPDATE request. URL: %s" % url) + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return common_const.STATUS_ERROR + + if resp is common_const.STATUS_SUCCESS: + msg = ("Updated firewall successfully for service at %r." % url) LOG.info(msg) return common_const.STATUS_ACTIVE - else: - self._print_exception('Failure', resp.status_code, url, - 'create', resp.content) - return common_const.STATUS_ERROR + + err_msg += (("Status code: %r, Response Content: %r" % + (resp['status'], resp)) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return common_const.STATUS_ERROR def delete_firewall(self, context, firewall, host): """ Implements firewall deletion @@ -656,47 +613,35 @@ def delete_firewall(self, context, firewall, host): msg = ("Initiating DELETE request. URL: %s" % url) LOG.info(msg) data = jsonutils.dumps(firewall) + + err_msg = ("Delete firewall POST request to the VyOS " + "service at %s failed. " % url) try: - resp = requests.delete(url, data=data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - self._print_exception('ConnectionError', err, url, 'delete') - raise requests.exceptions.ConnectionError(err) - except requests.exceptions.RequestException as err: - self._print_exception('RequestException', err, url, 'delete') - raise requests.exceptions.RequestException(err) + resp = self.rest_api.post(url, data) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return common_const.STATUS_ERROR - if resp.status_code in common_const.SUCCESS_CODES: - # For now agent only check for ERROR. - try: - resp_payload = resp.json() - if resp_payload['delete_success']: - msg = ("Deleted Firewall successfully.") - LOG.info(msg) - return common_const.STATUS_DELETED - elif not resp_payload['delete_success'] and \ - resp_payload.get('message', '') == ( - const.INTERFACE_NOT_FOUND): - # VK: This is a special case. - msg = ("Firewall not deleted, as interface is not " - "available in firewall. Possibly got detached. " - " So marking this delete as success. URL: %r" - "Response Content: %r" % (url, resp.content)) - LOG.error(msg) - return common_const.STATUS_SUCCESS - else: - self._print_exception('Failure', - resp.status_code, url, - 'delete', resp.content) - return common_const.STATUS_ERROR - except ValueError as err: - self._print_exception('ValueError', err, url, - 'delete', resp.content) - return common_const.STATUS_ERROR - except Exception as err: - self._print_exception('UnexpectedError', err, url, - 'delete', resp.content) - return common_const.STATUS_ERROR + if resp is common_const.STATUS_SUCCESS: + msg = ("Deleted firewall successfully for service at %r." % url) + LOG.info(msg) + return common_const.STATUS_DELETED + + if type(resp) is dict: + if not resp['delete_success'] and ( + resp.get('message') == const.INTERFACE_NOT_FOUND): + err_msg += ("Firewall was not deleted as interface was not " + "available in the firewall. It might have got " + "detached. So marking this delete as SUCCESS. " + "URL: %r, Response Content: %r" % + (url, resp.content)) + LOG.error(err_msg) + return common_const.STATUS_SUCCESS + else: + err_msg += ("Status code: %r, Response Content: %r" % + (resp['status'], resp)) else: - self._print_exception('Failure', resp.status_code, url, - 'create', resp.content) - return common_const.STATUS_ERROR + err_msg += ("Reason: " + resp) + LOG.error(err_msg) + return common_const.STATUS_ERROR diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog index 4fe9d13bb6..750beb0575 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog @@ -13,5 +13,3 @@ vyos (2.0) INITIAL RELEASE; urgency=low * Initial release. (Closes: #XXXXXX) - - -- root Wed, 13 May 2015 10:13:46 +0530 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control index a0ea052954..f8e7d09950 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/control @@ -5,4 +5,4 @@ Architecture: all Maintainer: One Convergence Section: devel Priority: optional -Description: vyos package +Description: Vyos package that supports Firewall and VPN diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm deleted file mode 100755 index 8357694dd9..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/postrm +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# 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. - -echo "" diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos index ed0a7d4523..9f523832ef 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/bin/vyos @@ -16,5 +16,5 @@ import sys sys.path.append("/usr/share/vyos") -from config_server.server2 import main +from config_server.server import main main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py index 2901efc106..95b3da56cf 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/fw_module.py @@ -41,10 +41,10 @@ ''' -class VyosFWConfigClass(ConfigOpts): +class VyosFWConfig(ConfigOpts): def __init__(self): - super(VyosFWConfigClass, self).__init__() + super(VyosFWConfig, self).__init__() self.fw_identifier = 'fw' self.provider_ptg_interfaces = list() self.rules = list() @@ -326,9 +326,9 @@ def run_sshd_on_mgmt_ip(self, mgmt_ip): self.set(command.split()) try: session.commit() - except Exception: - logger.error("Failed to update sshd listen-address to %s" % - mgmt_ip) + except Exception as err: + logger.error("Failed to update sshd listen-address " + "to %s. Reason: %r" % (mgmt_ip, err)) session.discard() session.teardown_config_session() return diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py index 102e054a2d..324e7e26f2 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/operations.py @@ -31,11 +31,11 @@ class ConfigOpts(object): def __init__(self): pass - def set_1(self, args): + def set_full(self, args): exe = execUtils(list(args)) exe.execmd() - def delete_1(self, args): + def delete_full(self, args): exe = execUtils(list(args)) exe.execmd() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py index 1896c188e6..0aee5509b9 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server.py @@ -10,47 +10,469 @@ # License for the specific language governing permissions and limitations # under the License. +import ast +import json as jsonutils import logging +import netifaces +import os import signal import sys +import time +from os.path import abspath +from os.path import dirname + +from edit_persistent_rule import EditPersistentRule +from flask import Flask +from flask import jsonify +from flask import request +from fw_module import VyosFWConfig +from log_forwarder import APIHandler as apihandler +from static_ip import StaticIp +from vpn_api_server import VPNHandler as vpnhandler +from vyos_exception import VyosException +from vyos_policy_based_routes import RoutesConfigHandler as routes_handler from vyos_session.utils import init_logger -logger = logging.getlogger(__name__) +sys.path.insert(0, dirname(dirname(abspath(__file__)))) + +logger = logging.getLogger(__name__) init_logger(logger) +app = Flask(__name__) -class VyosServer(object): +fw_module = None +e = EditPersistentRule() - def __init__(self): - pass +error_msgs = { + 'unexpected': 'Unexpected VYOS ERROR occurred while %s %s ' +} + + +@app.route('/auth-server-config', methods=['POST']) +def auth_server_config(): + data = jsonutils.loads(request.data) + f = open("/usr/share/vyos/auth_server.conf", 'w') + f.write(data['auth_uri']) + f.write('\n') + f.write(data['admin_tenant_name']) + f.write('\n') + f.write(data['admin_user']) + f.write('\n') + f.write(data['admin_password']) + f.write('\n') + f.write(data['remote_vpn_role_name']) + f.write("\n") + f.write(data['project_id']) + f.write("\n") + + try: + host_ip = data['host_mapping'].split()[0] + "/32" + command = ('grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease' + ' |tail -1| cut -d: -d "=" -f2') + gateway_ip = os.popen(command).read().strip().strip("'") + vpnhandler().configure_static_route("set", host_ip, gateway_ip) + + except Exception as ex: + err = ("Error in adding rvpn route. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + try: + if data['host_mapping'].split()[1]: + os.system("sudo chown vyos:users /etc/hosts") + os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) + os.system("sudo chown root:root /etc/hosts") + except Exception as e: + logger.error("Error in writing host mapping in /etc/hosts - %s" % e) + + return jsonutils.dumps(dict(status=True)) + + +@app.route('/create-ipsec-site-conn', methods=['POST']) +def create_ipsec_site_conn(): + """ + Open a "configure" session with vyos + "Set" all the parameters + "commit" the changes + """ + try: + data = jsonutils.loads(request.data) + status = vpnhandler().create_ipsec_site_conn(data) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = "Error in configuring ipsec_site_conection. Reason: %s" % ex + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/create-ipsec-site-tunnel', methods=['POST']) +def create_ipsec_site_tunnel(): + """ + Open a "configure" session with vyos + "Set" all the parameters + "commit" the changes + """ + try: + tunnel = jsonutils.loads(request.data) + pcidrs = tunnel['peer_cidrs'] + for pcidr in pcidrs: + tunnel['peer_cidr'] = pcidr + status = vpnhandler().create_ipsec_site_tunnel(tunnel) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in configuring ipsec_site_tunnel. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ipsec-site-tunnel', methods=['DELETE']) +def delete_ipsec_site_tunnel(): + try: + pcidrs = request.args.get('peer_cidrs') + peer_address = request.args.get('peer_address') + local_cidr = request.args.get('local_cidr') + pcidrs = ast.literal_eval(pcidrs) + for pcidr in pcidrs: + tunnel = {} + tunnel['peer_address'] = peer_address + tunnel['local_cidr'] = local_cidr + tunnel['peer_cidr'] = pcidr + status = vpnhandler().delete_ipsec_site_tunnel(tunnel) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in deleting ipsec_site_tunnel. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ipsec-site-conn', methods=['DELETE']) +def delete_ipsec_site_conn(): + try: + peer_address = request.args.get('peer_address') + status = vpnhandler().delete_ipsec_site_conn(peer_address) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in deleting ipsec_site_connection. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/get-ipsec-site-tunnel-state', methods=['GET']) +def get_ipsec_site_tunnel_state(): + try: + peer_address = request.args.get('peer_address') + lcidr = request.args.get('local_cidr') + pcidr = request.args.get('peer_cidr') + tunnel = {} + tunnel['peer_address'] = peer_address + tunnel['local_cidr'] = lcidr + tunnel['peer_cidr'] = pcidr + status, state = vpnhandler().get_ipsec_site_tunnel_state(tunnel) + return jsonutils.dumps(dict(state=state)) + except Exception as ex: + err = ("Error in get_ipsec_site_tunnel_state. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/create-ssl-vpn-conn', methods=['POST']) +def create_ssl_vpn_conn(): + try: + data = jsonutils.loads(request.data) + status = vpnhandler().create_ssl_vpn_conn(data) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in create_ssl_vpn_connection. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/ssl-vpn-push-route', methods=['POST']) +def ssl_vpn_push_route(): + try: + data = jsonutils.loads(request.data) + status = vpnhandler().ssl_vpn_push_route(data) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in ssl_vpn_push_route. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ssl-vpn-conn', methods=['DELETE']) +def delete_ssl_vpn_conn(): + try: + tunnel_name = request.args.get('tunnel') + status = vpnhandler().delete_ssl_vpn_conn(tunnel_name) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_ssl_vpn_conn. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-ssl-vpn-route', methods=['DELETE']) +def delete_ssl_vpn_route(): + try: + route = request.args.get('route') + status = vpnhandler().delete_ssl_vpn_route(route) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_ssl_vpn_route. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/get-ssl-vpn-conn-state', methods=['GET']) +def get_ssl_vpn_conn_state(): + try: + tunnel_name = request.args.get('tunnel') + status, state = vpnhandler().get_ssl_vpn_conn_state(tunnel_name) + return jsonutils.dumps(dict(status=status, state=state)) + except Exception as ex: + err = ("Error in get_ssl_vpn_conn_state. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/configure-firewall-rule', methods=['POST']) +def configure_firewall_rule(): + global fw_module + firewall_data = request.data + try: + response = fw_module.set_up_rule_on_interfaces(firewall_data) + except Exception as err: + try: + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) + except IndexError: + return send_error_response( + VyosException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'configuring', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/delete-firewall-rule', methods=['DELETE']) +def delete_firewall_rule(): + global fw_module + try: + response = fw_module.reset_firewall(request.data) + except Exception as err: + try: + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) + except IndexError: + return send_error_response( + VyosException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'deleting', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/update-firewall-rule', methods=['PUT']) +def update_firewall_rule(): + global fw_module + try: + fw_module.reset_firewall(request.data) + response = fw_module.set_up_rule_on_interfaces(request.data) + except Exception as err: + try: + return send_error_response(VyosException( + err[0], status_code=err[1], payload=err[2])) + except IndexError: + return send_error_response( + VyosException(str(err), status_code=500, + payload=dict(err=error_msgs['unexpected'] % ( + 'updating', 'firewall')))) + else: + return jsonify(**response) + + +@app.route('/add-source-route', methods=['POST']) +def add_source_route(): + try: + return routes_handler().add_source_route(request.data) + except Exception as ex: + err = ("Exception in adding source route. %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-source-route', methods=['DELETE']) +def delete_source_route(): + try: + return routes_handler().delete_source_route(request.data) + except Exception as ex: + err = ("Exception in deleting source route. %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/add-stitching-route', methods=['POST']) +def add_stitching_route(): + try: + gateway_ip = jsonutils.loads(request.data).get('gateway_ip') + status = vpnhandler().configure_static_route("set", "0.0.0.0/0", + gateway_ip) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in add_stitching_route. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +@app.route('/delete-stitching-route', methods=['DELETE']) +def delete_stitching_route(): + try: + gateway_ip = request.args.get('gateway_ip') + status = vpnhandler().configure_static_route( + "delete", "0.0.0.0/0", gateway_ip) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error in delete_stitching_route. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) + + +def send_error_response(error): + response = jsonify(error.to_dict()) + response.status_code = error.status_code + return response + + +@app.route('/add_static_ip', methods=['POST']) +def add_static_ip(): + try: + static_ip_obj = StaticIp() + data = jsonutils.loads(request.data) + static_ip_obj.configure(data) + except Exception as err: + msg = ("Error adding static IPs for hotplugged interfaces. " + "Data: %r. Error: %r" % (data, str(err))) + logger.error(msg) + return jsonutils.dumps(dict(status=False, reason=msg)) + else: + return jsonutils.dumps(dict(status=True)) + + +@app.route('/del_static_ip', methods=['DELETE']) +def del_static_ip(): + try: + static_ip_obj = StaticIp() + data = jsonutils.loads(request.data) + static_ip_obj.clear(data) + except Exception as err: + msg = ("Error clearing static IPs for hotplugged interfaces. " + "Data: %r. Error: %r" % (data, str(err))) + logger.error(msg) + return jsonutils.dumps(dict(status=False, reason=msg)) + else: + return jsonutils.dumps(dict(status=True)) + + +@app.route('/add_rule', methods=['POST']) +def add_rule(): + # configuring sshd to listen on management ip address + ip_addr = get_interface_to_bind() + fw_module.run_sshd_on_mgmt_ip(ip_addr) + + data = jsonutils.loads(request.data) + try: + EditPersistentRule.add(e, data) + except Exception as err: + logger.error("Error adding persistent rule %r" % str(err)) + return jsonutils.dumps(dict(status=False)) + else: + return jsonutils.dumps(dict(status=True)) + + +@app.route('/delete_rule', methods=['DELETE']) +def del_rule(): + data = jsonutils.loads(request.data) + try: + EditPersistentRule.delete(e, data) + except Exception as err: + logger.error("Error deleting persistent rule %r" % str(err)) + return jsonutils.dumps(dict(status=False)) + else: + return jsonutils.dumps(dict(status=True)) + + +@app.route('/configure-rsyslog-as-client', methods=['POST']) +def configure_rsyslog_as_client(): + try: + config_data = jsonutils.loads(request.data) + status = apihandler().configure_rsyslog_as_client(config_data) + return jsonutils.dumps(dict(status=status)) + except Exception as ex: + err = ("Error while conifiguring rsyslog client. Reason: %s" % ex) + logger.error(err) + return jsonutils.dumps(dict(status=False, reason=err)) def handler(signum, frame): - if signum in [2, 3, 11, 15]: - logger.info(" Recieved signal: %r. Thus exiting " % signum) - sys.exit() - else: - logger.info(" Caught singal: %r. Ignoring " % signum) - - -def main(argv): - vyos_server = VyosServer() - host = '' - port = 0 - if len(argv) != 5: - logger.info("server.py -h -p ") - sys.exit(2) - - # Review - OSM: We should accept -h -p in any order. - if argv[1] == '-h': - host = argv[2] - if argv[3] == '-p': - port = int(argv[4]) + if signum in [2, 3, 9, 11, 15]: + sys.exit(0) + else: + pass + + +def add_management_pbr(): + command = ('grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease' + ' |tail -1| cut -d: -d "=" -f2') + gateway_ip = os.popen(command).read().strip().strip("'") + command = ('grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease' + ' |tail -1| cut -d: -d "=" -f2') + src_ip = os.popen(command).read().strip().strip("'") + routes_info = [{'source_cidr': src_ip, 'gateway_ip': gateway_ip}] + routes_handler().add_source_route(jsonutils.dumps(routes_info)) + + +def getipaddr(): + # This is an assumption that service management will always gets + # configured on eth0 interface. + return netifaces.ifaddresses('eth0')[2][0]['addr'] + + +def get_interface_to_bind(): + while True: + try: + ip_addr = getipaddr() + logger.info("Management interface up on - %r " % + ''.join([netifaces.ifaddresses('eth0')[17][0][ + 'addr'][:2], + netifaces.ifaddresses('eth0')[17][0][ + 'addr'][-2:], + netifaces.ifaddresses('eth0')[2][0][ + 'addr'].split('.')[-1] + ])) + except ValueError: + logger.error("Management Interface not UP") + time.sleep(5) + except KeyError: + logger.error("Management Interface not FOUND") + time.sleep(5) + else: + break + return ip_addr + + +def main(): + """ + + :type ip_addr: Server listen address + """ + global fw_module + fw_module = VyosFWConfig() + ip_addr = get_interface_to_bind() signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler) - vyos_server.start(vyos_server.server, host, port) + app.run(ip_addr, 8888) + logger.info("VYOS Agent started ..... ") if __name__ == '__main__': - main(sys.argv) + main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py deleted file mode 100644 index e00ed2bdb9..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/server2.py +++ /dev/null @@ -1,478 +0,0 @@ -# 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 ast -import json as jsonutils -import logging -import netifaces -import os -import signal -import sys -import time - -from os.path import abspath -from os.path import dirname - -from edit_persistent_rule import EditPersistentRule -from flask import Flask -from flask import jsonify -from flask import request -from fw_module import VyosFWConfigClass -from log_forwarder import APIHandler as apihandler -from static_ip import StaticIp -from vpn_api_server import VPNHandler as vpnhandler -from vyos_exception import VyosException -from vyos_policy_based_routes import RoutesConfigHandler as routes_handler -from vyos_session.utils import init_logger - -sys.path.insert(0, dirname(dirname(abspath(__file__)))) - -logger = logging.getLogger(__name__) -init_logger(logger) - -app = Flask(__name__) - -fw_module = None -e = EditPersistentRule() - -error_msgs = { - 'unexpected': 'Unexpected VYOS ERROR occurred while %s %s ' -} - - -@app.route('/auth-server-config', methods=['POST']) -def auth_server_config(): - data = jsonutils.loads(request.data) - f = open("/usr/share/vyos/auth_server.conf", 'w') - f.write(data['auth_uri']) - f.write('\n') - f.write(data['admin_tenant_name']) - f.write('\n') - f.write(data['admin_user']) - f.write('\n') - f.write(data['admin_password']) - f.write('\n') - f.write(data['remote_vpn_role_name']) - f.write("\n") - f.write(data['project_id']) - f.write("\n") - - try: - host_ip = data['host_mapping'].split()[0] + "/32" - command = ('grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease' - ' |tail -1| cut -d: -d "=" -f2') - gateway_ip = os.popen(command).read().strip().strip("'") - vpnhandler().configure_static_route("set", host_ip, gateway_ip) - - except Exception as ex: - err = ("Error in adding rvpn route. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - try: - if data['host_mapping'].split()[1]: - os.system("sudo chown vyos:users /etc/hosts") - os.system("sudo echo '\n%s' >> /etc/hosts" % data['host_mapping']) - os.system("sudo chown root:root /etc/hosts") - except Exception as e: - logger.error("Error in writing host mapping in /etc/hosts - %s" % e) - - return jsonutils.dumps(dict(status=True)) - - -@app.route('/create-ipsec-site-conn', methods=['POST']) -def create_ipsec_site_conn(): - """ - Open a "configure" session with vyos - "Set" all the parameters - "commit" the changes - """ - try: - data = jsonutils.loads(request.data) - status = vpnhandler().create_ipsec_site_conn(data) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = "Error in configuring ipsec_site_conection. Reason: %s" % ex - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/create-ipsec-site-tunnel', methods=['POST']) -def create_ipsec_site_tunnel(): - """ - Open a "configure" session with vyos - "Set" all the parameters - "commit" the changes - """ - try: - tunnel = jsonutils.loads(request.data) - pcidrs = tunnel['peer_cidrs'] - for pcidr in pcidrs: - tunnel['peer_cidr'] = pcidr - status = vpnhandler().create_ipsec_site_tunnel(tunnel) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in configuring ipsec_site_tunnel. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ipsec-site-tunnel', methods=['DELETE']) -def delete_ipsec_site_tunnel(): - try: - pcidrs = request.args.get('peer_cidrs') - peer_address = request.args.get('peer_address') - local_cidr = request.args.get('local_cidr') - pcidrs = ast.literal_eval(pcidrs) - for pcidr in pcidrs: - tunnel = {} - tunnel['peer_address'] = peer_address - tunnel['local_cidr'] = local_cidr - tunnel['peer_cidr'] = pcidr - status = vpnhandler().delete_ipsec_site_tunnel(tunnel) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in deleting ipsec_site_tunnel. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ipsec-site-conn', methods=['DELETE']) -def delete_ipsec_site_conn(): - try: - peer_address = request.args.get('peer_address') - status = vpnhandler().delete_ipsec_site_conn(peer_address) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in deleting ipsec_site_connection. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/get-ipsec-site-tunnel-state', methods=['GET']) -def get_ipsec_site_tunnel_state(): - try: - peer_address = request.args.get('peer_address') - lcidr = request.args.get('local_cidr') - pcidr = request.args.get('peer_cidr') - tunnel = {} - tunnel['peer_address'] = peer_address - tunnel['local_cidr'] = lcidr - tunnel['peer_cidr'] = pcidr - status, state = vpnhandler().get_ipsec_site_tunnel_state(tunnel) - return jsonutils.dumps(dict(state=state)) - except Exception as ex: - err = ("Error in get_ipsec_site_tunnel_state. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/create-ssl-vpn-conn', methods=['POST']) -def create_ssl_vpn_conn(): - try: - data = jsonutils.loads(request.data) - status = vpnhandler().create_ssl_vpn_conn(data) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in create_ssl_vpn_connection. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/ssl-vpn-push-route', methods=['POST']) -def ssl_vpn_push_route(): - try: - data = jsonutils.loads(request.data) - status = vpnhandler().ssl_vpn_push_route(data) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in ssl_vpn_push_route. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ssl-vpn-conn', methods=['DELETE']) -def delete_ssl_vpn_conn(): - try: - tunnel_name = request.args.get('tunnel') - status = vpnhandler().delete_ssl_vpn_conn(tunnel_name) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_ssl_vpn_conn. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-ssl-vpn-route', methods=['DELETE']) -def delete_ssl_vpn_route(): - try: - route = request.args.get('route') - status = vpnhandler().delete_ssl_vpn_route(route) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_ssl_vpn_route. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/get-ssl-vpn-conn-state', methods=['GET']) -def get_ssl_vpn_conn_state(): - try: - tunnel_name = request.args.get('tunnel') - status, state = vpnhandler().get_ssl_vpn_conn_state(tunnel_name) - return jsonutils.dumps(dict(status=status, state=state)) - except Exception as ex: - err = ("Error in get_ssl_vpn_conn_state. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/configure-firewall-rule', methods=['POST']) -def configure_firewall_rule(): - global fw_module - firewall_data = request.data - try: - response = fw_module.set_up_rule_on_interfaces(firewall_data) - except Exception as err: - try: - return send_error_response(VyosException( - err[0], status_code=err[1], payload=err[2])) - except IndexError: - return send_error_response( - VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'configuring', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/delete-firewall-rule', methods=['DELETE']) -def delete_firewall_rule(): - global fw_module - try: - response = fw_module.reset_firewall(request.data) - except Exception as err: - try: - return send_error_response(VyosException( - err[0], status_code=err[1], payload=err[2])) - except IndexError: - return send_error_response( - VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'deleting', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/update-firewall-rule', methods=['PUT']) -def update_firewall_rule(): - global fw_module - try: - fw_module.reset_firewall(request.data) - response = fw_module.set_up_rule_on_interfaces(request.data) - except Exception as err: - try: - return send_error_response(VyosException( - err[0], status_code=err[1], payload=err[2])) - except IndexError: - return send_error_response( - VyosException(str(err), status_code=500, - payload=dict(err=error_msgs['unexpected'] % ( - 'updating', 'firewall')))) - else: - return jsonify(**response) - - -@app.route('/add-source-route', methods=['POST']) -def add_source_route(): - try: - return routes_handler().add_source_route(request.data) - except Exception as ex: - err = ("Exception in adding source route. %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-source-route', methods=['DELETE']) -def delete_source_route(): - try: - return routes_handler().delete_source_route(request.data) - except Exception as ex: - err = ("Exception in deleting source route. %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/add-stitching-route', methods=['POST']) -def add_stitching_route(): - try: - gateway_ip = jsonutils.loads(request.data).get('gateway_ip') - status = vpnhandler().configure_static_route("set", "0.0.0.0/0", - gateway_ip) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in add_stitching_route. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -@app.route('/delete-stitching-route', methods=['DELETE']) -def delete_stitching_route(): - try: - gateway_ip = request.args.get('gateway_ip') - status = vpnhandler().configure_static_route( - "delete", "0.0.0.0/0", gateway_ip) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error in delete_stitching_route. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -def send_error_response(error): - response = jsonify(error.to_dict()) - response.status_code = error.status_code - return response - - -@app.route('/add_static_ip', methods=['POST']) -def add_static_ip(): - try: - static_ip_obj = StaticIp() - data = jsonutils.loads(request.data) - static_ip_obj.configure(data) - except Exception as err: - msg = ("Error adding static IPs for hotplugged interfaces. " - "Data: %r. Error: %r" % (data, str(err))) - logger.error(msg) - return jsonutils.dumps(dict(status=False, reason=msg)) - else: - return jsonutils.dumps(dict(status=True)) - - -@app.route('/del_static_ip', methods=['DELETE']) -def del_static_ip(): - try: - static_ip_obj = StaticIp() - data = jsonutils.loads(request.data) - static_ip_obj.clear(data) - except Exception as err: - msg = ("Error clearing static IPs for hotplugged interfaces. " - "Data: %r. Error: %r" % (data, str(err))) - logger.error(msg) - return jsonutils.dumps(dict(status=False, reason=msg)) - else: - return jsonutils.dumps(dict(status=True)) - - -@app.route('/add_rule', methods=['POST']) -def add_rule(): - # configuring sshd to listen on management ip address - ip_addr = get_interface_to_bind() - fw_module.run_sshd_on_mgmt_ip(ip_addr) - - data = jsonutils.loads(request.data) - try: - EditPersistentRule.add(e, data) - except Exception as err: - logger.error("Error adding persistent rule %r" % str(err)) - return jsonutils.dumps(dict(status=False)) - else: - return jsonutils.dumps(dict(status=True)) - - -@app.route('/delete_rule', methods=['DELETE']) -def del_rule(): - data = jsonutils.loads(request.data) - try: - EditPersistentRule.delete(e, data) - except Exception as err: - logger.error("Error deleting persistent rule %r" % str(err)) - return jsonutils.dumps(dict(status=False)) - else: - return jsonutils.dumps(dict(status=True)) - - -@app.route('/configure-rsyslog-as-client', methods=['POST']) -def configure_rsyslog_as_client(): - try: - config_data = jsonutils.loads(request.data) - status = apihandler().configure_rsyslog_as_client(config_data) - return jsonutils.dumps(dict(status=status)) - except Exception as ex: - err = ("Error while conifiguring rsyslog client. Reason: %s" % ex) - logger.error(err) - return jsonutils.dumps(dict(status=False, reason=err)) - - -def handler(signum, frame): - if signum in [2, 3, 9, 11, 15]: - sys.exit(0) - else: - pass - - -def add_management_pbr(): - command = ('grep "new_routers" /var/lib/dhcp3/dhclient_eth0_lease' - ' |tail -1| cut -d: -d "=" -f2') - gateway_ip = os.popen(command).read().strip().strip("'") - command = ('grep "new_ip_address" /var/lib/dhcp3/dhclient_eth0_lease' - ' |tail -1| cut -d: -d "=" -f2') - src_ip = os.popen(command).read().strip().strip("'") - routes_info = [{'source_cidr': src_ip, 'gateway_ip': gateway_ip}] - routes_handler().add_source_route(jsonutils.dumps(routes_info)) - - -def getipaddr(): - # This is an assumption that service management will always gets - # configured on eth0 interface. - return netifaces.ifaddresses('eth0')[2][0]['addr'] - - -def get_interface_to_bind(): - while True: - try: - ip_addr = getipaddr() - logger.info("Management interface up on - %r " % - ''.join([netifaces.ifaddresses('eth0')[17][0][ - 'addr'][:2], - netifaces.ifaddresses('eth0')[17][0][ - 'addr'][-2:], - netifaces.ifaddresses('eth0')[2][0][ - 'addr'].split('.')[-1] - ])) - except ValueError: - logger.error("Management Interface not UP") - time.sleep(5) - except KeyError: - logger.error("Management Interface not FOUND") - time.sleep(5) - else: - break - return ip_addr - - -def main(): - """ - - :type ip_addr: Server listen address - """ - global fw_module - fw_module = VyosFWConfigClass() - ip_addr = get_interface_to_bind() - signal.signal(signal.SIGTERM, handler) - signal.signal(signal.SIGINT, handler) - app.run(ip_addr, 8888) - logger.info("VYOS Agent started ..... ") - - -if __name__ == '__main__': - main() diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py index 672055f481..aefdc8ec71 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vpn_api_server.py @@ -264,7 +264,7 @@ def _delete_ssl_vpn_route(self, route): def _set_commands(self, cmds): for cmd in cmds: logger.debug(cmd) - self.set_1(cmd.split(' ')) + self.set_full(cmd.split(' ')) def _create_ike_group(self, ike, dpd): cmds = copy.deepcopy(IPSEC_SITE2SITE_COMMANDS) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_dhc.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_dhc.py deleted file mode 100644 index e04d326ff4..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_dhc.py +++ /dev/null @@ -1,29 +0,0 @@ -# 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 shlex -import subprocess - -import netifaces - - -def initiate_dhclient(): - interfaces = netifaces.interfaces() - for interface in interfaces: - cmd = "sudo dhclient %s" % interface - args = shlex.split(cmd) - if not netifaces.ifaddresses(interface).get(netifaces.AF_INET): - output, error = subprocess.Popen( - args, stdout=subprocess.PIPE, - stderr=subprocess.PIPE).communicate() - if error: - raise diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py index e697e4e3f4..d883c2a12c 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/config_server/vyos_policy_based_routes.py @@ -184,7 +184,8 @@ def add_source_route(self, routes_info): raise Exception(message) return jsonutils.dumps(dict(status=True)) - # FIXME: When invoked on delete path we have to propagate the error + # REVISIT(Vikash): When invoked on delete path we have + # to propagate the error def _delete_policy_route(self, source_cidr, source_interface): try: interface_number_string = source_interface.split("eth", 1)[1] diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py index 7646e59104..c091b078e8 100755 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/execformat/executor.py @@ -109,7 +109,6 @@ def execmd(self, nonsession=False): raise SessionNotExists('Configure session do not exists') if not nonsession: - # result = (stdout, stderr, errcode) result = _runner(' '.join(self.args)) else: result = _op_command() @@ -136,7 +135,7 @@ def check_cmd_args(self): logger.info('config path: "%s"' % config_path) cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) logger.debug('exec command: "%s"' % cmd) - result = _runner(cmd) # result = (stdout, stderr, errcode) + result = _runner(cmd) logger.debug('command return code: %s' % result[2]) if result[2]: logger.error('Configuration path is not correct') @@ -144,26 +143,6 @@ def check_cmd_args(self): logger.info('Configuration path is correct') return True - def check_cmd_args(self): - """ - Check that config path is correct before performing execmd() - """ - logger.info('Check specified configuration path existance') - config_path = ' '.join(self.args[1:]) - logger.info('config path: "%s"' % config_path) - cmd = '{0} exists {1}'.format(VYOS_SHELL_API, config_path) - logger.debug('exec command: "%s"' % cmd) - proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out, err = proc.communicate() - errcode = proc.returncode - logger.debug('command return code: %s' % errcode) - if errcode: - logger.error('Configuration path is not correct') - raise ConfigPathNotCorrect('Configuration path is not correct') - logger.info('Configuration path is correct') - return True - def get_possible_options(self): """ Returns list of nodes under specified configuration path diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn deleted file mode 100755 index 7981efb427..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/restart_vpn +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/vbash - -# 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. - -sudo rm /var/run/pluto.pid -vbash -ic 'restart vpn' diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/vyos deleted file mode 100755 index 1ae23f372b..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/init_script/vyos +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh -# -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA -# -### BEGIN INIT INFO -# Provides: vyos -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: vyos service -# Description: Provides the vyos service -### END INIT INFO -set -e -PIDFILE=/var/run/elastic_services/vyos.pid -LOGFILE=/var/log/elastic_services/vyos.log -DAEMON=/usr/bin/vyos -DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services -ENABLED=true -if test -f /etc/default/vyos; then -. /etc/default/vyos -fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services -. /lib/lsb/init-functions -export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp -if [ ! -x ${DAEMON} ] ; then -exit 0 -fi -case "$1" in -start) -test "$ENABLED" = "true" || exit 0 -start=1 -## check if pidfile is there -if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi -fi -if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting vyos agent" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? -else -echo "vyos[$pid] is already running" -fi -;; -stop) -test "$ENABLED" = "true" || exit 0 -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping vyos agent" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" -fi -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -;; -restart|force-reload) -test "$ENABLED" = "true" || exit 1 -$0 stop -sleep 2 -$0 start -;; -reload) -test "$ENABLED" = "true" || exit 0 -## check if pidfile is there -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading Vyos agent" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "Vyos agent is not running or PID file not existing" -fi -;; -status) -test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON vyos && exit 0 || exit $? -;; -*) -log_action_msg "Usage: /etc/init.d/vyos {start|stop|restart|force-reload|reload|status}" -exit 1 -;; -esac -exit 0 diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README index 53356b3e1c..51b6206f2b 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos-pbr/README @@ -19,7 +19,7 @@ 4) copy pbr_init and pbr to /usr/share/vyos-pbr -vyos agent (server2.py) adds route to the controller node received from pushed +vyos agent (server.py) adds route to the controller node received from pushed configuration, and also writes a route in the /usr/share/vyos-pbr/controller_route file. This is to make the added route persistent even if the instance is rebooted. diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/vyos b/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/vyos deleted file mode 100755 index 6ca96848a3..0000000000 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/src/vyos_init_script/vyos +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh -# -# One Convergence, Inc. CONFIDENTIAL -# Copyright (c) 2012-2014, One Convergence, Inc., USA -# All Rights Reserved. -# -# All information contained herein is, and remains the property of -# One Convergence, Inc. and its suppliers, if any. The intellectual and -# technical concepts contained herein are proprietary to One Convergence, -# Inc. and its suppliers. -# -# Dissemination of this information or reproduction of this material is -# strictly forbidden unless prior written permission is obtained from -# One Convergence, Inc., USA -# -### BEGIN INIT INFO -# Provides: vyos -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: vyos service -# Description: Provides the vyos service -### END INIT INFO -set -e -PIDFILE=/var/run/elastic_services/vyos.pid -LOGFILE=/var/log/elastic_services/vyos.log -DAEMON=/usr/bin/vyos -DAEMON_ARGS="--log-file=$LOGFILE" -DAEMON_DIR=/var/run/elastic_services -ENABLED=true -if test -f /etc/default/vyos; then -. /etc/default/vyos -fi -mkdir -p /var/run/elastic_services -mkdir -p /var/log/elastic_services -. /lib/lsb/init-functions -export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" -export TMPDIR=/var/lib/elastic_services/tmp -if [ ! -x ${DAEMON} ] ; then -exit 0 -fi -case "$1" in -start) -test "$ENABLED" = "true" || exit 0 -start=1 -## check if pidfile is there -if [ -f $PIDFILE ]; then -pid=`cat $PIDFILE` -## check if pid is there -if [ "1$pid" -ne "1" ]; then -## check if process with pid not running -set +e -kill -0 $pid > /dev/null 2>&1 -[ $? -eq 0 ] && start=0 -set -e -fi -fi -if [ $start -eq 1 ]; then -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -log_daemon_msg "Starting Vyos agent" -# We have completely messed up the rc level scripts -sudo chown vyos:users -R /var/run/elastic_services -sudo -u vyos start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir $DAEMON_DIR --exec $DAEMON -- $DAEMON_ARGS -log_end_msg $? -else -echo "vyos[$pid] is already running" -fi -;; -stop) -test "$ENABLED" = "true" || exit 0 -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Stopping Vyos agent" -start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -rm $PIDFILE -else -echo "PID file not existing" -fi -## ensure stale processes killed -set +e -running_processes=`ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | wc -l` -[ $running_processes -gt 0 ] && ps aux | grep "python /usr/bin/vyos" | grep -v grep | awk '{print $2}' | xargs kill -9 -set -e -;; -restart|force-reload) -test "$ENABLED" = "true" || exit 1 -$0 stop -sleep 2 -$0 start -;; -reload) -test "$ENABLED" = "true" || exit 0 -## check if pidfile is there -if [ -f $PIDFILE ]; then -set +e -kill -0 `cat $PIDFILE` > /dev/null 2>&1 -if [ $? -eq 0 ]; then -set -e -log_daemon_msg "Reloading vyos agent" -start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile $PIDFILE -log_end_msg $? -else -echo "No process with PID `cat $PIDFILE` found running, removing the PID file" -fi -else -echo "Vyos agent is not running or PID file not existing" -fi -;; -status) -test "$ENABLED" = "true" || exit 0 -status_of_proc -p $PIDFILE $DAEMON vyos && exit 0 || exit $? -;; -*) -log_action_msg "Usage: /etc/init.d/vyos {start|stop|restart|force-reload|reload|status}" -exit 1 -;; -esac -exit 0 From b4b1254053bd9333b303011f1f19dbc9d2d7fb76 Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 13 Jul 2016 12:47:07 +0530 Subject: [PATCH 035/157] reverting accidental changes to files --- .../nfp/configurator/agents/agent_base.py | 2 +- .../nfp/configurator/agents/firewall.py | 2 +- .../drivers/firewall/vyos/vyos_fw_driver.py | 389 ++++++++++-------- 3 files changed, 224 insertions(+), 169 deletions(-) diff --git a/gbpservice/nfp/configurator/agents/agent_base.py b/gbpservice/nfp/configurator/agents/agent_base.py index 8275a998b0..fdd509e0f7 100644 --- a/gbpservice/nfp/configurator/agents/agent_base.py +++ b/gbpservice/nfp/configurator/agents/agent_base.py @@ -68,7 +68,7 @@ def process_request(self, sa_req_list, notification_data): # In case of malformed input, send failure notification if not self.validate_request(sa_req_list, notification_data): - # REVISIT(JAGADISH): Need to send failure notification + # TODO(JAGADISH): Need to send failure notification return # Multiple request data blobs needs batch processing. Send batch diff --git a/gbpservice/nfp/configurator/agents/firewall.py b/gbpservice/nfp/configurator/agents/firewall.py index a9e0d07152..e7110c2065 100644 --- a/gbpservice/nfp/configurator/agents/firewall.py +++ b/gbpservice/nfp/configurator/agents/firewall.py @@ -289,7 +289,7 @@ def invoke_driver_for_plugin_api(self, ev): agent_info, firewall['id'], firewall) except Exception as err: - # REVISIT(VIKASH) Is it correct to raise ? As the subsequent + # TODO(VIKASH) Is it correct to raise ? As the subsequent # attempt to clean will only re-raise the last one.And it # can go on and on and may not be ever recovered. self.plugin_rpc.set_firewall_status( diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index 89679953a4..1df9aee6a4 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -22,56 +22,10 @@ vyos_fw_constants as const) from gbpservice.nfp.configurator.lib import constants as common_const from gbpservice.nfp.configurator.lib import fw_constants as fw_const -from nntplib import resp LOG = nfp_logging.getLogger(__name__) -""" REST API wrapper class that provides POST method to -communicate with the Service VM. - -""" - - -class RestApi(object): - - def __init__(self, timeout): - self.timeout = timeout - - def post(self, url, data): - """ Invokes REST POST call to the Service VM. - - :param url: URL to connect. - :param data: data to be sent. - - Returns: SUCCESS/Error message - - """ - - try: - data = jsonutils.dumps(data) - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to the service at URL: %r. " - "ERROR: %r" % (url, str(err).capitalize())) - return msg - except Exception as err: - msg = ("Failed to issue POST call " - "to service. URL: %r, Data: %r. Error: %r" % - (url, data, str(err).capitalize())) - return msg - - try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response, invalid JSON. URL: " - "%r. %r" % (url, str(err).capitalize())) - return msg - if resp.status_code not in common_const.SUCCESS_CODES: - return result - return common_const.STATUS_SUCCESS - - """ Firewall generic configuration driver for handling device configuration requests. @@ -121,27 +75,38 @@ def _configure_static_ips(self, resource_data): msg = ("Initiating POST request to add static IPs for primary " "service at: %r" % mgmt_ip) LOG.info(msg) - - err_msg = ("Static IP POST request to the VyOS firewall " - "service at %s failed. " % url) try: - resp = self.rest_api.post(url, data) - except Exception as err: - err_msg += ("Reason: %r" % str(err).capitalize()) - LOG.error(err_msg) - return err_msg + resp = requests.post(url, data, timeout=self.timeout) + except requests.exceptions.ConnectionError as err: + msg = ("Failed to establish connection to primary service at: " + "%r. ERROR: %r" % + (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg + except requests.exceptions.RequestException as err: + msg = ("Unexpected ERROR happened while adding " + "static IPs for primary service at: %r. " + "ERROR: %r" % + (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg - if resp is common_const.STATUS_SUCCESS: - msg = ("Static IPs successfully added for service at %r." % url) - LOG.info(msg) - return resp + try: + result = resp.json() + except ValueError as err: + msg = ("Unable to parse response, invalid JSON. URL: " + "%r. %r" % (url, str(err).capitalize())) + LOG.error(msg) + return msg + if not result['status']: + msg = ("Error adding static IPs. URL: %r. Reason: %s." % + (url, result['reason'])) + LOG.error(msg) + return msg - err_msg += (("Status code: %r, Reason: %r" % - (resp['status'], resp['reason'])) - if type(resp) is dict - else ("Reason: " + resp)) - LOG.error(err_msg) - return err_msg + msg = ("Static IPs successfully added.") + LOG.info(msg) + return common_const.STATUS_SUCCESS def configure_interfaces(self, context, resource_data): """ Configure interfaces for the service VM. @@ -176,6 +141,10 @@ def configure_interfaces(self, context, resource_data): "Error: %s" % (mgmt_ip, err)) LOG.error(msg) return result_log_forward + else: + msg = ("Configured log forwarding for service at %s. " + "Result: %s" % (mgmt_ip, result_log_forward)) + LOG.info(msg) try: result_static_ips = self._configure_static_ips(resource_data) @@ -186,6 +155,9 @@ def configure_interfaces(self, context, resource_data): else: if result_static_ips != common_const.STATUS_SUCCESS: return result_static_ips + else: + msg = ("Added static IPs. Result: %s" % result_static_ips) + LOG.info(msg) rule_info = dict( provider_mac=resource_data['provider_mac'], @@ -197,27 +169,36 @@ def configure_interfaces(self, context, resource_data): msg = ("Initiating POST request to add persistent rule to primary " "service at: %r" % mgmt_ip) LOG.info(msg) - - err_msg = ("Add persistent rule POST request to the VyOS firewall " - "service at %s failed. " % url) try: - resp = self.rest_api.post(url, data) - except Exception as err: - err_msg += ("Reason: %r" % str(err).capitalize()) - LOG.error(err_msg) - return err_msg + resp = requests.post(url, data, timeout=self.timeout) + except requests.exceptions.ConnectionError as err: + msg = ("Failed to establish connection to primary service at: " + "%r. ERROR: %r" % + (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg + except requests.exceptions.RequestException as err: + msg = ("Unexpected ERROR happened while adding " + "persistent rule of primary service at: %r. ERROR: %r" % + (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg - if resp is common_const.STATUS_SUCCESS: - msg = ("Persistent rule successfully added for " - "service at %r." % url) - LOG.info(msg) - return resp + try: + result = resp.json() + except ValueError as err: + msg = ("Unable to parse response, invalid JSON. URL: " + "%r. %r" % (url, str(err).capitalize())) + LOG.error(msg) + return msg + if not result['status']: + msg = ("Error adding persistent rule. URL: %r" % url) + LOG.error(msg) + return msg - err_msg += (("Status code: %r" % resp['status']) - if type(resp) is dict - else ("Reason: " + resp)) - LOG.error(err_msg) - return err_msg + msg = ("Persistent rule successfully added.") + LOG.info(msg) + return common_const.STATUS_SUCCESS def _clear_static_ips(self, resource_data): """ Clear static IPs for provider and stitching @@ -249,7 +230,6 @@ def _clear_static_ips(self, resource_data): msg = ("Initiating POST request to remove static IPs for primary " "service at: %r" % mgmt_ip) LOG.info(msg) - try: resp = requests.delete(url, data=data, timeout=self.timeout) except requests.exceptions.ConnectionError as err: @@ -371,8 +351,12 @@ def configure_routes(self, context, resource_data): source_cidrs = resource_data.get('source_cidrs') gateway_ip = resource_data.get('gateway_ip') + # REVISIT(VK): This was all along bad way, don't know why at all it + # was done like this. + url = const.request_url % (mgmt_ip, self.port, 'add-source-route') + active_configured = False route_info = [] for source_cidr in source_cidrs: route_info.append({'source_cidr': source_cidr, @@ -381,27 +365,42 @@ def configure_routes(self, context, resource_data): msg = ("Initiating POST request to configure route of " "primary service at: %r" % mgmt_ip) LOG.info(msg) - - err_msg = ("Configure routes POST request to the VyOS firewall " - "service at %s failed. " % url) try: - resp = self.rest_api.post(url, data) - except Exception as err: - err_msg += ("Reason: %r" % str(err).capitalize()) - LOG.error(err_msg) - return err_msg + resp = requests.post(url, data=data, timeout=self.timeout) + except requests.exceptions.ConnectionError as err: + msg = ("Failed to establish connection to service at: " + "%r. ERROR: %r" % (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg + except requests.exceptions.RequestException as err: + msg = ("Unexpected ERROR happened while configuring " + "route of service at: %r ERROR: %r" % + (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg - if resp is common_const.STATUS_SUCCESS: - msg = ("Configured routes successfully for service at %r." % url) - LOG.info(msg) - return resp + if resp.status_code in common_const.SUCCESS_CODES: + message = jsonutils.loads(resp.text) + if message.get("status", False): + msg = ("Route configured successfully for VYOS" + " service at: %r" % mgmt_ip) + LOG.info(msg) + active_configured = True + else: + msg = ("Configure source route failed on service with" + " status %s %s" + % (resp.status_code, message.get("reason", None))) + LOG.error(msg) + return msg - err_msg += (("Status code: %r, Reason: %r" % - (resp['status'], resp['reason'])) - if type(resp) is dict - else ("Reason: " + resp)) - LOG.error(err_msg) - return err_msg + msg = ("Route configuration status : %r " + % (active_configured)) + LOG.info(msg) + if active_configured: + return common_const.STATUS_SUCCESS + else: + return ("Failed to configure source route. Response code: %s." + "Response Content: %r" % (resp.status_code, resp.content)) def clear_routes(self, context, resource_data): """ Clear routes for the service VM. @@ -474,7 +473,6 @@ class FwaasDriver(FwGenericConfigDriver): def __init__(self, conf): self.conf = conf self.timeout = const.REST_TIMEOUT - self.rest_api = RestApi(self.timeout) self.host = self.conf.host self.port = const.CONFIGURATION_SERVER_PORT super(FwaasDriver, self).__init__() @@ -505,6 +503,44 @@ def _get_firewall_attribute(self, firewall): LOG.debug(msg) return description['vm_management_ip'] + def _print_exception(self, exception_type, err, + url, operation, response=None): + """ Abstract class for printing log messages + + :param exception_type: Name of the exception as a string + :param err: Either error of type Exception or error code + :param url: Service url + :param operation: Create, update or delete + :param response: Response content from Service VM + + """ + + if exception_type == 'ConnectionError': + msg = ("Error occurred while connecting to firewall " + "service at URL: %r. Firewall not %sd. %s. " + % (url, operation, str(err).capitalize())) + LOG.error(msg) + elif exception_type == 'RequestException': + msg = ("Unexpected error occurred while connecting to " + "firewall service at URL: %r. Firewall not %sd. %s" + % (url, operation, str(err).capitalize())) + LOG.error(msg) + elif exception_type == 'ValueError': + msg = ("Unable to parse the response. Invalid " + "JSON from URL: %r. Firewall not %sd. %s. %r" + % (url, operation, str(err).capitalize(), response)) + LOG.error(msg) + elif exception_type == 'UnexpectedError': + msg = ("Unexpected error occurred while connecting to service " + "at URL: %r. Firewall not %sd. %s. %r" + % (url, operation, str(err).capitalize(), response)) + LOG.error(msg) + elif exception_type == 'Failure': + msg = ("Firewall not %sd. URL: %r. Response " + "code from server: %r. %r" + % (operation, url, err, response)) + LOG.error(msg) + def create_firewall(self, context, firewall, host): """ Implements firewall creation @@ -529,27 +565,42 @@ def create_firewall(self, context, firewall, host): " %r. URL: %s" % (firewall['id'], firewall['tenant_id'], url)) LOG.info(msg) data = jsonutils.dumps(firewall) - - err_msg = ("Configure firewall POST request to the VyOS " - "service at %s failed. " % url) try: - resp = self.rest_api.post(url, data) - except Exception as err: - err_msg += ("Reason: %r" % str(err).capitalize()) - LOG.error(err_msg) - return common_const.STATUS_ERROR - - if resp is common_const.STATUS_SUCCESS: - msg = ("Configured firewall successfully for service at %r." % url) - LOG.info(msg) - return common_const.STATUS_ACTIVE + resp = requests.post(url, data, timeout=self.timeout) + except requests.exceptions.ConnectionError as err: + self._print_exception('ConnectionError', err, url, 'create') + raise requests.exceptions.ConnectionError(err) + except requests.exceptions.RequestException as err: + self._print_exception('RequestException', err, url, 'create') + raise requests.exceptions.RequestException(err) - err_msg += (("Status code: %r, Response Content: %r" % - (resp['status'], resp)) - if type(resp) is dict - else ("Reason: " + resp)) - LOG.error(err_msg) - return common_const.STATUS_ERROR + msg = ("POSTed the configuration to Service VM") + LOG.debug(msg) + if resp.status_code in common_const.SUCCESS_CODES: + try: + resp_payload = resp.json() + if resp_payload['config_success']: + msg = ("Configured Firewall successfully. URL: %s" + % url) + LOG.info(msg) + return common_const.STATUS_ACTIVE + else: + self._print_exception('Failure', + resp.status_code, url, + 'create', resp.content) + return common_const.STATUS_ERROR + except ValueError as err: + self._print_exception('ValueError', err, url, + 'create', resp.content) + return common_const.STATUS_ERROR + except Exception as err: + self._print_exception('UnexpectedError', err, url, + 'create', resp.content) + return common_const.STATUS_ERROR + else: + self._print_exception('Failure', resp.status_code, url, + 'create', resp.content) + return common_const.STATUS_ERROR def update_firewall(self, context, firewall, host): """ Implements firewall updation @@ -571,27 +622,19 @@ def update_firewall(self, context, firewall, host): msg = ("Initiating UPDATE request. URL: %s" % url) LOG.info(msg) data = jsonutils.dumps(firewall) - - err_msg = ("Update firewall POST request to the VyOS " - "service at %s failed. " % url) try: - resp = self.rest_api.post(url, data) + resp = requests.put(url, data=data, timeout=self.timeout) except Exception as err: - err_msg += ("Reason: %r" % str(err).capitalize()) - LOG.error(err_msg) - return common_const.STATUS_ERROR - - if resp is common_const.STATUS_SUCCESS: - msg = ("Updated firewall successfully for service at %r." % url) + self._print_exception('UnexpectedError', err, url, 'update') + raise Exception(err) + if resp.status_code == 200: + msg = ("Successful UPDATE request. URL: %s" % url) LOG.info(msg) return common_const.STATUS_ACTIVE - - err_msg += (("Status code: %r, Response Content: %r" % - (resp['status'], resp)) - if type(resp) is dict - else ("Reason: " + resp)) - LOG.error(err_msg) - return common_const.STATUS_ERROR + else: + self._print_exception('Failure', resp.status_code, url, + 'create', resp.content) + return common_const.STATUS_ERROR def delete_firewall(self, context, firewall, host): """ Implements firewall deletion @@ -613,35 +656,47 @@ def delete_firewall(self, context, firewall, host): msg = ("Initiating DELETE request. URL: %s" % url) LOG.info(msg) data = jsonutils.dumps(firewall) - - err_msg = ("Delete firewall POST request to the VyOS " - "service at %s failed. " % url) try: - resp = self.rest_api.post(url, data) - except Exception as err: - err_msg += ("Reason: %r" % str(err).capitalize()) - LOG.error(err_msg) - return common_const.STATUS_ERROR + resp = requests.delete(url, data=data, timeout=self.timeout) + except requests.exceptions.ConnectionError as err: + self._print_exception('ConnectionError', err, url, 'delete') + raise requests.exceptions.ConnectionError(err) + except requests.exceptions.RequestException as err: + self._print_exception('RequestException', err, url, 'delete') + raise requests.exceptions.RequestException(err) - if resp is common_const.STATUS_SUCCESS: - msg = ("Deleted firewall successfully for service at %r." % url) - LOG.info(msg) - return common_const.STATUS_DELETED - - if type(resp) is dict: - if not resp['delete_success'] and ( - resp.get('message') == const.INTERFACE_NOT_FOUND): - err_msg += ("Firewall was not deleted as interface was not " - "available in the firewall. It might have got " - "detached. So marking this delete as SUCCESS. " - "URL: %r, Response Content: %r" % - (url, resp.content)) - LOG.error(err_msg) - return common_const.STATUS_SUCCESS - else: - err_msg += ("Status code: %r, Response Content: %r" % - (resp['status'], resp)) + if resp.status_code in common_const.SUCCESS_CODES: + # For now agent only check for ERROR. + try: + resp_payload = resp.json() + if resp_payload['delete_success']: + msg = ("Deleted Firewall successfully.") + LOG.info(msg) + return common_const.STATUS_DELETED + elif not resp_payload['delete_success'] and \ + resp_payload.get('message', '') == ( + const.INTERFACE_NOT_FOUND): + # VK: This is a special case. + msg = ("Firewall not deleted, as interface is not " + "available in firewall. Possibly got detached. " + " So marking this delete as success. URL: %r" + "Response Content: %r" % (url, resp.content)) + LOG.error(msg) + return common_const.STATUS_SUCCESS + else: + self._print_exception('Failure', + resp.status_code, url, + 'delete', resp.content) + return common_const.STATUS_ERROR + except ValueError as err: + self._print_exception('ValueError', err, url, + 'delete', resp.content) + return common_const.STATUS_ERROR + except Exception as err: + self._print_exception('UnexpectedError', err, url, + 'delete', resp.content) + return common_const.STATUS_ERROR else: - err_msg += ("Reason: " + resp) - LOG.error(err_msg) - return common_const.STATUS_ERROR + self._print_exception('Failure', resp.status_code, url, + 'create', resp.content) + return common_const.STATUS_ERROR From 74e7ab87e157e69a57cfc4fa7e33495bcc67b32f Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 13 Jul 2016 14:07:57 +0530 Subject: [PATCH 036/157] code restructure --- .../nfp/configurator/agents/agent_base.py | 2 +- .../nfp/configurator/agents/firewall.py | 2 +- .../drivers/firewall/vyos/vyos_fw_driver.py | 539 ++++++++---------- gbpservice/nfp/configurator/lib/constants.py | 2 + 4 files changed, 236 insertions(+), 309 deletions(-) diff --git a/gbpservice/nfp/configurator/agents/agent_base.py b/gbpservice/nfp/configurator/agents/agent_base.py index fdd509e0f7..8275a998b0 100644 --- a/gbpservice/nfp/configurator/agents/agent_base.py +++ b/gbpservice/nfp/configurator/agents/agent_base.py @@ -68,7 +68,7 @@ def process_request(self, sa_req_list, notification_data): # In case of malformed input, send failure notification if not self.validate_request(sa_req_list, notification_data): - # TODO(JAGADISH): Need to send failure notification + # REVISIT(JAGADISH): Need to send failure notification return # Multiple request data blobs needs batch processing. Send batch diff --git a/gbpservice/nfp/configurator/agents/firewall.py b/gbpservice/nfp/configurator/agents/firewall.py index e7110c2065..a9e0d07152 100644 --- a/gbpservice/nfp/configurator/agents/firewall.py +++ b/gbpservice/nfp/configurator/agents/firewall.py @@ -289,7 +289,7 @@ def invoke_driver_for_plugin_api(self, ev): agent_info, firewall['id'], firewall) except Exception as err: - # TODO(VIKASH) Is it correct to raise ? As the subsequent + # REVISIT(VIKASH) Is it correct to raise ? As the subsequent # attempt to clean will only re-raise the last one.And it # can go on and on and may not be ever recovered. self.plugin_rpc.set_firewall_status( diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index 1df9aee6a4..a5054dc679 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -22,10 +22,64 @@ vyos_fw_constants as const) from gbpservice.nfp.configurator.lib import constants as common_const from gbpservice.nfp.configurator.lib import fw_constants as fw_const +from nntplib import resp LOG = nfp_logging.getLogger(__name__) +""" REST API wrapper class that provides POST method to +communicate with the Service VM. + +""" + + +class RestApi(object): + + def __init__(self, timeout): + self.timeout = timeout + + def request_type_to_api_map(self, url, data, request_type): + request_api_map = { + 'POST': requests.post(url, data=data, timeout=self.timeout), + 'PUT': requests.put(url, data=data, timeout=self.timeout), + 'DELETE': requests.delete(url, data=data, timeout=self.timeout)} + return request_api_map[request_type] + + def fire(self, url, data, request_type): + """ Invokes REST POST call to the Service VM. + + :param url: URL to connect. + :param data: data to be sent. + + Returns: SUCCESS/Error message + + """ + + try: + data = jsonutils.dumps(data) + resp = self.request_type_to_api_map(url, + data, request_type.upper()) + except requests.exceptions.ConnectionError as err: + msg = ("Failed to establish connection to the service at URL: %r. " + "ERROR: %r" % (url, str(err).capitalize())) + return msg + except Exception as err: + msg = ("Failed to issue %r call " + "to service. URL: %r, Data: %r. Error: %r" % + (request_type.upper(), url, data, str(err).capitalize())) + return msg + + try: + result = resp.json() + except ValueError as err: + msg = ("Unable to parse response, invalid JSON. URL: " + "%r. %r" % (url, str(err).capitalize())) + return msg + if resp.status_code not in common_const.SUCCESS_CODES: + return result + return common_const.STATUS_SUCCESS + + """ Firewall generic configuration driver for handling device configuration requests. @@ -75,38 +129,27 @@ def _configure_static_ips(self, resource_data): msg = ("Initiating POST request to add static IPs for primary " "service at: %r" % mgmt_ip) LOG.info(msg) - try: - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to primary service at: " - "%r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while adding " - "static IPs for primary service at: %r. " - "ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + err_msg = ("Static IP POST request to the VyOS firewall " + "service at %s failed. " % url) try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response, invalid JSON. URL: " - "%r. %r" % (url, str(err).capitalize())) - LOG.error(msg) - return msg - if not result['status']: - msg = ("Error adding static IPs. URL: %r. Reason: %s." % - (url, result['reason'])) - LOG.error(msg) - return msg + resp = self.rest_api.fire(url, data, common_const.POST) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - msg = ("Static IPs successfully added.") - LOG.info(msg) - return common_const.STATUS_SUCCESS + if resp is common_const.STATUS_SUCCESS: + msg = ("Static IPs successfully added for service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r, Reason: %r" % + (resp['status'], resp['reason'])) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def configure_interfaces(self, context, resource_data): """ Configure interfaces for the service VM. @@ -141,10 +184,6 @@ def configure_interfaces(self, context, resource_data): "Error: %s" % (mgmt_ip, err)) LOG.error(msg) return result_log_forward - else: - msg = ("Configured log forwarding for service at %s. " - "Result: %s" % (mgmt_ip, result_log_forward)) - LOG.info(msg) try: result_static_ips = self._configure_static_ips(resource_data) @@ -155,9 +194,6 @@ def configure_interfaces(self, context, resource_data): else: if result_static_ips != common_const.STATUS_SUCCESS: return result_static_ips - else: - msg = ("Added static IPs. Result: %s" % result_static_ips) - LOG.info(msg) rule_info = dict( provider_mac=resource_data['provider_mac'], @@ -169,36 +205,27 @@ def configure_interfaces(self, context, resource_data): msg = ("Initiating POST request to add persistent rule to primary " "service at: %r" % mgmt_ip) LOG.info(msg) - try: - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to primary service at: " - "%r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while adding " - "persistent rule of primary service at: %r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + err_msg = ("Add persistent rule POST request to the VyOS firewall " + "service at %s failed. " % url) try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response, invalid JSON. URL: " - "%r. %r" % (url, str(err).capitalize())) - LOG.error(msg) - return msg - if not result['status']: - msg = ("Error adding persistent rule. URL: %r" % url) - LOG.error(msg) - return msg + resp = self.rest_api.fire(url, data, common_const.POST) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - msg = ("Persistent rule successfully added.") - LOG.info(msg) - return common_const.STATUS_SUCCESS + if resp is common_const.STATUS_SUCCESS: + msg = ("Persistent rule successfully added for " + "service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r" % resp['status']) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def _clear_static_ips(self, resource_data): """ Clear static IPs for provider and stitching @@ -230,37 +257,27 @@ def _clear_static_ips(self, resource_data): msg = ("Initiating POST request to remove static IPs for primary " "service at: %r" % mgmt_ip) LOG.info(msg) - try: - resp = requests.delete(url, data=data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to primary service at: " - "%r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while removing " - "static IPs for primary service at: %r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + err_msg = ("Static IP DELETE request to the VyOS firewall " + "service at %s failed. " % url) try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response, invalid JSON. URL: " - "%r. %r" % (url, str(err).capitalize())) - LOG.error(msg) - return msg - if not result['status']: - msg = ("Error removing static IPs. URL: %r. Reason: %s." % - (url, result['reason'])) - LOG.error(msg) - return msg + resp = self.rest_api.fire(url, data, common_const.DELETE) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - msg = ("Static IPs successfully removed.") - LOG.info(msg) - return common_const.STATUS_SUCCESS + if resp is common_const.STATUS_SUCCESS: + msg = ("Static IPs successfully removed for service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r, Reason: %r" % + (resp['status'], resp['reason'])) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def clear_interfaces(self, context, resource_data): """ Clear interfaces for the service VM. @@ -299,40 +316,29 @@ def clear_interfaces(self, context, resource_data): msg = ("Initiating DELETE persistent rule.") LOG.info(msg) - url = const.request_url % (mgmt_ip, - self.port, - 'delete_rule') + url = const.request_url % (mgmt_ip, self.port, 'delete_rule') + data = jsonutils.dumps(rule_info) + err_msg = ("Persistent rule DELETE request to the VyOS firewall " + "service at %s failed. " % url) try: - data = jsonutils.dumps(rule_info) - resp = requests.delete(url, data=data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to service at: %r. " - "ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - raise Exception(err) - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while deleting " - "persistent rule of service at: %r. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - raise Exception(err) + resp = self.rest_api.fire(url, data, common_const.DELETE) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response, invalid JSON. URL: " - "%r. %r" % (url, str(err).capitalize())) - LOG.error(msg) - raise Exception(msg) - if not result['status'] or resp.status_code not in [200, 201, 202]: - msg = ("Error deleting persistent rule. URL: %r" % url) - LOG.error(msg) - raise Exception(msg) - msg = ("Persistent rule successfully deleted.") - LOG.info(msg) - return common_const.STATUS_SUCCESS + if resp is common_const.STATUS_SUCCESS: + msg = ("Persistent rules successfully deleted " + "for service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r." % resp['status']) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def configure_routes(self, context, resource_data): """ Configure routes for the service VM. @@ -351,12 +357,8 @@ def configure_routes(self, context, resource_data): source_cidrs = resource_data.get('source_cidrs') gateway_ip = resource_data.get('gateway_ip') - # REVISIT(VK): This was all along bad way, don't know why at all it - # was done like this. - url = const.request_url % (mgmt_ip, self.port, 'add-source-route') - active_configured = False route_info = [] for source_cidr in source_cidrs: route_info.append({'source_cidr': source_cidr, @@ -365,42 +367,27 @@ def configure_routes(self, context, resource_data): msg = ("Initiating POST request to configure route of " "primary service at: %r" % mgmt_ip) LOG.info(msg) + + err_msg = ("Configure routes POST request to the VyOS firewall " + "service at %s failed. " % url) try: - resp = requests.post(url, data=data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to service at: " - "%r. ERROR: %r" % (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while configuring " - "route of service at: %r ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + resp = self.rest_api.fire(url, data, common_const.POST) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - if resp.status_code in common_const.SUCCESS_CODES: - message = jsonutils.loads(resp.text) - if message.get("status", False): - msg = ("Route configured successfully for VYOS" - " service at: %r" % mgmt_ip) - LOG.info(msg) - active_configured = True - else: - msg = ("Configure source route failed on service with" - " status %s %s" - % (resp.status_code, message.get("reason", None))) - LOG.error(msg) - return msg + if resp is common_const.STATUS_SUCCESS: + msg = ("Configured routes successfully for service at %r." % url) + LOG.info(msg) + return resp - msg = ("Route configuration status : %r " - % (active_configured)) - LOG.info(msg) - if active_configured: - return common_const.STATUS_SUCCESS - else: - return ("Failed to configure source route. Response code: %s." - "Response Content: %r" % (resp.status_code, resp.content)) + err_msg += (("Status code: %r, Reason: %r" % + (resp['status'], resp['reason'])) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg def clear_routes(self, context, resource_data): """ Clear routes for the service VM. @@ -418,9 +405,6 @@ def clear_routes(self, context, resource_data): mgmt_ip = resource_data.get('mgmt_ip') source_cidrs = resource_data.get('source_cidrs') - # REVISIT(VK): This was all along bad way, don't know why at all it - # was done like this. - active_configured = False url = const.request_url % (mgmt_ip, self.port, 'delete-source-route') route_info = [] @@ -430,31 +414,28 @@ def clear_routes(self, context, resource_data): msg = ("Initiating DELETE route request to primary service at: %r" % mgmt_ip) LOG.info(msg) + + err_msg = ("Routes DELETE request to the VyOS firewall " + "service at %s failed. " % url) try: - resp = requests.delete(url, data=data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to primary service at: " - " %r. ERROR: %r" % (mgmt_ip, err)) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while deleting " - " route of service at: %r ERROR: %r" - % (mgmt_ip, err)) - LOG.error(msg) - return msg + resp = self.rest_api.fire(url, data, common_const.DELETE) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg - if resp.status_code in common_const.SUCCESS_CODES: - active_configured = True + if resp is common_const.STATUS_SUCCESS: + msg = ("Routes successfully removed for service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r, Response Content: %r" % + (resp['status'], resp)) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg - msg = ("Route deletion status : %r " - % (active_configured)) - LOG.info(msg) - if active_configured: - return common_const.STATUS_SUCCESS - else: - return ("Failed to delete source route. Response code: %s." - "Response Content: %r" % (resp.status_code, resp.content)) """ Firewall as a service driver for handling firewall service configuration requests. @@ -473,6 +454,7 @@ class FwaasDriver(FwGenericConfigDriver): def __init__(self, conf): self.conf = conf self.timeout = const.REST_TIMEOUT + self.rest_api = RestApi(self.timeout) self.host = self.conf.host self.port = const.CONFIGURATION_SERVER_PORT super(FwaasDriver, self).__init__() @@ -503,44 +485,6 @@ def _get_firewall_attribute(self, firewall): LOG.debug(msg) return description['vm_management_ip'] - def _print_exception(self, exception_type, err, - url, operation, response=None): - """ Abstract class for printing log messages - - :param exception_type: Name of the exception as a string - :param err: Either error of type Exception or error code - :param url: Service url - :param operation: Create, update or delete - :param response: Response content from Service VM - - """ - - if exception_type == 'ConnectionError': - msg = ("Error occurred while connecting to firewall " - "service at URL: %r. Firewall not %sd. %s. " - % (url, operation, str(err).capitalize())) - LOG.error(msg) - elif exception_type == 'RequestException': - msg = ("Unexpected error occurred while connecting to " - "firewall service at URL: %r. Firewall not %sd. %s" - % (url, operation, str(err).capitalize())) - LOG.error(msg) - elif exception_type == 'ValueError': - msg = ("Unable to parse the response. Invalid " - "JSON from URL: %r. Firewall not %sd. %s. %r" - % (url, operation, str(err).capitalize(), response)) - LOG.error(msg) - elif exception_type == 'UnexpectedError': - msg = ("Unexpected error occurred while connecting to service " - "at URL: %r. Firewall not %sd. %s. %r" - % (url, operation, str(err).capitalize(), response)) - LOG.error(msg) - elif exception_type == 'Failure': - msg = ("Firewall not %sd. URL: %r. Response " - "code from server: %r. %r" - % (operation, url, err, response)) - LOG.error(msg) - def create_firewall(self, context, firewall, host): """ Implements firewall creation @@ -565,43 +509,28 @@ def create_firewall(self, context, firewall, host): " %r. URL: %s" % (firewall['id'], firewall['tenant_id'], url)) LOG.info(msg) data = jsonutils.dumps(firewall) - try: - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - self._print_exception('ConnectionError', err, url, 'create') - raise requests.exceptions.ConnectionError(err) - except requests.exceptions.RequestException as err: - self._print_exception('RequestException', err, url, 'create') - raise requests.exceptions.RequestException(err) - msg = ("POSTed the configuration to Service VM") - LOG.debug(msg) - if resp.status_code in common_const.SUCCESS_CODES: - try: - resp_payload = resp.json() - if resp_payload['config_success']: - msg = ("Configured Firewall successfully. URL: %s" - % url) - LOG.info(msg) - return common_const.STATUS_ACTIVE - else: - self._print_exception('Failure', - resp.status_code, url, - 'create', resp.content) - return common_const.STATUS_ERROR - except ValueError as err: - self._print_exception('ValueError', err, url, - 'create', resp.content) - return common_const.STATUS_ERROR - except Exception as err: - self._print_exception('UnexpectedError', err, url, - 'create', resp.content) - return common_const.STATUS_ERROR - else: - self._print_exception('Failure', resp.status_code, url, - 'create', resp.content) + err_msg = ("Configure firewall POST request to the VyOS " + "service at %s failed. " % url) + try: + resp = self.rest_api.fire(url, data, common_const.POST) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) return common_const.STATUS_ERROR + if resp is common_const.STATUS_SUCCESS: + msg = ("Configured firewall successfully for service at %r." % url) + LOG.info(msg) + return common_const.STATUS_ACTIVE + + err_msg += (("Status code: %r, Response Content: %r" % + (resp['status'], resp)) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return common_const.STATUS_ERROR + def update_firewall(self, context, firewall, host): """ Implements firewall updation @@ -622,19 +551,27 @@ def update_firewall(self, context, firewall, host): msg = ("Initiating UPDATE request. URL: %s" % url) LOG.info(msg) data = jsonutils.dumps(firewall) + + err_msg = ("Update firewall POST request to the VyOS " + "service at %s failed. " % url) try: - resp = requests.put(url, data=data, timeout=self.timeout) + resp = self.rest_api.fire(url, data, common_const.PUT) except Exception as err: - self._print_exception('UnexpectedError', err, url, 'update') - raise Exception(err) - if resp.status_code == 200: - msg = ("Successful UPDATE request. URL: %s" % url) + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return common_const.STATUS_ERROR + + if resp is common_const.STATUS_SUCCESS: + msg = ("Updated firewall successfully for service at %r." % url) LOG.info(msg) return common_const.STATUS_ACTIVE - else: - self._print_exception('Failure', resp.status_code, url, - 'create', resp.content) - return common_const.STATUS_ERROR + + err_msg += (("Status code: %r, Response Content: %r" % + (resp['status'], resp)) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return common_const.STATUS_ERROR def delete_firewall(self, context, firewall, host): """ Implements firewall deletion @@ -656,47 +593,35 @@ def delete_firewall(self, context, firewall, host): msg = ("Initiating DELETE request. URL: %s" % url) LOG.info(msg) data = jsonutils.dumps(firewall) + + err_msg = ("Delete firewall POST request to the VyOS " + "service at %s failed. " % url) try: - resp = requests.delete(url, data=data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - self._print_exception('ConnectionError', err, url, 'delete') - raise requests.exceptions.ConnectionError(err) - except requests.exceptions.RequestException as err: - self._print_exception('RequestException', err, url, 'delete') - raise requests.exceptions.RequestException(err) - - if resp.status_code in common_const.SUCCESS_CODES: - # For now agent only check for ERROR. - try: - resp_payload = resp.json() - if resp_payload['delete_success']: - msg = ("Deleted Firewall successfully.") - LOG.info(msg) - return common_const.STATUS_DELETED - elif not resp_payload['delete_success'] and \ - resp_payload.get('message', '') == ( - const.INTERFACE_NOT_FOUND): - # VK: This is a special case. - msg = ("Firewall not deleted, as interface is not " - "available in firewall. Possibly got detached. " - " So marking this delete as success. URL: %r" - "Response Content: %r" % (url, resp.content)) - LOG.error(msg) - return common_const.STATUS_SUCCESS - else: - self._print_exception('Failure', - resp.status_code, url, - 'delete', resp.content) - return common_const.STATUS_ERROR - except ValueError as err: - self._print_exception('ValueError', err, url, - 'delete', resp.content) - return common_const.STATUS_ERROR - except Exception as err: - self._print_exception('UnexpectedError', err, url, - 'delete', resp.content) - return common_const.STATUS_ERROR - else: - self._print_exception('Failure', resp.status_code, url, - 'create', resp.content) + resp = self.rest_api.fire(url, data, common_const.DELETE) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) return common_const.STATUS_ERROR + + if resp is common_const.STATUS_SUCCESS: + msg = ("Deleted firewall successfully for service at %r." % url) + LOG.info(msg) + return common_const.STATUS_DELETED + + if type(resp) is dict: + if not resp['delete_success'] and ( + resp.get('message') == const.INTERFACE_NOT_FOUND): + err_msg += ("Firewall was not deleted as interface was not " + "available in the firewall. It might have got " + "detached. So marking this delete as SUCCESS. " + "URL: %r, Response Content: %r" % + (url, resp.content)) + LOG.error(err_msg) + return common_const.STATUS_SUCCESS + else: + err_msg += ("Status code: %r, Response Content: %r" % + (resp['status'], resp)) + else: + err_msg += ("Reason: " + resp) + LOG.error(err_msg) + return common_const.STATUS_ERROR diff --git a/gbpservice/nfp/configurator/lib/constants.py b/gbpservice/nfp/configurator/lib/constants.py index a607c0344b..c32b66edb4 100644 --- a/gbpservice/nfp/configurator/lib/constants.py +++ b/gbpservice/nfp/configurator/lib/constants.py @@ -36,6 +36,8 @@ CREATE = 'create' UPDATE = 'update' DELETE = 'delete' +POST = 'POST' +PUT = 'put' UNHANDLED = "UNHANDLED" SUCCESS_CODES = [200, 201, 202, 203, 204] From 18fd19ffb9142d014f30adbdc863905423e7f4a8 Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 13 Jul 2016 14:41:26 +0530 Subject: [PATCH 037/157] code reorg in base driver --- .../configurator/drivers/base/base_driver.py | 52 +++++++------------ .../drivers/firewall/vyos/vyos_fw_driver.py | 1 - 2 files changed, 20 insertions(+), 33 deletions(-) diff --git a/gbpservice/nfp/configurator/drivers/base/base_driver.py b/gbpservice/nfp/configurator/drivers/base/base_driver.py index 5962a2b092..221a30354a 100644 --- a/gbpservice/nfp/configurator/drivers/base/base_driver.py +++ b/gbpservice/nfp/configurator/drivers/base/base_driver.py @@ -120,37 +120,25 @@ def _configure_log_forwarding(self, url, mgmt_ip, port): msg = ("Initiating POST request to configure log forwarding " "for service at: %r" % mgmt_ip) LOG.info(msg) - try: - resp = requests.post(url, data, timeout=self.timeout) - except requests.exceptions.ConnectionError as err: - msg = ("Failed to establish connection to service at: " - "%r for configuring log forwarding. ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg - except requests.exceptions.RequestException as err: - msg = ("Unexpected ERROR happened while configuring " - "log forwarding for service at: %r. " - "ERROR: %r" % - (mgmt_ip, str(err).capitalize())) - LOG.error(msg) - return msg + err_msg = ("Log forward POST request to the " + "service at %s failed. " % url) try: - result = resp.json() - except ValueError as err: - msg = ("Unable to parse response of configure log forward API, " - "invalid JSON. URL: %r. %r" % (url, str(err).capitalize())) - LOG.error(msg) - return msg - if not result['status']: - msg = ("Error configuring log forwarding for service " - "at %s. URL: %r. Reason: %s." % - (mgmt_ip, url, result['reason'])) - LOG.error(msg) - return msg - - msg = ("Successfully configured log forwarding for " - "service at %s." % mgmt_ip) - LOG.info(msg) - return const.SUCCESS + resp = self.rest_api.fire(url, data, const.POST) + except Exception as err: + err_msg += ("Reason: %r" % str(err).capitalize()) + LOG.error(err_msg) + return err_msg + + if resp is const.STATUS_SUCCESS: + msg = ("Log forwarding successfully configured " + "for service at %r." % url) + LOG.info(msg) + return resp + + err_msg += (("Status code: %r, Reason: %r" % + (resp['status'], resp['reason'])) + if type(resp) is dict + else ("Reason: " + resp)) + LOG.error(err_msg) + return err_msg diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index a5054dc679..1bf24862da 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -22,7 +22,6 @@ vyos_fw_constants as const) from gbpservice.nfp.configurator.lib import constants as common_const from gbpservice.nfp.configurator.lib import fw_constants as fw_const -from nntplib import resp LOG = nfp_logging.getLogger(__name__) From 3673acec6fbc1d56569b532f110989cd5323cc63 Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 13 Jul 2016 16:51:27 +0530 Subject: [PATCH 038/157] refinements --- .../configurator/drivers/base/base_driver.py | 1 - .../drivers/firewall/vyos/vyos_fw_driver.py | 22 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/gbpservice/nfp/configurator/drivers/base/base_driver.py b/gbpservice/nfp/configurator/drivers/base/base_driver.py index 221a30354a..45c8642f09 100644 --- a/gbpservice/nfp/configurator/drivers/base/base_driver.py +++ b/gbpservice/nfp/configurator/drivers/base/base_driver.py @@ -10,7 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import requests import subprocess from oslo_serialization import jsonutils diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index 1bf24862da..aeae078946 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -55,7 +55,6 @@ def fire(self, url, data, request_type): """ try: - data = jsonutils.dumps(data) resp = self.request_type_to_api_map(url, data, request_type.upper()) except requests.exceptions.ConnectionError as err: @@ -74,7 +73,8 @@ def fire(self, url, data, request_type): msg = ("Unable to parse response, invalid JSON. URL: " "%r. %r" % (url, str(err).capitalize())) return msg - if resp.status_code not in common_const.SUCCESS_CODES: + if resp.status_code not in common_const.SUCCESS_CODES or ( + result.get('status') is False): return result return common_const.STATUS_SUCCESS @@ -428,8 +428,8 @@ def clear_routes(self, context, resource_data): LOG.info(msg) return resp - err_msg += (("Status code: %r, Response Content: %r" % - (resp['status'], resp)) + err_msg += (("Status code: %r, Reason: %r" % + (resp['status'], resp['reason'])) if type(resp) is dict else ("Reason: " + resp)) LOG.error(err_msg) @@ -523,8 +523,8 @@ def create_firewall(self, context, firewall, host): LOG.info(msg) return common_const.STATUS_ACTIVE - err_msg += (("Status code: %r, Response Content: %r" % - (resp['status'], resp)) + err_msg += (("Reason: %r, Response Content: %r" % + (resp.pop('message'), resp)) if type(resp) is dict else ("Reason: " + resp)) LOG.error(err_msg) @@ -565,8 +565,8 @@ def update_firewall(self, context, firewall, host): LOG.info(msg) return common_const.STATUS_ACTIVE - err_msg += (("Status code: %r, Response Content: %r" % - (resp['status'], resp)) + err_msg += (("Reason: %r, Response Content: %r" % + (resp.pop('message'), resp)) if type(resp) is dict else ("Reason: " + resp)) LOG.error(err_msg) @@ -608,7 +608,7 @@ def delete_firewall(self, context, firewall, host): return common_const.STATUS_DELETED if type(resp) is dict: - if not resp['delete_success'] and ( + if not resp.get('delete_success') and ( resp.get('message') == const.INTERFACE_NOT_FOUND): err_msg += ("Firewall was not deleted as interface was not " "available in the firewall. It might have got " @@ -618,8 +618,8 @@ def delete_firewall(self, context, firewall, host): LOG.error(err_msg) return common_const.STATUS_SUCCESS else: - err_msg += ("Status code: %r, Response Content: %r" % - (resp['status'], resp)) + err_msg += ("Reason: %r, Response Content: %r" % + (resp.pop('reason'), resp)) else: err_msg += ("Reason: " + resp) LOG.error(err_msg) From ac6a3b22b6cb4c8cbd61e41fe723b1c9895b5c62 Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 13 Jul 2016 17:21:07 +0530 Subject: [PATCH 039/157] corrected changelog --- .../nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog index 750beb0575..c58aa95e26 100644 --- a/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog +++ b/gbpservice/nfp/service_vendor_agents/vyos/agent/DEBIAN/changelog @@ -12,4 +12,6 @@ vyos (2.0) INITIAL RELEASE; urgency=low - * Initial release. (Closes: #XXXXXX) + * Supports firewall and VPN + + -- One Convergence Wed, 13 Jul 2016 05:20:46 +0530 From 828d72e8a733a9cc2e7e468065d54e46efc80689 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Wed, 13 Jul 2016 18:40:57 +0530 Subject: [PATCH 040/157] added fix for ASAv Firewall moving error state --- .../nfp/configurator/drivers/firewall/asav/asav_fw_driver.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py index 3a7dbe4a0d..1f19662ff7 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py @@ -31,7 +31,7 @@ LOG = nfp_logging.getLogger(__name__) -TIMEOUT = 20 +TIMEOUT = 40 asav_auth_opts = [ cfg.StrOpt( @@ -854,11 +854,12 @@ def create_firewall(self, context, firewall, host): msg = ("Failed to configure ASAv Firewall. Reason: %r" % result) LOG.error(msg) + return result else: self.save_config(mgmt_ip, firewall['id']) msg = ("Configured ASAv Firewall.") LOG.info(msg) - return result + return common_const.STATUS_ACTIVE except Exception as err: msg = ("Failed to configure firewall. Error: %r" % err) LOG.error(msg) From aa426e9ac14ec4167d3d18bb42c464a4df5f9df3 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Wed, 13 Jul 2016 18:59:16 +0530 Subject: [PATCH 041/157] Fixed diskimage directory path --- devstack/lib/nfp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 724c85c404..e576745cd7 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -172,7 +172,7 @@ function create_nfp_image { if [[ $NFP_DEVSTACK_MODE = base ]]; then RefConfiguratorQcow2ImageName=reference_configurator_image echo "Building Image: $RefConfiguratorQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/ref_configurator_conf.json + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/ref_configurator_conf.json RefConfiguratorQcow2Image=$(cat /tmp/image_path) echo "Uploading Image: $RefConfiguratorQcow2ImageName" glance image-create --name $RefConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $RefConfiguratorQcow2Image @@ -184,7 +184,7 @@ function create_nfp_image { create_port_for_vm $ConfiguratorQcow2ImageName if [[ $ConfiguratorQcow2Image = build ]]; then echo "Building Image: $ConfiguratorQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/configurator_conf.json $GBPSERVICE_BRANCH + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH ConfiguratorQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $ConfiguratorQcow2ImageName" @@ -201,7 +201,7 @@ function create_nfp_image { sudo rm -rf visibility sudo git clone https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git -b $VISIBILITY_GIT_BRANCH echo "Building Image: $VisibilityQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/visibility_disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/visibility_conf.json $GBPSERVICE_BRANCH $DEVSTACK_DIR/local.conf + sudo python $DISKIMAGE_CREATE_DIR/visibility_disk_image_create.py $DISKIMAGE_CREATE_DIR/visibility_conf.json $GBPSERVICE_BRANCH $DEVSTACK_DIR/local.conf VisibilityQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $VisibilityQcow2ImageName" @@ -220,7 +220,7 @@ function create_nfp_image { create_port_for_vm $ConfiguratorQcow2ImageName if [[ $ConfiguratorQcow2Image = build ]]; then echo "Building Image: $ConfiguratorQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/configurator_conf.json $GBPSERVICE_BRANCH + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH ConfiguratorQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $ConfiguratorQcow2ImageName" @@ -230,7 +230,7 @@ function create_nfp_image { VyosQcow2ImageName=vyos if [[ $VyosQcow2Image = build ]]; then echo "Building Image: $VyosQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/vyos_conf.json + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/vyos_conf.json VyosQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $VyosQcow2ImageName" @@ -239,7 +239,7 @@ function create_nfp_image { HaproxyQcow2ImageName=haproxy if [[ $HaproxyQcow2Image = build ]]; then echo "Building Image: $HaproxyQcow2ImageName" - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/haproxy_conf.json + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/haproxy_conf.json HaproxyQcow2Image=$(cat /tmp/image_path) fi echo "Uploading Image: $HaproxyQcow2ImageName" From 4801128f847e73ecd2218315a61852bde7d92404 Mon Sep 17 00:00:00 2001 From: pkharat Date: Thu, 14 Jul 2016 10:45:52 +0530 Subject: [PATCH 042/157] Addressing review comments for LB agent and drivers code submission --- .../configurator/agents/loadbalancer_v1.py | 154 +++++++++--------- .../v1/haproxy/haproxy_lb_driver.py | 147 +++++------------ .../v1/haproxy/haproxy_rest_client.py | 87 ++-------- .../nfp/configurator/lib/lb_constants.py | 18 ++ 4 files changed, 144 insertions(+), 262 deletions(-) diff --git a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py index b0f4a8ec6c..6b69308b9d 100644 --- a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py +++ b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py @@ -9,7 +9,6 @@ # 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 os from gbpservice.nfp.configurator.agents import agent_base from gbpservice.nfp.configurator.lib import data_filter @@ -23,25 +22,24 @@ LOG = nfp_logging.getLogger(__name__) -""" Implements LBaaS response path to Neutron plugin. -Methods of this class are invoked by the LBaasEventHandler class and also -by driver class for sending response from driver to the LBaaS Neutron plugin. -""" - class LBaasRpcSender(data_filter.Filter): - + """Implements LBaaS response path to Neutron plugin. + Methods of this class are invoked by LBaasEventHandler class + and also by driver class for sending response from driver to + the LBaaS Neutron plugin. + """ def __init__(self, sc): self.notify = agent_base.AgentBaseNotification(sc) def get_logical_device(self, pool_id, context): """ Calls data filter library to get logical device from pool_id. - :param pool_id: object type - :param context: context which has list of all pool related resources - belonging to that tenant + :param pool_id: pool id + :param context: RPC context Returns: logical_device + """ return self.call( context, @@ -57,6 +55,10 @@ def update_status(self, obj_type, obj_id, status, agent_info, obj=None): :param obj_type: object type :param obj_id: object id :param status: status of the object to be set + :param agent_info: agent_info + :param obj: object + + Returns: None """ @@ -76,7 +78,9 @@ def update_pool_stats(self, pool_id, stats, context, pool=None): :param pool_id: pool id :param stats: statistics of that pool + :param context: RPC context + Returns: None """ msg = {'info': {'service_type': lb_constants.SERVICE_TYPE, 'context': context.to_dict()}, @@ -92,10 +96,11 @@ def update_pool_stats(self, pool_id, stats, context, pool=None): def vip_deleted(self, vip, status, agent_info): """ Enqueues the response from LBaaS operation to neutron plugin. - :param vip: object type - :param vip_id: object id - :param status: status of the object to be set + :param vip: vip resource + :param status: vip status + :param agent_info: agent_info + Returns: None """ msg = {'info': {'service_type': lb_constants.SERVICE_TYPE, 'context': agent_info['context']}, @@ -107,18 +112,17 @@ def vip_deleted(self, vip, status, agent_info): } self.notify._notification(msg) -"""Implements APIs invoked by configurator for processing RPC messages. - -RPC client of configurator module receives RPC messages from REST server -and invokes the API of this class. The instance of this class is registered -with configurator module using register_service_agent API. Configurator module -identifies the service agent object based on service type and invokes ones of -the methods of this class to configure the device. -""" +class LBaaSRpcManager(agent_base.AgentBaseRPCManager): + """Implements APIs invoked by configurator for processing RPC messages. + RPC client of configurator module receives RPC messages from REST server + and invokes the API of this class. The instance of this class is registered + with configurator module using register_service_agent API. Configurator + module identifies the service agent object based on service type and + invokes one of the methods of this class to configure the device. -class LBaaSRpcManager(agent_base.AgentBaseRPCManager): + """ def __init__(self, sc, conf): """Instantiates child and parent class objects. @@ -137,11 +141,13 @@ def _send_event(self, event_id, data, serialize=False, binding_key=None, """Posts an event to framework. :param event_id: Unique identifier for the event - :param event_key: Event key for serialization - :param serialize: Serialize the event + :param data: event data + :param serialize: boolean value used to serialize the event :param binding_key: binding key to be used for serialization :param key: event key + Returns: None + """ ev = self.sc.new_event(id=event_id, data=data) @@ -392,33 +398,28 @@ def __init__(self, sc, drivers, rpcmgr): self.rpcmgr = rpcmgr self.plugin_rpc = LBaasRpcSender(sc) - """TODO(pritam): Remove neutron context dependency. As of now because + """REVISIT (pritam): Remove neutron context dependency. As of now because config agent needs context in notification, and internal poll event like collect_stats() does not have context, creating context here, but should get rid of this in future. """ self.context = context.get_admin_context_without_session() - def _get_driver(self, driver_name): - """Retrieves service driver object based on service type input. + def _get_driver(self, service_vendor): + """Retrieves service driver instance. - Currently, service drivers are identified with service type. Support - for single driver per service type is provided. When multi-vendor - support is going to be provided, the driver should be selected based - on both service type and vendor name. - - :param service_type: Service type - loadbalancer + :param service_vendor: service vendor Returns: Service driver instance """ - driver = lb_constants.SERVICE_TYPE + driver_name + driver = lb_constants.SERVICE_TYPE + service_vendor return self.drivers[driver] def handle_event(self, ev): - """Processes the generated events in worker context. + """Processes generated events in worker context. - Processes the following events. + Processes following events. - create pool - update pool - delete pool @@ -437,28 +438,23 @@ def handle_event(self, ev): Returns: None """ - msg = ("Handling event=%s" % (ev.id)) + msg = ("Starting handling event %s" % (ev.id)) LOG.info(msg) try: - msg = ("Worker process with ID: %s starting " - "to handle task: %s of topic: %s. " - % (os.getpid(), ev.id, lb_constants.LBAAS_AGENT_RPC_TOPIC)) - LOG.debug(msg) - method = getattr(self, "_%s" % (ev.id.lower())) method(ev) except Exception as err: - msg = ("Failed to perform the operation: %s. %s" + msg = ("Failed to handle event %s. Reason is %s" % (ev.id, str(err).capitalize())) LOG.error(msg) finally: if ev.id == lb_constants.EVENT_COLLECT_STATS: - """Do not say event done for collect stats as it is + """Do not say event done for this event as it is to be executed forever """ pass else: - msg = ("Calling event done for event=%s" % (ev.id)) + msg = ("Successfully handled event %s" % (ev.id)) LOG.info(msg) self.sc.event_complete(ev) @@ -471,18 +467,18 @@ def _handle_event_vip(self, ev, operation): driver = self._get_driver(service_vendor) try: - if operation == 'create': + if operation == lb_constants.CREATE: driver.create_vip(vip, context) - elif operation == 'update': + elif operation == lb_constants.UPDATE: old_vip = data['old_vip'] driver.update_vip(old_vip, vip, context) - elif operation == 'delete': + elif operation == lb_constants.DELETE: driver.delete_vip(vip, context) self.plugin_rpc.vip_deleted(vip, lb_constants.ACTIVE, agent_info) return # Don't update object status for delete operation except Exception: - if operation == 'delete': + if operation == lb_constants.DELETE: msg = ("Failed to delete vip %s" % (vip['id'])) self.plugin_rpc.vip_deleted(vip, lb_constants.ACTIVE, agent_info) @@ -497,13 +493,13 @@ def _handle_event_vip(self, ev, operation): agent_info, vip) def _create_vip(self, ev): - self._handle_event_vip(ev, 'create') + self._handle_event_vip(ev, lb_constants.CREATE) def _update_vip(self, ev): - self._handle_event_vip(ev, 'update') + self._handle_event_vip(ev, lb_constants.UPDATE) def _delete_vip(self, ev): - self._handle_event_vip(ev, 'delete') + self._handle_event_vip(ev, lb_constants.DELETE) def _handle_event_pool(self, ev, operation): data = ev.data @@ -512,7 +508,7 @@ def _handle_event_pool(self, ev, operation): agent_info = context.pop('agent_info') service_vendor = agent_info['service_vendor'] try: - if operation == 'create': + if operation == lb_constants.CREATE: driver_name = data['driver_name'] driver_id = driver_name + service_vendor if (driver_id) not in self.drivers.keys(): @@ -525,17 +521,17 @@ def _handle_event_pool(self, ev, operation): driver = self.drivers[driver_id] driver.create_pool(pool, context) LBaaSEventHandler.instance_mapping[pool['id']] = driver_name - elif operation == 'update': + elif operation == lb_constants.UPDATE: old_pool = data['old_pool'] driver = self._get_driver(service_vendor) # pool['id']) driver.update_pool(old_pool, pool, context) - elif operation == 'delete': + elif operation == lb_constants.DELETE: driver = self._get_driver(service_vendor) # pool['id']) driver.delete_pool(pool, context) del LBaaSEventHandler.instance_mapping[pool['id']] return # Don't update object status for delete operation except Exception: - if operation == 'delete': + if operation == lb_constants.DELETE: msg = ("Failed to delete pool %s" % (pool['id'])) LOG.warn(msg) del LBaaSEventHandler.instance_mapping[pool['id']] @@ -549,13 +545,13 @@ def _handle_event_pool(self, ev, operation): agent_info, pool) def _create_pool(self, ev): - self._handle_event_pool(ev, 'create') + self._handle_event_pool(ev, lb_constants.CREATE) def _update_pool(self, ev): - self._handle_event_pool(ev, 'update') + self._handle_event_pool(ev, lb_constants.UPDATE) def _delete_pool(self, ev): - self._handle_event_pool(ev, 'delete') + self._handle_event_pool(ev, lb_constants.DELETE) def _handle_event_member(self, ev, operation): data = ev.data @@ -565,16 +561,16 @@ def _handle_event_member(self, ev, operation): service_vendor = agent_info['service_vendor'] driver = self._get_driver(service_vendor) # member['pool_id']) try: - if operation == 'create': + if operation == lb_constants.CREATE: driver.create_member(member, context) - elif operation == 'update': + elif operation == lb_constants.UPDATE: old_member = data['old_member'] driver.update_member(old_member, member, context) - elif operation == 'delete': + elif operation == lb_constants.DELETE: driver.delete_member(member, context) return # Don't update object status for delete operation except Exception: - if operation == 'delete': + if operation == lb_constants.DELETE: msg = ("Failed to delete member %s" % (member['id'])) LOG.warn(msg) else: @@ -587,13 +583,13 @@ def _handle_event_member(self, ev, operation): agent_info, member) def _create_member(self, ev): - self._handle_event_member(ev, 'create') + self._handle_event_member(ev, lb_constants.CREATE) def _update_member(self, ev): - self._handle_event_member(ev, 'update') + self._handle_event_member(ev, lb_constants.UPDATE) def _delete_member(self, ev): - self._handle_event_member(ev, 'delete') + self._handle_event_member(ev, lb_constants.DELETE) def _handle_event_pool_health_monitor(self, ev, operation): data = ev.data @@ -606,20 +602,20 @@ def _handle_event_pool_health_monitor(self, ev, operation): assoc_id = {'pool_id': pool_id, 'monitor_id': health_monitor['id']} try: - if operation == 'create': + if operation == lb_constants.CREATE: driver.create_pool_health_monitor(health_monitor, pool_id, context) - elif operation == 'update': + elif operation == lb_constants.UPDATE: old_health_monitor = data['old_health_monitor'] driver.update_pool_health_monitor(old_health_monitor, health_monitor, pool_id, context) - elif operation == 'delete': + elif operation == lb_constants.DELETE: driver.delete_pool_health_monitor(health_monitor, pool_id, context) return # Don't update object status for delete operation except Exception: - if operation == 'delete': + if operation == lb_constants.DELETE: msg = ("Failed to delete pool health monitor." " assoc_id: %s" % (assoc_id)) LOG.warn(msg) @@ -633,23 +629,23 @@ def _handle_event_pool_health_monitor(self, ev, operation): agent_info, health_monitor) def _create_pool_health_monitor(self, ev): - self._handle_event_pool_health_monitor(ev, 'create') + self._handle_event_pool_health_monitor(ev, lb_constants.CREATE) def _update_pool_health_monitor(self, ev): - self._handle_event_pool_health_monitor(ev, 'update') + self._handle_event_pool_health_monitor(ev, lb_constants.UPDATE) def _delete_pool_health_monitor(self, ev): - self._handle_event_pool_health_monitor(ev, 'delete') + self._handle_event_pool_health_monitor(ev, lb_constants.DELETE) def _agent_updated(self, ev): - """ TODO:(pritam): Support """ + """ REVISIT(pritam): Implement this method """ return None def _collect_stats(self, ev): self.sc.poll_event(ev) @nfp_api.poll_event_desc(event=lb_constants.EVENT_COLLECT_STATS, - spacing=60) + spacing=60) def collect_stats(self, ev): for pool_id, driver_name in LBaaSEventHandler.instance_mapping.items(): driver_id = lb_constants.SERVICE_TYPE + driver_name @@ -734,7 +730,7 @@ def register_service_agent(cm, sc, conf, rpcmgr): """ - service_type = 'loadbalancer' # lb_constants.SERVICE_TYPE + service_type = lb_constants.SERVICE_TYPE cm.register_service_agent(service_type, rpcmgr) @@ -750,7 +746,7 @@ def init_agent(cm, sc, conf): try: drivers = load_drivers(sc, conf) except Exception as err: - msg = ("Loadbalaner agent failed to load service drivers. %s" + msg = ("Loadbalaner agent failed to load service drivers. Reason:%s" % (str(err).capitalize())) LOG.error(msg) raise err @@ -764,7 +760,7 @@ def init_agent(cm, sc, conf): try: events_init(sc, drivers, rpcmgr) except Exception as err: - msg = ("Loadbalaner agent failed to initialize events. %s" + msg = ("Loadbalaner agent failed to initialize events. Reason:%s" % (str(err).capitalize())) LOG.error(msg) raise err @@ -777,7 +773,7 @@ def init_agent(cm, sc, conf): register_service_agent(cm, sc, conf, rpcmgr) except Exception as err: msg = ("Failed to register Loadbalaner agent with" - " configurator module. %s" % (str(err).capitalize())) + " configurator module. Reason:%s" % (str(err).capitalize())) LOG.error(msg) raise err else: diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py index e20440f41f..5edad25291 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py +++ b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py @@ -21,48 +21,23 @@ LOG = nfp_logging.getLogger(__name__) -DRIVER_NAME = 'loadbalancer' -PROTOCOL_MAP = { - lb_constants.PROTOCOL_TCP: 'tcp', - lb_constants.PROTOCOL_HTTP: 'http', - lb_constants.PROTOCOL_HTTPS: 'https', -} -BALANCE_MAP = { - lb_constants.LB_METHOD_ROUND_ROBIN: 'roundrobin', - lb_constants.LB_METHOD_LEAST_CONNECTIONS: 'leastconn', - lb_constants.LB_METHOD_SOURCE_IP: 'source' -} -REQUEST_RETRIES = 0 -REQUEST_TIMEOUT = 120 - - -""" Loadbalancer generic configuration driver for handling device -configuration requests. - -""" - class LbGenericConfigDriver(object): + """ Loadbalancer generic configuration driver class for handling device + configuration requests. """ - Driver class for implementing loadbalancer configuration - requests from Orchestrator. - """ - def __init__(self): pass def configure_interfaces(self, context, resource_data): """ Configure interfaces for the service VM. - Calls static IP configuration function and implements - persistent rule addition in the service VM. - Issues REST call to service VM for configuration of interfaces. - + Internally it configures log forwarding in service vm :param context: neutron context - :param resource_data: a dictionary of loadbalancer objects - send by neutron plugin + :param resource_data: resource data containing service vm + related details - Returns: SUCCESS/Failure message with reason. + Returns: SUCCESS/FAILED with reason. """ @@ -97,6 +72,11 @@ def configure_interfaces(self, context, resource_data): class HaproxyOnVmDriver(LbGenericConfigDriver, base_driver.BaseDriver): + """Main driver which gets registered with LB agent and Generic Config agent + in configurator and these agents pass all *aaS neutron and generic + config requests to this class. + """ + service_type = 'loadbalancer' service_vendor = 'haproxy' pool_to_device = {} @@ -111,7 +91,8 @@ def __init__(self, plugin_rpc=None, conf=None): def _get_rest_client(self, ip_addr): client = haproxy_rest_client.HttpRequests( ip_addr, self.port, - REQUEST_RETRIES, REQUEST_TIMEOUT) + lb_constants.REQUEST_RETRIES, + lb_constants.REQUEST_TIMEOUT) return client def _get_device_for_pool(self, pool_id, context): @@ -155,7 +136,6 @@ def _expand_expected_codes(self, codes): return retval def _prepare_haproxy_frontend(self, vip): - # Prepare the frontend request body vip_ip = vip['address'] vip_port_number = vip['protocol_port'] protocol = vip['protocol'] @@ -163,7 +143,7 @@ def _prepare_haproxy_frontend(self, vip): frontend = { 'option': {}, 'bind': '%s:%d' % (vip_ip, vip_port_number), - 'mode': PROTOCOL_MAP[protocol], + 'mode': lb_constants.PROTOCOL_MAP[protocol], 'default_backend': "bck:%s" % vip['pool_id'] } if vip['connection_limit'] >= 0: @@ -193,8 +173,9 @@ def _prepare_haproxy_backend(self, pool, context): server_addon = '' backend = { - 'mode': '%s' % PROTOCOL_MAP[protocol], - 'balance': '%s' % BALANCE_MAP.get(lb_method, 'roundrobin'), + 'mode': '%s' % lb_constants.PROTOCOL_MAP[protocol], + 'balance': '%s' % lb_constants.BALANCE_MAP.get( + lb_method, 'roundrobin'), 'option': {}, 'timeout': {}, 'server': {} @@ -391,115 +372,79 @@ def _prepare_backend_updating_health_monitor_for_pool(self, health_monitor, return backend def _create_vip(self, vip, device_addr): - # create REST client object try: client = self._get_rest_client(device_addr) - - # Prepare the frontend request body frontend = self._prepare_haproxy_frontend(vip) - body = {"frnt:%s" % vip['id']: frontend} - - # Send REST API request to Haproxy agent on VM client.create_resource("frontend", body) except Exception as e: raise e def _delete_vip(self, vip, device_addr): - # create REST client object try: client = self._get_rest_client(device_addr) - - # Send REST API request to Haproxy agent on VM client.delete_resource("frontend/frnt:%s" % vip['id']) except Exception as e: raise e def _create_pool(self, pool, device_addr, context): - # create REST client object try: client = self._get_rest_client(device_addr) - - # Prepare the backend request body backend = self._prepare_haproxy_backend(pool, context) body = {'bck:%s' % pool['id']: backend} - - # Send REST API request to Haproxy agent on VM client.create_resource("backend", body) except Exception as e: raise e def _delete_pool(self, pool, device_addr): - # create REST client object try: client = self._get_rest_client(device_addr) - - # Send REST API request to Haproxy agent on VM client.delete_resource("backend/bck:%s" % pool['id']) except Exception as e: raise e def _create_member(self, member, device_addr, context): - # create REST client object try: client = self._get_rest_client(device_addr) - - # get backend backend = client.get_resource("backend/bck:%s" % member['pool_id']) - backend = self._prepare_haproxy_backend_with_member( member, backend, context) - - # Send REST API request to Haproxy agent on VM client.update_resource("backend/bck:%s" % member['pool_id'], backend) except Exception as e: raise e def _delete_member(self, member, device_addr): - # create REST client object try: client = self._get_rest_client(device_addr) - - # get backend backend = client.get_resource("backend/bck:%s" % member['pool_id']) # update backend with the server deleted from that del backend['server']['srvr:%s' % member['id']] - - # Send REST API request to Haproxy agent on VM client.update_resource("backend/bck:%s" % member['pool_id'], backend) except Exception as e: raise e def _create_pool_health_monitor(self, hm, pool_id, device_addr): - # create REST client object try: client = self._get_rest_client(device_addr) - backend = client.get_resource("backend/bck:%s" % pool_id) - - # server addon options backend = self._prepare_backend_adding_health_monitor_to_pool( hm, pool_id, backend) - client.update_resource("backend/bck:%s" % pool_id, backend) except Exception as e: raise e def _delete_pool_health_monitor(self, hm, pool_id, device_addr, context): - # create REST client object try: client = self._get_rest_client(device_addr) - backend = client.get_resource("backend/bck:%s" % pool_id) - backend = self._prepare_backend_deleting_health_monitor_from_pool( hm, pool_id, @@ -509,11 +454,9 @@ def _delete_pool_health_monitor(self, hm, pool_id, except Exception as e: raise e - @classmethod - def get_name(self): - return DRIVER_NAME - def deploy_instance(self, logical_config): + """ REVISIT (pritam): Not used now but will be used when + agent_updated() call is supported in LB agent """ # do actual deploy only if vip and pool are configured and active if (not logical_config or 'vip' not in logical_config or @@ -544,6 +487,8 @@ def deploy_instance(self, logical_config): raise e def undeploy_instance(self, pool_id, context): + """ REVISIT (pritam): Not used now but will be used when + agent_updated() call is supported in LB agent """ try: device_addr = self._get_device_for_pool(pool_id, context) logical_device = self.plugin_rpc.get_logical_device(pool_id, @@ -558,6 +503,7 @@ def undeploy_instance(self, pool_id, context): raise e def remove_orphans(self, pol_ids): + """ REVISIT (pritam): Unused""" raise NotImplementedError def get_stats(self, pool_id): @@ -589,7 +535,7 @@ def get_stats(self, pool_id): return stats def create_vip(self, vip, context): - msg = (" create vip [vip=%s ]" % (vip)) + msg = ("Handling create vip [vip=%s]" % (vip)) LOG.info(msg) try: device_addr = self._get_device_for_pool(vip['pool_id'], context) @@ -614,7 +560,7 @@ def create_vip(self, vip, context): LOG.info(msg) def update_vip(self, old_vip, vip, context): - msg = (" update vip [old_vip=%s, vip=%s ]" % (old_vip, vip)) + msg = ("Handling update vip [old_vip=%s, vip=%s]" % (old_vip, vip)) LOG.info(msg) try: device_addr = self._get_device_for_pool(old_vip['pool_id'], @@ -644,13 +590,8 @@ def update_vip(self, old_vip, vip, context): self._create_vip(vip, device_addr) return - # create REST client object client = self._get_rest_client(device_addr) - - # Prepare the frontend request body body = self._prepare_haproxy_frontend(vip) - - # Send REST API request to Haproxy agent on VM client.update_resource("frontend/frnt:%s" % vip['id'], body) except Exception as e: msg = ("Failed to update vip %s. %s" @@ -662,17 +603,13 @@ def update_vip(self, old_vip, vip, context): LOG.info(msg) def delete_vip(self, vip, context): - msg = (" delete vip [vip=%s ]" % (vip)) + msg = ("Handling delete vip [vip=%s]" % (vip)) LOG.info(msg) try: device_addr = self._get_device_for_pool(vip['pool_id'], context) logical_device = self.plugin_rpc.get_logical_device(vip['pool_id'], context) - - # Delete vip from VM self._delete_vip(vip, device_addr) - - # Delete pool from VM pool = logical_device['pool'] self._delete_pool(pool, device_addr) except Exception as e: @@ -686,24 +623,20 @@ def delete_vip(self, vip, context): def create_pool(self, pool, context): # nothing to do here because a pool needs a vip to be useful - msg = ("create pool [pool=%s]" % (pool)) + msg = ("Handled create pool [pool=%s]" % (pool)) LOG.info(msg) - pass def update_pool(self, old_pool, pool, context): - msg = ("update pool [old_pool=%s, pool=%s]" % (old_pool, pool)) + msg = ("Handling update pool [old_pool=%s, pool=%s]" + % (old_pool, pool)) LOG.info(msg) try: device_addr = self._get_device_for_pool(pool['id'], context) if (pool['vip_id'] and device_addr is not None): - # create REST client object client = self._get_rest_client(device_addr) - # Prepare the backend request body for create request backend = self._prepare_haproxy_backend(pool, context) body = backend - - # Send REST API request to Haproxy agent on VM client.update_resource("backend/bck:%s" % pool['id'], body) except Exception as e: msg = ("Failed to update pool from %s to %s. %s" @@ -716,11 +649,11 @@ def update_pool(self, old_pool, pool, context): LOG.info(msg) def delete_pool(self, pool, context): - # if pool is not known, do nothing - msg = ("delete pool [pool=%s]" % (pool)) + msg = ("Handling delete pool [pool=%s]" % (pool)) LOG.info(msg) try: device = HaproxyOnVmDriver.pool_to_device.get(pool['id'], None) + # if pool is not known, do nothing if device is None: return @@ -738,7 +671,7 @@ def delete_pool(self, pool, context): LOG.info(msg) def create_member(self, member, context): - msg = (" create member [member=%s] " % (member)) + msg = ("Handling create member [member=%s] " % (member)) LOG.info(msg) try: device_addr = self._get_device_for_pool(member['pool_id'], context) @@ -754,8 +687,8 @@ def create_member(self, member, context): LOG.info(msg) def update_member(self, old_member, member, context): - msg = (" update member [old_member=%s, member=%s] " % (old_member, - member)) + msg = ("Handling update member [old_member=%s, member=%s] " + % (old_member, member)) LOG.info(msg) try: device_addr = self._get_device_for_pool(old_member['pool_id'], @@ -763,7 +696,6 @@ def update_member(self, old_member, member, context): if device_addr is not None: self._delete_member(old_member, device_addr) - # create the member (new) device_addr = self._get_device_for_pool(member['pool_id'], context) if device_addr is not None: self._create_member(member, device_addr, context) @@ -777,7 +709,7 @@ def update_member(self, old_member, member, context): LOG.info(msg) def delete_member(self, member, context): - msg = (" delete member [member=%s] " % (member)) + msg = ("Handling delete member [member=%s] " % (member)) LOG.info(msg) try: device_addr = self._get_device_for_pool(member['pool_id'], @@ -794,8 +726,7 @@ def delete_member(self, member, context): LOG.info(msg) def create_pool_health_monitor(self, health_monitor, pool_id, context): - # create the health_monitor - msg = ("create pool health monitor [hm=%s, pool_id=%s]" + msg = ("Handling create pool health monitor [hm=%s, pool_id=%s]" % (health_monitor, pool_id)) LOG.info(msg) try: @@ -816,15 +747,13 @@ def create_pool_health_monitor(self, health_monitor, pool_id, context): def update_pool_health_monitor(self, old_health_monitor, health_monitor, pool_id, context): - msg = ("update pool health monitor [old_hm=%s, hm=%s, pool_id=%s]" - % (old_health_monitor, health_monitor, pool_id)) + msg = ("Handling update pool health monitor [old_hm=%s, hm=%s," + "pool_id=%s]" % (old_health_monitor, health_monitor, pool_id)) LOG.info(msg) try: device_addr = self._get_device_for_pool(pool_id, context) if device_addr is not None: - # create REST client object client = self._get_rest_client(device_addr) - backend = client.get_resource("backend/bck:%s" % pool_id) # update backend deleting the health monitor from it @@ -849,7 +778,7 @@ def update_pool_health_monitor(self, old_health_monitor, health_monitor, LOG.info(msg) def delete_pool_health_monitor(self, health_monitor, pool_id, context): - msg = ("delete pool health monitor [hm=%s, pool_id=%s]" + msg = ("Handling delete pool health monitor [hm=%s, pool_id=%s]" % (health_monitor, pool_id)) LOG.info(msg) try: diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py index 24c2800817..70285e0777 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py +++ b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py @@ -10,7 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import httplib import json as jsonutils import requests import urlparse @@ -20,30 +19,9 @@ LOG = nfp_logging.getLogger(__name__) -class RestClientException(Exception): - """Embeds the exceptions thrown by the REST Client.""" - - def __init__(self, status, method, url): - """RestClientException init - - :param status: HTTP Response code - :param method: HTTP Request Method - :param url: REST Server request url - - """ - msg = ("REST Request failed for URL: %s, Method: " - "%s and Response Code: %s" % (url, method, status)) - LOG.error(msg) - super(RestClientException, self).__init__(self, msg) - self.status = status - self.method = method - self.url = url - - class HttpRequests(object): - """Encapsulates the Python requests module - - Uses python-requests library to perform API request to the REST server + """Encapsulates Python requests module + Uses python-requests library to perform API request to the REST server """ def __init__(self, host, port, retries=0, request_timeout=30): @@ -62,48 +40,21 @@ def do_request(self, method, url=None, headers=None, data=None, response = self.pool.request(method, url=url, headers=headers, data=data, timeout=timeout) - except Exception as err: - msg = ("Failed in performing HTTP request. %s" - % str(err).capitalize()) + except Exception as e: + msg = ("[Request:%s, URL:%s, Body:%s] Failed.Reason:%s" + % (method, url, data, e)) LOG.error(msg) + raise e return response def request(self, method, uri, body=None, content_type="application/json"): - """Issue a request to REST API server.""" - headers = {"Content-Type": content_type} url = urlparse.urljoin(self.rest_server_url, uri) - response = None - - try: - response = self.do_request(method, url=url, headers=headers, - data=body, - timeout=self._request_timeout) - - msg = ("Request: %s, URI: %s executed." - % (method, (self.rest_server_url + uri))) - LOG.debug(msg) - except httplib.IncompleteRead as err: - response = err.partial - msg = ("Request failed in REST Api Server. %s" - % str(err).capitalize()) - LOG.error(msg) - except Exception as err: - msg = ("Request failed in REST Api Server. %s" - % str(err).capitalize()) - LOG.error(msg) - - if response is None: - # Request was timed out. - msg = ("Response is Null, Request for method: %s to " - "URI: %s timed out" % (method, uri)) - LOG.error(msg) - # TODO(Magesh): Use constants defined in requests or httplib - # for checking error codes - raise RestClientException(status=408, method=method, url=url) - + response = self.do_request(method, url=url, headers=headers, + data=body, + timeout=self._request_timeout) status = response.status_code # Not Found (404) is OK for DELETE. Ignore it here if method == 'DELETE' and status == 404: @@ -111,15 +62,12 @@ def request(self, method, uri, body=None, elif status not in (200, 201, 204): # requests.codes.ok = 200, requests.codes.created = 201, # requests.codes.no_content = 204 - msg = ("Unexpected response code %s from REST " - "API Server for %s to %s" - % (status, method, url)) + msg = ("[Request:%s, URL:%s, Body:%s] Failed with status:%s" + % (method, url, body, status)) LOG.error(msg) - raise RestClientException(status=status, method=method, - url=self.rest_server_url + uri) else: - msg = ("Success: %s, url: %s and status: %s" - % (method, (self.rest_server_url + uri), status)) + msg = ("[Request:%s, URL:%s, Body:%s] executed successfully" + % (method, url, body)) LOG.debug(msg) response.body = response.content return response @@ -140,12 +88,3 @@ def delete_resource(self, resource_path): def get_resource(self, resource_path): response = self.request("GET", resource_path) return response.json() - - def list_resources(self, resource_path): - response = self.request("GET", resource_path) - return response.json() - - def sync_config(self, resource_path, resource_data): - response = self.request("POST", resource_path, - jsonutils.dumps(resource_data)) - return response.json() diff --git a/gbpservice/nfp/configurator/lib/lb_constants.py b/gbpservice/nfp/configurator/lib/lb_constants.py index 1e82774697..acd0352bdf 100644 --- a/gbpservice/nfp/configurator/lib/lb_constants.py +++ b/gbpservice/nfp/configurator/lib/lb_constants.py @@ -61,6 +61,24 @@ LBAAS = 'lbaas' +PROTOCOL_MAP = { + PROTOCOL_TCP: 'tcp', + PROTOCOL_HTTP: 'http', + PROTOCOL_HTTPS: 'https', +} +BALANCE_MAP = { + LB_METHOD_ROUND_ROBIN: 'roundrobin', + LB_METHOD_LEAST_CONNECTIONS: 'leastconn', + LB_METHOD_SOURCE_IP: 'source' +} +REQUEST_RETRIES = 0 +REQUEST_TIMEOUT = 120 + +# Operations +CREATE = 'create' +UPDATE = 'update' +DELETE = 'delete' + """ Event ids """ EVENT_CREATE_POOL = 'CREATE_POOL' EVENT_UPDATE_POOL = 'UPDATE_POOL' From 2ecc16635511f109df4b717ec3fb855faffa4cf1 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 14 Jul 2016 11:16:55 +0530 Subject: [PATCH 043/157] Removed enterprise code from devstack Conflicts: devstack/lib/nfp devstack/local.conf.nfp --- devstack/lib/nfp | 178 ++----------- devstack/local.conf.nfp | 29 +-- devstack/plugin.sh | 8 +- devstack/settings | 3 +- .../nfp/scripts/mode_shift.sh.enterprise | 233 ++++++++++++++++++ 5 files changed, 258 insertions(+), 193 deletions(-) create mode 100644 gbpservice/nfp/scripts/mode_shift.sh.enterprise diff --git a/devstack/lib/nfp b/devstack/lib/nfp index e576745cd7..f49134e381 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -13,8 +13,7 @@ # - assign_user_role_credential # - create_nfp_gbp_resources # - create_nfp_image -# - launch_[configurator/visibility]VM -# - nfp_logs_forword +# - launch_configuratorVM # - copy_nfp_files_and_start_process # # ``unstack.sh`` calls the entry points in this order: @@ -39,7 +38,7 @@ function prepare_nfp_image_builder { sudo -H -E pip install -r $DISKIMAGE_CREATE_DIR/requirements.txt sudo apt-get install -y --force-yes qemu-utils sudo apt-get install -y --force-yes dpkg-dev - if [[ $NFP_DEVSTACK_MODE != base ]]; then + if [[ $NFP_DEVSTACK_MODE = advanced ]]; then sudo wget -qO- https://get.docker.com/ | bash fi } @@ -117,9 +116,6 @@ function create_nfp_gbp_resources { gbp service-profile-create --servicetype LOADBALANCERV2 --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy_lbaasv2,device_type=nova,flavor=m1.small --vendor NFP lbv2_profile gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vyos_fw_profile gbp service-profile-create --servicetype VPN --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vpn_profile - if [[ $NFP_DEVSTACK_MODE = enterprise ]]; then - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=asav,device_type=nova --vendor NFP asav_fw_profile - fi create_ext_net create_ep_and_nsp create_advance_sharing_ptg @@ -132,31 +128,16 @@ function create_nfp_gbp_resources { function create_port_for_vm { # $1 is image_name - if [[ $1 = configurator ]]; then - instance_name=$ConfiguratorInstanceName - else - instance_name=$VisibilityInstanceName - fi +# $2 is instance name GROUP="svc_management_ptg" - PortId=$(gbp policy-target-create --policy-target-group $GROUP $instance_name | grep port_id | awk '{print $4}') + PortId=$(gbp policy-target-create --policy-target-group $GROUP $2 | grep port_id | awk '{print $4}') IpAddr_extractor=`neutron port-list --format value | grep $PortId | awk '{print $7}'` IpAddr_purge_last=${IpAddr_extractor::-1} IpAddr=${IpAddr_purge_last//\"/} echo "IpAddr of port($PortId): $IpAddr" - if [[ $1 = configurator ]]; then - configurator_image_name=$1 - configurator_port_id=$PortId - configurator_ip=$IpAddr - else - visibility_image_name=$1 - visibility_port_id=$PortId - visibility_ip=$IpAddr - fi -} - -function configure_vis_ip_addr_in_docker { - echo "Visibility VM IP address is: $visibility_ip" - sed -i "s/VIS_VM_IP_ADDRESS/"$visibility_ip"/" $NFPSERVICE_DIR/gbpservice/nfp/configurator/Dockerfile + configurator_image_name=$1 + configurator_port_id=$PortId + configurator_ip=$IpAddr } # create_nfp_image() - Create and upload the service images @@ -178,54 +159,16 @@ function create_nfp_image { glance image-create --name $RefConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $RefConfiguratorQcow2Image openstack --os-cloud=devstack-admin flavor create --ram 512 --disk 3 --vcpus 1 m1.nfp-tiny else - if [[ $NFP_DEVSTACK_MODE = enterprise ]]; then - ConfiguratorQcow2ImageName=configurator - ConfiguratorInstanceName="configuratorVM_instance" - create_port_for_vm $ConfiguratorQcow2ImageName - if [[ $ConfiguratorQcow2Image = build ]]; then - echo "Building Image: $ConfiguratorQcow2ImageName" - sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH - ConfiguratorQcow2Image=$(cat /tmp/image_path) - fi - echo "Uploading Image: $ConfiguratorQcow2ImageName" - glance image-create --name $ConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $ConfiguratorQcow2Image - - VisibilityQcow2ImageName=visibility - VisibilityInstanceName="VisibilityVM_instance" - create_port_for_vm $VisibilityQcow2ImageName - if [[ $VisibilityQcow2Image = build ]]; then - # edits the docker file to add visibility vm IP address - configure_vis_ip_addr_in_docker - # prepare visibility source, this is needed for diskimage build - cd /home/stack/ - sudo rm -rf visibility - sudo git clone https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git -b $VISIBILITY_GIT_BRANCH - echo "Building Image: $VisibilityQcow2ImageName" - sudo python $DISKIMAGE_CREATE_DIR/visibility_disk_image_create.py $DISKIMAGE_CREATE_DIR/visibility_conf.json $GBPSERVICE_BRANCH $DEVSTACK_DIR/local.conf - VisibilityQcow2Image=$(cat /tmp/image_path) - fi - echo "Uploading Image: $VisibilityQcow2ImageName" - glance image-create --name $VisibilityQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $VisibilityQcow2Image - - AsavQcow2ImageName=asav - echo "Uploading Image: $AsavQcow2ImageName" - glance image-create --name $AsavQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $AsavQcow2Image - - PaloAltoQcow2ImageName=paloalto - echo "Uploading Image: $PaloAltoQcow2ImageName" - glance image-create --name $PaloAltoQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $PaloAltoQcow2Image - else - ConfiguratorQcow2ImageName=configurator - ConfiguratorInstanceName="configuratorVM_instance" - create_port_for_vm $ConfiguratorQcow2ImageName - if [[ $ConfiguratorQcow2Image = build ]]; then - echo "Building Image: $ConfiguratorQcow2ImageName" - sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH - ConfiguratorQcow2Image=$(cat /tmp/image_path) - fi - echo "Uploading Image: $ConfiguratorQcow2ImageName" - glance image-create --name $ConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $ConfiguratorQcow2Image + ConfiguratorQcow2ImageName=configurator + ConfiguratorInstanceName="configuratorVM_instance" + create_port_for_vm $ConfiguratorQcow2ImageName $ConfiguratorInstanceName + if [[ $ConfiguratorQcow2Image = build ]]; then + echo "Building Image: $ConfiguratorQcow2ImageName" + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH + ConfiguratorQcow2Image=$(cat /tmp/image_path) fi + echo "Uploading Image: $ConfiguratorQcow2ImageName" + glance image-create --name $ConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $ConfiguratorQcow2Image VyosQcow2ImageName=vyos if [[ $VyosQcow2Image = build ]]; then @@ -283,91 +226,6 @@ function launch_configuratorVM { sleep 10 } -function configure_visibility_user_data { -# $1 is the Visibility VM's IP address - CUR_DIR=$PWD - visibility_vm_ip=$1 - sudo rm -rf /opt/visibility_user_data - sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. - cd /opt - sudo rm -rf my.key my.key.pub - sudo ssh-keygen -t rsa -N "" -f my.key - value=`sudo cat my.key.pub` - sudo echo $value - sudo sed -i "s||${value}|" visibility_user_data - sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data - sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data - sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data - sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data - cd $CUR_DIR -} - -function attach_security_groups { - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - - SecGroup="allow_all" - nova secgroup-create $SecGroup "allow all traffic" - nova secgroup-add-rule $SecGroup udp 1 65535 120.0.0.0/24 - nova secgroup-add-rule $SecGroup icmp -1 -1 120.0.0.0/24 - nova secgroup-add-rule $SecGroup tcp 1 65535 120.0.0.0/24 - nova secgroup-add-rule $SecGroup tcp 80 80 0.0.0.0/0 - nova secgroup-add-rule $SecGroup udp 514 514 0.0.0.0/0 - nova secgroup-add-rule $SecGroup tcp 443 443 0.0.0.0/0 - - nova add-secgroup $VisibilityInstanceName $SecGroup -} - -function launch_visibilityVM { - neutron net-create visibility-network - neutron subnet-create visibility-network 188.0.0.0/24 --name visibility-subnet - neutron router-create visibility-router - neutron router-gateway-set visibility-router $EXT_NET_NAME - neutron router-interface-add visibility-router visibility-subnet - ExtPortId=$(neutron port-create visibility-network | grep ' id ' | awk '{print $4}') - fip_id=$(neutron floatingip-create $EXT_NET_NAME | grep ' id '| awk '{print $4}') - neutron floatingip-associate $fip_id $ExtPortId - IpAddr_extractor=`neutron port-list --format value|grep $ExtPortId|awk '{print $6}'` - IpAddr_purge_last=${IpAddr_extractor::-1} - IpAddr2=${IpAddr_purge_last//\"/} - echo "Collecting IpAddr : for $ExtPortId" - echo $IpAddr2 - - echo "Collecting ImageId : for $visibility_image_name" - ImageId=`glance image-list|grep $visibility_image_name |awk '{print $2}'` - if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then - echo $ImageId - else - echo "No image found with name $visibility_image_name ..." - exit - fi - - configure_visibility_user_data $visibility_ip - echo "Launching Visibility image" - nova boot --image $ImageId --flavor m1.xlarge --user-data /opt/visibility_user_data --nic port-id=$visibility_port_id --nic port-id=$ExtPortId $VisibilityInstanceName - sleep 10 - attach_security_groups -} - -function nfp_logs_forword { - VISIBILITY_CONF="/etc/rsyslog.d/visibility.conf" - SYSLOG_CONFIG="/etc/rsyslog.conf" - log_facility=local1 - - sudo sed -i '/#$ModLoad imudp/ s/^#//' $SYSLOG_CONFIG - sudo sed -i '/#$UDPServerRun 514/ s/^#//' $SYSLOG_CONFIG - echo "Successfully enabled UDP in syslog" - - visibility_vm_ip_address=$(neutron floatingip-list --format value | grep "$IpAddr2" | awk '{print $3}') - echo "$log_facility.* @$visibility_vm_ip_address:514" | sudo tee $VISIBILITY_CONF - echo "Created $VISIBILITY_CONF file" - - sudo service rsyslog restart - if [ $? -ne 0 ]; then - echo "ERROR: Failed to restart rsyslog" - fi -} - function namespace_delete { source $DEVSTACK_DIR/openrc neutron service @@ -475,7 +333,7 @@ function copy_nfp_files_and_start_process { sudo rm -rf /etc/nfp_* sudo cp -r bin/nfp_orchestrator.ini /etc/ sudo cp -r bin/nfp_proxy_agent.ini /etc/ - [[ $NFP_DEVSTACK_MODE != base ]] && sudo cp -r bin/nfp_config_orch.ini /etc/ + [[ $NFP_DEVSTACK_MODE = advanced ]] && sudo cp -r bin/nfp_config_orch.ini /etc/ sudo cp -r bin/nfp_proxy.ini /etc/nfp_proxy.ini sudo cp -r bin/nfp_proxy /usr/bin/ @@ -505,7 +363,7 @@ function copy_nfp_files_and_start_process { run_process nfp_proxy "source $NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete; namespace_create" sleep 10 - if [[ $NFP_DEVSTACK_MODE != base ]]; then + if [[ $NFP_DEVSTACK_MODE = advanced ]]; then echo "Starting nfp config orchestrator >>>> under screen named : nfp_config_orchestrator" run_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file /opt/stack/logs/nfp_config_orchestrator.log" else diff --git a/devstack/local.conf.nfp b/devstack/local.conf.nfp index 2287a03c16..85f758ae14 100644 --- a/devstack/local.conf.nfp +++ b/devstack/local.conf.nfp @@ -16,28 +16,24 @@ SERVICE_TOKEN=admin # NFP Service ENABLE_NFP=True -# Edit NFP_DEVSTACK_MODE with either 'base' or 'advanced' or 'enterprise' +# Edit NFP_DEVSTACK_MODE with either 'base' or 'advanced' [[ $ENABLE_NFP = True ]] && NFP_DEVSTACK_MODE=base -[[ $NFP_DEVSTACK_MODE != base ]] && enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka -[[ $NFP_DEVSTACK_MODE != base ]] && enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer.git stable/mitaka - +[[ $NFP_DEVSTACK_MODE = advanced ]] && enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka +[[ $NFP_DEVSTACK_MODE = advanced ]] && enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer.git stable/mitaka if [[ $NFP_DEVSTACK_MODE = base ]]; then GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy GBPSERVICE_BRANCH=master -elif [[ $NFP_DEVSTACK_MODE = advanced ]]; then +else # Openstack repo #GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy #GBPSERVICE_BRANCH=refs/changes/05/335405/27 # Oneconvergence repo GBPSERVICE_REPO=https://github.com/oneconvergence/group-based-policy.git GBPSERVICE_BRANCH=mitaka_21st_march_base -else - GBPSERVICE_REPO=https://github.com/oneconvergence/group-based-policy.git - GBPSERVICE_BRANCH=mitaka_21st_march_base fi enable_plugin gbp $GBPSERVICE_REPO $GBPSERVICE_BRANCH -if [[ $NFP_DEVSTACK_MODE != base ]]; then +if [[ $NFP_DEVSTACK_MODE = advanced ]]; then # External Network EXT_NET_GATEWAY= EXT_NET_ALLOCATION_POOL_START= @@ -50,18 +46,3 @@ if [[ $NFP_DEVSTACK_MODE != base ]]; then # Make sure that your public interface is not attached to any bridge. PUBLIC_INTERFACE= fi - -if [[ $NFP_DEVSTACK_MODE = enterprise ]]; then - # Visibility GIT path - # Default visibility repo https://github.com/oneconvergence/visibility.git - VISIBILITY_GIT_BRANCH=master - GIT_ACCESS_USERNAME= - GIT_ACCESS_PASSWORD= - - # Configure docker images local repository - DOCKER_IMAGES_URL=http://192.168.100.50/docker_images/ - - AsavQcow2Image= - PaloAltoQcow2Image= -fi - diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 818b9a74fa..08b12193f7 100755 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -5,10 +5,6 @@ function gbp_configure_nova { iniset $NOVA_CONF neutron allow_duplicate_networks "True" } -function nfp_configure_nova { - iniset $NOVA_CONF DEFAULT instance_usage_audit "True" -} - function gbp_configure_heat { local HEAT_PLUGINS_DIR="/opt/stack/gbpautomation/gbpautomation/heat" iniset $HEAT_CONF DEFAULT plugin_dirs "$HEAT_PLUGINS_DIR" @@ -102,8 +98,7 @@ if is_service_enabled group-policy; then if [[ $ENABLE_NFP = True ]]; then echo_summary "Configuring $NFP" nfp_configure_neutron - [[ $NFP_DEVSTACK_MODE = enterprise ]] && nfp_configure_nova - if [[ $NFP_DEVSTACK_MODE != base ]]; then + if [[ $NFP_DEVSTACK_MODE = advanced ]]; then configure_nfp_loadbalancer configure_nfp_firewall configure_nfp_vpn @@ -129,7 +124,6 @@ if is_service_enabled group-policy; then create_nfp_gbp_resources create_nfp_image [[ $NFP_DEVSTACK_MODE = advanced ]] && launch_configuratorVM - [[ $NFP_DEVSTACK_MODE = enterprise ]] && launch_configuratorVM && launch_visibilityVM && nfp_logs_forword copy_nfp_files_and_start_process fi fi diff --git a/devstack/settings b/devstack/settings index b7907e1b93..c4fe0cc048 100755 --- a/devstack/settings +++ b/devstack/settings @@ -5,7 +5,6 @@ ENABLE_NFP=${ENABLE_NFP:-False} [[ $ENABLE_NFP = True ]] && source $DEST/gbp/devstack/lib/nfp # VM locations ConfiguratorQcow2Image=${ConfiguratorQcow2Image:-build} -VisibilityQcow2Image=${VisibilityQcow2Image:-build} VyosQcow2Image=${VyosQcow2Image:-build} HaproxyQcow2Image=${HaproxyQcow2Image:-build} @@ -35,7 +34,7 @@ enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-fwaas -[[ $NFP_DEVSTACK_MODE != base ]] && enable_service neutron-vpnaas +[[ $ENABLE_NFP = True ]] && [[ $NFP_DEVSTACK_MODE = advanced ]] && enable_service neutron-vpnaas enable_service q-lbaas enable_service q-meta enable_service neutron diff --git a/gbpservice/nfp/scripts/mode_shift.sh.enterprise b/gbpservice/nfp/scripts/mode_shift.sh.enterprise new file mode 100644 index 0000000000..3aa6f31288 --- /dev/null +++ b/gbpservice/nfp/scripts/mode_shift.sh.enterprise @@ -0,0 +1,233 @@ +#! /bin/bash + +source /opt/stack/gbp/gbpservice/nfp/config/mode_shift.conf + +DEVSTACK_DIR=/home/stack/devstack +source $DEVSTACK_DIR/local.conf +NFPSERVICE_DIR=/opt/stack/gbp +# TODO(DEEPAK): Should be retrieved from a result file populated by advanced mode. +EXT_NET_NAME=ext-net + +function nfp_configure_nova { + NOVA_CONF_DIR=/etc/nova + NOVA_CONF=$NOVA_CONF_DIR/nova.conf + source $DEVSTACK_DIR/inc/ini-config + iniset $NOVA_CONF DEFAULT instance_usage_audit "True" + + source $DEVSTACK_DIR/functions-common + stop_process n-cpu + stop_process n-cond + stop_process n-sch + stop_process n-novnc + stop_process n-cauth + stop_process n-api + + source $DEVSTACK_DIR/lib/nova + start_nova_compute + start_nova_api + run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" + run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" + run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" + run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" +} + +function create_port_for_vm { +# $1 is image_name +# $2 is instance name + GROUP="svc_management_ptg" + PortId=$(gbp policy-target-create --policy-target-group $GROUP $2 | grep port_id | awk '{print $4}') + IpAddr_extractor=`neutron port-list --format value | grep $PortId | awk '{print $7}'` + IpAddr_purge_last=${IpAddr_extractor::-1} + IpAddr=${IpAddr_purge_last//\"/} + echo "IpAddr of port($PortId): $IpAddr" + visibility_image_name=$1 + visibility_port_id=$PortId + visibility_ip=$IpAddr +} + +function configure_vis_ip_addr_in_docker { + echo "Visibility VM IP address is: $visibility_ip" + sed -i "s/VIS_VM_IP_ADDRESS/"$visibility_ip"/" $NFPSERVICE_DIR/gbpservice/nfp/configurator/Dockerfile +} + +function create_images { + source $DEVSTACK_DIR/openrc neutron service + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + # prepare visibility image and upload it into glance + VISIBILITY_QCOW2_IMAGE=${VISIBILITY_QCOW2_IMAGE:-build} + VISIBILITY_QCOW2_IMAGE_NAME=visibility + InstanceName="VisibilityVM_instance" + create_port_for_vm $VISIBILITY_QCOW2_IMAGE_NAME $InstanceName + + if [[ $VISIBILITY_QCOW2_IMAGE = build ]]; then + # edits the docker file to add visibility vm IP address + configure_vis_ip_addr_in_docker + + # prepare visibility source, this is needed for diskimage build + cd /home/stack/ + sudo rm -rf visibility + sudo git clone https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git -b $VISIBILITY_GIT_BRANCH + echo "Building Image: $VISIBILITY_QCOW2_IMAGE_NAME" + cd $NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create/ + sudo python visibility_disk_image_create.py visibility_conf.json $DEVSTACK_DIR/local.conf + VISIBILITY_QCOW2_IMAGE=$(cat /tmp/image_path) + fi + echo "Uploading Image: $VISIBILITY_QCOW2_IMAGE_NAME" + glance image-create --name $VISIBILITY_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $VISIBILITY_QCOW2_IMAGE + sleep 4 + + if ! [[ -z $AsavQcow2Image ]]; then + gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=asav,device_type=nova --vendor NFP asav_fw_profile + + ASAV_QCOW2_IMAGE_NAME=asav + echo "Uploading Image: $ASAV_QCOW2_IMAGE_NAME" + glance image-create --name $ASAV_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $AsavQcow2Image + fi + + if ! [[ -z $PaloAltoQcow2Image ]]; then + PALO_ALTO_QCOW2_IMAGE_NAME=paloalto + echo "Uploading Image: $PALO_ALTO_QCOW2_IMAGE_NAME" + glance image-create --name $PALO_ALTO_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $PaloAltoQcow2Image + fi +} + +function configure_visibility_user_data { +# $1 is the Visibility VM's IP address + CUR_DIR=$PWD + visibility_vm_ip=$1 + configurator_ip= + sudo rm -rf /opt/visibility_user_data + sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. + cd /opt + sudo rm -rf my.key my.key.pub + sudo ssh-keygen -t rsa -N "" -f my.key + value=`sudo cat my.key.pub` + sudo echo $value + sudo sed -i "s||${value}|" visibility_user_data + sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data + sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data + sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data + sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data + cd $CUR_DIR +} + +function attach_security_groups { + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + SecGroup="allow_all" + nova secgroup-create $SecGroup "allow all traffic" + nova secgroup-add-rule $SecGroup udp 1 65535 120.0.0.0/24 + nova secgroup-add-rule $SecGroup icmp -1 -1 120.0.0.0/24 + nova secgroup-add-rule $SecGroup tcp 1 65535 120.0.0.0/24 + nova secgroup-add-rule $SecGroup tcp 80 80 0.0.0.0/0 + nova secgroup-add-rule $SecGroup udp 514 514 0.0.0.0/0 + nova secgroup-add-rule $SecGroup tcp 443 443 0.0.0.0/0 + + nova add-secgroup $InstanceName $SecGroup +} + +function launch_visibilityVM { + neutron net-create visibility-network + neutron subnet-create visibility-network 188.0.0.0/24 --name visibility-subnet + neutron router-create visibility-router + neutron router-gateway-set visibility-router $EXT_NET_NAME + neutron router-interface-add visibility-router visibility-subnet + ExtPortId=$(neutron port-create visibility-network | grep ' id ' | awk '{print $4}') + fip_id=$(neutron floatingip-create $EXT_NET_NAME | grep ' id '| awk '{print $4}') + neutron floatingip-associate $fip_id $ExtPortId + IpAddr_extractor=`neutron port-list --format value|grep $ExtPortId|awk '{print $6}'` + IpAddr_purge_last=${IpAddr_extractor::-1} + IpAddr2=${IpAddr_purge_last//\"/} + echo "Collecting IpAddr : for $ExtPortId" + echo $IpAddr2 + + echo "Collecting ImageId : for $visibility_image_name" + ImageId=`glance image-list|grep $visibility_image_name |awk '{print $2}'` + if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then + echo $ImageId + else + echo "No image found with name $visibility_image_name ..." + exit + fi + + configure_visibility_user_data $visibility_ip + echo "Launching Visibility image" + nova boot --image $ImageId --flavor m1.xlarge --user-data /opt/visibility_user_data --nic port-id=$visibility_port_id --nic port-id=$ExtPortId $InstanceName + sleep 10 + attach_security_groups +} + +function nfp_logs_forword { + VISIBILITY_CONF="/etc/rsyslog.d/visibility.conf" + SYSLOG_CONFIG="/etc/rsyslog.conf" + log_facility=local1 + + sudo sed -i '/#$ModLoad imudp/ s/^#//' $SYSLOG_CONFIG + sudo sed -i '/#$UDPServerRun 514/ s/^#//' $SYSLOG_CONFIG + echo "Successfully enabled UDP in syslog" + + visibility_vm_ip_address=$(neutron floatingip-list --format value | grep "$IpAddr2" | awk '{print $3}') + echo "$log_facility.* @$visibility_vm_ip_address:514" | sudo tee $VISIBILITY_CONF + echo "Created $VISIBILITY_CONF file" + + sudo service rsyslog restart + if [ $? -ne 0 ]; then + echo "ERROR: Failed to restart rsyslog" + fi +} + +function restart_processes { + source $DEVSTACK_DIR/functions-common + source $DEVSTACK_DIR/openrc neutron service + + # restart proxy + stop_process proxy + run_process proxy "source $NFPSERVICE_DIR/devstack/lib/nfp;namespace_delete $DEVSTACK_DIR;namespace_create $DEVSTACK_DIR $IpAddr" + echo "Restarted proxy process" + sleep 10 + + # restart proxy agent + stop_process proxy_agent + run_process proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file /opt/stack/logs/nfp_proxy_agent.log" + echo "Restarted proxy agent process" + sleep 3 +} + +function prepare_for_mode_shift { + if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then + source $DEST/gbp/devstack/lib/nfp + + echo "Preparing image creation" + nfp_configure_nova + sleep 10 + create_images + echo "Launching the Visibility VM" + launch_visibilityVM + nfp_logs_forword + else + echo "Shifting from $FROM mode to $TO mode is not supported." + fi +} + +function mode_shift { + if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then + echo "Restarting various processes" + restart_processes + else + echo "Shifting from $FROM mode to $TO mode is not supported." + fi +} + + +echo "Task: Shifting mode of NFP from $FROM mode to $TO mode." + +echo "Preparing for the NFP mode shift." +prepare_for_mode_shift + +echo "Shifting NFP to $TO mode. There will be a little downtime. Kindly bear with me." +mode_shift + +echo "Successfully shifted NFP from $FROM mode to $TO mode." From 54d8b43058fa86c36734ec52182977c2610f8e4a Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 14 Jul 2016 12:06:20 +0530 Subject: [PATCH 044/157] merged submitted code --- gbpservice/nfp/configurator/Dockerfile | 11 ++---- .../nfp/configurator/agents/agent_base.py | 2 +- .../nfp/configurator/agents/generic_config.py | 2 +- .../configurator/agents/loadbalancer_v1.py | 8 ++--- gbpservice/nfp/configurator/lib/constants.py | 3 ++ .../nfp/configurator/modules/configurator.py | 35 +++---------------- gbpservice/nfp/configurator/run.sh | 2 +- 7 files changed, 16 insertions(+), 47 deletions(-) diff --git a/gbpservice/nfp/configurator/Dockerfile b/gbpservice/nfp/configurator/Dockerfile index 12e2843a29..db93462911 100644 --- a/gbpservice/nfp/configurator/Dockerfile +++ b/gbpservice/nfp/configurator/Dockerfile @@ -47,21 +47,14 @@ RUN git clone -b stable/mitaka --single-branch https://github.com/openstack/neut RUN cp -r /neutron_lib/neutron_lib /usr/local/lib/python2.7/dist-packages/ RUN git clone -b stable/mitaka --single-branch https://github.com/openstack/neutron.git neutron RUN cp -r /neutron/neutron /usr/local/lib/python2.7/dist-packages/ - -# Openstack Repo -#RUN git clone https://github.com/openstack/group-based-policy.git group-based-policy -#RUN cd /group-based-policy && git fetch https://git.openstack.org/openstack/group-based-policy GIT-BRANCH-NAME && git checkout FETCH_HEAD - -# Oneconvergence Repo -RUN git clone -b GIT-BRANCH-NAME --single-branch https://github.com/oneconvergence/group-based-policy.git group-based-policy - +RUN git clone https://github.com/openstack/group-based-policy.git group-based-policy +RUN cd /group-based-policy && git fetch https://git.openstack.org/openstack/group-based-policy GIT-BRANCH-NAME && git checkout FETCH_HEAD RUN cp -r /group-based-policy/gbpservice /usr/local/lib/python2.7/dist-packages/ RUN cp /group-based-policy/gbpservice/nfp/bin/nfp /usr/bin/ RUN chmod +x /usr/bin/nfp RUN cp /group-based-policy/gbpservice/nfp/bin/nfp_configurator.ini /etc/ RUN sed -i "s/log_forward_ip_address=*.*/log_forward_ip_address=VIS_VM_IP_ADDRESS/" /etc/nfp_configurator.ini RUN cp /group-based-policy/gbpservice/nfp/bin/policy.json /etc/ -RUN cp -r /group-based-policy/gbpservice/nfp/configurator/config /etc/nfp_config RUN mkdir -p /var/log/nfp RUN touch /var/log/nfp/nfp_configurator.log RUN touch /var/log/nfp/nfp_pecan.log diff --git a/gbpservice/nfp/configurator/agents/agent_base.py b/gbpservice/nfp/configurator/agents/agent_base.py index 8275a998b0..be19be993f 100644 --- a/gbpservice/nfp/configurator/agents/agent_base.py +++ b/gbpservice/nfp/configurator/agents/agent_base.py @@ -10,9 +10,9 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.core import module as nfp_api from gbpservice.nfp.configurator.lib import constants as const from gbpservice.nfp.core import log as nfp_logging +from gbpservice.nfp.core import module as nfp_api LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/configurator/agents/generic_config.py b/gbpservice/nfp/configurator/agents/generic_config.py index dbc00750d0..1bc87a807e 100644 --- a/gbpservice/nfp/configurator/agents/generic_config.py +++ b/gbpservice/nfp/configurator/agents/generic_config.py @@ -18,8 +18,8 @@ from gbpservice.nfp.configurator.lib import constants as common_const from gbpservice.nfp.configurator.lib import utils from gbpservice.nfp.core import event as nfp_event -from gbpservice.nfp.core import module as nfp_api from gbpservice.nfp.core import log as nfp_logging +from gbpservice.nfp.core import module as nfp_api LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py index b0f4a8ec6c..ae97b60e85 100644 --- a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py +++ b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py @@ -11,15 +11,15 @@ # under the License. import os +from neutron import context + from gbpservice.nfp.configurator.agents import agent_base from gbpservice.nfp.configurator.lib import data_filter from gbpservice.nfp.configurator.lib import lb_constants from gbpservice.nfp.configurator.lib import utils from gbpservice.nfp.core import event as nfp_event -from gbpservice.nfp.core import module as nfp_api from gbpservice.nfp.core import log as nfp_logging - -from neutron import context +from gbpservice.nfp.core import module as nfp_api LOG = nfp_logging.getLogger(__name__) @@ -649,7 +649,7 @@ def _collect_stats(self, ev): self.sc.poll_event(ev) @nfp_api.poll_event_desc(event=lb_constants.EVENT_COLLECT_STATS, - spacing=60) + spacing=60) def collect_stats(self, ev): for pool_id, driver_name in LBaaSEventHandler.instance_mapping.items(): driver_id = lb_constants.SERVICE_TYPE + driver_name diff --git a/gbpservice/nfp/configurator/lib/constants.py b/gbpservice/nfp/configurator/lib/constants.py index c32b66edb4..8c0f337bd1 100644 --- a/gbpservice/nfp/configurator/lib/constants.py +++ b/gbpservice/nfp/configurator/lib/constants.py @@ -49,3 +49,6 @@ STATUS_ERROR = "ERROR" STATUS_SUCCESS = "SUCCESS" UNHANDLED = "UNHANDLED" + +AGENTS_PKG = 'gbpservice.nfp.configurator.agents' +CONFIGURATOR_RPC_TOPIC = 'configurator' diff --git a/gbpservice/nfp/configurator/modules/configurator.py b/gbpservice/nfp/configurator/modules/configurator.py index 80d04a285b..16d8cac000 100644 --- a/gbpservice/nfp/configurator/modules/configurator.py +++ b/gbpservice/nfp/configurator/modules/configurator.py @@ -11,7 +11,6 @@ # under the License. from oslo_log import helpers as log_helpers -from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.configurator.lib import config_opts from gbpservice.nfp.configurator.lib import constants as const @@ -21,16 +20,8 @@ from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import rpc -from neutron.common import rpc as n_rpc -from neutron import context as n_context -import oslo_messaging -import time - LOG = nfp_logging.getLogger(__name__) -AGENTS_PKG = 'gbpservice.nfp.configurator.agents' -CONFIGURATOR_RPC_TOPIC = 'configurator' - """Implements procedure calls invoked by an REST server. Implements following RPC methods. @@ -421,7 +412,7 @@ def init_rpc(sc, cm, conf, demuxer): # Initializes RPC client rpc_mgr = ConfiguratorRpcManager(sc, cm, conf, demuxer) configurator_agent = rpc.RpcAgent(sc, - topic=CONFIGURATOR_RPC_TOPIC, + topic=const.CONFIGURATOR_RPC_TOPIC, manager=rpc_mgr) # Registers RPC client object with core service controller @@ -439,7 +430,7 @@ def get_configurator_module_instance(sc): conf_utils = utils.ConfiguratorUtils() # Loads all the service agents under AGENT_PKG module path - cm.imported_sas = conf_utils.load_agents(AGENTS_PKG) + cm.imported_sas = conf_utils.load_agents(const.AGENTS_PKG) msg = ("Configurator loaded service agents from %s location." % (cm.imported_sas)) LOG.info(msg) @@ -495,12 +486,12 @@ def nfp_module_init(sc, conf): init_rpc(sc, cm, conf, demuxer_instance) except Exception as err: msg = ("Failed to initialize configurator RPC with topic %s. %s." - % (CONFIGURATOR_RPC_TOPIC, str(err).capitalize())) + % (const.CONFIGURATOR_RPC_TOPIC, str(err).capitalize())) LOG.error(msg) raise Exception(err) else: msg = ("Initialized configurator RPC with topic %s." - % CONFIGURATOR_RPC_TOPIC) + % const.CONFIGURATOR_RPC_TOPIC) LOG.debug(msg) @@ -520,24 +511,6 @@ def nfp_module_post_init(sc, conf): try: cm = get_configurator_module_instance(sc) cm.init_service_agents_complete(sc, conf) - - #TODO(Rahul):Need to generalize the following code in library. - context = n_context.Context('configurator', 'configrator') - uptime = time.strftime("%c") - request_data = {'eventdata': {'uptime': uptime, - 'module': 'configurator'}, - 'eventid': 'NFP_UP_TIME', - 'eventtype': 'NFP_CONTROLLER'} - API_VERSION = '1.0' - target = oslo_messaging.Target( - topic='visibility', - version=API_VERSION) - client = n_rpc.get_client(target) - cctxt = client.prepare(version=API_VERSION, - topic='visibility') - cctxt.cast(context, - 'network_function_event', request_data=request_data) - except Exception as err: msg = ("Failed to trigger initialization complete for configurator" " agent modules. %s." % (str(err).capitalize())) diff --git a/gbpservice/nfp/configurator/run.sh b/gbpservice/nfp/configurator/run.sh index 474eff82cb..1792208f4c 100644 --- a/gbpservice/nfp/configurator/run.sh +++ b/gbpservice/nfp/configurator/run.sh @@ -1,7 +1,7 @@ #!/bin/bash service rabbitmq-server start -screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --config-dir=/etc/nfp_config --log-file=/var/log/nfp/nfp_configurator.log +screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --log-file=/var/log/nfp/nfp_configurator.log cd /usr/local/lib/python2.7/dist-packages/gbpservice/nfp/configurator/api/ python setup.py develop screen -dmS "pecan" pecan serve config.py From 66c8b6e4b26d9268640fd11d1f126580a0544c1e Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 14 Jul 2016 15:19:24 +0530 Subject: [PATCH 045/157] class comments included inside the class --- .../nfp/configurator/agents/agent_base.py | 20 ++++-- .../nfp/configurator/agents/firewall.py | 33 +++++---- .../nfp/configurator/agents/generic_config.py | 32 ++++----- .../nfp/configurator/agents/nfp_service.py | 23 +++--- .../configurator/drivers/base/base_driver.py | 11 +-- .../drivers/firewall/vyos/vyos_fw_driver.py | 39 +++++----- .../drivers/nfp_service/heat/heat_driver.py | 14 ++-- .../nfp/configurator/lib/data_filter.py | 4 +- gbpservice/nfp/configurator/lib/demuxer.py | 72 +++++++++---------- .../nfp/configurator/lib/schema_validator.py | 11 ++- gbpservice/nfp/configurator/lib/utils.py | 9 +-- .../nfp/configurator/modules/configurator.py | 40 +++++------ 12 files changed, 153 insertions(+), 155 deletions(-) diff --git a/gbpservice/nfp/configurator/agents/agent_base.py b/gbpservice/nfp/configurator/agents/agent_base.py index be19be993f..b59f8c9af8 100644 --- a/gbpservice/nfp/configurator/agents/agent_base.py +++ b/gbpservice/nfp/configurator/agents/agent_base.py @@ -16,15 +16,15 @@ LOG = nfp_logging.getLogger(__name__) -"""Implements base class for all service agents. -Common methods for service agents are implemented in this class. Configurator -module invokes these methods through the service agent's child class instance. - -""" +class AgentBaseRPCManager(object): + """Implements base class for all service agents. + Common methods for service agents are implemented in this class. + Configurator module invokes these methods through the service + agent's child class instance. -class AgentBaseRPCManager(object): + """ def __init__(self, sc, conf): self.sc = sc @@ -109,6 +109,11 @@ def process_request(self, sa_req_list, notification_data): class AgentBaseNotification(object): + """Enqueues notification event into notification queue + + Responses from the REST calls made to the VM are fed to under the + cloud components using this notification handle. + """ def __init__(self, sc): self.sc = sc @@ -130,6 +135,9 @@ def _notification(self, data): class AgentBaseEventHandler(nfp_api.NfpEventHandler): + """ Super class for all agents to handle batch events. + + """ def __init__(self, sc, drivers, rpcmgr): self.sc = sc diff --git a/gbpservice/nfp/configurator/agents/firewall.py b/gbpservice/nfp/configurator/agents/firewall.py index a9e0d07152..8f02468cbb 100644 --- a/gbpservice/nfp/configurator/agents/firewall.py +++ b/gbpservice/nfp/configurator/agents/firewall.py @@ -24,15 +24,14 @@ LOG = nfp_logging.getLogger(__name__) -""" Implements Fwaas response path to Neutron plugin. -Methods of this class are invoked by the FwaasEventHandler class -for sending response from driver to the Fwaas Neutron plugin. - -""" +class FwaasRpcSender(agent_base.AgentBaseEventHandler): + """ Implements Fwaas response path to Neutron plugin. + Methods of this class are invoked by the FwaasEventHandler class + for sending response from driver to the Fwaas Neutron plugin. -class FwaasRpcSender(agent_base.AgentBaseEventHandler): + """ def __init__(self, sc, host, drivers, rpcmgr): super(FwaasRpcSender, self).__init__(sc, drivers, rpcmgr) @@ -81,16 +80,16 @@ def firewall_deleted(self, agent_info, firewall_id, firewall=None): } self.notify._notification(msg) -""" Implements FWaasRpcManager class which receives requests - from Configurator to Agent. -Methods of this class are invoked by the configurator. Events are -created according to the requests received and enqueued to worker queues. +class FWaasRpcManager(agent_base.AgentBaseRPCManager): + """ Implements FWaasRpcManager class which receives requests + from Configurator to Agent. -""" + Methods of this class are invoked by the configurator. Events are + created according to the requests received and enqueued to worker queues. + """ -class FWaasRpcManager(agent_base.AgentBaseRPCManager): RPC_API_VERSION = '1.0' target = messaging.Target(version=RPC_API_VERSION) @@ -156,15 +155,15 @@ def delete_firewall(self, context, firewall, host): self._create_event(context, firewall, host, const.FIREWALL_DELETE_EVENT) -""" Handler class which invokes firewall driver methods -Worker processes dequeue the worker queues and invokes the -appropriate handler class methods for Fwaas methods. +class FWaasEventHandler(nfp_api.NfpEventHandler): + """ Handler class which invokes firewall driver methods -""" + Worker processes dequeue the worker queues and invokes the + appropriate handler class methods for Fwaas methods. + """ -class FWaasEventHandler(nfp_api.NfpEventHandler): def __init__(self, sc, drivers, rpcmgr, conf): """ Instantiates class object. diff --git a/gbpservice/nfp/configurator/agents/generic_config.py b/gbpservice/nfp/configurator/agents/generic_config.py index 1bc87a807e..2965a3a2ff 100644 --- a/gbpservice/nfp/configurator/agents/generic_config.py +++ b/gbpservice/nfp/configurator/agents/generic_config.py @@ -23,18 +23,18 @@ LOG = nfp_logging.getLogger(__name__) -"""Implements APIs invoked by configurator for processing RPC messages. -RPC client of configurator module receives RPC messages from REST server -and invokes the API of this class. The instance of this class is registered -with configurator module using register_service_agent API. Configurator module -identifies the service agent object based on service type and invokes ones of -the methods of this class to configure the device. +class GenericConfigRpcManager(agent_base.AgentBaseRPCManager): + """Implements APIs invoked by configurator for processing RPC messages. -""" + RPC client of configurator module receives RPC messages from REST server + and invokes the API of this class. The instance of this class is registered + with configurator module using register_service_agent API. Configurator + module identifies the service agent object based on service type and + invokes ones of the methods of this class to configure the device. + """ -class GenericConfigRpcManager(agent_base.AgentBaseRPCManager): def __init__(self, sc, conf): """Instantiates child and parent class objects. @@ -161,17 +161,15 @@ def clear_healthmonitor(self, context, resource_data): resource_data['vmid']) -"""Implements event handlers and their helper methods. - -Object of this class is registered with the event class of core service -controller. Based on the event key, handle_event method of this class is -invoked by core service controller. - -""" - - class GenericConfigEventHandler(agent_base.AgentBaseEventHandler, nfp_api.NfpEventHandler): + """Implements event handlers and their helper methods. + + Object of this class is registered with the event class of core service + controller. Based on the event key, handle_event method of this class is + invoked by core service controller. + """ + def __init__(self, sc, drivers, rpcmgr): super(GenericConfigEventHandler, self).__init__( sc, drivers, rpcmgr) diff --git a/gbpservice/nfp/configurator/agents/nfp_service.py b/gbpservice/nfp/configurator/agents/nfp_service.py index 945b293f6d..41a2cad6c3 100644 --- a/gbpservice/nfp/configurator/agents/nfp_service.py +++ b/gbpservice/nfp/configurator/agents/nfp_service.py @@ -21,16 +21,16 @@ LOG = nfp_logging.getLogger(__name__) -""" Implements ConfigScriptRpcManager class which receives requests - from Configurator module. -Methods of this class are invoked by the configurator. Events are -created according to the requests received and enqueued to worker queues. +class ConfigScriptRpcManager(agent_base.AgentBaseRPCManager): + """ Implements ConfigScriptRpcManager class which receives requests + from Configurator module. -""" + Methods of this class are invoked by the configurator. Events are + created according to the requests received and enqueued to worker queues. + """ -class ConfigScriptRpcManager(agent_base.AgentBaseRPCManager): RPC_API_VERSION = '1.0' target = messaging.Target(version=RPC_API_VERSION) @@ -63,15 +63,14 @@ def run_nfp_service(self, context, resource_data): data=arg_dict, key=None) self.sc.post_event(ev) -""" Handler class which invokes nfp_service driver methods - -Worker processes dequeue the worker queues and invokes the -appropriate handler class methods for ConfigScript methods. -""" +class ConfigScriptEventHandler(agent_base.AgentBaseEventHandler): + """ Handler class which invokes nfp_service driver methods + Worker processes dequeue the worker queues and invokes the + appropriate handler class methods for ConfigScript methods. -class ConfigScriptEventHandler(agent_base.AgentBaseEventHandler): + """ def __init__(self, sc, drivers, rpcmgr): """ Initializes parent and child class objects. diff --git a/gbpservice/nfp/configurator/drivers/base/base_driver.py b/gbpservice/nfp/configurator/drivers/base/base_driver.py index 45c8642f09..9cb9e69417 100644 --- a/gbpservice/nfp/configurator/drivers/base/base_driver.py +++ b/gbpservice/nfp/configurator/drivers/base/base_driver.py @@ -19,13 +19,14 @@ LOG = nfp_logging.getLogger(__name__) -"""Every service vendor must inherit this class. If any service vendor wants - to add extra methods for their service, apart from below given, they should - add method definition here and implement the method in their driver -""" - class BaseDriver(object): + """ Implements common functions for drivers. + + Every service vendor must inherit this class. If any service vendor wants + to add extra methods for their service, apart from below given, they should + add method definition here and implement the method in their driver + """ def __init__(self, conf): pass diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index aeae078946..a8a35691e2 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -26,13 +26,13 @@ LOG = nfp_logging.getLogger(__name__) -""" REST API wrapper class that provides POST method to -communicate with the Service VM. - -""" +class RestApi(object): + """ Issues REST calls to the Service VMs + REST API wrapper class that provides POST method to + communicate with the Service VM. -class RestApi(object): + """ def __init__(self, timeout): self.timeout = timeout @@ -49,6 +49,7 @@ def fire(self, url, data, request_type): :param url: URL to connect. :param data: data to be sent. + :param request_type: POST/PUT/DELETE Returns: SUCCESS/Error message @@ -79,16 +80,11 @@ def fire(self, url, data, request_type): return common_const.STATUS_SUCCESS -""" Firewall generic configuration driver for handling device -configuration requests. - -""" - - class FwGenericConfigDriver(base_driver.BaseDriver): - """ - Driver class for implementing firewall configuration - requests from Orchestrator. + """ Implements device configuration requests. + + Firewall generic configuration driver for handling device + configuration requests from Orchestrator. """ def __init__(self): @@ -436,17 +432,16 @@ def clear_routes(self, context, resource_data): return err_msg -""" Firewall as a service driver for handling firewall -service configuration requests. - -We initialize service type in this class because agent loads -class object only for those driver classes that have service type -initialized. Also, only this driver class is exposed to the agent. +class FwaasDriver(FwGenericConfigDriver): + """ Firewall as a service driver for handling firewall + service configuration requests. -""" + We initialize service type in this class because agent loads + class object only for those driver classes that have service type + initialized. Also, only this driver class is exposed to the agent. + """ -class FwaasDriver(FwGenericConfigDriver): service_type = fw_const.SERVICE_TYPE service_vendor = const.VYOS diff --git a/gbpservice/nfp/configurator/drivers/nfp_service/heat/heat_driver.py b/gbpservice/nfp/configurator/drivers/nfp_service/heat/heat_driver.py index fea3fe03bf..bd3e0fe0b8 100644 --- a/gbpservice/nfp/configurator/drivers/nfp_service/heat/heat_driver.py +++ b/gbpservice/nfp/configurator/drivers/nfp_service/heat/heat_driver.py @@ -18,17 +18,17 @@ LOG = nfp_logging.getLogger(__name__) -""" Heat as a driver for handling config script -heat configuration requests. -We initialize service type in this class because agent loads -class object only for those driver classes that have service type -initialized. Also, only this driver class is exposed to the agent. +class HeatDriver(base_driver.BaseDriver): + """ Heat as a driver for handling config script + heat configuration requests. -""" + We initialize service type in this class because agent loads + class object only for those driver classes that have service type + initialized. Also, only this driver class is exposed to the agent. + """ -class HeatDriver(base_driver.BaseDriver): service_type = const.SERVICE_TYPE resource_type = const.HEAT_RESOURCE diff --git a/gbpservice/nfp/configurator/lib/data_filter.py b/gbpservice/nfp/configurator/lib/data_filter.py index 2adb4f9ede..3b847d5fef 100644 --- a/gbpservice/nfp/configurator/lib/data_filter.py +++ b/gbpservice/nfp/configurator/lib/data_filter.py @@ -17,8 +17,8 @@ class Filter(object): - """ - Filter class which provides data asked in a specific format. + """ Filter class which provides data asked in a specific format. + This class mocks all rpc calls going from *aaS agent/driver to respective *aaS plugin. """ diff --git a/gbpservice/nfp/configurator/lib/demuxer.py b/gbpservice/nfp/configurator/lib/demuxer.py index 44b829dfba..9d92f24bb2 100644 --- a/gbpservice/nfp/configurator/lib/demuxer.py +++ b/gbpservice/nfp/configurator/lib/demuxer.py @@ -15,50 +15,50 @@ LOG = nfp_logging.getLogger(__name__) -"""Implements supporting methods for configurator module. -Provides methods that take configurator API request data and helps -configurator to de-multiplex the API calls to different service agents -and drivers. - -Format of request data for network device configuration API: -request_data { - info { - version: - } - config [ - { +class ServiceAgentDemuxer(object): + """Implements supporting methods for configurator module. + + Provides methods that take configurator API request data and helps + configurator to de-multiplex the API calls to different service agents + and drivers. + + Format of request data for network device configuration API: + request_data { + info { + version: + } + config [ + { + 'resource': , + 'kwargs': + }, + { 'resource': , 'kwargs': - }, - { - 'resource': , - 'kwargs': - }, ... - ] -} -Format of request data for network service configuration API: -request_data { - info { - version: - type: + }, ... + ] } - config [ - { + Format of request data for network service configuration API: + request_data { + info { + version: + type: + } + config [ + { + 'resource': , + 'kwargs': + }, + { 'resource': , 'kwargs': - }, - { - 'resource': , - 'kwargs': - }, ... - ] -} - -""" + }, ... + ] + } + """ -class ServiceAgentDemuxer(object): def __init__(self): pass diff --git a/gbpservice/nfp/configurator/lib/schema_validator.py b/gbpservice/nfp/configurator/lib/schema_validator.py index 1b18c40568..a58077c675 100644 --- a/gbpservice/nfp/configurator/lib/schema_validator.py +++ b/gbpservice/nfp/configurator/lib/schema_validator.py @@ -16,14 +16,13 @@ import gbpservice.nfp.configurator.lib.schema as schema LOG = nfp_logging.getLogger(__name__) -""" Validates request data against standard resource schemas given in schema.py - - Validation is focused on keys. It cross checks if resources in - request_data has all the keys given in the schema of that resource. -""" - class SchemaValidator(object): + """ Validates request data against standard resource schemas given in schema.py + + Validation is focused on keys. It cross checks if resources in + request_data has all the keys given in the schema of that resource. + """ def decode(self, request_data, is_generic_config): """ Validate request data against resource schema. diff --git a/gbpservice/nfp/configurator/lib/utils.py b/gbpservice/nfp/configurator/lib/utils.py index c55e99dd59..4fc866d650 100644 --- a/gbpservice/nfp/configurator/lib/utils.py +++ b/gbpservice/nfp/configurator/lib/utils.py @@ -17,12 +17,13 @@ LOG = nfp_logging.getLogger(__name__) -"""Utility class which provides common library functions for configurator. - New common library functions, if needed, should be added in this class. -""" - class ConfiguratorUtils(object): + """Utility class which provides common library functions for configurator. + + New common library functions, if needed, should be added in this class. + """ + def __init__(self): pass diff --git a/gbpservice/nfp/configurator/modules/configurator.py b/gbpservice/nfp/configurator/modules/configurator.py index 16d8cac000..51e0af0ca2 100644 --- a/gbpservice/nfp/configurator/modules/configurator.py +++ b/gbpservice/nfp/configurator/modules/configurator.py @@ -22,22 +22,21 @@ LOG = nfp_logging.getLogger(__name__) -"""Implements procedure calls invoked by an REST server. - -Implements following RPC methods. - - create_network_function_device_config - - delete_network_function_device_config - - update_network_function_device_config - - create_network_function_config - - delete_network_function_config - - update_network_function_config - - get_notifications -Also implements local methods for supporting RPC methods - -""" - class ConfiguratorRpcManager(object): + """Implements procedure calls invoked by an REST server. + + Implements following RPC methods. + - create_network_function_device_config + - delete_network_function_device_config + - update_network_function_device_config + - create_network_function_config + - delete_network_function_config + - update_network_function_config + - get_notifications + Also implements local methods for supporting RPC methods + + """ def __init__(self, sc, cm, conf, demuxer): self.sc = sc @@ -312,16 +311,15 @@ def get_notifications(self, context): LOG.info(msg) return notifications -"""Implements configurator module APIs. - Implements methods which are either invoked by registered service agents - or by the configurator global methods. The methods invoked by configurator - global methods interface with service agents. - -""" +class ConfiguratorModule(object): + """Implements configurator module APIs. + Implements methods which are either invoked by registered service + agents or by the configurator global methods. The methods invoked + by configurator global methods interface with service agents. -class ConfiguratorModule(object): + """ def __init__(self, sc): self.sa_instances = {} From e53a8c407ff12c3deb39a7509cba24cff4462dd1 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 14 Jul 2016 15:45:11 +0530 Subject: [PATCH 046/157] Addressed review comments --- devstack/lib/nfp | 216 ++++++++++++++++++++++++++++++++++++++-------- devstack/settings | 3 +- 2 files changed, 182 insertions(+), 37 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index e576745cd7..197dbd7aed 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -61,6 +61,7 @@ function init_nfpgbpservice { iniset $NEUTRON_CONF DEFAULT policy_dirs $NFP_CONF_DIR } +# assign_user_role_credential() - Assign Service role to the users function assign_user_role_credential { source $DEVSTACK_DIR/openrc admin admin @@ -68,10 +69,18 @@ function assign_user_role_credential { serviceRoleID=`keystone role-list | grep "service" | awk '{print $2}'` adminRoleID=`keystone role-list | grep "admin" | awk '{print $2}'` - keystone user-role-add --user nova --tenant $serviceTenantID --role $serviceRoleID - keystone user-role-add --user neutron --tenant $serviceTenantID --role $adminRoleID + keystone user-role-add\ + --user nova\ + --tenant $serviceTenantID\ + --role $serviceRoleID + + keystone user-role-add\ + --user neutron\ + --tenant $serviceTenantID\ + --role $adminRoleID } +# create_ext_net() - Create an external network function create_ext_net { source $DEVSTACK_DIR/stackrc @@ -86,52 +95,165 @@ function create_ext_net { unset OS_USER_DOMAIN_ID unset OS_PROJECT_DOMAIN_ID - neutron net-create --router:external=true --shared $EXT_NET_NAME - neutron subnet-create --ip_version 4 --gateway $EXT_NET_GATEWAY --name $EXT_NET_SUBNET_NAME --allocation-pool start=$EXT_NET_ALLOCATION_POOL_START,end=$EXT_NET_ALLOCATION_POOL_END $EXT_NET_NAME $EXT_NET_CIDR + neutron net-create\ + --router:external=true\ + --shared\ + $EXT_NET_NAME + + neutron subnet-create + --ip_version 4\ + --gateway $EXT_NET_GATEWAY\ + --name $EXT_NET_SUBNET_NAME\ + --allocation-pool start=$EXT_NET_ALLOCATION_POOL_START,end=$EXT_NET_ALLOCATION_POOL_END\ + $EXT_NET_NAME\ + $EXT_NET_CIDR } +# create_ep_and_nsp() - Create GBP resources for the external netwrok function create_ep_and_nsp { subnet_id=`neutron net-list | grep "$EXT_NET_NAME" | awk '{print $6}'` - gbp external-segment-create --ip-version 4 --cidr $EXT_NET_CIDR --external-route destination=0.0.0.0/0,nexthop= --shared True --subnet_id=$subnet_id default - gbp nat-pool-create --ip-version 4 --ip-pool $EXT_NET_CIDR --external-segment default --shared True default - gbp ep-create --external-segments default ext_connect - gbp nsp-create --network-service-params type=ip_pool,name=vip_ip,value=nat_pool svc_mgmt_fip_policy + + gbp external-segment-create\ + --ip-version 4\ + --cidr $EXT_NET_CIDR\ + --external-route destination=0.0.0.0/0,nexthop=\ + --shared True\ + --subnet_id=$subnet_id\ + default + + gbp nat-pool-create\ + --ip-version 4\ + --ip-pool $EXT_NET_CIDR\ + --external-segment default\ + --shared True\ + default + + gbp ep-create\ + --external-segments default\ + ext_connect + + gbp nsp-create\ + --network-service-params type=ip_pool,name=vip_ip,value=nat_pool\ + svc_mgmt_fip_policy } +# create_advance_sharing_ptg() - Create a Policy target group function create_advance_sharing_ptg { - gbp l3policy-create --ip-version 4 --ip-pool 121.0.0.0/20 --proxy-ip-pool=192.167.0.0/24 --subnet-prefix-length 20 advanced_services_sharing_l3p - gbp l2policy-create --l3-policy advanced_services_sharing_l3p advance_sharing_l2p - gbp group-create --l2-policy advance_sharing_l2p Advance_Sharing_PTG + gbp l3policy-create\ + --ip-version 4\ + --ip-pool 121.0.0.0/20\ + --proxy-ip-pool=192.167.0.0/24\ + --subnet-prefix-length 20\ + advanced_services_sharing_l3p + + gbp l2policy-create\ + --l3-policy advanced_services_sharing_l3p\ + advance_sharing_l2p + + gbp group-create\ + --l2-policy advance_sharing_l2p\ + Advance_Sharing_PTG } +# create_nfp_gbp_resources() - Create various GBP resources function create_nfp_gbp_resources { source $DEVSTACK_DIR/openrc neutron service if [[ $NFP_DEVSTACK_MODE = base ]]; then + IMAGE_NAME="reference_configurator_image" FLAVOR=m1.nfp-tiny - gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=None --vendor NFP base_mode_lb - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME,flavor=$FLAVOR --vendor NFP base_mode_fw_vm + + gbp service-profile-create\ + --servicetype LOADBALANCER\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=haproxy,device_type=None\ + --vendor NFP\ + base_mode_lb + + gbp service-profile-create\ + --servicetype FIREWALL\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME,flavor=$FLAVOR\ + --vendor NFP\ + base_mode_fw_vm + else - gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=nova --vendor NFP lb_profile - gbp service-profile-create --servicetype LOADBALANCERV2 --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy_lbaasv2,device_type=nova,flavor=m1.small --vendor NFP lbv2_profile - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vyos_fw_profile - gbp service-profile-create --servicetype VPN --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=nova --vendor NFP vpn_profile + + gbp service-profile-create\ + --servicetype LOADBALANCER\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=haproxy,device_type=nova\ + --vendor NFP\ + lb_profile + + gbp service-profile-create\ + --servicetype LOADBALANCERV2\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=haproxy_lbaasv2,device_type=nova,flavor=m1.small\ + --vendor NFP\ + lbv2_profile + + gbp service-profile-create\ + --servicetype FIREWALL\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=vyos,device_type=nova\ + --vendor NFP\ + vyos_fw_profile + + gbp service-profile-create\ + --servicetype VPN\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=vyos,device_type=nova\ + --vendor NFP\ + vpn_profile + if [[ $NFP_DEVSTACK_MODE = enterprise ]]; then - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=asav,device_type=nova --vendor NFP asav_fw_profile + gbp service-profile-create\ + --servicetype FIREWALL\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=asav,device_type=nova\ + --vendor NFP\ + asav_fw_profile fi + create_ext_net create_ep_and_nsp create_advance_sharing_ptg + fi - gbp l3policy-create --ip-version 4 --proxy-ip-pool=192.169.0.0/24 --ip-pool 120.0.0.0/24 --subnet-prefix-length 24 service_management - gbp l2policy-create --l3-policy service_management svc_management_ptg - gbp group-create svc_management_ptg --service_management True --l2-policy svc_management_ptg - neutron router-gateway-clear l3p_service_management + + gbp l3policy-create\ + --ip-version 4\ + --proxy-ip-pool=192.169.0.0/24\ + --ip-pool 120.0.0.0/24\ + --subnet-prefix-length 24\ + service_management + + gbp l2policy-create\ + --l3-policy service_management\ + svc_management_ptg + + gbp group-create\ + svc_management_ptg\ + --service_management True\ + --l2-policy svc_management_ptg + + neutron router-gateway-clear\ + l3p_service_management } +# create_port_for_vm() - Create a port, and get its details +# Args: +# $1 is image_name function create_port_for_vm { -# $1 is image_name if [[ $1 = configurator ]]; then instance_name=$ConfiguratorInstanceName else @@ -154,6 +276,7 @@ function create_port_for_vm { fi } +# configure_vis_ip_addr_in_docker() - Configure Configurator with Visibility VM's IP address function configure_vis_ip_addr_in_docker { echo "Visibility VM IP address is: $visibility_ip" sed -i "s/VIS_VM_IP_ADDRESS/"$visibility_ip"/" $NFPSERVICE_DIR/gbpservice/nfp/configurator/Dockerfile @@ -254,6 +377,7 @@ function create_nfp_image { sudo service apache2 restart } +# configure_configurator_user_data() - Configure Configurator user data function configure_configurator_user_data { CUR_DIR=$PWD sudo rm -rf /opt/configurator_user_data @@ -268,23 +392,31 @@ function configure_configurator_user_data { cd $CUR_DIR } +# launch_configuratorVM() - Launch the Configurator VM function launch_configuratorVM { echo "Collecting ImageId : for $configurator_image_name" ImageId=`glance image-list | grep $configurator_image_name | awk '{print $2}'` if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then echo $ImageId else - echo "No image found with name $configurator_image_name ..." + echo "No image found with name $configurator_image_name" exit fi configure_configurator_user_data - nova boot --flavor m1.medium --user-data /opt/configurator_user_data --image $ImageId --nic port-id=$configurator_port_id $ConfiguratorInstanceName + nova boot\ + --flavor m1.medium\ + --user-data /opt/configurator_user_data\ + --image $ImageId\ + --nic port-id=$configurator_port_id\ + $ConfiguratorInstanceName sleep 10 } +# configure_visibility_user_data() - Configure Visibility user data +# Args: +# $1 - Visibility VM's IP address function configure_visibility_user_data { -# $1 is the Visibility VM's IP address CUR_DIR=$PWD visibility_vm_ip=$1 sudo rm -rf /opt/visibility_user_data @@ -302,6 +434,7 @@ function configure_visibility_user_data { cd $CUR_DIR } +# attach_security_groups() - Create and add a security group to the Visibility VM function attach_security_groups { unset OS_USER_DOMAIN_ID unset OS_PROJECT_DOMAIN_ID @@ -318,6 +451,7 @@ function attach_security_groups { nova add-secgroup $VisibilityInstanceName $SecGroup } +# launch_visibilityVM() - Launch the Visibility VM function launch_visibilityVM { neutron net-create visibility-network neutron subnet-create visibility-network 188.0.0.0/24 --name visibility-subnet @@ -338,17 +472,24 @@ function launch_visibilityVM { if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then echo $ImageId else - echo "No image found with name $visibility_image_name ..." + echo "No image found with name $visibility_image_name" exit fi configure_visibility_user_data $visibility_ip echo "Launching Visibility image" - nova boot --image $ImageId --flavor m1.xlarge --user-data /opt/visibility_user_data --nic port-id=$visibility_port_id --nic port-id=$ExtPortId $VisibilityInstanceName + nova boot\ + --image $ImageId\ + --flavor m1.xlarge\ + --user-data /opt/visibility_user_data\ + --nic port-id=$visibility_port_id\ + --nic port-id=$ExtPortId\ + $VisibilityInstanceName sleep 10 attach_security_groups } +# nfp_logs_forword() - Configure log forwarding for visibility function nfp_logs_forword { VISIBILITY_CONF="/etc/rsyslog.d/visibility.conf" SYSLOG_CONFIG="/etc/rsyslog.conf" @@ -368,6 +509,7 @@ function nfp_logs_forword { fi } +# namespace_delete() - Utility for namespace management function namespace_delete { source $DEVSTACK_DIR/openrc neutron service @@ -392,9 +534,10 @@ function namespace_delete { echo "ovs port ptr1 is removed" fi - echo "nfp-proxy cleaning success.... " + echo "nfp-proxy cleaning success." } +# namespace_create() - Utility for namespace management function namespace_create { SERVICE_MGMT_NET="l2p_svc_management_ptg" echo "Creating new namespace nfp-proxy...." @@ -468,6 +611,7 @@ function namespace_create { sudo ip netns exec nfp-proxy /usr/bin/nfp_proxy --config-file=/etc/nfp_proxy.ini } +# copy_nfp_files_and_start_process() - Setup configuration and start processes function copy_nfp_files_and_start_process { cd /opt/stack/gbp/gbpservice/nfp sudo cp -r bin/nfp /usr/bin/ @@ -493,33 +637,33 @@ function copy_nfp_files_and_start_process { sed -i 's#source.*#source '$DEVSTACK_DIR'/openrc demo demo#g' /opt/stack/gbp/devstack/exercises/nfp_service/*.sh source $DEVSTACK_DIR/functions-common - echo "Starting orchestrator >>>> under screen named : nfp_orchestrator" + echo "Starting nfp_orchestrator under screen named nfp_orchestrator" run_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file /opt/stack/logs/nfp_orchestrator.log" sleep 4 - echo "Starting proxy_agent >>>> under screen named : nfp_proxy_agent" + echo "Starting nfp_proxy_agent under screen named nfp_proxy_agent" run_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file /opt/stack/logs/nfp_proxy_agent.log" sleep 4 - echo "Starting proxy server under Namespace : nfp-proxy namespace >>>> under screen named : nfp_proxy" + echo "Starting nfp_proxy inside namespace named nfp-proxy, under screen named nfp_proxy" run_process nfp_proxy "source $NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete; namespace_create" sleep 10 if [[ $NFP_DEVSTACK_MODE != base ]]; then - echo "Starting nfp config orchestrator >>>> under screen named : nfp_config_orchestrator" + echo "Starting nfp_config_orchestrator under screen named nfp_config_orchestrator" run_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file /opt/stack/logs/nfp_config_orchestrator.log" else cd pecan/api sudo python setup.py develop - echo "Starting nfp_base_configurator >>>> under screen named : nfp_base_configurator" + echo "Starting nfp_base_configurator under screen named nfp_base_configurator" run_process nfp_base_configurator "cd /opt/stack/gbp/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" fi sleep 1 - echo "Running gbp-db-manage" + echo "Upgrading DB to HEAD" source $DEVSTACK_DIR/openrc neutron service gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head sleep 2 - echo "NFP configuration done...!! " + echo "NFP configuration done." } diff --git a/devstack/settings b/devstack/settings index b7907e1b93..478e42d069 100755 --- a/devstack/settings +++ b/devstack/settings @@ -47,7 +47,8 @@ if [[ $ENABLE_NFP = True ]]; then enable_service nfp_orchestrator enable_service nfp_proxy enable_service nfp_proxy_agent - [[ $NFP_DEVSTACK_MODE = base ]] && enable_service nfp_base_configurator || enable_service nfp_config_orchestrator + [[ $NFP_DEVSTACK_MODE = base ]] && enable_service nfp_base_configurator + [[ $NFP_DEVSTACK_MODE != base ]] && enable_service nfp_config_orchestrator fi OVS_PHYSICAL_BRIDGE=br-ex From ee0ca69c6ce454a56a538fcbab483cbcc9c35803 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 14 Jul 2016 18:19:35 +0530 Subject: [PATCH 047/157] Addressed review comments --- devstack/lib/nfp | 11 +++---- devstack/local.conf.nfp | 30 +++++++++++-------- .../diskimage-create/disk_image_create.py | 3 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 74e2835425..82ef690c92 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -269,7 +269,7 @@ function create_nfp_image { RefConfiguratorQcow2ImageName=reference_configurator_image echo "Building Image: $RefConfiguratorQcow2ImageName" sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/ref_configurator_conf.json - RefConfiguratorQcow2Image=$(cat /tmp/image_path) + RefConfiguratorQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) echo "Uploading Image: $RefConfiguratorQcow2ImageName" glance image-create --name $RefConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $RefConfiguratorQcow2Image openstack --os-cloud=devstack-admin flavor create --ram 512 --disk 3 --vcpus 1 m1.nfp-tiny @@ -280,7 +280,7 @@ function create_nfp_image { if [[ $ConfiguratorQcow2Image = build ]]; then echo "Building Image: $ConfiguratorQcow2ImageName" sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH - ConfiguratorQcow2Image=$(cat /tmp/image_path) + ConfiguratorQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) fi echo "Uploading Image: $ConfiguratorQcow2ImageName" glance image-create --name $ConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $ConfiguratorQcow2Image @@ -292,7 +292,7 @@ function create_nfp_image { cd $DISK_IMAGE_DIR/diskimage-create/vyos/ sudo python vyos_image_create.py vyos_conf.json cd $cur_dir - VyosQcow2Image=$(cat /tmp/image_path) + VyosQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) fi echo "Uploading Image: $VyosQcow2ImageName" glance image-create --name $VyosQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $VyosQcow2Image @@ -301,13 +301,10 @@ function create_nfp_image { if [[ $HaproxyQcow2Image = build ]]; then echo "Building Image: $HaproxyQcow2ImageName" sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/haproxy_conf.json - HaproxyQcow2Image=$(cat /tmp/image_path) + HaproxyQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) fi echo "Uploading Image: $HaproxyQcow2ImageName" glance image-create --name $HaproxyQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $HaproxyQcow2Image - Haproxy_LBaasV2_Qcow2Image_Name=haproxy_lbaasv2 - echo "Uploading Image: $Haproxy_LBaasV2_Qcow2Image_Name" - glance image-create --name $Haproxy_LBaasV2_Qcow2Image_Name --disk-format qcow2 --container-format bare --visibility public --file $Haproxy_LBaasV2_Qcow2Image fi # restore the apache2 setting that we did above diff --git a/devstack/local.conf.nfp b/devstack/local.conf.nfp index 85f758ae14..4f5355405a 100644 --- a/devstack/local.conf.nfp +++ b/devstack/local.conf.nfp @@ -18,31 +18,35 @@ SERVICE_TOKEN=admin ENABLE_NFP=True # Edit NFP_DEVSTACK_MODE with either 'base' or 'advanced' [[ $ENABLE_NFP = True ]] && NFP_DEVSTACK_MODE=base -[[ $NFP_DEVSTACK_MODE = advanced ]] && enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka -[[ $NFP_DEVSTACK_MODE = advanced ]] && enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer.git stable/mitaka if [[ $NFP_DEVSTACK_MODE = base ]]; then GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy GBPSERVICE_BRANCH=master else - # Openstack repo - #GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy - #GBPSERVICE_BRANCH=refs/changes/05/335405/27 - # Oneconvergence repo - GBPSERVICE_REPO=https://github.com/oneconvergence/group-based-policy.git - GBPSERVICE_BRANCH=mitaka_21st_march_base -fi -enable_plugin gbp $GBPSERVICE_REPO $GBPSERVICE_BRANCH - -if [[ $NFP_DEVSTACK_MODE = advanced ]]; then # External Network EXT_NET_GATEWAY= EXT_NET_ALLOCATION_POOL_START= EXT_NET_ALLOCATION_POOL_END= EXT_NET_CIDR= + # Following image path options are optional + # Configure them to use the custom images + # Leave them empty, so that they will be built during the installation + ConfiguratorQcow2Image= VyosQcow2Image= - Haproxy_LBaasV2_Qcow2Image= + HaproxyQcow2Image= # Make sure that your public interface is not attached to any bridge. PUBLIC_INTERFACE= + + enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka + enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer.git stable/mitaka + + # Openstack repo + #GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy + #GBPSERVICE_BRANCH=refs/changes/05/335405/27 + # Oneconvergence repo + GBPSERVICE_REPO=https://github.com/oneconvergence/group-based-policy.git + GBPSERVICE_BRANCH=mitaka_21st_march_base fi +enable_plugin gbp $GBPSERVICE_REPO $GBPSERVICE_BRANCH + diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py index 9590e357d3..c8c825e8d4 100755 --- a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py @@ -190,9 +190,8 @@ def dib(nfp_branch_name): if not ret: image_path = "%s/output/%s.qcow2" % (cur_dir, image_name) print("Image location: %s" % image_path) - with open("/tmp/image_path", "w") as f: + with open("%s/output/last_built_image_path" % cur_dir, "w") as f: f.write(image_path) - f.close() if __name__ == "__main__": From b53a75d148c3871495101517139fea11af6f2bdb Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 14 Jul 2016 18:20:52 +0530 Subject: [PATCH 048/157] Fixed base mode installation --- devstack/lib/nfp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 82ef690c92..6ccaff8068 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -90,10 +90,6 @@ function create_ext_net { EXT_NET_ALLOCATION_POOL_END=$EXT_NET_ALLOCATION_POOL_END EXT_NET_CIDR=$EXT_NET_CIDR - source $DEVSTACK_DIR/openrc neutron service - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - neutron net-create\ --router:external=true\ --shared\ @@ -157,6 +153,8 @@ function create_advance_sharing_ptg { # create_nfp_gbp_resources() - Create various GBP resources function create_nfp_gbp_resources { source $DEVSTACK_DIR/openrc neutron service + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID if [[ $NFP_DEVSTACK_MODE = base ]]; then From cae98fca043c0985ec4f9fcd596446ac0cfe16a7 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 14 Jul 2016 19:50:52 +0530 Subject: [PATCH 049/157] added nfp svc agent unit test --- .../configurator/agents/test_nfp_service.py | 189 ++++++++++++++++++ .../configurator/test_data/fw_test_data.py | 22 +- .../test_data/nfp_service_test_data.py | 43 ++++ 3 files changed, 243 insertions(+), 11 deletions(-) create mode 100644 gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py create mode 100644 gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py new file mode 100644 index 0000000000..8a6051ee5f --- /dev/null +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py @@ -0,0 +1,189 @@ +# 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 mock +import unittest + +from oslo_config import cfg +from oslo_log import log as logging + +from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( + nfp_service_test_data as fo) +from gbpservice.nfp.configurator.agents import nfp_service as ns +from gbpservice.nfp.configurator.lib import nfp_service_constants as const + +LOG = logging.getLogger(__name__) + + +class NfpServiceRpcManagerTestCase(unittest.TestCase): + """ Implement test cases for RPC manager methods of nfp service agent. + + """ + + def __init__(self, *args, **kwargs): + super(NfpServiceRpcManagerTestCase, self).__init__( + *args, **kwargs) + self.fo = fo.FakeObjects() + + @mock.patch(__name__ + '.fo.FakeObjects.sc') + @mock.patch(__name__ + '.fo.FakeObjects.conf') + def _get_NfpServiceRpcManager_object(self, conf, sc): + """ Retrieves RPC manager object of nfp service agent. + + :param sc: mocked service controller object of process model framework + :param conf: mocked OSLO configuration file + + Returns: object of nfp service's RPC manager + and service controller. + + """ + + agent = ns.ConfigScriptRpcManager(sc, conf) + return agent, sc + + def _test_event_creation(self, method): + """ Tests event creation and enqueueing for create/delete + operation of generic config agent's RPC manager. + + :param method: CREATE_NFP_SERVICE + + Returns: none + + """ + + agent, sc = self._get_NfpServiceRpcManager_object() + arg_dict = {'context': self.fo.context, + 'resource_data': self.fo.kwargs} + with mock.patch.object( + sc, 'new_event', return_value='foo') as mock_sc_event, \ + mock.patch.object(sc, 'post_event') as mock_sc_rpc_event: + actual_call = agent.run_nfp_service(self.fo.context, + self.fo.kwargs) + + expected_cal = mock_sc_event.assert_called_with( + id=method, data=arg_dict, key=None) + self.assertEqual(actual_call, expected_cal) + mock_sc_rpc_event.assert_called_with('foo') + + def test_nfp_service_rpcmanager(self): + """ Implements test case for run_nfp_service method + of nfp service RPC manager. + + Returns: none + + """ + + self._test_event_creation(const.CREATE_NFP_SERVICE_EVENT) + + +class NfpServiceEventHandlerTestCase(unittest.TestCase): + """ Implements test cases for event handler methods + of nfp service agent. + + """ + + def __init__(self, *args, **kwargs): + super(NfpServiceEventHandlerTestCase, self).__init__( + *args, **kwargs) + self.fo = fo.FakeObjects() + self.context = {'notification_data': {}, + 'resource': 'interfaces'} + + @mock.patch(__name__ + '.fo.FakeObjects.rpcmgr') + @mock.patch(__name__ + '.fo.FakeObjects.drivers') + @mock.patch(__name__ + '.fo.FakeObjects.sc') + def _get_NfpServiceEventHandler_object(self, sc, drivers, rpcmgr): + """ Retrieves event handler object of nfp service. + + :param sc: mocked service controller object of process model framework + :param rpcmgr: object of configurator's RPC manager + :param drivers: list of driver objects for nfp service agent + + Returns: object of nfp service's event handler + + """ + + agent = ns.ConfigScriptEventHandler(sc, drivers, rpcmgr) + return agent, sc + + def _test_handle_event(self, ev, result=const.UNHANDLED_RESULT): + """ Test handle event method of nfp service agent. + + :param ev: event data which has to be actually sent by + process framework. + + Returns: None + + """ + + agent, sc = self._get_NfpServiceEventHandler_object() + driver = mock.Mock() + + with mock.patch.object( + driver, 'run_heat', return_value=result) as mock_config_inte, \ + mock.patch.object( + agent, '_get_driver', return_value=driver): + + agent.handle_event(ev) + + mock_config_inte.assert_called_with( + ev.data['context']['context'], ev.data['resource_data']) + + def test_create_nfp_service_handle_event_success(self): + """ Implements positive test case for create_nfp_service method + of nfp service event handler. + + Returns: none + + """ + + ev = fo.FakeEventNfpService() + ev.id = const.CREATE_NFP_SERVICE_EVENT + self._test_handle_event(ev) + + def test_create_nfp_service_handle_event_failure(self): + """ Implements negative test case for create_nfp_service method + of nfp service event handler. + + Returns: none + + """ + + ev = fo.FakeEventNfpService() + ev.id = const.CREATE_NFP_SERVICE_EVENT + self._test_handle_event(ev, const.FAILURE) + + def test_create_nfp_service_handle_event_key_error(self): + """ Implements key error test case for create_nfp_service method + of nfp service event handler. + + Returns: none + + """ + + ev = fo.FakeEventNfpService() + ev.id = const.CREATE_NFP_SERVICE_EVENT + ev.data['context'].pop('service_vendor') + + agent, sc = self._get_NfpServiceEventHandler_object() + driver = mock.Mock() + + with mock.patch.object(driver, 'run_heat'), \ + mock.patch.object( + agent, '_get_driver', return_value=driver): + + with self.assertRaises(KeyError): + agent.handle_event(ev) + + +if __name__ == '__main__': + unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py index 8af7789147..507ba1f688 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py @@ -10,12 +10,12 @@ # License for the specific language governing permissions and limitations # under the License. -""" Implements fake objects for assertion. -""" +class FakeObjects(object): + """ Implements fake objects for assertion. + """ -class FakeObjects(object): sc = 'sc' empty_dict = {} context = 'APIcontext' @@ -300,13 +300,13 @@ def _fake_firewall_obj(self): } return firewall -""" Implements a fake event class for firewall for - process framework to use -""" +class FakeEventFirewall(object): + """ Implements a fake event class for firewall for + process framework to use + """ -class FakeEventFirewall(object): def __init__(self): fo = FakeObjects() kwargs = fo._fake_resource_data() @@ -323,13 +323,13 @@ def __init__(self): 'resource_data': kwargs} self.id = 'dummy' -""" Implements a fake event class for generic config for - process framework to use -""" +class FakeEventGenericConfig(object): + """ Implements a fake event class for generic config for + process framework to use + """ -class FakeEventGenericConfig(object): def __init__(self): fo = FakeObjects() kwargs = fo._fake_resource_data() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py new file mode 100644 index 0000000000..7691fe12f0 --- /dev/null +++ b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py @@ -0,0 +1,43 @@ +# 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. + + +class FakeObjects(object): + """ Implements fake objects for assertion. + + """ + + sc = 'sc' + conf = 'conf' + context = 'APIcontext' + kwargs = {'vmid': 'vmid'} + rpcmgr = 'rpcmgr' + drivers = 'drivers' + + +class FakeEventNfpService(object): + """ Implements a fake event class for generic config for + process framework to use + + """ + + def __init__(self): + fo = FakeObjects() + self.data = { + 'context': { + 'resource': 'heat', + 'notification_data': {}, + 'resource_type': 'firewall', + 'service_vendor': 'vyos', + 'context': 'APIcontext'}, + 'resource_data': 'some data'} + self.id = 'dummy' From 917a38d1dedfadc563c74a6743aa3d4339c66c00 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Thu, 14 Jul 2016 20:00:43 +0530 Subject: [PATCH 050/157] fix for authentication --- .../drivers/orchestration_driver.py | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py b/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py index 171b88ac41..d43ccda04a 100644 --- a/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py +++ b/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py @@ -312,6 +312,7 @@ def _update_self_with_vendor_data(self, vendor_data, attr): {'attr': attr, 'default': attr_value}) def _update_vendor_data(self, device_data, token=None): + vendor_data = {} try: image_name = self._get_image_name(device_data) vendor_data = self._get_vendor_data(device_data, image_name) @@ -334,6 +335,7 @@ def _update_vendor_data(self, device_data, token=None): LOG.error(_LE("Error while getting metadata for image name:" "%(image_name)s, proceeding with default values"), {'image_name': image_name}) + return vendor_data def _update_vendor_data_fast(self, token, admin_tenant_id, image_name, device_data): @@ -1164,32 +1166,24 @@ def unplug_network_function_device_interfaces(self, device_data, compute_policy=device_data['service_details']['device_type']) image_name = self._get_image_name(device_data) + vendor_data = {} if image_name: - self._update_vendor_data(device_data, - device_data.get('token')) + vendor_data = self._update_vendor_data(device_data, + device_data.get('token')) token = self._get_token(device_data.get('token')) if not token: return None - - executor = nfp_executor.TaskExecutor(jobs=1) - vendor_data_result = {} - tenant_id = device_data.get('tenant_id') - - executor.add_job('UPDATE_VENDOR_DATA', - self._update_vendor_data_fast, - token, tenant_id, image_name, device_data, - result_store=vendor_data_result) - executor.fire() - - vendor_data = vendor_data_result.get('result', None) if not vendor_data: LOG.warn(_LE('Failed to get vendor data for device deletion.')) - vendor_data = {} update_ifaces = [] - try: + supports_hotplug = True + if vendor_data: if vendor_data.get('supports_hotplug') == False: + supports_hotplug = False + try: + if supports_hotplug == False: if self.setup_mode.get(nfp_constants.APIC_MODE): data_port_ids = [] for port in device_data['ports']: From 61d98d5f8a11637088f0193680a88660338efef2 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 14 Jul 2016 20:24:52 +0530 Subject: [PATCH 051/157] Addressed review comment --- devstack/lib/nfp | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 6ccaff8068..31317a20a2 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -132,24 +132,6 @@ function create_ep_and_nsp { svc_mgmt_fip_policy } -# create_advance_sharing_ptg() - Create a Policy target group -function create_advance_sharing_ptg { - gbp l3policy-create\ - --ip-version 4\ - --ip-pool 121.0.0.0/20\ - --proxy-ip-pool=192.167.0.0/24\ - --subnet-prefix-length 20\ - advanced_services_sharing_l3p - - gbp l2policy-create\ - --l3-policy advanced_services_sharing_l3p\ - advance_sharing_l2p - - gbp group-create\ - --l2-policy advance_sharing_l2p\ - Advance_Sharing_PTG -} - # create_nfp_gbp_resources() - Create various GBP resources function create_nfp_gbp_resources { source $DEVSTACK_DIR/openrc neutron service @@ -213,7 +195,6 @@ function create_nfp_gbp_resources { create_ext_net create_ep_and_nsp - create_advance_sharing_ptg fi @@ -231,7 +212,8 @@ function create_nfp_gbp_resources { gbp group-create\ svc_management_ptg\ --service_management True\ - --l2-policy svc_management_ptg + --l2-policy\ + svc_management_ptg neutron router-gateway-clear\ l3p_service_management From ff343f667da5d9407a4d1f45b589d26db5266259 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 14 Jul 2016 20:44:58 +0530 Subject: [PATCH 052/157] Fixed ENABLE_NFP=False and Corrected Readme(s) --- devstack/README-NFP-Advanced-Mode | 9 +++-- devstack/Readme-NFP-install.txt | 54 +++++++-------------------- devstack/local.conf.nfp | 62 ++++++++++++++++--------------- 3 files changed, 51 insertions(+), 74 deletions(-) diff --git a/devstack/README-NFP-Advanced-Mode b/devstack/README-NFP-Advanced-Mode index 73c42c8300..56a377e443 100644 --- a/devstack/README-NFP-Advanced-Mode +++ b/devstack/README-NFP-Advanced-Mode @@ -12,15 +12,18 @@ Fresh Installation Steps: (3) Configure local.conf # Modify NFP_DEVSTACK_MODE to 'advanced' - # Modify the GBPSERVICE_BRANCH to point to the top patch in devstack changeset refs/changes/05/335405 # Configure following external network details, EXT_NET_GATEWAY= EXT_NET_ALLOCATION_POOL_START= EXT_NET_ALLOCATION_POOL_END= EXT_NET_CIDR= - # Configure the following image paths, + # Configure the following image paths(optional), + # Leave them empty, so that the images are built during installation + ConfiguratorQcow2Image= VyosQcow2Image= - Haproxy_LBaasV2_Qcow2Image= + HaproxyQcow2Image= + # Configure PUBLIC_INTERFACE with the public interface name + # Modify the GBPSERVICE_BRANCH to point to the top patch in devstack changeset refs/changes/05/335405 (4) Install devstack. # ./stack.sh diff --git a/devstack/Readme-NFP-install.txt b/devstack/Readme-NFP-install.txt index 13273df616..ccce7e2dca 100644 --- a/devstack/Readme-NFP-install.txt +++ b/devstack/Readme-NFP-install.txt @@ -17,48 +17,20 @@ Fresh Installation Steps: * Advanced Mode Configuration: # Devstack installation in enterprise mode - Example: [[ $ENABLE_NFP = True ]] && NFP_DEVSTACK_MODE=advanced - # Change the value of GBPSERVICE_BRANCH to use different branch(in OC repo)/patch(in Openstack repo) - # External network details - EXT_NET_GATEWAY= - EXT_NET_ALLOCATION_POOL_START= - EXT_NET_ALLOCATION_POOL_END= - EXT_NET_CIDR= - # VyOS image path - * Available only at 192.168.100.135:/home/stack/service_images/vyos.qcow2 - Example: VyosQcow2Image=/home/stack/images/vyos.qcow2 - # Haproxy LBaaS V2 image path - Haproxy_LBaasV2_Qcow2Image= - # Public interface - Example: PUBLIC_INTERFACE=eth1 - - * Enterprise Mode Configuration: - # Devstack installation in enterprise mode - Example: [[ $ENABLE_NFP = True ]] && NFP_DEVSTACK_MODE=enterprise - # Change the value of GBPSERVICE_BRANCH to use different branch + NFP_DEVSTACK_MODE=advanced # External network details - EXT_NET_GATEWAY= - EXT_NET_ALLOCATION_POOL_START= - EXT_NET_ALLOCATION_POOL_END= - EXT_NET_CIDR= - # VyOS image path - * Available only at 192.168.100.135:/home/stack/service_images/vyos.qcow2 - Example: VyosQcow2Image=/home/stack/images/vyos.qcow2 - # Haproxy LBaaS V2 image path - Haproxy_LBaasV2_Qcow2Image= - # Public interface - Example: PUBLIC_INTERFACE=eth1 - # Visibility GIT Repository Credentials - GIT_ACCESS_USERNAME= - GIT_ACCESS_PASSWORD= - # Docker image path - * Available only at 192.168.100.50. Change and configure for different nework - DOCKER_IMAGES_URL=http://192.168.100.50/docker_images/ - # ASAv image path - AsavQcow2Image= - # PaloAlto image path - PaloAltoQcow2Image= - + EXT_NET_GATEWAY= + EXT_NET_ALLOCATION_POOL_START= + EXT_NET_ALLOCATION_POOL_END= + EXT_NET_CIDR= + # Service VM image path(s) + # (optional - Leave them empty, so that they will be built during installation) + ConfiguratorQcow2Image= + VyosQcow2Image= + HaproxyQcow2Image= + # Public interface name + PUBLIC_INTERFACE= + # Change the value of GBPSERVICE_BRANCH to use different branch(in OC repo)/patch(in Openstack repo) (4) Run stack.sh from the /home/stack/devstack/ directory # ./stack.sh diff --git a/devstack/local.conf.nfp b/devstack/local.conf.nfp index 4f5355405a..40304934fe 100644 --- a/devstack/local.conf.nfp +++ b/devstack/local.conf.nfp @@ -16,37 +16,39 @@ SERVICE_TOKEN=admin # NFP Service ENABLE_NFP=True +GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy +GBPSERVICE_BRANCH=master # Edit NFP_DEVSTACK_MODE with either 'base' or 'advanced' -[[ $ENABLE_NFP = True ]] && NFP_DEVSTACK_MODE=base -if [[ $NFP_DEVSTACK_MODE = base ]]; then - GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy - GBPSERVICE_BRANCH=master -else - # External Network - EXT_NET_GATEWAY= - EXT_NET_ALLOCATION_POOL_START= - EXT_NET_ALLOCATION_POOL_END= - EXT_NET_CIDR= - - # Following image path options are optional - # Configure them to use the custom images - # Leave them empty, so that they will be built during the installation - ConfiguratorQcow2Image= - VyosQcow2Image= - HaproxyQcow2Image= - - # Make sure that your public interface is not attached to any bridge. - PUBLIC_INTERFACE= - - enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka - enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer.git stable/mitaka - - # Openstack repo - #GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy - #GBPSERVICE_BRANCH=refs/changes/05/335405/27 - # Oneconvergence repo - GBPSERVICE_REPO=https://github.com/oneconvergence/group-based-policy.git - GBPSERVICE_BRANCH=mitaka_21st_march_base +if [[ $ENABLE_NFP = True ]]; then + NFP_DEVSTACK_MODE=base + + if [[ $NFP_DEVSTACK_MODE = advanced ]]; then + # External Network + EXT_NET_GATEWAY= + EXT_NET_ALLOCATION_POOL_START= + EXT_NET_ALLOCATION_POOL_END= + EXT_NET_CIDR= + + # Following image path options are optional + # Configure them to use the custom images + # Leave them empty, so that they will be built during the installation + ConfiguratorQcow2Image= + VyosQcow2Image= + HaproxyQcow2Image= + + # Make sure that your public interface is not attached to any bridge. + PUBLIC_INTERFACE= + + enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka + enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer.git stable/mitaka + + # Openstack repo + #GBPSERVICE_REPO=https://git.openstack.org/openstack/group-based-policy + #GBPSERVICE_BRANCH=refs/changes/05/335405/27 + # Oneconvergence repo + GBPSERVICE_REPO=https://github.com/oneconvergence/group-based-policy.git + GBPSERVICE_BRANCH=mitaka_21st_march_base + fi fi enable_plugin gbp $GBPSERVICE_REPO $GBPSERVICE_BRANCH From e7b701baf0e9a47c452f944eb06c1f8f0e3e0206 Mon Sep 17 00:00:00 2001 From: pkharat Date: Fri, 15 Jul 2016 11:00:18 +0530 Subject: [PATCH 053/157] Synced OC git repo LB agent and driver code with gerrit LB agent and driver code --- .../configurator/agents/loadbalancer_v1.py | 35 +++++++------ .../v1/haproxy/haproxy_lb_driver.py | 52 ------------------- .../v1/haproxy/haproxy_rest_client.py | 9 +++- 3 files changed, 26 insertions(+), 70 deletions(-) diff --git a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py index 4b4d0df171..a177bba170 100644 --- a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py +++ b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py @@ -25,9 +25,11 @@ class LBaasRpcSender(data_filter.Filter): """Implements LBaaS response path to Neutron plugin. - Methods of this class are invoked by LBaasEventHandler class - and also by driver class for sending response from driver to - the LBaaS Neutron plugin. + + Methods of this class are invoked by LBaasEventHandler class + and also by driver class for sending response from driver to + the LBaaS Neutron plugin. + """ def __init__(self, sc): self.notify = agent_base.AgentBaseNotification(sc) @@ -152,7 +154,7 @@ def _send_event(self, event_id, data, serialize=False, binding_key=None, ev = self.sc.new_event(id=event_id, data=data) ev.key = key - ev.sequence = serialize + ev.serialize = serialize ev.binding_key = binding_key self.sc.post_event(ev) @@ -379,17 +381,15 @@ def agent_updated(self, context, payload): self._send_event(lb_constants.EVENT_AGENT_UPDATED, arg_dict) -"""Implements event handlers and their helper methods. - -Object of this class is registered with the event class of core service -controller. Based on the event key, handle_event method of this class is -invoked by core service controller. - -""" - - class LBaaSEventHandler(agent_base.AgentBaseEventHandler, nfp_api.NfpEventHandler): + """Implements event handlers and their helper methods. + + Object of this class is registered with the event class of core service + controller. Based on the event key, handle_event method of this class is + invoked by core service controller. + + """ instance_mapping = {} def __init__(self, sc, drivers, rpcmgr): @@ -398,10 +398,11 @@ def __init__(self, sc, drivers, rpcmgr): self.rpcmgr = rpcmgr self.plugin_rpc = LBaasRpcSender(sc) - """REVISIT (pritam): Remove neutron context dependency. As of now because - config agent needs context in notification, and internal poll event - like collect_stats() does not have context, creating context here, - but should get rid of this in future. + """REVISIT (pritam): + Remove neutron context dependency. As of now + because config agent needs context in notification, and internal + poll event like collect_stats() does not have context, creating + context here, but should get rid of this in future. """ self.context = context.get_admin_context_without_session() diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py index 5edad25291..e6d69b4633 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py +++ b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py @@ -454,58 +454,6 @@ def _delete_pool_health_monitor(self, hm, pool_id, except Exception as e: raise e - def deploy_instance(self, logical_config): - """ REVISIT (pritam): Not used now but will be used when - agent_updated() call is supported in LB agent """ - # do actual deploy only if vip and pool are configured and active - if (not logical_config or - 'vip' not in logical_config or - (logical_config['vip']['status'] not in - lb_constants.ACTIVE_PENDING_STATUSES) or - not logical_config['vip']['admin_state_up'] or - (logical_config['pool']['status'] not in - lb_constants.ACTIVE_PENDING_STATUSES) or - not logical_config['pool']['admin_state_up']): - return - - try: - device_addr = self._get_device_for_pool( - logical_config['pool']['id']) - - self._create_pool(logical_config['pool'], device_addr) - self._create_vip(logical_config['vip'], device_addr) - for member in logical_config['members']: - self._create_member(member, device_addr) - for hm in logical_config['healthmonitors']: - self._create_pool_health_monitor(hm, - logical_config['pool']['id'], - device_addr) - except Exception as e: - msg = ("Failed to deploy instance. %s" - % str(e).capitalize()) - LOG.error(msg) - raise e - - def undeploy_instance(self, pool_id, context): - """ REVISIT (pritam): Not used now but will be used when - agent_updated() call is supported in LB agent """ - try: - device_addr = self._get_device_for_pool(pool_id, context) - logical_device = self.plugin_rpc.get_logical_device(pool_id, - context) - - self._delete_vip(logical_device['vip'], device_addr) - self._delete_pool(logical_device['pool'], device_addr) - except Exception as e: - msg = ("Failed to undeploy instance. %s" - % str(e).capitalize()) - LOG.error(msg) - raise e - - def remove_orphans(self, pol_ids): - """ REVISIT (pritam): Unused""" - raise NotImplementedError - def get_stats(self, pool_id): stats = {} try: diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py index 70285e0777..c32fa277e1 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py +++ b/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py @@ -44,7 +44,7 @@ def do_request(self, method, url=None, headers=None, data=None, msg = ("[Request:%s, URL:%s, Body:%s] Failed.Reason:%s" % (method, url, data, e)) LOG.error(msg) - raise e + raise Exception(msg) return response def request(self, method, uri, body=None, @@ -55,6 +55,12 @@ def request(self, method, uri, body=None, response = self.do_request(method, url=url, headers=headers, data=body, timeout=self._request_timeout) + if response is None: + msg = ("[Request:%s, URL:%s, Body:%s] Failed.HTTP response is None" + ".Request timed out" % (method, url, body)) + LOG.error(msg) + raise Exception(msg) + status = response.status_code # Not Found (404) is OK for DELETE. Ignore it here if method == 'DELETE' and status == 404: @@ -65,6 +71,7 @@ def request(self, method, uri, body=None, msg = ("[Request:%s, URL:%s, Body:%s] Failed with status:%s" % (method, url, body, status)) LOG.error(msg) + raise Exception(msg) else: msg = ("[Request:%s, URL:%s, Body:%s] executed successfully" % (method, url, body)) From 224c0607142d8b25fea560c9179b891ed5976437 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 15 Jul 2016 11:13:55 +0530 Subject: [PATCH 054/157] added nfp service driver and agent --- .../configurator/agents/test_nfp_service.py | 15 ++---- .../drivers/nfp_service/__init__.py | 0 .../drivers/nfp_service/test_heat_driver.py | 47 +++++++++++++++++++ .../test_data/nfp_service_test_data.py | 1 - 4 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py create mode 100644 gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py index 8a6051ee5f..ea6d745daf 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py @@ -13,16 +13,11 @@ import mock import unittest -from oslo_config import cfg -from oslo_log import log as logging - from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( nfp_service_test_data as fo) from gbpservice.nfp.configurator.agents import nfp_service as ns from gbpservice.nfp.configurator.lib import nfp_service_constants as const -LOG = logging.getLogger(__name__) - class NfpServiceRpcManagerTestCase(unittest.TestCase): """ Implement test cases for RPC manager methods of nfp service agent. @@ -129,9 +124,9 @@ def _test_handle_event(self, ev, result=const.UNHANDLED_RESULT): driver = mock.Mock() with mock.patch.object( - driver, 'run_heat', return_value=result) as mock_config_inte, \ - mock.patch.object( - agent, '_get_driver', return_value=driver): + driver, 'run_heat', return_value=result) as mock_config_inte, ( + mock.patch.object( + agent, '_get_driver', return_value=driver)): agent.handle_event(ev) @@ -177,9 +172,9 @@ def test_create_nfp_service_handle_event_key_error(self): agent, sc = self._get_NfpServiceEventHandler_object() driver = mock.Mock() - with mock.patch.object(driver, 'run_heat'), \ + with mock.patch.object(driver, 'run_heat'), ( mock.patch.object( - agent, '_get_driver', return_value=driver): + agent, '_get_driver', return_value=driver)): with self.assertRaises(KeyError): agent.handle_event(ev) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py new file mode 100644 index 0000000000..6142897d76 --- /dev/null +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py @@ -0,0 +1,47 @@ +# 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 unittest + +from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( + nfp_service_test_data as fo) +from gbpservice.nfp.configurator.drivers.nfp_service.heat.heat_driver import ( + HeatDriver) +from gbpservice.nfp.configurator.lib import nfp_service_constants as const + + +class NfpServiceHeatDriverTestCase(unittest.TestCase): + """ Implements test cases for driver methods + of nfp service. + + """ + + def __init__(self, *args, **kwargs): + super(NfpServiceHeatDriverTestCase, self).__init__(*args, **kwargs) + self.fo = fo.FakeObjects() + + def test_configure_interfaces(self): + """ Implements test case for nfp service heat driver. + + Returns: none + + """ + + driver = HeatDriver(self.fo.conf) + actual_val = driver.run_heat(self.fo.context, self.fo.kwargs) + + expected_val = const.UNHANDLED_RESULT + self.assertEqual(actual_val, expected_val) + + +if __name__ == '__main__': + unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py index 7691fe12f0..42a0b0e19c 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py @@ -31,7 +31,6 @@ class FakeEventNfpService(object): """ def __init__(self): - fo = FakeObjects() self.data = { 'context': { 'resource': 'heat', From 7c395526e97feeb4ebbb22662f6b0cfc7aedb68e Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Fri, 15 Jul 2016 12:10:12 +0530 Subject: [PATCH 055/157] Fixed hard coded /opt/stack/ path --- devstack/lib/nfp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 31317a20a2..713b55512f 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -432,7 +432,7 @@ function namespace_create { # copy_nfp_files_and_start_process() - Setup configuration and start processes function copy_nfp_files_and_start_process { - cd /opt/stack/gbp/gbpservice/nfp + cd $NFPSERVICE_DIR/gbpservice/nfp sudo cp -r bin/nfp /usr/bin/ sudo chmod +x /usr/bin/nfp sudo rm -rf /etc/nfp_* @@ -453,7 +453,7 @@ function copy_nfp_files_and_start_process { sudo sed -i "s/rest_server_address=*.*/rest_server_address=$configurator_ip/g" /etc/nfp_proxy.ini sudo sed -i "s/rest_server_port= *.*/rest_server_port=$configurator_port/g" /etc/nfp_proxy.ini - sed -i 's#source.*#source '$DEVSTACK_DIR'/openrc demo demo#g' /opt/stack/gbp/devstack/exercises/nfp_service/*.sh + sed -i 's#source.*#source '$DEVSTACK_DIR'/openrc demo demo#g' $NFPSERVICE_DIR/devstack/exercises/nfp_service/*.sh source $DEVSTACK_DIR/functions-common echo "Starting nfp_orchestrator under screen named nfp_orchestrator" @@ -475,7 +475,7 @@ function copy_nfp_files_and_start_process { cd pecan/api sudo python setup.py develop echo "Starting nfp_base_configurator under screen named nfp_base_configurator" - run_process nfp_base_configurator "cd /opt/stack/gbp/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" + run_process nfp_base_configurator "cd $NFPSERVICE_DIR/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" fi sleep 1 From 65dd419d0adb41e947a747344afdc2b23858732c Mon Sep 17 00:00:00 2001 From: Dhuldev-Valekar Date: Fri, 15 Jul 2016 12:19:15 +0530 Subject: [PATCH 056/157] Corrected syntax error --- devstack/lib/nfp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 31317a20a2..e938ab32c2 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -95,7 +95,7 @@ function create_ext_net { --shared\ $EXT_NET_NAME - neutron subnet-create + neutron subnet-create\ --ip_version 4\ --gateway $EXT_NET_GATEWAY\ --name $EXT_NET_SUBNET_NAME\ @@ -269,7 +269,7 @@ function create_nfp_image { if [[ $VyosQcow2Image = build ]]; then echo "Building Image: $VyosQcow2ImageName" cur_dir=$PWD - cd $DISK_IMAGE_DIR/diskimage-create/vyos/ + cd $DISKIMAGE_CREATE_DIR/vyos/ sudo python vyos_image_create.py vyos_conf.json cd $cur_dir VyosQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) From ca4685b7fc4ee9e5d78b6a2c29a30d153a1bf984 Mon Sep 17 00:00:00 2001 From: Dhuldev-Valekar Date: Fri, 15 Jul 2016 12:23:47 +0530 Subject: [PATCH 057/157] Corrected log file path --- devstack/lib/nfp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index bef9100ae8..1f3c357ac2 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -457,11 +457,11 @@ function copy_nfp_files_and_start_process { source $DEVSTACK_DIR/functions-common echo "Starting nfp_orchestrator under screen named nfp_orchestrator" - run_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file /opt/stack/logs/nfp_orchestrator.log" + run_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log" sleep 4 echo "Starting nfp_proxy_agent under screen named nfp_proxy_agent" - run_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file /opt/stack/logs/nfp_proxy_agent.log" + run_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log" sleep 4 echo "Starting nfp_proxy inside namespace named nfp-proxy, under screen named nfp_proxy" @@ -470,7 +470,7 @@ function copy_nfp_files_and_start_process { if [[ $NFP_DEVSTACK_MODE = advanced ]]; then echo "Starting nfp_config_orchestrator under screen named nfp_config_orchestrator" - run_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file /opt/stack/logs/nfp_config_orchestrator.log" + run_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file $DEST/logs/nfp_config_orchestrator.log" else cd pecan/api sudo python setup.py develop From 5c0ddd0d21a3270b1807f2c58548d2f05f82342e Mon Sep 17 00:00:00 2001 From: pkharat Date: Fri, 15 Jul 2016 14:41:37 +0530 Subject: [PATCH 058/157] Synced gerrit LB unit test code with mitaka_21_march_base branch --- .../nfp/configurator/agents/test_lb_agent.py | 9 +- .../api/v1/controllers/test_controller.py | 35 ------ .../drivers/loadbalancer/test_lb_driver.py | 29 +++-- .../configurator/test_data/lb_test_data.py | 110 ++++++++++++------ 4 files changed, 94 insertions(+), 89 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py index 0868c614c4..8b73baa734 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py @@ -16,8 +16,6 @@ from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( lb_test_data as test_data) from gbpservice.nfp.configurator.agents import loadbalancer_v1 as lb -from gbpservice.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( - haproxy_lb_driver as lb_driver) from gbpservice.nfp.configurator.lib import constants as const from gbpservice.nfp.configurator.lib import demuxer from gbpservice.nfp.configurator.modules import configurator @@ -399,7 +397,7 @@ def __init__(self, *args, **kwargs): super(LBaasEventHandlerTestCase, self).__init__(*args, **kwargs) self.fo = test_data.FakeObjects() self.ev = test_data.FakeEvent() - self.drivers = {'loadbalancer': lb_driver.HaproxyOnVmDriver()} + self.drivers = {'loadbalancer': mock.Mock()} def _get_lb_handler_objects(self, sc, drivers, rpcmgr): """ Retrieves EventHandler object of loadbalancer agent. @@ -427,7 +425,7 @@ def _test_handle_event(self, sc, rpcmgr): """ agent = self._get_lb_handler_objects(sc, self.drivers, rpcmgr) - driver = lb_driver.HaproxyOnVmDriver() + driver = self.drivers['loadbalancer'] with mock.patch.object(agent, '_get_driver', return_value=driver), \ mock.patch.object( @@ -437,8 +435,7 @@ def _test_handle_event(self, sc, rpcmgr): mock.patch.object( driver, 'update_vip') as mock_update_vip,\ mock.patch.object( - self.drivers['loadbalancer'], 'create_pool') as ( - mock_create_pool),\ + driver, 'create_pool') as mock_create_pool,\ mock.patch.object( driver, 'delete_pool') as mock_delete_pool,\ mock.patch.object( diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py b/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py index 2d5b178a1c..44b6d99d21 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py @@ -172,41 +172,6 @@ def test_put_update_network_function_config(self): 'update_network_function_config', self.data) self.assertEqual(response.status_code, 200) - def test_call(self): - """Tests call function of RPCClient. - - Returns: none - - """ - rpcclient = controller.RPCClient('topic_name') - with mock.patch.object( - rpcclient.client, 'call') as rpc_mock,\ - mock.patch.object( - rpcclient.client, 'prepare') as ( - prepare_mock): - prepare_mock.return_value = rpcclient.client - rpc_mock.return_value = True - value = rpcclient.call('rpc_method_name') - self.assertTrue(value) - - def test_cast(self): - """Tests cast function of RPCClient. - - Returns: none - - """ - rpcclient = controller.RPCClient('topic_name') - with mock.patch.object( - rpcclient.client, 'cast') as rpc_mock,\ - mock.patch.object( - rpcclient.client, 'prepare') as ( - prepare_mock): - prepare_mock.return_value = rpcclient.client - rpc_mock.return_value = True - value = rpcclient.cast('rpc_method_name', - jsonutils.dumps(self.data)) - self.assertTrue(value) - def test_post_create_network_function_device_config_fail(self): """Tests failure case of HTTP post request create_network_function_device_config diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py index 2babe9b638..012d26716d 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py @@ -20,7 +20,7 @@ haproxy_lb_driver as lb_driver) from gbpservice.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( haproxy_rest_client as _rest_client) - +from oslo_serialization import jsonutils """ Implement test cases for loadbalancer driver. @@ -115,9 +115,10 @@ def _test_lbaasdriver(self, method_name): url=self.data.delete_vip_url) elif method_name == 'CREATE_VIP': driver.create_vip(self.fo.vip, self.fo.context) + data = jsonutils.dumps(self.data.create_vip_data) mock_request.assert_called_with( 'POST', - data=self.data.create_vip_data, + data=data, headers=self.data.header, timeout=30, url=self.data.create_vip_url) @@ -128,9 +129,10 @@ def _test_lbaasdriver(self, method_name): self.fo.old_vip, self.fo.vip, self.fo.context) + data = jsonutils.dumps(self.data.update_vip_data) mock_request.assert_called_with( 'PUT', - data=self.data.update_vip_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.update_vip_url) @@ -143,25 +145,28 @@ def _test_lbaasdriver(self, method_name): self.fo.old_pool, self.fo.pool, self.fo.context) + data = jsonutils.dumps(self.data.update_pool_data) mock_request.assert_called_with( 'PUT', - data=self.data.update_pool_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.update_pool_url) elif method_name == 'CREATE_MEMBER': driver.create_member(self.fo.member[0], self.fo.context) + data = jsonutils.dumps(self.data.create_member_data) mock_request.assert_called_with( 'PUT', - data=self.data.create_member_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.create_member_url) elif method_name == 'DELETE_MEMBER': driver.delete_member(self.fo.member[0], self.fo.context) + data = jsonutils.dumps(self.data.delete_member_data) mock_request.assert_called_with( 'PUT', - data=self.data.delete_member_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.delete_member_url) @@ -170,9 +175,10 @@ def _test_lbaasdriver(self, method_name): self.fo.old_member[0], self.fo.member[0], self.fo.context) + data = jsonutils.dumps(self.data.update_member_data) mock_request.assert_called_with( 'PUT', - data=self.data.update_member_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.update_member_url) @@ -180,9 +186,10 @@ def _test_lbaasdriver(self, method_name): driver.create_pool_health_monitor( self.fo.hm[0], self.fo._get_pool_object()[0]['id'], self.fo.context) + data = jsonutils.dumps(self.data.create_hm_data) mock_request.assert_called_with( 'PUT', - data=self.data.create_hm_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.create_hm_url) @@ -190,9 +197,10 @@ def _test_lbaasdriver(self, method_name): driver.delete_pool_health_monitor( self.fo.hm[0], self.fo._get_pool_object()[0]['id'], self.fo.context) + data = jsonutils.dumps(self.data.delete_hm_data) mock_request.assert_called_with( 'PUT', - data=self.data.delete_hm_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.delete_hm_url) @@ -201,9 +209,10 @@ def _test_lbaasdriver(self, method_name): self.fo.old_hm[0], self.fo.hm[0], self.fo._get_pool_object()[0]['id'], self.fo.context) + data = jsonutils.dumps(self.data.update_hm_data) mock_request.assert_called_with( 'PUT', - data=self.data.update_hm_data, + data=data, headers=self.data.header, timeout=self.data.timeout, url=self.data.update_hm_url) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/lb_test_data.py b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/lb_test_data.py index 69c2b5617f..49f261e158 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/lb_test_data.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/lb_test_data.py @@ -419,7 +419,9 @@ def __init__(self): self.data = { 'context': {'notification_data': {}, 'resource': 'context_resource', - 'agent_info': {'service_vendor': '' + 'agent_info': {'service_vendor': '', + 'context': {}, + 'resource': '' } }, 'vip': fo._get_vip_object()[0], @@ -453,58 +455,90 @@ class AssertionData(object): timeout = 30 delete_vip_url = ('http://192.168.100.149:1234/backend/' 'bck:6350c0fd-07f8-46ff-b797-62acd23760de') - create_vip_data = ('{"frnt:7a755739-1bbb-4211-9130-b6c82d9169a5": {' - '"provider_interface_mac": "aa:bb:cc:dd:ee:ff", ' - '"bind": "42.0.0.14:22", ' - '"default_backend": ' - '"bck:6350c0fd-07f8-46ff-b797-62acd23760de", ' - '"option": {"tcplog": true}, ' - '"mode": "tcp"}}') + + create_vip_data = {"frnt:7a755739-1bbb-4211-9130-b6c82d9169a5": + {"option": {"tcplog": True}, + "bind": "42.0.0.14:22", + "mode": "tcp", + "default_backend": + "bck:6350c0fd-07f8-46ff-b797-62acd23760de", + "provider_interface_mac": "aa:bb:cc:dd:ee:ff" + } + } + create_vip_url = 'http://192.168.100.149:1234/frontend' create_vip_resources = 'backend/bck:6350c0fd-07f8-46ff-b797-62acd23760de' - update_vip_data = ('{"provider_interface_mac": "aa:bb:cc:dd:ee:ff", ' - '"bind": "42.0.0.14:22", ' - '"default_backend": ' - '"bck:6350c0fd-07f8-46ff-b797-62acd23760de", ' - '"option": {"tcplog": true}, ' - '"mode": "tcp"}') + + update_vip_data = {"option": {"tcplog": True}, + "bind": "42.0.0.14:22", + "mode": "tcp", + "default_backend": + "bck:6350c0fd-07f8-46ff-b797-62acd23760de", + "provider_interface_mac": "aa:bb:cc:dd:ee:ff" + } + update_vip_url = ('http://192.168.100.149:1234/frontend/frnt:' '7a755739-1bbb-4211-9130-b6c82d9169a5') - update_pool_data = ('{"server": ' - '{"srvr:4910851f-4af7-4592-ad04-08b508c6fa21": ' - '["42.0.0.11:80", "weight 1", ' - '"check inter 10s fall 3"]}, "balance": "roundrobin", ' - '"mode": "tcp", "timeout": {"check": "10s"}, ' - '"option": {}}') + + update_pool_data = {"mode": "tcp", + "balance": "roundrobin", + "option": {}, + "timeout": {"check": "10s"}, + "server": { + "srvr:4910851f-4af7-4592-ad04-08b508c6fa21": + ["42.0.0.11:80", "weight 1", + "check inter 10s fall 3"] + }, + } + update_pool_url = ('http://192.168.100.149:1234/backend/bck:' '6350c0fd-07f8-46ff-b797-62acd23760de') - create_member_data = ('{"timeout": {}, "server": ' - '{"srvr:4910851f-4af7-4592-ad04-08b508c6fa21": ' - '["42.0.0.11:80", "weight 1", ' - '"check inter 10s fall 3"], "resource": []}}') + + create_member_data = {"timeout": {}, + "server": + { + "srvr:4910851f-4af7-4592-ad04-08b508c6fa21": + ["42.0.0.11:80", "weight 1", + "check inter 10s fall 3"], + "resource": [] + } + } create_member_url = ('http://192.168.100.149:1234/backend/bck:' '6350c0fd-07f8-46ff-b797-62acd23760de') - delete_member_data = '{"timeout": {}, "server": {"resource": []}}' + + delete_member_data = {"timeout": {}, + "server": {"resource": []} + } + delete_member_url = ('http://192.168.100.149:1234/backend/bck:' '6350c0fd-07f8-46ff-b797-62acd23760de') - update_member_data = ('{"timeout": {}, "server": ' - '{"srvr:4910851f-4af7-4592-ad04-08b508c6fa21": ' - '["42.0.0.11:80", "weight 1", ' - '"check inter 10s fall 3"], "resource": []}}') + + update_member_data = create_member_data update_member_url = ('http://192.168.100.149:1234/backend/bck:' '6350c0fd-07f8-46ff-b797-62acd23760de') - create_hm_data = ('{"timeout": {"check": "10s"}, "server": ' - '{"srvr:4910851f-4af7-4592-ad04-08b508c6fa21": [], ' - '"resource": []}}') + + create_hm_data = {"timeout": {"check": "10s"}, + "server": + { + "srvr:4910851f-4af7-4592-ad04-08b508c6fa21": [], + "resource": [] + } + } + create_hm_url = ('http://192.168.100.149:1234/backend/bck:' '6350c0fd-07f8-46ff-b797-62acd23760de') - delete_hm_data = ('{"timeout": {}, "server": {"srvr:' - '4910851f-4af7-4592-ad04-08b508c6fa21": [], ' - '"resource": []}}') + + delete_hm_data = {"timeout": {}, + "server": + { + "srvr:4910851f-4af7-4592-ad04-08b508c6fa21": [], + "resource": [] + } + } + delete_hm_url = ('http://192.168.100.149:1234/backend/bck:' '6350c0fd-07f8-46ff-b797-62acd23760de') - update_hm_data = ('{"timeout": {"check": "10s"}, "server": ' - '{"srvr:4910851f-4af7-4592-ad04-08b508c6fa21": [], ' - '"resource": []}}') + + update_hm_data = create_hm_data update_hm_url = ('http://192.168.100.149:1234/backend/bck:' '6350c0fd-07f8-46ff-b797-62acd23760de') From 7113fa15a2087b4e70157f74b24ef27886cba7c0 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 15 Jul 2016 14:48:35 +0530 Subject: [PATCH 059/157] removed generailzed REST API from base driver --- .../nfp/configurator/agents/test_firewall.py | 80 ++++++------ .../agents/test_generic_config.py | 115 ++++++++---------- .../drivers/firewall/test_vyos_fw_driver.py | 115 +++++++++++++----- .../configurator/test_data/fw_test_data.py | 55 ++++++--- .../configurator/drivers/base/base_driver.py | 54 +++++--- .../drivers/firewall/vyos/vyos_fw_driver.py | 9 +- 6 files changed, 253 insertions(+), 175 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py index b779de1b3d..6dd7a20997 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py @@ -14,24 +14,19 @@ import unittest from oslo_config import cfg -from oslo_log import log as logging from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) from gbpservice.nfp.configurator.agents import firewall as fw -from gbpservice.nfp.configurator.drivers.firewall.vyos import ( - vyos_fw_driver as fw_dvr) +from gbpservice.nfp.configurator.lib import constants as const +from gbpservice.nfp.configurator.lib import fw_constants as fw_const -LOG = logging.getLogger(__name__) -STATUS_ACTIVE = "ACTIVE" - -""" Implements test cases for RPC manager methods of firewall agent. - -""" +class FWaasRpcManagerTestCase(unittest.TestCase): + """ Implements test cases for RPC manager methods of firewall agent. + """ -class FWaasRpcManagerTestCase(unittest.TestCase): def __init__(self, *args, **kwargs): super(FWaasRpcManagerTestCase, self).__init__(*args, **kwargs) self.fo = fo.FakeObjects() @@ -65,8 +60,8 @@ def _test_event_creation(self, method): 'firewall': self.fo.firewall, 'host': self.fo.host} with mock.patch.object(sc, 'new_event', return_value='foo') as ( - mock_sc_event), \ - mock.patch.object(sc, 'post_event') as mock_sc_rpc_event: + mock_sc_event), ( + mock.patch.object(sc, 'post_event')) as mock_sc_rpc_event: call_method = getattr(agent, method.lower()) call_method(context, self.fo.firewall, self.fo.host) @@ -82,7 +77,7 @@ def test_create_firewall_fwaasrpcmanager(self): """ - self._test_event_creation('CREATE_FIREWALL') + self._test_event_creation(fw_const.FIREWALL_CREATE_EVENT) def test_update_firewall_fwaasrpcmanager(self): """ Implements test case for update firewall method @@ -92,7 +87,7 @@ def test_update_firewall_fwaasrpcmanager(self): """ - self._test_event_creation('UPDATE_FIREWALL') + self._test_event_creation(fw_const.FIREWALL_UPDATE_EVENT) def test_delete_firewall_fwaasrpcmanager(self): """ Implements test case for delete firewall method @@ -102,15 +97,15 @@ def test_delete_firewall_fwaasrpcmanager(self): """ - self._test_event_creation('DELETE_FIREWALL') + self._test_event_creation(fw_const.FIREWALL_DELETE_EVENT) -""" Implements test cases for event handler methods -of firewall agent. -""" +class FwaasHandlerTestCase(unittest.TestCase): + """ Implements test cases for event handler methods + of firewall agent. + """ -class FwaasHandlerTestCase(unittest.TestCase): def __init__(self, *args, **kwargs): super(FwaasHandlerTestCase, self).__init__(*args, **kwargs) self.fo = fo.FakeObjects() @@ -148,23 +143,24 @@ def _test_handle_event(self, rule_list_info=True): """ agent = self._get_FwHandler_objects() - with mock.patch.object(cfg, 'CONF') as mock_cfg: - mock_cfg.configure_mock(rest_timeout='30', host='foo') - driver = fw_dvr.FwaasDriver(mock_cfg) + driver = mock.Mock() with mock.patch.object( agent.plugin_rpc, 'set_firewall_status') as ( - mock_set_fw_status), \ + mock_set_fw_status), ( mock.patch.object( - agent.plugin_rpc, 'firewall_deleted') as (mock_fw_deleted), \ + agent.plugin_rpc, 'firewall_deleted')) as (mock_fw_deleted), ( mock.patch.object( - driver, 'create_firewall') as mock_create_fw, \ + driver, fw_const.FIREWALL_CREATE_EVENT.lower())) as ( + mock_create_fw), ( mock.patch.object( - driver, 'update_firewall') as mock_update_fw, \ + driver, fw_const.FIREWALL_UPDATE_EVENT.lower())) as ( + mock_update_fw), ( mock.patch.object( - driver, 'delete_firewall') as mock_delete_fw, \ + driver, fw_const.FIREWALL_DELETE_EVENT.lower())) as ( + mock_delete_fw), ( mock.patch.object( - agent, '_get_driver', return_value=driver): + agent, '_get_driver', return_value=driver)): firewall = self.fo._fake_firewall_obj() if not rule_list_info: @@ -182,27 +178,27 @@ def _test_handle_event(self, rule_list_info=True): if 'service_info' in self.fo.context: self.fo.context.pop('service_info') if not rule_list_info: - if self.ev.id == 'CREATE_FIREWALL': + if self.ev.id == fw_const.FIREWALL_CREATE_EVENT: mock_set_fw_status.assert_called_with( agent_info, - firewall['id'], STATUS_ACTIVE, firewall) - elif self.ev.id == 'UPDATE_FIREWALL': + firewall['id'], const.STATUS_ACTIVE, firewall) + elif self.ev.id == fw_const.FIREWALL_UPDATE_EVENT: mock_set_fw_status.assert_called_with( agent_info, - STATUS_ACTIVE, firewall) - elif self.ev.id == 'DELETE_FIREWALL': + const.STATUS_ACTIVE, firewall) + elif self.ev.id == fw_const.FIREWALL_DELETE_EVENT: mock_fw_deleted.assert_called_with( agent_info, firewall['id'], firewall) else: - if self.ev.id == 'CREATE_FIREWALL': + if self.ev.id == fw_const.FIREWALL_CREATE_EVENT: mock_create_fw.assert_called_with( context, firewall, self.fo.host) - elif self.ev.id == 'UPDATE_FIREWALL': + elif self.ev.id == fw_const.FIREWALL_UPDATE_EVENT: mock_update_fw.assert_called_with( context, firewall, self.fo.host) - elif self.ev.id == 'DELETE_FIREWALL': + elif self.ev.id == fw_const.FIREWALL_DELETE_EVENT: mock_delete_fw.assert_called_with( context, firewall, self.fo.host) @@ -215,7 +211,7 @@ def test_create_firewall_with_rule_list_info_true(self): """ - self.ev.id = 'CREATE_FIREWALL' + self.ev.id = fw_const.FIREWALL_CREATE_EVENT self._test_handle_event() def test_update_firewall_with_rule_list_info_true(self): @@ -226,7 +222,7 @@ def test_update_firewall_with_rule_list_info_true(self): """ - self.ev.id = 'UPDATE_FIREWALL' + self.ev.id = fw_const.FIREWALL_UPDATE_EVENT self._test_handle_event() def test_delete_firewall_with_rule_list_info_true(self): @@ -237,7 +233,7 @@ def test_delete_firewall_with_rule_list_info_true(self): """ - self.ev.id = 'DELETE_FIREWALL' + self.ev.id = fw_const.FIREWALL_DELETE_EVENT self._test_handle_event() def test_create_firewall_with_rule_list_info_false(self): @@ -248,7 +244,7 @@ def test_create_firewall_with_rule_list_info_false(self): """ - self.ev.id = 'CREATE_FIREWALL' + self.ev.id = fw_const.FIREWALL_CREATE_EVENT self._test_handle_event(False) def test_update_firewall_with_rule_list_info_false(self): @@ -259,7 +255,7 @@ def test_update_firewall_with_rule_list_info_false(self): """ - self.ev.id = 'UPDATE_FIREWALL' + self.ev.id = fw_const.FIREWALL_UPDATE_EVENT self._test_handle_event(False) def test_delete_firewall_with_rule_list_info_false(self): @@ -270,7 +266,7 @@ def test_delete_firewall_with_rule_list_info_false(self): """ - self.ev.id = 'DELETE_FIREWALL' + self.ev.id = fw_const.FIREWALL_DELETE_EVENT self._test_handle_event(False) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py index 34d5935f3f..a4ae0f4e08 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py @@ -14,28 +14,17 @@ import subprocess import unittest -from oslo_config import cfg -from oslo_log import log as logging - from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) from gbpservice.nfp.configurator.agents import generic_config as gc -from gbpservice.nfp.configurator.drivers.firewall.vyos import ( - vyos_fw_driver as fw_dvr) from gbpservice.nfp.configurator.lib import ( - generic_config_constants as gen_cfg_const) - -LOG = logging.getLogger(__name__) - -STATUS_ACTIVE = "ACTIVE" - -""" Implement test cases for RPC manager methods of generic config agent. - -""" + generic_config_constants as const) class GenericConfigRpcManagerTestCase(unittest.TestCase): - ''' Generic Config RPC receiver for Firewall module ''' + """ Implement test cases for RPC manager methods of generic config agent. + + """ def __init__(self, *args, **kwargs): super(GenericConfigRpcManagerTestCase, self).__init__( @@ -73,8 +62,8 @@ def _test_event_creation(self, method): arg_dict = {'context': self.fo.context, 'resource_data': self.fo.kwargs} with mock.patch.object( - sc, 'new_event', return_value='foo') as mock_sc_event, \ - mock.patch.object(sc, 'post_event') as mock_sc_rpc_event: + sc, 'new_event', return_value='foo') as mock_sc_event, ( + mock.patch.object(sc, 'post_event')) as mock_sc_rpc_event: call_method = getattr(agent, method.lower()) call_method(self.fo.context, self.fo.kwargs) @@ -96,7 +85,7 @@ def test_configure_interfaces_genericconfigrpcmanager(self): """ - self._test_event_creation('CONFIGURE_INTERFACES') + self._test_event_creation(const.EVENT_CONFIGURE_INTERFACES) def test_clear_interfaces_genericconfigrpcmanager(self): """ Implements test case for clear interfaces method @@ -106,7 +95,7 @@ def test_clear_interfaces_genericconfigrpcmanager(self): """ - self._test_event_creation('CLEAR_INTERFACES') + self._test_event_creation(const.EVENT_CLEAR_INTERFACES) def test_configure_routes_genericconfigrpcmanager(self): """ Implements test case for configure routes method @@ -116,7 +105,7 @@ def test_configure_routes_genericconfigrpcmanager(self): """ - self._test_event_creation('CONFIGURE_ROUTES') + self._test_event_creation(const.EVENT_CONFIGURE_ROUTES) def test_clear_routes_genericconfigrpcmanager(self): """ Implements test case for clear routes method @@ -126,7 +115,7 @@ def test_clear_routes_genericconfigrpcmanager(self): """ - self._test_event_creation('CLEAR_ROUTES') + self._test_event_creation(const.EVENT_CLEAR_ROUTES) def test_configure_hm_genericconfigrpcmanager(self): """ Implements test case for configure healthmonitor method @@ -136,7 +125,7 @@ def test_configure_hm_genericconfigrpcmanager(self): """ - self._test_event_creation('CONFIGURE_HEALTHMONITOR') + self._test_event_creation(const.EVENT_CONFIGURE_HEALTHMONITOR) def test_clear_hm_genericconfigrpcmanager(self): """ Implements test case for clear healthmonitor method @@ -146,15 +135,15 @@ def test_clear_hm_genericconfigrpcmanager(self): """ - self._test_event_creation('CLEAR_HEALTHMONITOR') + self._test_event_creation(const.EVENT_CLEAR_HEALTHMONITOR) -""" Implements test cases for event handler methods -of generic config agent. -""" +class GenericConfigEventHandlerTestCase(unittest.TestCase): + """ Implements test cases for event handler methods + of generic config agent. + """ -class GenericConfigEventHandlerTestCase(unittest.TestCase): def __init__(self, *args, **kwargs): super(GenericConfigEventHandlerTestCase, self).__init__( *args, **kwargs) @@ -192,50 +181,53 @@ def _test_handle_event(self, ev): """ agent, sc = self._get_GenericConfigEventHandler_object() - with mock.patch.object(cfg, 'CONF') as mock_cfg: - mock_cfg.configure_mock(rest_timeout='30', host='foo') - driver = fw_dvr.FwaasDriver(mock_cfg) + driver = mock.Mock() with mock.patch.object( - driver, 'configure_interfaces') as mock_config_inte, \ + driver, const.EVENT_CONFIGURE_INTERFACES.lower()) as ( + mock_config_inte), ( mock.patch.object( - driver, 'clear_interfaces') as mock_clear_inte, \ + driver, const.EVENT_CLEAR_INTERFACES.lower())) as ( + mock_clear_inte), ( mock.patch.object( - driver, 'configure_routes') as mock_config_src_routes, \ + driver, const.EVENT_CONFIGURE_ROUTES.lower())) as ( + mock_config_src_routes), ( mock.patch.object( - driver, 'clear_routes') as mock_delete_src_routes, \ + driver, const.EVENT_CLEAR_ROUTES.lower())) as ( + mock_delete_src_routes), ( mock.patch.object( - sc, 'poll_event') as mock_hm_poll_event, \ + sc, 'poll_event')) as mock_hm_poll_event, ( mock.patch.object( - driver, 'configure_healthmonitor', return_value='SUCCESS'), \ + driver, const.EVENT_CONFIGURE_HEALTHMONITOR.lower(), + return_value='SUCCESS')), ( mock.patch.object( - agent, '_get_driver', return_value=driver): + agent, '_get_driver', return_value=driver)): - if 'CONFIGURE_HEALTHMONITOR' in ev.id: + if const.EVENT_CONFIGURE_HEALTHMONITOR in ev.id: ev.id, periodicity = ev.id.split() agent.handle_event(ev) resource_data = self.fo._fake_resource_data() - if ev.id == 'CONFIGURE_INTERFACES': + if ev.id == const.EVENT_CONFIGURE_INTERFACES: mock_config_inte.assert_called_with( self.fo.context, resource_data) - elif ev.id == 'CLEAR_INTERFACES': + elif ev.id == const.EVENT_CLEAR_INTERFACES: mock_clear_inte.assert_called_with( self.fo.context, resource_data) - elif ev.id == 'CONFIGURE_ROUTES': + elif ev.id == const.EVENT_CONFIGURE_ROUTES: mock_config_src_routes.assert_called_with( self.fo.context, resource_data) - elif ev.id == 'CLEAR_ROUTES': + elif ev.id == const.EVENT_CLEAR_ROUTES: mock_delete_src_routes.assert_called_with( self.fo.context, resource_data) - elif 'CONFIGURE_HEALTHMONITOR' in ev.id: - if periodicity == gen_cfg_const.INITIAL_HM_RETRIES: + elif const.EVENT_CONFIGURE_HEALTHMONITOR in ev.id: + if periodicity == const.INITIAL_HM_RETRIES: mock_hm_poll_event.assert_called_with( - ev, max_times=gen_cfg_const.INITIAL_HM_RETRIES) - elif periodicity == gen_cfg_const.FOREVER: + ev, max_times=const.INITIAL_HM_RETRIES) + elif periodicity == const.FOREVER: mock_hm_poll_event.assert_called_with(ev) - elif ev.id == 'CLEAR_HEALTHMONITOR': + elif ev.id == const.EVENT_CLEAR_HEALTHMONITOR: pass def _test_handle_periodic_event(self, ev): @@ -250,15 +242,14 @@ def _test_handle_periodic_event(self, ev): """ agent, sc = self._get_GenericConfigEventHandler_object() - with mock.patch.object(cfg, 'CONF') as mock_cfg: - mock_cfg.configure_mock(rest_timeout='30', host='foo') - driver = fw_dvr.FwaasDriver(mock_cfg) + driver = mock.Mock() + with mock.patch.object( - agent, '_get_driver', return_value=driver), \ - mock.patch.object( - driver, 'configure_healthmonitor', - return_value='SUCCESS'), \ - mock.patch.object(subprocess, 'check_output', return_value=True): + agent, '_get_driver', return_value=driver), ( + mock.patch.object( + driver, const.EVENT_CONFIGURE_HEALTHMONITOR.lower(), + return_value='SUCCESS')), ( + mock.patch.object(subprocess, 'check_output', return_value=True)): agent.handle_configure_healthmonitor(ev) @@ -271,7 +262,7 @@ def test_configure_interfaces_genericconfigeventhandler(self): """ ev = fo.FakeEventGenericConfig() - ev.id = 'CONFIGURE_INTERFACES' + ev.id = const.EVENT_CONFIGURE_INTERFACES self._test_handle_event(ev) def test_clear_interfaces_genericconfigeventhandler(self): @@ -283,7 +274,7 @@ def test_clear_interfaces_genericconfigeventhandler(self): """ ev = fo.FakeEventGenericConfig() - ev.id = 'CLEAR_INTERFACES' + ev.id = const.EVENT_CLEAR_INTERFACES self._test_handle_event(ev) def test_configure_routes_genericconfigeventhandler(self): @@ -295,7 +286,7 @@ def test_configure_routes_genericconfigeventhandler(self): """ ev = fo.FakeEventGenericConfig() - ev.id = 'CONFIGURE_ROUTES' + ev.id = const.EVENT_CONFIGURE_ROUTES self._test_handle_event(ev) def test_clear_routes_genericconfigeventhandler(self): @@ -307,7 +298,7 @@ def test_clear_routes_genericconfigeventhandler(self): """ ev = fo.FakeEventGenericConfig() - ev.id = 'CLEAR_ROUTES' + ev.id = const.EVENT_CLEAR_ROUTES self._test_handle_event(ev) def test_configure_hm_initial_genericconfigeventhandler(self): @@ -331,7 +322,7 @@ def test_configure_hm_forever_genericconfigeventhandler(self): """ ev = fo.FakeEventGenericConfig() - ev.data['resource_data'].update({'periodicity': gen_cfg_const.FOREVER}) + ev.data['resource_data'].update({'periodicity': const.FOREVER}) ev.id = 'CONFIGURE_HEALTHMONITOR forever' self._test_handle_event(ev) @@ -344,7 +335,7 @@ def test_clear_hm_genericconfigeventhandler(self): """ ev = fo.FakeEventGenericConfig() - ev.id = 'CLEAR_HEALTHMONITOR' + ev.id = const.EVENT_CLEAR_HEALTHMONITOR self._test_handle_event(ev) def test_handle_configure_healthmonitor_genericconfigeventhandler(self): @@ -356,7 +347,7 @@ def test_handle_configure_healthmonitor_genericconfigeventhandler(self): """ ev = fo.FakeEventGenericConfig() - ev.id = 'CONFIGURE_HEALTHMONITOR' + ev.id = const.EVENT_CONFIGURE_HEALTHMONITOR self._test_handle_periodic_event(ev) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index c4554f46fe..4cd906ea25 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -21,17 +21,14 @@ fw_test_data as fo) from gbpservice.nfp.configurator.drivers.firewall.vyos import ( vyos_fw_driver as fw_dvr) - - -STATUS_ACTIVE = "ACTIVE" - -""" Implements test cases for driver methods -of generic config. - -""" +from gbpservice.nfp.configurator.lib import constants as const class FwGenericConfigDriverTestCase(unittest.TestCase): + """ Implements test cases for driver methods + of generic config. + + """ def __init__(self, *args, **kwargs): super(FwGenericConfigDriverTestCase, self).__init__(*args, **kwargs) @@ -43,8 +40,49 @@ def __init__(self, *args, **kwargs): self.fake_resp_dict = {'status': True} self.kwargs = self.fo._fake_resource_data() + def test_configure_log_forward(self): + """ Implements test case for configure log forward method + of generic config driver. + + Returns: none + + """ + + with mock.patch.object( + requests, 'post', return_value=self.resp) as mock_post, ( + mock.patch.object( + self.resp, 'json', return_value=self.fake_resp_dict)): + self.driver.configure_interfaces(self.fo.context, self.kwargs) + + data = jsonutils.dumps(self.fo.log_forward_data()) + mock_post.assert_called_with(self.fo.url_for_log_forward, + data=data, + timeout=self.fo.timeout) + + def test_configure_static_ip(self): + """ Implements test case for configure log forward method + of generic config driver. + + Returns: none + + """ + + with mock.patch.object( + requests, 'post', return_value=self.resp) as mock_post, ( + mock.patch.object( + self.resp, 'json', return_value=self.fake_resp_dict)), ( + mock.patch.object( + self.driver, '_configure_log_forwarding', + return_value=const.STATUS_SUCCESS)): + self.driver.configure_interfaces(self.fo.context, self.kwargs) + + data = jsonutils.dumps(self.fo.static_ip_data()) + mock_post.assert_called_with(self.fo.url_for_add_static_ip, + data=data, + timeout=self.fo.timeout) + def test_configure_interfaces(self): - """ Implements test case for configure interfaces method + """ Implements test case for configure log forward method of generic config driver. Returns: none @@ -52,13 +90,20 @@ def test_configure_interfaces(self): """ with mock.patch.object( - requests, 'post', return_value=self.resp) as mock_post, \ + requests, 'post', return_value=self.resp) as mock_post, ( + mock.patch.object( + self.resp, 'json', return_value=self.fake_resp_dict)), ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.driver, '_configure_log_forwarding', + return_value=const.STATUS_SUCCESS)), ( + mock.patch.object( + self.driver, '_configure_static_ips', + return_value=const.STATUS_SUCCESS)): self.driver.configure_interfaces(self.fo.context, self.kwargs) + data = jsonutils.dumps(self.fo.data_for_interface) mock_post.assert_called_with(self.fo.url_for_add_inte, - self.fo.data_for_interface, + data=data, timeout=self.fo.timeout) def test_clear_interfaces(self): @@ -71,14 +116,15 @@ def test_clear_interfaces(self): self.resp = mock.Mock(status_code=200) with mock.patch.object( - requests, 'delete', return_value=self.resp) as mock_delete, \ + requests, 'delete', return_value=self.resp) as mock_delete, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.clear_interfaces(self.fo.context, self.kwargs) + data = jsonutils.dumps(self.fo.data_for_interface) mock_delete.assert_called_with( self.fo.url_for_del_inte, - data=self.fo.data_for_interface, + data=data, timeout=self.fo.timeout) def test_configure_source_routes(self): @@ -90,14 +136,17 @@ def test_configure_source_routes(self): """ with mock.patch.object( - requests, 'post', return_value=self.resp) as mock_post, \ + requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.configure_routes( self.fo.context, self.kwargs) + data = list() + data.append(self.fo.data_for_add_src_route) + data = jsonutils.dumps(data) mock_post.assert_called_with(self.fo.url_for_add_src_route, - data=self.fo.data_for_add_src_route, + data=data, timeout=self.fo.timeout) def test_delete_source_routes(self): @@ -109,24 +158,26 @@ def test_delete_source_routes(self): """ with mock.patch.object( - requests, 'delete', return_value=self.resp) as mock_delete, \ + requests, 'delete', return_value=self.resp) as mock_delete, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.clear_routes( self.fo.context, self.kwargs) + data = list() + data.append(self.fo.data_for_del_src_route) + data = jsonutils.dumps(data) mock_delete.assert_called_with( self.fo.url_for_del_src_route, - data=self.fo.data_for_del_src_route, + data=data, timeout=self.fo.timeout) -""" Implements test cases for driver methods -of firewall. - -""" - class FwaasDriverTestCase(unittest.TestCase): + """ Implements test cases for driver methods + of firewall. + + """ def __init__(self, *args, **kwargs): super(FwaasDriverTestCase, self).__init__(*args, **kwargs) @@ -150,9 +201,9 @@ def test_create_firewall_fwaasdriver(self): """ with mock.patch.object( - requests, 'post', return_value=self.resp) as mock_post, \ + requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.resp, 'json', return_value=self.fake_resp_dict)): mock_post.configure_mock(status_code=200) self.driver.create_firewall(self.fo.context, self.fo.firewall, self.fo.host) @@ -182,9 +233,9 @@ def test_update_firewall_fwaasdriver(self): """ with mock.patch.object( - requests, 'put', return_value=self.resp) as mock_put, \ + requests, 'put', return_value=self.resp) as mock_put, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.update_firewall(self.fo.context, self.fo.firewall, self.fo.host) mock_put.assert_called_with(self.fo.url_for_update_fw, @@ -213,9 +264,9 @@ def test_delete_firewall_fwaasdriver(self): """ with mock.patch.object( - requests, 'delete', return_value=self.resp) as mock_delete, \ + requests, 'delete', return_value=self.resp) as mock_delete, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.delete_firewall(self.fo.context, self.fo.firewall, self.fo.host) mock_delete.assert_called_with(self.fo.url_for_delete_fw, diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py index 507ba1f688..886134d419 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py @@ -24,7 +24,8 @@ class FakeObjects(object): 'agent_info': { 'resource': 'firewall', 'service_vendor': 'vyos', - 'context': {'requester': 'device_orch'}, + 'context': {'requester': 'device_orch', + 'logging_context': {}}, 'resource_type': 'firewall'}, 'notification_data': {}, 'service_info': {}, 'resource': 'firewall'} @@ -41,6 +42,8 @@ class FakeObjects(object): gateway_ip = '1.2.3.4' provider_interface_position = 'provider_interface_position' url = 'http://172.24.4.5:8888' + url_for_log_forward = "%s/configure-rsyslog-as-client" % url + url_for_add_static_ip = "%s/add_static_ip" % url url_for_add_inte = "%s/add_rule" % url url_for_del_inte = "%s/delete_rule" % url url_for_add_src_route = "%s/add-source-route" % url @@ -48,15 +51,27 @@ class FakeObjects(object): url_for_config_fw = "%s/configure-firewall-rule" % url url_for_update_fw = "%s/update-firewall-rule" % url url_for_delete_fw = "%s/delete-firewall-rule" % url - data = ('{"stitching_mac": "00:0a:95:9d:68:16",' - '"provider_mac": "00:0a:95:9d:68:16"}') - data_for_interface = ('{"stitching_mac": "00:0a:95:9d:68:16",' - ' "provider_mac": "00:0a:95:9d:68:16"}') - data_for_add_src_route = ('[{"source_cidr": "1.2.3.4/24", ' - '"gateway_ip": "1.2.3.4"}]') - data_for_del_src_route = '[{"source_cidr": "1.2.3.4/24"}]' + data_for_interface = dict(provider_mac="00:0a:95:9d:68:16", + stitching_mac="00:0a:95:9d:68:16") + data_for_add_src_route = {'source_cidr': "1.2.3.4/24", + 'gateway_ip': "1.2.3.4"} + data_for_del_src_route = {'source_cidr': '1.2.3.4/24'} timeout = 120 + def log_forward_data(self): + return dict(server_ip={}, server_port={}, log_level={}) + + def static_ip_data(self): + return dict( + provider_ip="11.0.1.1", + provider_cidr="11.0.1.0/24", + provider_mac="00:0a:95:9d:68:16", + stitching_ip="192.168.0.3", + stitching_cidr="192.168.0.0/28", + stitching_mac="00:0a:95:9d:68:16", + provider_interface_position="2", + stitching_interface_position="3") + def fake_request_data_generic_bulk(self): """ A sample bulk request data for generic APIs @@ -70,7 +85,8 @@ def fake_request_data_generic_bulk(self): "service_type": "firewall", "service_vendor": "vyos", "context": { - "requester": "device_orch" + "requester": "device_orch", + "logging_context": {} } }, "config": [{ @@ -127,7 +143,8 @@ def fake_request_data_fw(self): "service_type": "firewall", "service_vendor": "vyos", "context": { - "requester": "device_orch" + "requester": "device_orch", + "logging_context": {} } }, "config": [{ @@ -155,7 +172,8 @@ def fake_sa_req_list_fw(self): "service_vendor": "vyos", "resource": "firewall", "context": { - "requester": "device_orch" + "requester": "device_orch", + "logging_context": {} }, "resource_type": "firewall" }, @@ -204,7 +222,8 @@ def fake_sa_req_list(self): "service_vendor": "vyos", "resource": "interfaces", "context": { - "requester": "device_orch" + "requester": "device_orch", + "logging_context": {} }, "resource_type": "firewall" }, @@ -227,7 +246,8 @@ def fake_sa_req_list(self): "service_vendor": "vyos", "resource": "routes", "context": { - "requester": "device_orch" + "requester": "device_orch", + "logging_context": {} }, "resource_type": "firewall" }, @@ -265,8 +285,8 @@ def _fake_resource_data(self): 'stitching_cidr': '192.168.0.0/28', 'destination_cidr': '192.168.0.0/28', 'stitching_mac': '00:0a:95:9d:68:16', - 'provider_interface_index': 'provider_interface_index', - 'stitching_interface_index': 'stitching_interface_index', + 'provider_interface_index': '2', + 'stitching_interface_index': '3', 'mgmt_ip': '172.24.4.5', 'source_cidrs': ['1.2.3.4/24'], 'gateway_ip': '1.2.3.4' @@ -344,3 +364,8 @@ def __init__(self): 'host': fo.host, 'resource_data': kwargs} self.id = 'dummy' + + +class FakeEventGetNotifications(object): + def __init__(self): + self.data = {'dummy_data': 'dummy_value'} diff --git a/gbpservice/nfp/configurator/drivers/base/base_driver.py b/gbpservice/nfp/configurator/drivers/base/base_driver.py index 9cb9e69417..2e9041d241 100644 --- a/gbpservice/nfp/configurator/drivers/base/base_driver.py +++ b/gbpservice/nfp/configurator/drivers/base/base_driver.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +import requests import subprocess from oslo_serialization import jsonutils @@ -121,24 +122,37 @@ def _configure_log_forwarding(self, url, mgmt_ip, port): "for service at: %r" % mgmt_ip) LOG.info(msg) - err_msg = ("Log forward POST request to the " - "service at %s failed. " % url) try: - resp = self.rest_api.fire(url, data, const.POST) - except Exception as err: - err_msg += ("Reason: %r" % str(err).capitalize()) - LOG.error(err_msg) - return err_msg - - if resp is const.STATUS_SUCCESS: - msg = ("Log forwarding successfully configured " - "for service at %r." % url) - LOG.info(msg) - return resp - - err_msg += (("Status code: %r, Reason: %r" % - (resp['status'], resp['reason'])) - if type(resp) is dict - else ("Reason: " + resp)) - LOG.error(err_msg) - return err_msg + resp = requests.post(url, data, timeout=self.timeout) + except requests.exceptions.ConnectionError as err: + msg = ("Failed to establish connection to service at: " + "%r for configuring log forwarding. ERROR: %r" % + (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg + except requests.exceptions.RequestException as err: + msg = ("Unexpected ERROR happened while configuring " + "log forwarding for service at: %r. " + "ERROR: %r" % + (mgmt_ip, str(err).capitalize())) + LOG.error(msg) + return msg + + try: + result = resp.json() + except ValueError as err: + msg = ("Unable to parse response of configure log forward API, " + "invalid JSON. URL: %r. %r" % (url, str(err).capitalize())) + LOG.error(msg) + return msg + if not result['status']: + msg = ("Error configuring log forwarding for service " + "at %s. URL: %r. Reason: %s." % + (mgmt_ip, url, result['reason'])) + LOG.error(msg) + return msg + + msg = ("Successfully configured log forwarding for " + "service at %s." % mgmt_ip) + LOG.info(msg) + return const.SUCCESS diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index a8a35691e2..7f81893080 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -39,10 +39,11 @@ def __init__(self, timeout): def request_type_to_api_map(self, url, data, request_type): request_api_map = { - 'POST': requests.post(url, data=data, timeout=self.timeout), - 'PUT': requests.put(url, data=data, timeout=self.timeout), - 'DELETE': requests.delete(url, data=data, timeout=self.timeout)} - return request_api_map[request_type] + 'POST': requests.post, + 'PUT': requests.put, + 'DELETE': requests.delete} + return request_api_map[request_type](url, + data=data, timeout=self.timeout) def fire(self, url, data, request_type): """ Invokes REST POST call to the Service VM. From 41f9309770784c480cb9e09621d70cd701090d8f Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 15 Jul 2016 15:49:29 +0530 Subject: [PATCH 060/157] removed generailzed REST API from base driver --- .../drivers/firewall/vyos/vyos_fw_driver.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index 7f81893080..65b8a49f56 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -38,12 +38,8 @@ def __init__(self, timeout): self.timeout = timeout def request_type_to_api_map(self, url, data, request_type): - request_api_map = { - 'POST': requests.post, - 'PUT': requests.put, - 'DELETE': requests.delete} - return request_api_map[request_type](url, - data=data, timeout=self.timeout) + return getattr(requests, request_type)(url, + data=data, timeout=self.timeout) def fire(self, url, data, request_type): """ Invokes REST POST call to the Service VM. @@ -58,7 +54,7 @@ def fire(self, url, data, request_type): try: resp = self.request_type_to_api_map(url, - data, request_type.upper()) + data, request_type.lower()) except requests.exceptions.ConnectionError as err: msg = ("Failed to establish connection to the service at URL: %r. " "ERROR: %r" % (url, str(err).capitalize())) From ab30aa8bedd4cae98db7df99a3727e26027c28d7 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 15 Jul 2016 17:24:45 +0530 Subject: [PATCH 061/157] removed generailzed REST API from base driver --- .../drivers/firewall/test_vyos_fw_driver.py | 15 +++++++++------ .../drivers/firewall/vyos/vyos_fw_driver.py | 7 +++---- gbpservice/nfp/configurator/lib/constants.py | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index 4cd906ea25..9513358f1a 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -37,7 +37,7 @@ def __init__(self, *args, **kwargs): mock_cfg.configure_mock(rest_timeout=120, host='foo') self.driver = fw_dvr.FwaasDriver(mock_cfg) self.resp = mock.Mock() - self.fake_resp_dict = {'status': True} + self.fake_resp_dict = {'status': True, 'reason': 'not found!'} self.kwargs = self.fo._fake_resource_data() def test_configure_log_forward(self): @@ -48,15 +48,17 @@ def test_configure_log_forward(self): """ + resp_data = self.fake_resp_dict + resp_data['status'] = False with mock.patch.object( requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict)): + self.resp, 'json', return_value=resp_data)): self.driver.configure_interfaces(self.fo.context, self.kwargs) data = jsonutils.dumps(self.fo.log_forward_data()) mock_post.assert_called_with(self.fo.url_for_log_forward, - data=data, + data, timeout=self.fo.timeout) def test_configure_static_ip(self): @@ -139,8 +141,8 @@ def test_configure_source_routes(self): requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object( self.resp, 'json', return_value=self.fake_resp_dict)): - self.driver.configure_routes( - self.fo.context, self.kwargs) + + self.driver.configure_routes(self.fo.context, self.kwargs) data = list() data.append(self.fo.data_for_add_src_route) @@ -187,6 +189,7 @@ def __init__(self, *args, **kwargs): self.driver = fw_dvr.FwaasDriver(mock_cfg) self.resp = mock.Mock() self.fake_resp_dict = {'status': True, + 'message': 'something', 'config_success': True, 'delete_success': True} self.fo.firewall = self.fo._fake_firewall_obj() @@ -208,7 +211,7 @@ def test_create_firewall_fwaasdriver(self): self.driver.create_firewall(self.fo.context, self.fo.firewall, self.fo.host) mock_post.assert_called_with(self.fo.url_for_config_fw, - self.firewall, + data=self.firewall, timeout=self.fo.timeout) def test_create_firewall_key_error_fwaasdriver(self): diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index 65b8a49f56..d96591daaf 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -173,9 +173,9 @@ def configure_interfaces(self, context, resource_data): pass elif result_log_forward != common_const.STATUS_SUCCESS: msg = ("Failed to configure log forwarding for service at %s. " - "Error: %s" % (mgmt_ip, err)) + "Error: %s" % (mgmt_ip, result_log_forward)) LOG.error(msg) - return result_log_forward + return msg try: result_static_ips = self._configure_static_ips(resource_data) @@ -610,8 +610,7 @@ def delete_firewall(self, context, firewall, host): LOG.error(err_msg) return common_const.STATUS_SUCCESS else: - err_msg += ("Reason: %r, Response Content: %r" % - (resp.pop('reason'), resp)) + err_msg += ("Response Content: %r" % resp) else: err_msg += ("Reason: " + resp) LOG.error(err_msg) diff --git a/gbpservice/nfp/configurator/lib/constants.py b/gbpservice/nfp/configurator/lib/constants.py index 8c0f337bd1..98b83a5288 100644 --- a/gbpservice/nfp/configurator/lib/constants.py +++ b/gbpservice/nfp/configurator/lib/constants.py @@ -36,7 +36,7 @@ CREATE = 'create' UPDATE = 'update' DELETE = 'delete' -POST = 'POST' +POST = 'post' PUT = 'put' UNHANDLED = "UNHANDLED" From f174b861f8af45d4253621aa33ac20e412fafdd7 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 15 Jul 2016 17:38:44 +0530 Subject: [PATCH 062/157] removed generailzed REST API from base driver --- gbpservice/nfp/configurator/agents/firewall.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gbpservice/nfp/configurator/agents/firewall.py b/gbpservice/nfp/configurator/agents/firewall.py index 8f02468cbb..3bd411db06 100644 --- a/gbpservice/nfp/configurator/agents/firewall.py +++ b/gbpservice/nfp/configurator/agents/firewall.py @@ -277,7 +277,7 @@ def invoke_driver_for_plugin_api(self, ev): try: status = self.method(context, firewall, host) except requests.ConnectionError: - # FIXME It can't be correct everytime + # REVISIT(VIKASH): It can't be correct everytime msg = ("There is a connection error for firewall %r of " "tenant %r. Assuming either there is serious " "issue with VM or data path is completely " @@ -288,7 +288,7 @@ def invoke_driver_for_plugin_api(self, ev): agent_info, firewall['id'], firewall) except Exception as err: - # REVISIT(VIKASH) Is it correct to raise ? As the subsequent + # REVISIT(VIKASH): Is it correct to raise ? As the subsequent # attempt to clean will only re-raise the last one.And it # can go on and on and may not be ever recovered. self.plugin_rpc.set_firewall_status( From d2e82271d0712758bce11b05b785f9179cc7edf6 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 15 Jul 2016 18:09:44 +0530 Subject: [PATCH 063/157] fixed all the testcases and pep8 issues --- .../agents/test_generic_config.py | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py index a4ae0f4e08..617dc85a95 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py @@ -19,6 +19,7 @@ from gbpservice.nfp.configurator.agents import generic_config as gc from gbpservice.nfp.configurator.lib import ( generic_config_constants as const) +from gbpservice.nfp.configurator.lib import constants as common_const class GenericConfigRpcManagerTestCase(unittest.TestCase): @@ -184,22 +185,26 @@ def _test_handle_event(self, ev): driver = mock.Mock() with mock.patch.object( - driver, const.EVENT_CONFIGURE_INTERFACES.lower()) as ( + driver, const.EVENT_CONFIGURE_INTERFACES.lower(), + return_value=common_const.SUCCESS) as ( mock_config_inte), ( mock.patch.object( - driver, const.EVENT_CLEAR_INTERFACES.lower())) as ( + driver, const.EVENT_CLEAR_INTERFACES.lower(), + return_value=common_const.SUCCESS)) as ( mock_clear_inte), ( mock.patch.object( - driver, const.EVENT_CONFIGURE_ROUTES.lower())) as ( + driver, const.EVENT_CONFIGURE_ROUTES.lower(), + return_value=common_const.SUCCESS)) as ( mock_config_src_routes), ( mock.patch.object( - driver, const.EVENT_CLEAR_ROUTES.lower())) as ( + driver, const.EVENT_CLEAR_ROUTES.lower(), + return_value=common_const.SUCCESS)) as ( mock_delete_src_routes), ( mock.patch.object( sc, 'poll_event')) as mock_hm_poll_event, ( mock.patch.object( driver, const.EVENT_CONFIGURE_HEALTHMONITOR.lower(), - return_value='SUCCESS')), ( + return_value=common_const.SUCCESS)), ( mock.patch.object( agent, '_get_driver', return_value=driver)): @@ -227,8 +232,6 @@ def _test_handle_event(self, ev): ev, max_times=const.INITIAL_HM_RETRIES) elif periodicity == const.FOREVER: mock_hm_poll_event.assert_called_with(ev) - elif ev.id == const.EVENT_CLEAR_HEALTHMONITOR: - pass def _test_handle_periodic_event(self, ev): """ Test handle periodic event method of generic config agent @@ -248,7 +251,7 @@ def _test_handle_periodic_event(self, ev): agent, '_get_driver', return_value=driver), ( mock.patch.object( driver, const.EVENT_CONFIGURE_HEALTHMONITOR.lower(), - return_value='SUCCESS')), ( + return_value=common_const.SUCCESS)), ( mock.patch.object(subprocess, 'check_output', return_value=True)): agent.handle_configure_healthmonitor(ev) @@ -326,18 +329,6 @@ def test_configure_hm_forever_genericconfigeventhandler(self): ev.id = 'CONFIGURE_HEALTHMONITOR forever' self._test_handle_event(ev) - def test_clear_hm_genericconfigeventhandler(self): - """ Implements test case for clear health monitor method - of generic config event handler. - - Returns: none - - """ - - ev = fo.FakeEventGenericConfig() - ev.id = const.EVENT_CLEAR_HEALTHMONITOR - self._test_handle_event(ev) - def test_handle_configure_healthmonitor_genericconfigeventhandler(self): """ Implements test case for handle configure health monitor method of generic config event handler. From f1192efa80d4f38f047abf018d67138b1817676f Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 15 Jul 2016 20:03:16 +0530 Subject: [PATCH 064/157] removed assertRaises test cases --- .../nfp/configurator/agents/test_firewall.py | 10 ++-- .../agents/test_generic_config.py | 11 ++--- .../configurator/agents/test_nfp_service.py | 33 ++----------- .../drivers/firewall/test_vyos_fw_driver.py | 49 ++----------------- .../drivers/nfp_service/test_heat_driver.py | 8 +-- 5 files changed, 16 insertions(+), 95 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py index 6dd7a20997..8414f88919 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py @@ -11,8 +11,8 @@ # under the License. import mock -import unittest +from neutron.tests import base from oslo_config import cfg from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( @@ -22,7 +22,7 @@ from gbpservice.nfp.configurator.lib import fw_constants as fw_const -class FWaasRpcManagerTestCase(unittest.TestCase): +class FWaasRpcManagerTestCase(base.BaseTestCase): """ Implements test cases for RPC manager methods of firewall agent. """ @@ -100,7 +100,7 @@ def test_delete_firewall_fwaasrpcmanager(self): self._test_event_creation(fw_const.FIREWALL_DELETE_EVENT) -class FwaasHandlerTestCase(unittest.TestCase): +class FwaasHandlerTestCase(base.BaseTestCase): """ Implements test cases for event handler methods of firewall agent. @@ -268,7 +268,3 @@ def test_delete_firewall_with_rule_list_info_false(self): self.ev.id = fw_const.FIREWALL_DELETE_EVENT self._test_handle_event(False) - - -if __name__ == '__main__': - unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py index 617dc85a95..b6c3625167 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py @@ -12,7 +12,8 @@ import mock import subprocess -import unittest + +from neutron.tests import base from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) @@ -22,7 +23,7 @@ from gbpservice.nfp.configurator.lib import constants as common_const -class GenericConfigRpcManagerTestCase(unittest.TestCase): +class GenericConfigRpcManagerTestCase(base.BaseTestCase): """ Implement test cases for RPC manager methods of generic config agent. """ @@ -139,7 +140,7 @@ def test_clear_hm_genericconfigrpcmanager(self): self._test_event_creation(const.EVENT_CLEAR_HEALTHMONITOR) -class GenericConfigEventHandlerTestCase(unittest.TestCase): +class GenericConfigEventHandlerTestCase(base.BaseTestCase): """ Implements test cases for event handler methods of generic config agent. @@ -340,7 +341,3 @@ def test_handle_configure_healthmonitor_genericconfigeventhandler(self): ev = fo.FakeEventGenericConfig() ev.id = const.EVENT_CONFIGURE_HEALTHMONITOR self._test_handle_periodic_event(ev) - - -if __name__ == '__main__': - unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py index ea6d745daf..1c146a0cb5 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py @@ -11,7 +11,8 @@ # under the License. import mock -import unittest + +from neutron.tests import base from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( nfp_service_test_data as fo) @@ -19,7 +20,7 @@ from gbpservice.nfp.configurator.lib import nfp_service_constants as const -class NfpServiceRpcManagerTestCase(unittest.TestCase): +class NfpServiceRpcManagerTestCase(base.BaseTestCase): """ Implement test cases for RPC manager methods of nfp service agent. """ @@ -80,7 +81,7 @@ def test_nfp_service_rpcmanager(self): self._test_event_creation(const.CREATE_NFP_SERVICE_EVENT) -class NfpServiceEventHandlerTestCase(unittest.TestCase): +class NfpServiceEventHandlerTestCase(base.BaseTestCase): """ Implements test cases for event handler methods of nfp service agent. @@ -156,29 +157,3 @@ def test_create_nfp_service_handle_event_failure(self): ev = fo.FakeEventNfpService() ev.id = const.CREATE_NFP_SERVICE_EVENT self._test_handle_event(ev, const.FAILURE) - - def test_create_nfp_service_handle_event_key_error(self): - """ Implements key error test case for create_nfp_service method - of nfp service event handler. - - Returns: none - - """ - - ev = fo.FakeEventNfpService() - ev.id = const.CREATE_NFP_SERVICE_EVENT - ev.data['context'].pop('service_vendor') - - agent, sc = self._get_NfpServiceEventHandler_object() - driver = mock.Mock() - - with mock.patch.object(driver, 'run_heat'), ( - mock.patch.object( - agent, '_get_driver', return_value=driver)): - - with self.assertRaises(KeyError): - agent.handle_event(ev) - - -if __name__ == '__main__': - unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index 9513358f1a..9702fab05a 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -12,8 +12,8 @@ import mock import requests -import unittest +from neutron.tests import base from oslo_config import cfg from oslo_serialization import jsonutils @@ -24,7 +24,7 @@ from gbpservice.nfp.configurator.lib import constants as const -class FwGenericConfigDriverTestCase(unittest.TestCase): +class FwGenericConfigDriverTestCase(base.BaseTestCase): """ Implements test cases for driver methods of generic config. @@ -175,7 +175,7 @@ def test_delete_source_routes(self): timeout=self.fo.timeout) -class FwaasDriverTestCase(unittest.TestCase): +class FwaasDriverTestCase(base.BaseTestCase): """ Implements test cases for driver methods of firewall. @@ -214,19 +214,6 @@ def test_create_firewall_fwaasdriver(self): data=self.firewall, timeout=self.fo.timeout) - def test_create_firewall_key_error_fwaasdriver(self): - """ Implements test case for catching key error in - create firewall method of firewall's drivers. - - Returns: none - - """ - - self.fo.firewall.pop('description') - with self.assertRaises(KeyError): - self.driver.create_firewall(self.fo.context, - self.fo.firewall, self.fo.host) - def test_update_firewall_fwaasdriver(self): """ Implements test case for update firewall method of firewall's drivers. @@ -245,19 +232,6 @@ def test_update_firewall_fwaasdriver(self): data=self.firewall, timeout=self.fo.timeout) - def test_update_firewall_key_error_fwaasdriver(self): - """ Implements test case for catching key error in - update firewall method of firewall's drivers. - - Returns: none - - """ - - self.fo.firewall.pop('description') - with self.assertRaises(KeyError): - self.driver.update_firewall(self.fo.context, - self.fo.firewall, self.fo.host) - def test_delete_firewall_fwaasdriver(self): """ Implements test case for delete firewall method of firewall's drivers. @@ -275,20 +249,3 @@ def test_delete_firewall_fwaasdriver(self): mock_delete.assert_called_with(self.fo.url_for_delete_fw, data=self.firewall, timeout=self.fo.timeout) - - def test_delete_firewall_key_error_fwaasdriver(self): - """ Implements test case for catching key error in - delete firewall method of firewall's drivers. - - Returns: none - - """ - - self.fo.firewall.pop('description') - with self.assertRaises(KeyError): - self.driver.delete_firewall(self.fo.context, - self.fo.firewall, self.fo.host) - - -if __name__ == '__main__': - unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py index 6142897d76..1501286933 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -import unittest +from neutron.tests import base from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( nfp_service_test_data as fo) @@ -19,7 +19,7 @@ from gbpservice.nfp.configurator.lib import nfp_service_constants as const -class NfpServiceHeatDriverTestCase(unittest.TestCase): +class NfpServiceHeatDriverTestCase(base.BaseTestCase): """ Implements test cases for driver methods of nfp service. @@ -41,7 +41,3 @@ def test_configure_interfaces(self): expected_val = const.UNHANDLED_RESULT self.assertEqual(actual_val, expected_val) - - -if __name__ == '__main__': - unittest.main() From 6d4159ef42914003d376f67e0a6d8c3b67efe2d0 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Fri, 15 Jul 2016 23:09:02 +0530 Subject: [PATCH 065/157] addressed the pep8 and code coverage --- .../nfp/configurator/agents/test_vpn_agent.py | 71 ++++++-- .../drivers/vpn/{vyos => }/test_vpn_driver.py | 166 +++++++----------- .../configurator/drivers/vpn/vyos/__init__.py | 0 .../configurator/test_data/vpn_test_data.py | 7 +- gbpservice/nfp/configurator/agents/vpn.py | 8 +- .../drivers/vpn/vyos/vyos_vpn_driver.py | 37 ++-- .../nfp/configurator/lib/data_filter.py | 1 + 7 files changed, 142 insertions(+), 148 deletions(-) rename gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/{vyos => }/test_vpn_driver.py (78%) delete mode 100644 gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/vyos/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py index 4861abb8c4..74295b9377 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py @@ -11,28 +11,52 @@ # under the License. -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import \ - vpn_test_data +import mock + +from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( + vpn_test_data) from gbpservice.nfp.configurator.agents import vpn -from gbpservice.nfp.configurator.drivers.vpn.vyos import vyos_vpn_driver +from gbpservice.nfp.configurator.lib import vpn_constants as const -import mock -import unittest +from neutron.tests import base + + +class VPNaasRpcManagerTestCase(base.BaseTestCase): + ''' + Implements test cases for RPC manager methods of vpn agent + ''' + def __init__(self, *args, **kwargs): + super(VPNaasRpcManagerTestCase, self).__init__(*args, **kwargs) + self.dict_obj = vpn_test_data.VPNTestData() + self.conf = self.dict_obj.conf + self.sc = mock.Mock() + self.rpcmgr = vpn.VPNaasRpcManager(self.conf, self.sc) -""" -Implements test cases for RPC manager methods of vpn agent -""" + def test_vpnservice_updated(self): + resource_data = self.dict_obj._create_ipsec_site_conn_obj() + with mock.patch.object(self.sc, 'new_event', + return_value='foo'), ( + mock.patch.object(self.sc, 'post_event')) as mock_post_event: + self.rpcmgr.vpnservice_updated( + self.dict_obj.make_service_context(), + resource_data=resource_data) + mock_post_event.assert_called_with('foo') -class VPNaasEventHandlerTestCase(unittest.TestCase): +class VPNaasEventHandlerTestCase(base.BaseTestCase): + ''' + Implements test cases for RPC manager methods of vpn agent + ''' def __init__(self, *args, **kwargs): super(VPNaasEventHandlerTestCase, self).__init__(*args, **kwargs) - self.conf = 'conf' self.dict_obj = vpn_test_data.VPNTestData() + self.sc = self.dict_obj.sc + self.conf = self.dict_obj.conf self.handler = vpn.VPNaasEventHandler(self.dict_obj.sc, self.dict_obj.drivers) self.ev = vpn_test_data.FakeEvent() - self.driver = vyos_vpn_driver.VpnaasIpsecDriver(self.conf) + self.rpc_sender = vpn.VpnaasRpcSender(self.sc) + self.driver = mock.Mock() def test_handle_event(self): ''' @@ -42,13 +66,28 @@ def test_handle_event(self): ''' with mock.patch.object(self.handler, '_get_driver', - return_value=self.dict_obj.drivers),\ - mock.patch.object(self.driver, 'vpnservice_updated') as ( - mock_vpnservice_updated): + return_value=self.dict_obj.drivers), ( + mock.patch.object( + self.driver, + 'vpnservice_updated')) as mock_vpnservice_updated: self.handler._vpnservice_updated(self.ev, self.driver) mock_vpnservice_updated.assert_called_with(self.ev.data['context'], self.ev.data[ 'resource_data']) -if __name__ == '__main__': - unittest.main() + def test_sync(self): + ''' + Test to handle the vpn service status like ACTIVE, ERROR + after the configurations. + + ''' + with mock.patch.object(self.handler, + '_get_driver', + return_value=self.driver), ( + mock.patch.object(self.rpc_sender, + 'get_vpn_servicecontext')), ( + mock.patch.object(self.driver, + 'check_status', + return_value=const.STATE_ACTIVE)): + + self.assertEqual(self.handler.sync(self.ev), {'poll': False}) \ No newline at end of file diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/vyos/test_vpn_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py similarity index 78% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/vyos/test_vpn_driver.py rename to gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py index 9c5ff098eb..7d52d05386 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/vyos/test_vpn_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py @@ -11,15 +11,16 @@ # under the License. import requests -import unittest -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import \ - vpn_test_data +from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( + vpn_test_data) from gbpservice.nfp.configurator.agents import vpn from gbpservice.nfp.configurator.drivers.base import base_driver from gbpservice.nfp.configurator.drivers.vpn.vyos import vyos_vpn_driver from oslo_serialization import jsonutils +from neutron.tests import base + import json import mock @@ -29,15 +30,13 @@ 'agent', vpn.VpnaasRpcSender(vpn_test_data.VPNTestData().sc)) -""" Implements test cases for driver methods -of vpn. - - -""" - -class VpnaasIpsecDriverTestCase(unittest.TestCase): +class VpnaasIpsecDriverTestCase(base.BaseTestCase): + ''' + Implements test cases for driver methods + of vpn. + ''' def __init__(self, *args, **kwargs): super(VpnaasIpsecDriverTestCase, self).__init__(*args, **kwargs) self.conf = 'conf' @@ -74,14 +73,13 @@ def test_create_ipsec_site_conn(self): context = self.dict_objects.make_service_context() kwargs = self.dict_objects.make_resource_data(operation='create', service_type='ipsec') - with mock.patch.object(bdobj.agent, 'update_status') as ( - mock_update_status),\ - mock.patch.object(jsonutils, 'loads') as mock_resp,\ - mock.patch.object(self.driver.agent, 'get_vpn_servicecontext', - return_value=[ - self.dict_objects.svc_context]),\ - mock.patch.object(requests, 'post') as ( - mock_post): + with mock.patch.object( + bdobj.agent, 'update_status') as mock_update_status, ( + mock.patch.object(jsonutils, 'loads')) as mock_resp, ( + mock.patch.object(requests, 'post')) as mock_post, ( + mock.patch.object( + self.driver.agent, 'get_vpn_servicecontext', + return_value=[self.dict_objects.svc_context])): mock_resp.return_value = self.fake_resp_dict mock_post.return_value = self.resp self.driver.vpnservice_updated(context, kwargs) @@ -94,6 +92,9 @@ def test_create_ipsec_site_conn(self): context, self.dict_objects.ipsec_vpnsvc_status) + def _dict_to_query_str(self, args): + return '&'.join([str(k) + '=' + str(v) for k, v in args.iteritems()]) + def test_delete_ipsec_site_conn(self): ''' Implements method to test the vpn driver's create ipsec site conn @@ -102,9 +103,9 @@ def test_delete_ipsec_site_conn(self): self.resp = mock.Mock(status_code=200) kwargs = self.dict_objects.make_resource_data(operation='delete', service_type='ipsec') - with mock.patch.object(self.plugin_rpc, 'ipsec_site_conn_deleted'),\ - mock.patch.object(json, 'loads') as mock_resp,\ - mock.patch.object(requests, 'delete') as ( + with mock.patch.object(self.plugin_rpc, 'ipsec_site_conn_deleted'), ( + mock.patch.object(json, 'loads')) as mock_resp, ( + mock.patch.object(requests, 'delete')) as ( mock_delete): mock_resp.return_value = self.fake_resp_dict mock_delete.return_value = self.resp @@ -114,10 +115,14 @@ def test_delete_ipsec_site_conn(self): tokens = svc_desc.split(';') cidr = tokens[1].split('=')[1] - url = "?local_cidr=" + cidr + "&peer_address=" + ( - resource['peer_address'] + ( - "&peer_cidrs=[u\'" + resource['peer_cidrs'][0] + "\']")) - url = self.dict_objects.url_delete_ipsec_tunnel + url + tunnel = {} + tunnel['peer_address'] = resource['peer_address'] + tunnel['local_cidr'] = cidr + tunnel['peer_cidrs'] = resource['peer_cidrs'] + + url = (self.dict_objects.url_delete_ipsec_tunnel + '?' + + self._dict_to_query_str(tunnel)) + mock_delete.assert_called_with( url.encode('ascii', 'ignore'), timeout=self.dict_objects.timeout, @@ -130,22 +135,21 @@ def test_check_status(self): self.resp = mock.Mock(status_code=200) svc_context = self.dict_objects.svc_context - with mock.patch.object(self.plugin_rpc, 'update_status'),\ - mock.patch.object(self.resp, 'json') as mock_json,\ - mock.patch.object(requests, 'get') as mock_get: + with mock.patch.object(self.plugin_rpc, 'update_status'), ( + mock.patch.object(self.resp, 'json')) as mock_json, ( + mock.patch.object(requests, 'get')) as mock_get: mock_get.return_value = self.resp mock_json.return_value = {'state': 'DOWN'} state = self.driver.check_status(self.context, svc_context) self.assertEqual(state, None) -""" Implements test cases for driver methods -of generic config. - -""" +class VpnGenericConfigDriverTestCase(base.BaseTestCase): + ''' + Implements test cases for driver methods + of generic config. -class VpnGenericConfigDriverTestCase(unittest.TestCase): - + ''' def __init__(self, *args, **kwargs): super(VpnGenericConfigDriverTestCase, self).__init__(*args, **kwargs) self.conf = 'conf' @@ -159,24 +163,27 @@ def __init__(self, *args, **kwargs): self.kwargs = self.dict_objects.fake_resource_data() def setUp(self): + super(VpnGenericConfigDriverTestCase, self).setUp() self.resp = mock.Mock(status_code=200) def tearDown(self): + super(VpnGenericConfigDriverTestCase, self).tearDown() self.resp = mock.Mock(status_code=200) def test_configure_interfaces(self): - """ Implements test case for configure interfaces method + ''' + Implements test case for configure interfaces method of generic config driver. Returns: none - """ + ''' with mock.patch.object( - requests, 'post', return_value=self.resp) as mock_post, \ + requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object(self.resp, 'json', - return_value=self.fake_resp_dict): + return_value=self.fake_resp_dict)): self.driver.configure_interfaces(self.dict_objects.context_device, self.kwargs) @@ -187,18 +194,19 @@ def test_configure_interfaces(self): timeout=self.dict_objects.timeout) def test_clear_interfaces(self): - """ Implements test case for clear interfaces method + ''' + Implements test case for clear interfaces method of generic config driver. Returns: none - """ + ''' self.resp = mock.Mock(status_code=200) with mock.patch.object( - requests, 'delete', return_value=self.resp) as mock_delete, \ + requests, 'delete', return_value=self.resp) as mock_delete, ( mock.patch.object( - self.resp, 'json', return_value=self.fake_resp_dict): + self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.clear_interfaces(self.dict_objects.context_device, self.kwargs) @@ -209,17 +217,18 @@ def test_clear_interfaces(self): timeout=self.dict_objects.timeout) def test_configure_source_routes(self): - """ Implements test case for configure routes method + ''' + Implements test case for configure routes method of generic config driver. Returns: none - """ + ''' with mock.patch.object( - requests, 'post', return_value=self.resp) as mock_post, \ + requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object(jsonutils, 'loads', - return_value=self.fake_resp_dict): + return_value=self.fake_resp_dict)): self.driver.configure_routes(self.dict_objects.context_device, self.kwargs) @@ -230,16 +239,17 @@ def test_configure_source_routes(self): timeout=self.dict_objects.timeout) def test_delete_source_routes(self): - """ Implements test case for clear routes method + ''' + Implements test case for clear routes method of generic config driver. Returns: none - """ + ''' - with mock.patch.object(requests, 'post', return_value=self.resp), \ + with mock.patch.object(requests, 'post', return_value=self.resp), ( mock.patch.object( - requests, 'delete', return_value=self.resp) as mock_delete: + requests, 'delete', return_value=self.resp)) as mock_delete: self.driver.clear_routes( self.dict_objects.context_device, self.kwargs) @@ -250,7 +260,7 @@ def test_delete_source_routes(self): timeout=self.dict_objects.timeout) -class VPNSvcValidatorTestCase(unittest.TestCase): +class VPNSvcValidatorTestCase(base.BaseTestCase): def __init__(self, *args, **kwargs): super(VPNSvcValidatorTestCase, self).__init__(*args, **kwargs) @@ -293,8 +303,7 @@ def test_validate_error(self): self.dict_objects.vpn_vpnsvc_active) -class RestApiTestCase(unittest.TestCase): - +class RestApiTestCase(base.BaseTestCase): ''' Class which implements the testcases to test the vpn RestApi calls. ''' @@ -321,34 +330,15 @@ def test_post_success(self): self.resp = mock.Mock(status_code=200) self.fake_resp_dict.update({'status': True}) with mock.patch.object(requests, 'post', return_value=self.resp) as ( - mock_post),\ + mock_post), ( mock.patch.object(jsonutils, 'loads', - return_value=self.fake_resp_dict): + return_value=self.fake_resp_dict)): self.rest_obj.post('create-ipsec-site-conn', self.data) mock_post.assert_called_with( self.dict_objects.url_create_ipsec_conn, data=self.j_data, timeout=self.timeout) - def test_post_fail(self): - ''' - Implements testcase for vpn drivers post method to test in - fail condition while making call to the service VM - ''' - - self.resp = mock.Mock(status_code=404) - self.fake_resp_dict.update({'status': False}) - with mock.patch.object(requests, 'post', return_value=self.resp) as ( - mock_post),\ - mock.patch.object(jsonutils, 'loads', - return_value=self.fake_resp_dict): - with self.assertRaises(requests.exceptions.HTTPError): - self.rest_obj.post('create-ipsec-site-conn', self.data) - mock_post.assert_called_with( - self.dict_objects.url_create_ipsec_conn, - data=self.j_data, - timeout=self.timeout) - def test_put_success(self): ''' Implements testcase for vpn drivers put method to test in @@ -388,9 +378,9 @@ def test_delete_success(self): self.resp = mock.Mock(status_code=200) self.fake_resp_dict.update({'status': True}) with mock.patch.object(requests, 'delete', return_value=self.resp) as ( - mock_delete),\ + mock_delete), ( mock.patch.object(jsonutils, 'loads', - return_value=self.fake_resp_dict): + return_value=self.fake_resp_dict)): self.rest_obj.delete('delete-ipsec-site-conn', self.args, self.data) @@ -399,27 +389,6 @@ def test_delete_success(self): timeout=self.timeout, data=self.j_data) - def test_delete_fail(self): - ''' - Implements testcase for vpn drivers delete method to test in - fail condition while making call to the service VM - ''' - - self.resp = mock.Mock(status_code=404) - self.fake_resp_dict.update({'status': False}) - with mock.patch.object(requests, 'delete', return_value=self.resp) as ( - mock_delete),\ - mock.patch.object(jsonutils, 'loads', - return_value=self.fake_resp_dict): - with self.assertRaises(requests.exceptions.HTTPError): - self.rest_obj.delete('delete-ipsec-site-conn', - self.args, - self.data) - mock_delete.assert_called_with( - self.dict_objects.url_delete_ipsec_conn, - timeout=self.timeout, - data=self.j_data) - def test_get_success(self): ''' Implements testcase for vpn drivers get methode to test in @@ -449,6 +418,3 @@ def test_get_fail(self): self.dict_objects.url_create_ipsec_tunnel, params=self.data, timeout=self.timeout) - -if __name__ == '__main__': - unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/vyos/__init__.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/vyos/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/vpn_test_data.py b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/vpn_test_data.py index 0723997441..4f5dd20119 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/vpn_test_data.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/vpn_test_data.py @@ -13,7 +13,6 @@ """ Implements fake objects for assertion. """ -import json class VPNTestData(object): @@ -27,6 +26,7 @@ def __init__(self): self.context_device = {'notification_data': {}, 'resource': 'interfaces'} self.sc = 'sc' + self.conf = 'conf' self.msg = 'msg' self.drivers = 'drivers' self.svc = {' ': ' '} @@ -528,9 +528,10 @@ def make_resource_data(self, operation=None, service_type=None): return self._create_vpnservice_obj() def fake_resource_data(self): - """ A sample keyword arguments for configurator + ''' + A sample keyword arguments for configurator Returns: resource_data - """ + ''' resource_data = {'service_type': 'vpn', 'vm_mgmt_ip': '192.168.20.75', 'mgmt_ip': '192.168.20.75', diff --git a/gbpservice/nfp/configurator/agents/vpn.py b/gbpservice/nfp/configurator/agents/vpn.py index 6b9e6b302f..0d33024369 100644 --- a/gbpservice/nfp/configurator/agents/vpn.py +++ b/gbpservice/nfp/configurator/agents/vpn.py @@ -18,10 +18,10 @@ from gbpservice.nfp.configurator.lib import data_filter from gbpservice.nfp.configurator.lib import utils from gbpservice.nfp.configurator.lib import vpn_constants as const -from gbpservice.nfp.core import controller as main from gbpservice.nfp.core.event import Event -from gbpservice.nfp.core import module as nfp_api + from gbpservice.nfp.core import log as nfp_logging +from gbpservice.nfp.core import module as nfp_api import oslo_messaging as messaging @@ -317,9 +317,9 @@ def events_init(sc, drivers): """ evs = [ Event(id='VPNSERVICE_UPDATED', - handler=VPNaasEventHandler(sc, drivers)), + handler=VPNaasEventHandler(sc, drivers)), Event(id='VPN_SYNC', - handler=VPNaasEventHandler(sc, drivers))] + handler=VPNaasEventHandler(sc, drivers))] sc.register_events(evs) diff --git a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py b/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py index 5a28cf0801..0be715cd78 100644 --- a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py +++ b/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py @@ -37,8 +37,8 @@ class InvalidRsrcType(Exception): class ResourceErrorState(Exception): - message = "Resource '%(name)s' : '%(id)s' \ - went to error state, %(message)" + message = ("Resource '%(name)s' : '%(id)s' " + "went to error state, %(message)") class RestApi(object): @@ -589,10 +589,6 @@ def configure_routes(self, context, resource_data): source_cidrs = resource_data.get('source_cidrs') gateway_ip = resource_data.get('gateway_ip') - # REVISIT(VK): This was all along bad way, don't know why at all it - # was done like this. - - # adding stitching gateway route stitching_url = const.request_url % (mgmt_ip, const.CONFIGURATION_SERVER_PORT, 'add-stitching-route') @@ -686,8 +682,6 @@ def clear_routes(self, context, resource_data): LOG.error(msg) return msg - # REVISIT(VK): This was all along bad way, don't know why at all it - # was done like this. active_configured = False url = const.request_url % (mgmt_ip, const.CONFIGURATION_SERVER_PORT, 'delete-source-route') @@ -820,11 +814,8 @@ def _get_ipsec_tunnel_local_cidr_from_vpnsvc(self, vpn_svc): return tunnel_local_cidr def _get_ipsec_tunnel_local_cidr(self, svc_context): - # Provider PTG is local cidr for the tunnel - # - which is passed in svc description as of now - return self.\ - _get_ipsec_tunnel_local_cidr_from_vpnsvc( - svc_context['service']) + return self._get_ipsec_tunnel_local_cidr_from_vpnsvc( + svc_context['service']) def _get_stitching_fixed_ip(self, conn): desc = conn['description'] @@ -881,8 +872,7 @@ def _ipsec_create_conn(self, context, mgmt_fip, conn): svc_context = self.agent.get_vpn_servicecontext( context, self._get_filters(conn_id=conn['id']))[0] - tunnel_local_cidr = self.\ - _get_ipsec_tunnel_local_cidr(svc_context) + tunnel_local_cidr = self._get_ipsec_tunnel_local_cidr(svc_context) conn = svc_context['siteconns'][0]['connection'] svc_context['siteconns'][0]['connection']['stitching_fixed_ip'] = ( self._get_stitching_fixed_ip(conn)) @@ -909,8 +899,7 @@ def _ipsec_create_tunnel(self, context, mgmt_fip, conn): svc_context = self.agent.get_vpn_servicecontext( context, self._get_filters(conn_id=conn['id']))[0] - tunnel_local_cidr = self.\ - _get_ipsec_tunnel_local_cidr(svc_context) + tunnel_local_cidr = self._get_ipsec_tunnel_local_cidr(svc_context) tunnel = {} tunnel['peer_address'] = conn['peer_address'] @@ -1014,8 +1003,7 @@ def _ipsec_delete_tunnel(self, context, mgmt_fip, Returns: None """ - lcidr = self.\ - _get_ipsec_tunnel_local_cidr_from_vpnsvc(conn) + lcidr = self._get_ipsec_tunnel_local_cidr_from_vpnsvc(conn) tunnel = {} tunnel['peer_address'] = conn['peer_address'] @@ -1066,8 +1054,7 @@ def _ipsec_is_state_changed(self, svc_context, conn, fip): """ c_state = None - lcidr = self.\ - _get_ipsec_tunnel_local_cidr(svc_context) + lcidr = self._get_ipsec_tunnel_local_cidr(svc_context) if conn['status'] == const.STATE_INIT: tunnel = { 'peer_address': conn['peer_address'], @@ -1078,11 +1065,11 @@ def _ipsec_is_state_changed(self, svc_context, conn, fip): tunnel) state = output['state'] - if state.upper() == 'UP' and\ - conn['status'] != const.STATE_ACTIVE: + if state.upper() == 'UP' and( + conn['status'] != const.STATE_ACTIVE): c_state = const.STATE_ACTIVE - if state.upper() == 'DOWN' and\ - conn['status'] == const.STATE_ACTIVE: + if state.upper() == 'DOWN' and( + conn['status'] == const.STATE_ACTIVE): c_state = const.STATE_PENDING if c_state: diff --git a/gbpservice/nfp/configurator/lib/data_filter.py b/gbpservice/nfp/configurator/lib/data_filter.py index 3b847d5fef..c58ccfc85e 100644 --- a/gbpservice/nfp/configurator/lib/data_filter.py +++ b/gbpservice/nfp/configurator/lib/data_filter.py @@ -35,6 +35,7 @@ def call(self, context, msg): Returns: data after applying filter on it """ + filters = {} try: for fk, fv in msg['args'].items(): if dict == type(fv): From 2f3ab953c1afeadfd509d9961079dbbb56e3a1fd Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Fri, 15 Jul 2016 23:22:35 +0530 Subject: [PATCH 066/157] addressed pep8 isses --- .../tests/unit/nfp/configurator/agents/test_vpn_agent.py | 3 ++- gbpservice/nfp/configurator/agents/vpn.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py index 74295b9377..4ea9f8bf7c 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py @@ -90,4 +90,5 @@ def test_sync(self): 'check_status', return_value=const.STATE_ACTIVE)): - self.assertEqual(self.handler.sync(self.ev), {'poll': False}) \ No newline at end of file + self.assertEqual(self.handler.sync(self.ev), {'poll': False}) + diff --git a/gbpservice/nfp/configurator/agents/vpn.py b/gbpservice/nfp/configurator/agents/vpn.py index 0d33024369..2dcb6913c4 100644 --- a/gbpservice/nfp/configurator/agents/vpn.py +++ b/gbpservice/nfp/configurator/agents/vpn.py @@ -145,7 +145,7 @@ def __init__(self, conf, sc): """ - super(VPNaasRpcManager, self).__init__(conf, sc) + super(VPNaasRpcManager, self).__init__(sc, conf) def vpnservice_updated(self, context, **resource_data): """Registers the VPNaas plugin events to update the vpn configurations. From 9b8ad2c5eb5fd39f8cae9fc85f788fc3b38aef7f Mon Sep 17 00:00:00 2001 From: pkharat Date: Sat, 16 Jul 2016 13:12:09 +0530 Subject: [PATCH 067/157] Addressed review comments 1) Used '(' instead of '\' 2) Used neutron.tests.base class instead of unittest --- .../nfp/configurator/agents/test_lb_agent.py | 67 +++++++++---------- .../drivers/loadbalancer/test_lb_driver.py | 26 +++---- 2 files changed, 42 insertions(+), 51 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py index 8b73baa734..a8ee850353 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py @@ -11,7 +11,6 @@ # under the License. import mock -import unittest from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( lb_test_data as test_data) @@ -19,14 +18,14 @@ from gbpservice.nfp.configurator.lib import constants as const from gbpservice.nfp.configurator.lib import demuxer from gbpservice.nfp.configurator.modules import configurator - +from neutron.tests import base """Implement test cases for LBaasRpcSender methods of loadbalancer agent. """ -class LBaasRpcSenderTest(unittest.TestCase): +class LBaasRpcSenderTest(base.BaseTestCase): @mock.patch(__name__ + '.test_data.FakeObjects.conf') @mock.patch(__name__ + '.test_data.FakeObjects.sc') @@ -57,9 +56,11 @@ def test_update_status(self): sc, conf, rpc_mgr = self._get_configurator_rpc_manager_object() agent = lb.LBaasRpcSender(sc) agent_info = {'context': 'context', 'resource': 'pool'} - with mock.patch.object(sc, 'new_event', return_value='foo') as ( - mock_new_event),\ - mock.patch.object(sc, 'stash_event') as mock_stash_event: + with mock.patch.object( + sc, 'new_event', return_value='foo') as mock_new_event, ( + mock.patch.object( + sc, 'stash_event')) as mock_stash_event: + agent.update_status('pool', 'object_id', 'status', agent_info, 'pool') @@ -90,9 +91,10 @@ def test_update_pool_stats(self): sc, conf, rpc_mgr = self._get_configurator_rpc_manager_object() agent = lb.LBaasRpcSender(sc) - with mock.patch.object(sc, 'new_event', return_value='foo') as ( - mock_new_event), \ - mock.patch.object(sc, 'stash_event') as (mock_stash_event): + with mock.patch.object( + sc, 'new_event', return_value='foo') as mock_new_event, ( + mock.patch.object( + sc, 'stash_event')) as mock_stash_event: context = test_data.Context() agent.update_pool_stats('pool_id', 'stats', context) @@ -130,7 +132,7 @@ def test_get_logical_device(self): """ -class LBaaSRpcManagerTest(unittest.TestCase): +class LBaaSRpcManagerTest(base.BaseTestCase): def __init__(self, *args, **kwargs): super(LBaaSRpcManagerTest, self).__init__(*args, **kwargs) @@ -222,12 +224,12 @@ def _test_rpc_manager(self, operation, request_data, args): agent, sc = self._get_lbaas_rpc_manager_object(conf, sc) method = self.fo.method - with mock.patch.object(sc, 'new_event', return_value=self.foo) as ( - mock_sc_new_event), \ - mock.patch.object(sc, 'post_event') as mock_sc_post_event, \ - mock.patch.object(rpc_mgr, - '_get_service_agent_instance', - return_value=agent): + with mock.patch.object( + sc, 'new_event', return_value=self.foo) as mock_sc_new_event, ( + mock.patch.object( + sc, 'post_event')) as mock_sc_post_event, ( + mock.patch.object( + rpc_mgr, '_get_service_agent_instance', return_value=agent)): getattr(rpc_mgr, method[operation])(self.fo.context, request_data) mock_sc_new_event.assert_called_with(id=operation, data=args) @@ -391,7 +393,7 @@ def test_UPDATE_POOL_HEALTH_MONITOR_rpc_manager(self): """ -class LBaasEventHandlerTestCase(unittest.TestCase): +class LBaasEventHandlerTestCase(base.BaseTestCase): def __init__(self, *args, **kwargs): super(LBaasEventHandlerTestCase, self).__init__(*args, **kwargs) @@ -427,31 +429,32 @@ def _test_handle_event(self, sc, rpcmgr): agent = self._get_lb_handler_objects(sc, self.drivers, rpcmgr) driver = self.drivers['loadbalancer'] - with mock.patch.object(agent, '_get_driver', return_value=driver), \ + with mock.patch.object( + agent, '_get_driver', return_value=driver), ( mock.patch.object( - driver, 'create_vip') as mock_create_vip,\ + driver, 'create_vip')) as mock_create_vip, ( mock.patch.object( - driver, 'delete_vip') as mock_delete_vip,\ + driver, 'delete_vip')) as mock_delete_vip, ( mock.patch.object( - driver, 'update_vip') as mock_update_vip,\ + driver, 'update_vip')) as mock_update_vip, ( mock.patch.object( - driver, 'create_pool') as mock_create_pool,\ + driver, 'create_pool')) as mock_create_pool, ( mock.patch.object( - driver, 'delete_pool') as mock_delete_pool,\ + driver, 'delete_pool')) as mock_delete_pool, ( mock.patch.object( - driver, 'update_pool') as mock_update_pool,\ + driver, 'update_pool')) as mock_update_pool, ( mock.patch.object( - driver, 'create_member') as mock_create_member,\ + driver, 'create_member')) as mock_create_member, ( mock.patch.object( - driver, 'delete_member') as mock_delete_member,\ + driver, 'delete_member')) as mock_delete_member, ( mock.patch.object( - driver, 'update_member') as mock_update_member,\ + driver, 'update_member')) as mock_update_member, ( mock.patch.object( - driver, 'create_pool_health_monitor') as mock_create_poolhm,\ + driver, 'create_pool_health_monitor')) as mock_create_poolhm, ( mock.patch.object( - driver, 'delete_pool_health_monitor') as mock_delete_poolhm,\ + driver, 'delete_pool_health_monitor')) as mock_delete_poolhm, ( mock.patch.object( - driver, 'update_pool_health_monitor') as mock_update_poolhm: + driver, 'update_pool_health_monitor')) as mock_update_poolhm: vip = self.fo._get_vip_object()[0] old_vip = self.fo._get_vip_object()[0] @@ -629,7 +632,3 @@ def test_update_pool_hm_event_handler(self): self.ev.id = 'UPDATE_POOL_HEALTH_MONITOR' self._test_handle_event() - - -if __name__ == '__main__': - unittest.main() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py index 012d26716d..7844ce8a1b 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py @@ -11,7 +11,6 @@ # under the License. import mock -import unittest from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( lb_test_data as test_data) @@ -20,6 +19,7 @@ haproxy_lb_driver as lb_driver) from gbpservice.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( haproxy_rest_client as _rest_client) +from neutron.tests import base from oslo_serialization import jsonutils """ Implement test cases for loadbalancer driver. @@ -27,7 +27,7 @@ """ -class HaproxyOnVmDriverTestCase(unittest.TestCase): +class HaproxyOnVmDriverTestCase(base.BaseTestCase): def __init__(self, *args, **kwargs): super(HaproxyOnVmDriverTestCase, self).__init__(*args, **kwargs) @@ -89,20 +89,16 @@ def _test_lbaasdriver(self, method_name): 'healthmonitors': self.fo.hm, 'members': self.fo.member} with mock.patch.object( - agent.plugin_rpc, - 'get_logical_device', - return_value=logical_device_return_value),\ + agent.plugin_rpc, 'get_logical_device', + return_value=logical_device_return_value), ( mock.patch.object( - driver, - '_get_rest_client', - return_value=rest_client),\ + driver, '_get_rest_client', return_value=rest_client)), ( mock.patch.object( - rest_client.pool, - 'request', return_value=self.resp) as (mock_request),\ + rest_client.pool, 'request', + return_value=self.resp)) as mock_request, ( mock.patch.object( - rest_client, - 'get_resource', - return_value=self.get_resource) as (mock_get_resource): + rest_client, 'get_resource', + return_value=self.get_resource)) as mock_get_resource: mock_request.status_code = 200 if method_name == 'DELETE_VIP': @@ -327,7 +323,3 @@ def test_pool_health_monitor_update_lbaasdriver(self): """ self._test_lbaasdriver('UPDATE_POOL_HEALTH_MONITOR') - - -if __name__ == '__main__': - unittest.main() From 08d75c5056cee42086cc86c1830de38383fcd013 Mon Sep 17 00:00:00 2001 From: pkharat Date: Sat, 16 Jul 2016 15:53:01 +0530 Subject: [PATCH 068/157] Addressed review comments given by Jagadish --- .../configurator/agents/loadbalancer_v1.py | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py index a177bba170..fb9aec3d74 100644 --- a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py +++ b/gbpservice/nfp/configurator/agents/loadbalancer_v1.py @@ -37,7 +37,7 @@ def __init__(self, sc): def get_logical_device(self, pool_id, context): """ Calls data filter library to get logical device from pool_id. - :param pool_id: pool id + :param pool_id: Neutron LBaaS pool id :param context: RPC context Returns: logical_device @@ -54,11 +54,12 @@ def get_logical_device(self, pool_id, context): def update_status(self, obj_type, obj_id, status, agent_info, obj=None): """ Enqueues the response from LBaaS operation to neutron plugin. - :param obj_type: object type - :param obj_id: object id - :param status: status of the object to be set - :param agent_info: agent_info - :param obj: object + :param obj_type: Neutron LBaaS object type + :param obj_id: Neutron LBaaS object id + :param status: Neutron LBaaS object status to be set + :param agent_info: Agent info which carries context which is needed + in config_orch to send response back to *aaS plugin + :param obj: Neutron LBaaS object Returns: None @@ -78,7 +79,7 @@ def update_status(self, obj_type, obj_id, status, agent_info, obj=None): def update_pool_stats(self, pool_id, stats, context, pool=None): """ Enqueues the response from LBaaS operation to neutron plugin. - :param pool_id: pool id + :param pool_id: Neutron LBaaS pool id :param stats: statistics of that pool :param context: RPC context @@ -98,9 +99,10 @@ def update_pool_stats(self, pool_id, stats, context, pool=None): def vip_deleted(self, vip, status, agent_info): """ Enqueues the response from LBaaS operation to neutron plugin. - :param vip: vip resource - :param status: vip status - :param agent_info: agent_info + :param vip: Neutron LBaaS vip resource + :param status: Neutron LBaaS vip resource status + :param agent_info: Agent info which carries context which is needed + in config_orch to send response back to *aaS plugin Returns: None """ @@ -407,7 +409,8 @@ def __init__(self, sc, drivers, rpcmgr): self.context = context.get_admin_context_without_session() def _get_driver(self, service_vendor): - """Retrieves service driver instance. + """Retrieves service driver instance based on service type + and service vendor. :param service_vendor: service vendor From dd989d2c2f20ca365b3ef588ea1aa16c6441aebe Mon Sep 17 00:00:00 2001 From: SureshDH Date: Sat, 16 Jul 2016 17:53:36 +0530 Subject: [PATCH 069/157] addressed review comments --- .../nfp/configurator/agents/test_vpn_agent.py | 36 ++-- .../drivers/vpn/test_vpn_driver.py | 183 +++++++++--------- .../drivers/vpn/vyos/vyos_vpn_driver.py | 5 +- 3 files changed, 113 insertions(+), 111 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py index 4ea9f8bf7c..d565aa8414 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py @@ -22,51 +22,51 @@ class VPNaasRpcManagerTestCase(base.BaseTestCase): - ''' + """ Implements test cases for RPC manager methods of vpn agent - ''' + """ def __init__(self, *args, **kwargs): super(VPNaasRpcManagerTestCase, self).__init__(*args, **kwargs) - self.dict_obj = vpn_test_data.VPNTestData() - self.conf = self.dict_obj.conf + self.test_dict = vpn_test_data.VPNTestData() + self.conf = self.test_dict.conf self.sc = mock.Mock() self.rpcmgr = vpn.VPNaasRpcManager(self.conf, self.sc) def test_vpnservice_updated(self): - resource_data = self.dict_obj._create_ipsec_site_conn_obj() + resource_data = self.test_dict._create_ipsec_site_conn_obj() with mock.patch.object(self.sc, 'new_event', return_value='foo'), ( mock.patch.object(self.sc, 'post_event')) as mock_post_event: self.rpcmgr.vpnservice_updated( - self.dict_obj.make_service_context(), + self.test_dict.make_service_context(), resource_data=resource_data) mock_post_event.assert_called_with('foo') class VPNaasEventHandlerTestCase(base.BaseTestCase): - ''' + """ Implements test cases for RPC manager methods of vpn agent - ''' + """ def __init__(self, *args, **kwargs): super(VPNaasEventHandlerTestCase, self).__init__(*args, **kwargs) - self.dict_obj = vpn_test_data.VPNTestData() - self.sc = self.dict_obj.sc - self.conf = self.dict_obj.conf - self.handler = vpn.VPNaasEventHandler(self.dict_obj.sc, - self.dict_obj.drivers) + self.test_dict = vpn_test_data.VPNTestData() + self.sc = self.test_dict.sc + self.conf = self.test_dict.conf + self.handler = vpn.VPNaasEventHandler(self.test_dict.sc, + self.test_dict.drivers) self.ev = vpn_test_data.FakeEvent() self.rpc_sender = vpn.VpnaasRpcSender(self.sc) self.driver = mock.Mock() def test_handle_event(self): - ''' + """ Test to handle the vpn agent's vpnservice_updated method to handle various vpn operations - ''' + """ with mock.patch.object(self.handler, '_get_driver', - return_value=self.dict_obj.drivers), ( + return_value=self.test_dict.drivers), ( mock.patch.object( self.driver, 'vpnservice_updated')) as mock_vpnservice_updated: @@ -76,11 +76,11 @@ def test_handle_event(self): 'resource_data']) def test_sync(self): - ''' + """ Test to handle the vpn service status like ACTIVE, ERROR after the configurations. - ''' + """ with mock.patch.object(self.handler, '_get_driver', return_value=self.driver), ( diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py index 7d52d05386..9555ed2647 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py @@ -32,17 +32,17 @@ class VpnaasIpsecDriverTestCase(base.BaseTestCase): - ''' + """ Implements test cases for driver methods of vpn. - ''' + """ def __init__(self, *args, **kwargs): super(VpnaasIpsecDriverTestCase, self).__init__(*args, **kwargs) self.conf = 'conf' - self.dict_objects = vpn_test_data.VPNTestData() - self.context = self.dict_objects.make_service_context() - self.plugin_rpc = vpn.VpnaasRpcSender(self.dict_objects.sc) + self.test_dict = vpn_test_data.VPNTestData() + self.context = self.test_dict.make_service_context() + self.plugin_rpc = vpn.VpnaasRpcSender(self.test_dict.sc) self.driver = vyos_vpn_driver.VpnaasIpsecDriver(self.conf) self.svc_validate = ( vyos_vpn_driver.VPNServiceValidator(self.plugin_rpc)) @@ -50,28 +50,28 @@ def __init__(self, *args, **kwargs): self.fake_resp_dict = {'status': True} def test_create_vpn_service(self): - ''' + """ Implements method to test the vpn driver's create vpn service. - ''' + """ - context = self.dict_objects.make_service_context(operation_type='vpn') + context = self.test_dict.make_service_context(operation_type='vpn') - kwargs = self.dict_objects.make_resource_data(operation='create', + kwargs = self.test_dict.make_resource_data(operation='create', service_type='vpn') with mock.patch.object(bdobj.agent, 'update_status') as ( mock_update_status): self.driver.vpnservice_updated(context, kwargs) mock_update_status.assert_called_with( self.context, - self.dict_objects.vpn_vpnsvc_active) + self.test_dict.vpn_vpnsvc_active) def test_create_ipsec_site_conn(self): - ''' + """ Implements method to test the vpn driver's create ipsec site conn - ''' + """ self.resp = mock.Mock(status_code=200) - context = self.dict_objects.make_service_context() - kwargs = self.dict_objects.make_resource_data(operation='create', + context = self.test_dict.make_service_context() + kwargs = self.test_dict.make_resource_data(operation='create', service_type='ipsec') with mock.patch.object( bdobj.agent, 'update_status') as mock_update_status, ( @@ -79,29 +79,29 @@ def test_create_ipsec_site_conn(self): mock.patch.object(requests, 'post')) as mock_post, ( mock.patch.object( self.driver.agent, 'get_vpn_servicecontext', - return_value=[self.dict_objects.svc_context])): + return_value=[self.test_dict.svc_context])): mock_resp.return_value = self.fake_resp_dict mock_post.return_value = self.resp self.driver.vpnservice_updated(context, kwargs) mock_post.assert_called_with( - self.dict_objects.url_create_ipsec_tunnel, - data=jsonutils.dumps(self.dict_objects.data_), - timeout=self.dict_objects.timeout) + self.test_dict.url_create_ipsec_tunnel, + data=jsonutils.dumps(self.test_dict.data_), + timeout=self.test_dict.timeout) mock_update_status.assert_called_with( context, - self.dict_objects.ipsec_vpnsvc_status) + self.test_dict.ipsec_vpnsvc_status) def _dict_to_query_str(self, args): return '&'.join([str(k) + '=' + str(v) for k, v in args.iteritems()]) def test_delete_ipsec_site_conn(self): - ''' + """ Implements method to test the vpn driver's create ipsec site conn - ''' + """ self.resp = mock.Mock(status_code=200) - kwargs = self.dict_objects.make_resource_data(operation='delete', + kwargs = self.test_dict.make_resource_data(operation='delete', service_type='ipsec') with mock.patch.object(self.plugin_rpc, 'ipsec_site_conn_deleted'), ( mock.patch.object(json, 'loads')) as mock_resp, ( @@ -120,21 +120,21 @@ def test_delete_ipsec_site_conn(self): tunnel['local_cidr'] = cidr tunnel['peer_cidrs'] = resource['peer_cidrs'] - url = (self.dict_objects.url_delete_ipsec_tunnel + '?' + + url = (self.test_dict.url_delete_ipsec_tunnel + '?' + self._dict_to_query_str(tunnel)) mock_delete.assert_called_with( url.encode('ascii', 'ignore'), - timeout=self.dict_objects.timeout, + timeout=self.test_dict.timeout, data=None) def test_check_status(self): - ''' + """ Implements method to test the vpn driver's check status - ''' + """ self.resp = mock.Mock(status_code=200) - svc_context = self.dict_objects.svc_context + svc_context = self.test_dict.svc_context with mock.patch.object(self.plugin_rpc, 'update_status'), ( mock.patch.object(self.resp, 'json')) as mock_json, ( mock.patch.object(requests, 'get')) as mock_get: @@ -145,22 +145,22 @@ def test_check_status(self): class VpnGenericConfigDriverTestCase(base.BaseTestCase): - ''' + """ Implements test cases for driver methods of generic config. - ''' + """ def __init__(self, *args, **kwargs): super(VpnGenericConfigDriverTestCase, self).__init__(*args, **kwargs) self.conf = 'conf' - self.dict_objects = vpn_test_data.VPNTestData() - self.context = self.dict_objects.make_service_context() - self.plugin_rpc = vpn.VpnaasRpcSender(self.dict_objects.sc) - self.rest_apt = vyos_vpn_driver.RestApi(self.dict_objects.vm_mgmt_ip) + self.test_dict = vpn_test_data.VPNTestData() + self.context = self.test_dict.make_service_context() + self.plugin_rpc = vpn.VpnaasRpcSender(self.test_dict.sc) + self.rest_apt = vyos_vpn_driver.RestApi(self.test_dict.vm_mgmt_ip) self.driver = vyos_vpn_driver.VpnGenericConfigDriver(self.conf) self.resp = mock.Mock() self.fake_resp_dict = {'status': True} - self.kwargs = self.dict_objects.fake_resource_data() + self.kwargs = self.test_dict.fake_resource_data() def setUp(self): super(VpnGenericConfigDriverTestCase, self).setUp() @@ -171,111 +171,111 @@ def tearDown(self): self.resp = mock.Mock(status_code=200) def test_configure_interfaces(self): - ''' + """ Implements test case for configure interfaces method of generic config driver. Returns: none - ''' + """ with mock.patch.object( requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object(self.resp, 'json', return_value=self.fake_resp_dict)): - self.driver.configure_interfaces(self.dict_objects.context_device, + self.driver.configure_interfaces(self.test_dict.context_device, self.kwargs) mock_post.assert_called_with( - self.dict_objects.url_for_add_inte, + self.test_dict.url_for_add_inte, jsonutils.dumps( - self.dict_objects.data_for_interface), - timeout=self.dict_objects.timeout) + self.test_dict.data_for_interface), + timeout=self.test_dict.timeout) def test_clear_interfaces(self): - ''' + """ Implements test case for clear interfaces method of generic config driver. Returns: none - ''' + """ self.resp = mock.Mock(status_code=200) with mock.patch.object( requests, 'delete', return_value=self.resp) as mock_delete, ( mock.patch.object( self.resp, 'json', return_value=self.fake_resp_dict)): - self.driver.clear_interfaces(self.dict_objects.context_device, + self.driver.clear_interfaces(self.test_dict.context_device, self.kwargs) mock_delete.assert_called_with( - self.dict_objects.url_for_del_inte, + self.test_dict.url_for_del_inte, data=jsonutils.dumps( - self.dict_objects.data_for_interface), - timeout=self.dict_objects.timeout) + self.test_dict.data_for_interface), + timeout=self.test_dict.timeout) def test_configure_source_routes(self): - ''' + """ Implements test case for configure routes method of generic config driver. Returns: none - ''' + """ with mock.patch.object( requests, 'post', return_value=self.resp) as mock_post, ( mock.patch.object(jsonutils, 'loads', return_value=self.fake_resp_dict)): - self.driver.configure_routes(self.dict_objects.context_device, + self.driver.configure_routes(self.test_dict.context_device, self.kwargs) mock_post.assert_called_with( - self.dict_objects.url_for_add_src_route, + self.test_dict.url_for_add_src_route, data=jsonutils.dumps( - self.dict_objects.data_for_add_src_route), - timeout=self.dict_objects.timeout) + self.test_dict.data_for_add_src_route), + timeout=self.test_dict.timeout) def test_delete_source_routes(self): - ''' + """ Implements test case for clear routes method of generic config driver. Returns: none - ''' + """ with mock.patch.object(requests, 'post', return_value=self.resp), ( mock.patch.object( requests, 'delete', return_value=self.resp)) as mock_delete: self.driver.clear_routes( - self.dict_objects.context_device, self.kwargs) + self.test_dict.context_device, self.kwargs) mock_delete.assert_called_with( - self.dict_objects.url_for_del_src_route, + self.test_dict.url_for_del_src_route, data=jsonutils.dumps( - self.dict_objects.data_for_del_src_route), - timeout=self.dict_objects.timeout) + self.test_dict.data_for_del_src_route), + timeout=self.test_dict.timeout) class VPNSvcValidatorTestCase(base.BaseTestCase): def __init__(self, *args, **kwargs): super(VPNSvcValidatorTestCase, self).__init__(*args, **kwargs) - self.dict_objects = vpn_test_data.VPNTestData() - self.plugin_rpc = vpn.VpnaasRpcSender(self.dict_objects.sc) + self.test_dict = vpn_test_data.VPNTestData() + self.plugin_rpc = vpn.VpnaasRpcSender(self.test_dict.sc) self.valid_obj = vyos_vpn_driver.VPNServiceValidator(self.plugin_rpc) def test_validate_active(self): - ''' + """ Implements testcase for vpn driver's validate method to test in success condition while making call to the service VM - ''' + """ - context = self.dict_objects.make_service_context() - svc = self.dict_objects._create_vpnservice_obj()['resource'] + context = self.test_dict.make_service_context() + svc = self.test_dict._create_vpnservice_obj()['resource'] description = str(svc['description']) description = description.split(';') description[1] = 'tunnel_local_cidr=12.0.6.0/24' @@ -285,28 +285,28 @@ def test_validate_active(self): with mock.patch.object(self.plugin_rpc, "update_status") as mock_valid: self.valid_obj.validate(context, svc) mock_valid.assert_called_with(context, - self.dict_objects.vpn_vpnsvc_active) + self.test_dict.vpn_vpnsvc_active) def test_validate_error(self): - ''' + """ Implements testcase for vpn driver's validate method to test in fail condition while making call to the service VM - ''' + """ - context = self.dict_objects.make_service_context() + context = self.test_dict.make_service_context() with mock.patch.object(self.plugin_rpc, "update_status") as mock_valid: self.valid_obj.validate( context, - self.dict_objects._create_vpnservice_obj()['resource']) + self.test_dict._create_vpnservice_obj()['resource']) mock_valid.assert_called_with( context, - self.dict_objects.vpn_vpnsvc_active) + self.test_dict.vpn_vpnsvc_active) class RestApiTestCase(base.BaseTestCase): - ''' + """ Class which implements the testcases to test the vpn RestApi calls. - ''' + """ def __init__(self, *args, **kwargs): super(RestApiTestCase, self).__init__(*args, **kwargs) @@ -314,7 +314,7 @@ def __init__(self, *args, **kwargs): vpn_test_data.VPNTestData().vm_mgmt_ip)) self.resp = mock.Mock() self.resp = mock.Mock(status_code=200) - self.dict_objects = vpn_test_data.VPNTestData() + self.test_dict = vpn_test_data.VPNTestData() self.args = {'peer_address': '1.103.2.2'} self.fake_resp_dict = {'status': None} self.timeout = 90 @@ -322,10 +322,10 @@ def __init__(self, *args, **kwargs): self.j_data = jsonutils.dumps(self.data) def test_post_success(self): - ''' + """ Implements testcase for vpn drivers post method to test in success condition while making call to the service VM - ''' + """ self.resp = mock.Mock(status_code=200) self.fake_resp_dict.update({'status': True}) @@ -335,30 +335,30 @@ def test_post_success(self): return_value=self.fake_resp_dict)): self.rest_obj.post('create-ipsec-site-conn', self.data) mock_post.assert_called_with( - self.dict_objects.url_create_ipsec_conn, + self.test_dict.url_create_ipsec_conn, data=self.j_data, timeout=self.timeout) def test_put_success(self): - ''' + """ Implements testcase for vpn drivers put method to test in success condition while making call to the service VM - ''' + """ self.resp = mock.Mock(status_code=200) with mock.patch.object(requests, 'put', return_value=self.resp) as ( mock_put): self.rest_obj.put('create-ipsec-site-conn', self.data) mock_put.assert_called_with( - self.dict_objects.url_create_ipsec_conn, + self.test_dict.url_create_ipsec_conn, data=self.j_data, timeout=self.timeout) def test_put_fail(self): - ''' + """ Implements testcase for vpn drivers put method to test in fail condition while making call to the service VM - ''' + """ self.resp = mock.Mock(status_code=404) with mock.patch.object(requests, 'put', return_value=self.resp) as ( @@ -366,15 +366,15 @@ def test_put_fail(self): self.rest_obj.put('create-ipsec-site-conn', self.data) mock_put.assert_called_with( - self.dict_objects.url_create_ipsec_conn, + self.test_dict.url_create_ipsec_conn, data=jsonutils.dumps(self.data), timeout=self.timeout) def test_delete_success(self): - ''' + """ Implements testcase for vpn drivers delete method to test in success condition while making call to the service VM - ''' + """ self.resp = mock.Mock(status_code=200) self.fake_resp_dict.update({'status': True}) with mock.patch.object(requests, 'delete', return_value=self.resp) as ( @@ -385,36 +385,37 @@ def test_delete_success(self): self.args, self.data) mock_delete.assert_called_with( - self.dict_objects.url_delete_ipsec_conn, + self.test_dict.url_delete_ipsec_conn, timeout=self.timeout, data=self.j_data) def test_get_success(self): - ''' + """ Implements testcase for vpn drivers get methode to test in fail condition while making call to the service VM - ''' + """ self.resp = mock.Mock(status_code=200) with mock.patch.object(requests, 'get', return_value=self.resp) as ( mock_get): self.rest_obj.get('create-ipsec-site-tunnel', self.data) mock_get.assert_called_with( - self.dict_objects.url_create_ipsec_tunnel, + self.test_dict.url_create_ipsec_tunnel, params=self.data, timeout=self.timeout) def test_get_fail(self): - ''' + """ Implements testcase for vpn drivers get methode to test in fail condition - ''' + """ self.resp = mock.Mock(status_code=404) with mock.patch.object(requests, 'get', return_value=self.resp) as ( mock_get): self.rest_obj.get('create-ipsec-site-tunnel', self.data) mock_get.assert_called_with( - self.dict_objects.url_create_ipsec_tunnel, + self.test_dict.url_create_ipsec_tunnel, params=self.data, timeout=self.timeout) + diff --git a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py b/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py index 0be715cd78..976cd70fac 100644 --- a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py +++ b/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py @@ -1065,10 +1065,10 @@ def _ipsec_is_state_changed(self, svc_context, conn, fip): tunnel) state = output['state'] - if state.upper() == 'UP' and( + if state.upper() == 'UP' and ( conn['status'] != const.STATE_ACTIVE): c_state = const.STATE_ACTIVE - if state.upper() == 'DOWN' and( + if state.upper() == 'DOWN' and ( conn['status'] == const.STATE_ACTIVE): c_state = const.STATE_PENDING @@ -1271,3 +1271,4 @@ def configure_healthmonitor(self, context, resource_data): port = str(const.CONFIGURATION_SERVER_PORT) command = 'nc ' + ip + ' ' + port + ' -z' return self._check_vm_health(command) + From 22a028392a51e075e23d40f7b146b1d3ce348d97 Mon Sep 17 00:00:00 2001 From: SureshDH Date: Sat, 16 Jul 2016 18:08:28 +0530 Subject: [PATCH 070/157] addressed pep8 isses --- .../tests/unit/nfp/configurator/agents/test_vpn_agent.py | 1 - .../unit/nfp/configurator/drivers/vpn/test_vpn_driver.py | 7 +++---- .../nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py index d565aa8414..2c5e070346 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py @@ -91,4 +91,3 @@ def test_sync(self): return_value=const.STATE_ACTIVE)): self.assertEqual(self.handler.sync(self.ev), {'poll': False}) - diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py index 9555ed2647..b4518f515b 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py @@ -57,7 +57,7 @@ def test_create_vpn_service(self): context = self.test_dict.make_service_context(operation_type='vpn') kwargs = self.test_dict.make_resource_data(operation='create', - service_type='vpn') + service_type='vpn') with mock.patch.object(bdobj.agent, 'update_status') as ( mock_update_status): self.driver.vpnservice_updated(context, kwargs) @@ -72,7 +72,7 @@ def test_create_ipsec_site_conn(self): self.resp = mock.Mock(status_code=200) context = self.test_dict.make_service_context() kwargs = self.test_dict.make_resource_data(operation='create', - service_type='ipsec') + service_type='ipsec') with mock.patch.object( bdobj.agent, 'update_status') as mock_update_status, ( mock.patch.object(jsonutils, 'loads')) as mock_resp, ( @@ -102,7 +102,7 @@ def test_delete_ipsec_site_conn(self): self.resp = mock.Mock(status_code=200) kwargs = self.test_dict.make_resource_data(operation='delete', - service_type='ipsec') + service_type='ipsec') with mock.patch.object(self.plugin_rpc, 'ipsec_site_conn_deleted'), ( mock.patch.object(json, 'loads')) as mock_resp, ( mock.patch.object(requests, 'delete')) as ( @@ -418,4 +418,3 @@ def test_get_fail(self): self.test_dict.url_create_ipsec_tunnel, params=self.data, timeout=self.timeout) - diff --git a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py b/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py index 976cd70fac..5f73f97732 100644 --- a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py +++ b/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py @@ -1271,4 +1271,3 @@ def configure_healthmonitor(self, context, resource_data): port = str(const.CONFIGURATION_SERVER_PORT) command = 'nc ' + ip + ' ' + port + ' -z' return self._check_vm_health(command) - From c7d9866b091aa690f65fa96e4e287a72885ad9c1 Mon Sep 17 00:00:00 2001 From: dpaks Date: Sat, 16 Jul 2016 18:49:04 +0530 Subject: [PATCH 071/157] added hm test cases, addressed review comments --- .../agents/test_generic_config.py | 23 +++++++++--- .../configurator/agents/test_nfp_service.py | 8 ++--- .../drivers/firewall/test_vyos_fw_driver.py | 33 +++++++++-------- .../configurator/test_data/fw_test_data.py | 35 +++++++++++-------- 4 files changed, 59 insertions(+), 40 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py index b6c3625167..c5350a78b1 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py @@ -187,12 +187,10 @@ def _test_handle_event(self, ev): with mock.patch.object( driver, const.EVENT_CONFIGURE_INTERFACES.lower(), - return_value=common_const.SUCCESS) as ( - mock_config_inte), ( + return_value=common_const.SUCCESS) as (mock_config_inte), ( mock.patch.object( driver, const.EVENT_CLEAR_INTERFACES.lower(), - return_value=common_const.SUCCESS)) as ( - mock_clear_inte), ( + return_value=common_const.SUCCESS)) as (mock_clear_inte), ( mock.patch.object( driver, const.EVENT_CONFIGURE_ROUTES.lower(), return_value=common_const.SUCCESS)) as ( @@ -206,6 +204,9 @@ def _test_handle_event(self, ev): mock.patch.object( driver, const.EVENT_CONFIGURE_HEALTHMONITOR.lower(), return_value=common_const.SUCCESS)), ( + mock.patch.object( + driver, const.EVENT_CLEAR_HEALTHMONITOR.lower(), + return_value=common_const.SUCCESS)) as mock_clear_hm, ( mock.patch.object( agent, '_get_driver', return_value=driver)): @@ -233,6 +234,9 @@ def _test_handle_event(self, ev): ev, max_times=const.INITIAL_HM_RETRIES) elif periodicity == const.FOREVER: mock_hm_poll_event.assert_called_with(ev) + elif ev.id == const.EVENT_CLEAR_HEALTHMONITOR: + mock_clear_hm.assert_called_with( + self.fo.context, resource_data) def _test_handle_periodic_event(self, ev): """ Test handle periodic event method of generic config agent @@ -330,6 +334,17 @@ def test_configure_hm_forever_genericconfigeventhandler(self): ev.id = 'CONFIGURE_HEALTHMONITOR forever' self._test_handle_event(ev) + def test_clear_hm_genericconfigeventhandler(self): + """ Implements test case for clear health monitor method + of generic config event handler. + + Returns: none + """ + + ev = fo.FakeEventGenericConfig() + ev.id = 'CLEAR_HEALTHMONITOR' + self._test_handle_event(ev) + def test_handle_configure_healthmonitor_genericconfigeventhandler(self): """ Implements test case for handle configure health monitor method of generic config event handler. diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py index 1c146a0cb5..b4fc183964 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py @@ -60,8 +60,8 @@ def _test_event_creation(self, method): arg_dict = {'context': self.fo.context, 'resource_data': self.fo.kwargs} with mock.patch.object( - sc, 'new_event', return_value='foo') as mock_sc_event, \ - mock.patch.object(sc, 'post_event') as mock_sc_rpc_event: + sc, 'new_event', return_value='foo') as mock_sc_event, ( + mock.patch.object(sc, 'post_event')) as mock_sc_rpc_event: actual_call = agent.run_nfp_service(self.fo.context, self.fo.kwargs) @@ -97,7 +97,7 @@ def __init__(self, *args, **kwargs): @mock.patch(__name__ + '.fo.FakeObjects.rpcmgr') @mock.patch(__name__ + '.fo.FakeObjects.drivers') @mock.patch(__name__ + '.fo.FakeObjects.sc') - def _get_NfpServiceEventHandler_object(self, sc, drivers, rpcmgr): + def _get_nfp_service_event_handler_object(self, sc, drivers, rpcmgr): """ Retrieves event handler object of nfp service. :param sc: mocked service controller object of process model framework @@ -121,7 +121,7 @@ def _test_handle_event(self, ev, result=const.UNHANDLED_RESULT): """ - agent, sc = self._get_NfpServiceEventHandler_object() + agent, sc = self._get_nfp_service_event_handler_object() driver = mock.Mock() with mock.patch.object( diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index 9702fab05a..f1493c4efe 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -57,12 +57,12 @@ def test_configure_log_forward(self): self.driver.configure_interfaces(self.fo.context, self.kwargs) data = jsonutils.dumps(self.fo.log_forward_data()) - mock_post.assert_called_with(self.fo.url_for_log_forward, + mock_post.assert_called_with(self.fo.get_url_for_api('log_forward'), data, timeout=self.fo.timeout) def test_configure_static_ip(self): - """ Implements test case for configure log forward method + """ Implements test case for configure static ip method of generic config driver. Returns: none @@ -79,12 +79,12 @@ def test_configure_static_ip(self): self.driver.configure_interfaces(self.fo.context, self.kwargs) data = jsonutils.dumps(self.fo.static_ip_data()) - mock_post.assert_called_with(self.fo.url_for_add_static_ip, - data=data, - timeout=self.fo.timeout) + mock_post.assert_called_with( + self.fo.get_url_for_api('add_static_ip'), + data=data, timeout=self.fo.timeout) def test_configure_interfaces(self): - """ Implements test case for configure log forward method + """ Implements test case for configure interfaces method of generic config driver. Returns: none @@ -104,7 +104,7 @@ def test_configure_interfaces(self): self.driver.configure_interfaces(self.fo.context, self.kwargs) data = jsonutils.dumps(self.fo.data_for_interface) - mock_post.assert_called_with(self.fo.url_for_add_inte, + mock_post.assert_called_with(self.fo.get_url_for_api('add_inte'), data=data, timeout=self.fo.timeout) @@ -125,7 +125,7 @@ def test_clear_interfaces(self): data = jsonutils.dumps(self.fo.data_for_interface) mock_delete.assert_called_with( - self.fo.url_for_del_inte, + self.fo.get_url_for_api('del_inte'), data=data, timeout=self.fo.timeout) @@ -147,9 +147,9 @@ def test_configure_source_routes(self): data = list() data.append(self.fo.data_for_add_src_route) data = jsonutils.dumps(data) - mock_post.assert_called_with(self.fo.url_for_add_src_route, - data=data, - timeout=self.fo.timeout) + mock_post.assert_called_with( + self.fo.get_url_for_api('add_src_route'), + data=data, timeout=self.fo.timeout) def test_delete_source_routes(self): """ Implements test case for clear routes method @@ -170,9 +170,8 @@ def test_delete_source_routes(self): data.append(self.fo.data_for_del_src_route) data = jsonutils.dumps(data) mock_delete.assert_called_with( - self.fo.url_for_del_src_route, - data=data, - timeout=self.fo.timeout) + self.fo.get_url_for_api('del_src_route'), + data=data, timeout=self.fo.timeout) class FwaasDriverTestCase(base.BaseTestCase): @@ -210,7 +209,7 @@ def test_create_firewall_fwaasdriver(self): mock_post.configure_mock(status_code=200) self.driver.create_firewall(self.fo.context, self.fo.firewall, self.fo.host) - mock_post.assert_called_with(self.fo.url_for_config_fw, + mock_post.assert_called_with(self.fo.get_url_for_api('config_fw'), data=self.firewall, timeout=self.fo.timeout) @@ -228,7 +227,7 @@ def test_update_firewall_fwaasdriver(self): self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.update_firewall(self.fo.context, self.fo.firewall, self.fo.host) - mock_put.assert_called_with(self.fo.url_for_update_fw, + mock_put.assert_called_with(self.fo.get_url_for_api('update_fw'), data=self.firewall, timeout=self.fo.timeout) @@ -246,6 +245,6 @@ def test_delete_firewall_fwaasdriver(self): self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.delete_firewall(self.fo.context, self.fo.firewall, self.fo.host) - mock_delete.assert_called_with(self.fo.url_for_delete_fw, + mock_delete.assert_called_with(self.fo.get_url_for_api('delete_fw'), data=self.firewall, timeout=self.fo.timeout) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py index 886134d419..e0b91292b7 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py @@ -35,22 +35,7 @@ class FakeObjects(object): kwargs = {'vmid': 'vmid'} rpcmgr = 'rpcmgr' drivers = 'drivers' - vm_mgmt_ip = '172.24.4.5' - service_vendor = 'service_vendor' - source_cidrs = ['1.2.3.4/24'] - destination_cidr = 'destination_cidr' - gateway_ip = '1.2.3.4' provider_interface_position = 'provider_interface_position' - url = 'http://172.24.4.5:8888' - url_for_log_forward = "%s/configure-rsyslog-as-client" % url - url_for_add_static_ip = "%s/add_static_ip" % url - url_for_add_inte = "%s/add_rule" % url - url_for_del_inte = "%s/delete_rule" % url - url_for_add_src_route = "%s/add-source-route" % url - url_for_del_src_route = "%s/delete-source-route" % url - url_for_config_fw = "%s/configure-firewall-rule" % url - url_for_update_fw = "%s/update-firewall-rule" % url - url_for_delete_fw = "%s/delete-firewall-rule" % url data_for_interface = dict(provider_mac="00:0a:95:9d:68:16", stitching_mac="00:0a:95:9d:68:16") data_for_add_src_route = {'source_cidr': "1.2.3.4/24", @@ -58,6 +43,21 @@ class FakeObjects(object): data_for_del_src_route = {'source_cidr': '1.2.3.4/24'} timeout = 120 + def get_url_for_api(self, api): + url = 'http://172.24.4.5:8888/' + api_url_map = { + 'log_forward': 'configure-rsyslog-as-client', + 'add_static_ip': 'add_static_ip', + 'add_inte': 'add_rule', + 'del_inte': 'delete_rule', + 'add_src_route': 'add-source-route', + 'del_src_route': 'delete-source-route', + 'config_fw': 'configure-firewall-rule', + 'update_fw': 'update-firewall-rule', + 'delete_fw': 'delete-firewall-rule'} + + return url + api_url_map[api] + def log_forward_data(self): return dict(server_ip={}, server_port={}, log_level={}) @@ -367,5 +367,10 @@ def __init__(self): class FakeEventGetNotifications(object): + """ Implements a fake event class for notifications functionality + for the process framework to use + + """ + def __init__(self): self.data = {'dummy_data': 'dummy_value'} From 94261e2c4d2413b5335d38cef2d410daa74927ab Mon Sep 17 00:00:00 2001 From: dpaks Date: Sat, 16 Jul 2016 18:57:46 +0530 Subject: [PATCH 072/157] fixed pep8 --- .../unit/nfp/configurator/agents/test_nfp_service.py | 7 ------- .../drivers/firewall/test_vyos_fw_driver.py | 12 ++++++------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py index b4fc183964..e8c4f13408 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py @@ -40,7 +40,6 @@ def _get_NfpServiceRpcManager_object(self, conf, sc): Returns: object of nfp service's RPC manager and service controller. - """ agent = ns.ConfigScriptRpcManager(sc, conf) @@ -53,7 +52,6 @@ def _test_event_creation(self, method): :param method: CREATE_NFP_SERVICE Returns: none - """ agent, sc = self._get_NfpServiceRpcManager_object() @@ -75,7 +73,6 @@ def test_nfp_service_rpcmanager(self): of nfp service RPC manager. Returns: none - """ self._test_event_creation(const.CREATE_NFP_SERVICE_EVENT) @@ -105,7 +102,6 @@ def _get_nfp_service_event_handler_object(self, sc, drivers, rpcmgr): :param drivers: list of driver objects for nfp service agent Returns: object of nfp service's event handler - """ agent = ns.ConfigScriptEventHandler(sc, drivers, rpcmgr) @@ -118,7 +114,6 @@ def _test_handle_event(self, ev, result=const.UNHANDLED_RESULT): process framework. Returns: None - """ agent, sc = self._get_nfp_service_event_handler_object() @@ -139,7 +134,6 @@ def test_create_nfp_service_handle_event_success(self): of nfp service event handler. Returns: none - """ ev = fo.FakeEventNfpService() @@ -151,7 +145,6 @@ def test_create_nfp_service_handle_event_failure(self): of nfp service event handler. Returns: none - """ ev = fo.FakeEventNfpService() diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index f1493c4efe..977583b619 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -57,9 +57,9 @@ def test_configure_log_forward(self): self.driver.configure_interfaces(self.fo.context, self.kwargs) data = jsonutils.dumps(self.fo.log_forward_data()) - mock_post.assert_called_with(self.fo.get_url_for_api('log_forward'), - data, - timeout=self.fo.timeout) + mock_post.assert_called_with( + self.fo.get_url_for_api('log_forward'), + data, timeout=self.fo.timeout) def test_configure_static_ip(self): """ Implements test case for configure static ip method @@ -245,6 +245,6 @@ def test_delete_firewall_fwaasdriver(self): self.resp, 'json', return_value=self.fake_resp_dict)): self.driver.delete_firewall(self.fo.context, self.fo.firewall, self.fo.host) - mock_delete.assert_called_with(self.fo.get_url_for_api('delete_fw'), - data=self.firewall, - timeout=self.fo.timeout) + mock_delete.assert_called_with( + self.fo.get_url_for_api('delete_fw'), + data=self.firewall, timeout=self.fo.timeout) From cd029b51ef49cebcaba62775f3e9e871cdab23be Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Sun, 17 Jul 2016 09:37:32 +0530 Subject: [PATCH 073/157] Relocated configurator and config_orchestrator to gbpservice/contrib/nfp/ --- .../__init__.py | 0 .../modules => contrib/nfp}/__init__.py | 0 .../nfp/config_orchestrator}/__init__.py | 0 .../config_orchestrator/common}/__init__.py | 0 .../nfp/config_orchestrator/common/common.py | 2 +- .../common/lbv2_constants.py | 0 .../nfp/config_orchestrator/common/topics.py | 0 .../config_orchestrator/handlers}/__init__.py | 0 .../handlers/config}/__init__.py | 0 .../handlers/config/firewall.py | 2 +- .../handlers/config/loadbalancer.py | 2 +- .../handlers/config/loadbalancerv2.py | 2 +- .../config_orchestrator/handlers/config/vpn.py | 2 +- .../handlers/event}/__init__.py | 0 .../handlers/event/handler.py | 2 +- .../handlers/notification}/__init__.py | 0 .../handlers/notification/handler.py | 4 ++-- .../config_orchestrator/modules}/__init__.py | 0 .../config_orchestrator/modules/config_orch.py | 14 +++++++------- .../{ => contrib}/nfp/configurator/Dockerfile | 0 .../nfp/configurator}/__init__.py | 0 .../nfp/configurator/agents}/__init__.py | 0 .../nfp/configurator/agents/agent_base.py | 2 +- .../nfp/configurator/agents/firewall.py | 8 ++++---- .../nfp/configurator/agents/generic_config.py | 8 ++++---- .../nfp/configurator/agents/loadbalancer_v1.py | 8 ++++---- .../nfp/configurator/agents/loadbalancer_v2.py | 8 ++++---- .../nfp/configurator/agents/nfp_service.py | 6 +++--- .../nfp/configurator/agents/vpn.py | 10 +++++----- .../nfp/configurator/api}/__init__.py | 0 .../nfp/configurator/api/base_controller.py | 0 .../nfp/configurator/api/config.py | 0 .../nfp/configurator/api/root_controller.py | 0 .../nfp/configurator/api/setup.py | 0 .../nfp/configurator/api/v1}/__init__.py | 0 .../nfp/configurator/api/v1/app.py | 0 .../api/v1/controllers/__init__.py | 0 .../api/v1/controllers/controller.py | 2 +- .../nfp/configurator/config}/__init__.py | 0 .../nfp/configurator/config/asav.conf | 0 .../nfp/configurator/drivers}/__init__.py | 0 .../nfp/configurator/drivers/base}/__init__.py | 0 .../configurator/drivers/base/base_driver.py | 2 +- .../configurator/drivers/firewall}/__init__.py | 0 .../drivers/firewall/asav}/__init__.py | 0 .../drivers/firewall/asav/asav_fw_constants.py | 0 .../drivers/firewall/asav/asav_fw_driver.py | 8 ++++---- .../drivers/firewall/paloalto}/__init__.py | 0 .../firewall/paloalto/paloalto_fw_constants.py | 0 .../firewall/paloalto/paloalto_fw_driver.py | 8 ++++---- .../drivers/firewall/vyos}/__init__.py | 0 .../drivers/firewall/vyos/vyos_fw_constants.py | 0 .../drivers/firewall/vyos/vyos_fw_driver.py | 8 ++++---- .../drivers/loadbalancer}/__init__.py | 0 .../drivers/loadbalancer/v1}/__init__.py | 0 .../loadbalancer/v1/haproxy}/__init__.py | 0 .../v1/haproxy/haproxy_lb_driver.py | 8 ++++---- .../v1/haproxy/haproxy_rest_client.py | 0 .../drivers/loadbalancer/v2}/__init__.py | 0 .../loadbalancer/v2/haproxy}/__init__.py | 0 .../loadbalancer/v2/haproxy/haproxy_driver.py | 18 +++++++++--------- .../v2/haproxy/neutron_lbaas_data_models.py | 0 .../v2/haproxy/octavia_lib}/__init__.py | 0 .../haproxy/octavia_lib/amphorae}/__init__.py | 0 .../amphorae/driver_exceptions}/__init__.py | 0 .../amphorae/driver_exceptions/exceptions.py | 0 .../octavia_lib/amphorae/drivers}/__init__.py | 0 .../amphorae/drivers/driver_base.py | 0 .../amphorae/drivers/haproxy}/__init__.py | 0 .../amphorae/drivers/haproxy/data_models.py | 2 +- .../amphorae/drivers/haproxy/exceptions.py | 0 .../v2/haproxy/octavia_lib/common}/__init__.py | 0 .../v2/haproxy/octavia_lib/common/constants.py | 0 .../haproxy/octavia_lib/common/data_models.py | 2 +- .../haproxy/octavia_lib/common/exceptions.py | 4 ++-- .../octavia_lib/common/jinja}/__init__.py | 0 .../common/jinja/haproxy}/__init__.py | 0 .../common/jinja/haproxy/jinja_cfg.py | 4 ++-- .../jinja/haproxy/templates}/__init__.py | 0 .../common/jinja/haproxy/templates/base.j2 | 0 .../jinja/haproxy/templates/haproxy.cfg.j2 | 0 .../common/jinja/haproxy/templates/macros.j2 | 0 .../octavia_lib/common/tls_utils}/__init__.py | 0 .../common/tls_utils/cert_parser.py | 6 +++--- .../v2/haproxy/octavia_lib/common/utils.py | 0 .../v2/haproxy/octavia_lib/i18n.py | 0 .../haproxy/octavia_lib/network}/__init__.py | 0 .../haproxy/octavia_lib/network/data_models.py | 2 +- .../loadbalancer/v2/haproxy/rest_api_driver.py | 16 ++++++++-------- .../drivers/nfp_service}/__init__.py | 0 .../drivers/nfp_service/heat}/__init__.py | 0 .../drivers/nfp_service/heat/heat_driver.py | 4 ++-- .../nfp/configurator/drivers/vpn}/__init__.py | 0 .../configurator/drivers/vpn/vyos}/__init__.py | 0 .../drivers/vpn/vyos/vyos_vpn_driver.py | 4 ++-- .../nfp/configurator/lib}/__init__.py | 0 .../nfp/configurator/lib/config_opts.py | 0 .../nfp/configurator/lib/constants.py | 2 +- .../nfp/configurator/lib/data_filter.py | 2 +- .../nfp/configurator/lib/demuxer.py | 2 +- .../nfp/configurator/lib/filter_constants.py | 0 .../nfp/configurator/lib/fw_constants.py | 2 +- .../lib/generic_config_constants.py | 2 +- .../nfp/configurator/lib/lb_constants.py | 2 +- .../nfp/configurator/lib/lbv2_constants.py | 2 +- .../configurator/lib/nfp_service_constants.py | 2 +- .../nfp/configurator/lib/schema.py | 0 .../nfp/configurator/lib/schema_validator.py | 4 ++-- .../nfp/configurator/lib/utils.py | 0 .../nfp/configurator/lib/vpn_constants.py | 2 +- .../nfp/configurator/modules}/__init__.py | 0 .../nfp/configurator/modules/configurator.py | 10 +++++----- .../{ => contrib}/nfp/configurator/run.sh | 2 +- .../haproxy => contrib/tests}/__init__.py | 0 .../common => contrib/tests/unit}/__init__.py | 0 .../tests/unit/nfp}/__init__.py | 0 .../unit/nfp/config_orchestrator}/__init__.py | 0 .../config_orchestrator/modules}/__init__.py | 0 .../modules/test_config_orch.py | 10 +++++----- .../tests/unit/nfp/configurator}/__init__.py | 0 .../unit/nfp/configurator/agents}/__init__.py | 0 .../nfp/configurator/agents/test_firewall.py | 8 ++++---- .../configurator/agents/test_generic_config.py | 8 ++++---- .../nfp/configurator/agents/test_lb_agent.py | 10 +++++----- .../configurator/agents/test_nfp_service.py | 6 +++--- .../nfp/configurator/agents/test_vpn_agent.py | 6 +++--- .../unit/nfp/configurator/api}/__init__.py | 0 .../unit/nfp/configurator/api/v1}/__init__.py | 0 .../api/v1/controllers}/__init__.py | 0 .../api/v1/controllers/test_controller.py | 6 +++--- .../unit/nfp/configurator/drivers}/__init__.py | 0 .../configurator/drivers/firewall}/__init__.py | 0 .../drivers/firewall/test_asav_fw_driver.py | 4 ++-- .../drivers/firewall/test_vyos_fw_driver.py | 6 +++--- .../drivers/loadbalancer}/__init__.py | 0 .../drivers/loadbalancer/test_lb_driver.py | 8 ++++---- .../drivers/nfp_service/__init__.py | 0 .../drivers/nfp_service/test_heat_driver.py | 6 +++--- .../nfp/configurator/drivers/vpn/__init__.py | 0 .../drivers/vpn/test_vpn_driver.py | 8 ++++---- .../unit/nfp/configurator/lib/__init__.py | 0 .../unit/nfp/configurator/lib/filter_base.py | 0 .../unit/nfp/configurator/lib/test_demuxer.py | 4 ++-- .../unit/nfp/configurator/lib/test_filter.py | 2 +- .../configurator/lib/test_schema_validator.py | 4 ++-- .../unit/nfp/configurator/modules/__init__.py | 0 .../configurator/modules/test_configurator.py | 10 +++++----- .../nfp/configurator/test_data/__init__.py | 0 .../test_data/asav_fw_test_data.py | 0 .../nfp/configurator/test_data/fw_test_data.py | 0 .../nfp/configurator/test_data/lb_test_data.py | 0 .../test_data/nfp_service_test_data.py | 0 .../configurator/test_data/vpn_test_data.py | 0 gbpservice/nfp/bin/nfp_config_orch.ini | 2 +- gbpservice/nfp/bin/nfp_configurator.ini | 2 +- .../nfp/bin/startup/redhat/nfp_pecan.service | 2 +- gbpservice/nfp/scripts/mode_shift.sh | 2 +- .../nfp/scripts/mode_shift.sh.enterprise | 2 +- .../firewall/nfp_fwaas_plugin-liberty.py | 2 +- .../firewall/nfp_fwaas_plugin.py | 2 +- .../drivers/nfp_lbaas_plugin_driver.py | 4 ++-- .../drivers/nfp_lbaasv2_plugin_driver.py | 4 ++-- .../vpn/drivers/nfp_vpnaas_driver.py | 2 +- .../diskimage-create/disk_image_create.py | 2 +- .../visibility_disk_image_create.py | 2 +- 165 files changed, 173 insertions(+), 173 deletions(-) rename gbpservice/{neutron/tests/unit/nfp/config_orchestrator => contrib}/__init__.py (100%) rename gbpservice/{neutron/tests/unit/nfp/config_orchestrator/modules => contrib/nfp}/__init__.py (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator => contrib/nfp/config_orchestrator}/__init__.py (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator/agents => contrib/nfp/config_orchestrator/common}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/common/common.py (98%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/common/lbv2_constants.py (100%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/common/topics.py (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator/api => contrib/nfp/config_orchestrator/handlers}/__init__.py (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator/api/v1 => contrib/nfp/config_orchestrator/handlers/config}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/handlers/config/firewall.py (98%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/handlers/config/loadbalancer.py (99%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/handlers/config/loadbalancerv2.py (99%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/handlers/config/vpn.py (99%) rename gbpservice/{neutron/tests/unit/nfp/configurator/api/v1/controllers => contrib/nfp/config_orchestrator/handlers/event}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/handlers/event/handler.py (99%) rename gbpservice/{neutron/tests/unit/nfp/configurator/drivers => contrib/nfp/config_orchestrator/handlers/notification}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/handlers/notification/handler.py (98%) rename gbpservice/{neutron/tests/unit/nfp/configurator/drivers/firewall => contrib/nfp/config_orchestrator/modules}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/config_orchestrator/modules/config_orch.py (88%) rename gbpservice/{ => contrib}/nfp/configurator/Dockerfile (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator/drivers/loadbalancer => contrib/nfp/configurator}/__init__.py (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator/drivers/nfp_service => contrib/nfp/configurator/agents}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/agents/agent_base.py (99%) rename gbpservice/{ => contrib}/nfp/configurator/agents/firewall.py (98%) rename gbpservice/{ => contrib}/nfp/configurator/agents/generic_config.py (98%) rename gbpservice/{ => contrib}/nfp/configurator/agents/loadbalancer_v1.py (99%) rename gbpservice/{ => contrib}/nfp/configurator/agents/loadbalancer_v2.py (99%) rename gbpservice/{ => contrib}/nfp/configurator/agents/nfp_service.py (97%) rename gbpservice/{ => contrib}/nfp/configurator/agents/vpn.py (97%) rename gbpservice/{neutron/tests/unit/nfp/configurator/drivers/vpn => contrib/nfp/configurator/api}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/api/base_controller.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/api/config.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/api/root_controller.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/api/setup.py (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator/lib => contrib/nfp/configurator/api/v1}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/api/v1/app.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/api/v1/controllers/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/api/v1/controllers/controller.py (99%) rename gbpservice/{neutron/tests/unit/nfp/configurator/modules => contrib/nfp/configurator/config}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/config/asav.conf (100%) rename gbpservice/{neutron/tests/unit/nfp/configurator/test_data => contrib/nfp/configurator/drivers}/__init__.py (100%) rename gbpservice/{nfp/config_orchestrator => contrib/nfp/configurator/drivers/base}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/base/base_driver.py (98%) rename gbpservice/{nfp/config_orchestrator/common => contrib/nfp/configurator/drivers/firewall}/__init__.py (100%) rename gbpservice/{nfp/config_orchestrator/handlers => contrib/nfp/configurator/drivers/firewall/asav}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/firewall/asav/asav_fw_constants.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py (99%) rename gbpservice/{nfp/config_orchestrator/handlers/config => contrib/nfp/configurator/drivers/firewall/paloalto}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_constants.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_driver.py (99%) rename gbpservice/{nfp/config_orchestrator/handlers/event => contrib/nfp/configurator/drivers/firewall/vyos}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/firewall/vyos/vyos_fw_constants.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py (98%) rename gbpservice/{nfp/config_orchestrator/handlers/notification => contrib/nfp/configurator/drivers/loadbalancer}/__init__.py (100%) rename gbpservice/{nfp/config_orchestrator/modules => contrib/nfp/configurator/drivers/loadbalancer/v1}/__init__.py (100%) rename gbpservice/{nfp/configurator => contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py (99%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py (100%) rename gbpservice/{nfp/configurator/agents => contrib/nfp/configurator/drivers/loadbalancer/v2}/__init__.py (100%) rename gbpservice/{nfp/configurator/api => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/haproxy_driver.py (97%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/neutron_lbaas_data_models.py (100%) rename gbpservice/{nfp/configurator/api/v1 => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib}/__init__.py (100%) rename gbpservice/{nfp/configurator/config => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/exceptions.py (100%) rename gbpservice/{nfp/configurator/drivers/base => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/driver_base.py (100%) rename gbpservice/{nfp/configurator/drivers/firewall => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/data_models.py (97%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/exceptions.py (100%) rename gbpservice/{nfp/configurator/drivers/firewall/asav => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/constants.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/data_models.py (99%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/exceptions.py (97%) rename gbpservice/{nfp/configurator/drivers/firewall/paloalto => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/firewall/vyos => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/jinja_cfg.py (98%) rename gbpservice/{nfp/configurator/drivers/loadbalancer => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/base.j2 (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/haproxy.cfg.j2 (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/macros.j2 (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v1 => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/cert_parser.py (96%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/utils.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/i18n.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v1/haproxy => contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/data_models.py (97%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/loadbalancer/v2/haproxy/rest_api_driver.py (95%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2 => contrib/nfp/configurator/drivers/nfp_service}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy => contrib/nfp/configurator/drivers/nfp_service/heat}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/nfp_service/heat/heat_driver.py (89%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib => contrib/nfp/configurator/drivers/vpn}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae => contrib/nfp/configurator/drivers/vpn/vyos}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py (99%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions => contrib/nfp/configurator/lib}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/lib/config_opts.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/lib/constants.py (96%) rename gbpservice/{ => contrib}/nfp/configurator/lib/data_filter.py (99%) rename gbpservice/{ => contrib}/nfp/configurator/lib/demuxer.py (98%) rename gbpservice/{ => contrib}/nfp/configurator/lib/filter_constants.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/lib/fw_constants.py (91%) rename gbpservice/{ => contrib}/nfp/configurator/lib/generic_config_constants.py (94%) rename gbpservice/{ => contrib}/nfp/configurator/lib/lb_constants.py (97%) rename gbpservice/{ => contrib}/nfp/configurator/lib/lbv2_constants.py (97%) rename gbpservice/{ => contrib}/nfp/configurator/lib/nfp_service_constants.py (91%) rename gbpservice/{ => contrib}/nfp/configurator/lib/schema.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/lib/schema_validator.py (96%) rename gbpservice/{ => contrib}/nfp/configurator/lib/utils.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/lib/vpn_constants.py (95%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers => contrib/nfp/configurator/modules}/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/configurator/modules/configurator.py (98%) rename gbpservice/{ => contrib}/nfp/configurator/run.sh (76%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy => contrib/tests}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common => contrib/tests/unit}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja => contrib/tests/unit/nfp}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy => contrib/tests/unit/nfp/config_orchestrator}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates => contrib/tests/unit/nfp/config_orchestrator/modules}/__init__.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py (99%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils => contrib/tests/unit/nfp/configurator}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network => contrib/tests/unit/nfp/configurator/agents}/__init__.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/agents/test_firewall.py (97%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/agents/test_generic_config.py (97%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/agents/test_lb_agent.py (98%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/agents/test_nfp_service.py (96%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/agents/test_vpn_agent.py (94%) rename gbpservice/{nfp/configurator/drivers/nfp_service => contrib/tests/unit/nfp/configurator/api}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/nfp_service/heat => contrib/tests/unit/nfp/configurator/api/v1}/__init__.py (100%) rename gbpservice/{nfp/configurator/drivers/vpn => contrib/tests/unit/nfp/configurator/api/v1/controllers}/__init__.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py (97%) rename gbpservice/{nfp/configurator/drivers/vpn/vyos => contrib/tests/unit/nfp/configurator/drivers}/__init__.py (100%) rename gbpservice/{nfp/configurator/lib => contrib/tests/unit/nfp/configurator/drivers/firewall}/__init__.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/drivers/firewall/test_asav_fw_driver.py (98%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py (97%) rename gbpservice/{nfp/configurator/modules => contrib/tests/unit/nfp/configurator/drivers/loadbalancer}/__init__.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py (97%) create mode 100644 gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py (85%) create mode 100644 gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/__init__.py rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py (98%) create mode 100644 gbpservice/contrib/tests/unit/nfp/configurator/lib/__init__.py rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/lib/filter_base.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/lib/test_demuxer.py (95%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/lib/test_filter.py (99%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/lib/test_schema_validator.py (98%) create mode 100644 gbpservice/contrib/tests/unit/nfp/configurator/modules/__init__.py rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/modules/test_configurator.py (97%) create mode 100644 gbpservice/contrib/tests/unit/nfp/configurator/test_data/__init__.py rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/test_data/asav_fw_test_data.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/test_data/fw_test_data.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/test_data/lb_test_data.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py (100%) rename gbpservice/{neutron => contrib}/tests/unit/nfp/configurator/test_data/vpn_test_data.py (100%) diff --git a/gbpservice/neutron/tests/unit/nfp/config_orchestrator/__init__.py b/gbpservice/contrib/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/config_orchestrator/__init__.py rename to gbpservice/contrib/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/config_orchestrator/modules/__init__.py b/gbpservice/contrib/nfp/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/config_orchestrator/modules/__init__.py rename to gbpservice/contrib/nfp/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/__init__.py rename to gbpservice/contrib/nfp/config_orchestrator/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/common/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/agents/__init__.py rename to gbpservice/contrib/nfp/config_orchestrator/common/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/common/common.py b/gbpservice/contrib/nfp/config_orchestrator/common/common.py similarity index 98% rename from gbpservice/nfp/config_orchestrator/common/common.py rename to gbpservice/contrib/nfp/config_orchestrator/common/common.py index 982e90b487..573e7c641d 100644 --- a/gbpservice/nfp/config_orchestrator/common/common.py +++ b/gbpservice/contrib/nfp/config_orchestrator/common/common.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.config_orchestrator.common import topics as a_topics +from gbpservice.contrib.nfp.config_orchestrator.common import topics as a_topics from gbpservice.nfp.lib import transport from neutron.common import constants as n_constants diff --git a/gbpservice/nfp/config_orchestrator/common/lbv2_constants.py b/gbpservice/contrib/nfp/config_orchestrator/common/lbv2_constants.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/common/lbv2_constants.py rename to gbpservice/contrib/nfp/config_orchestrator/common/lbv2_constants.py diff --git a/gbpservice/nfp/config_orchestrator/common/topics.py b/gbpservice/contrib/nfp/config_orchestrator/common/topics.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/common/topics.py rename to gbpservice/contrib/nfp/config_orchestrator/common/topics.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/api/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/api/__init__.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/api/v1/__init__.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/config/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/handlers/config/firewall.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/firewall.py similarity index 98% rename from gbpservice/nfp/config_orchestrator/handlers/config/firewall.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/config/firewall.py index ebaeed6bd0..5a7c6ec824 100644 --- a/gbpservice/nfp/config_orchestrator/handlers/config/firewall.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/firewall.py @@ -13,7 +13,7 @@ import ast import copy -from gbpservice.nfp.config_orchestrator.common import common +from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport diff --git a/gbpservice/nfp/config_orchestrator/handlers/config/loadbalancer.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancer.py similarity index 99% rename from gbpservice/nfp/config_orchestrator/handlers/config/loadbalancer.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancer.py index 7d62b37981..bc7fb6131d 100644 --- a/gbpservice/nfp/config_orchestrator/handlers/config/loadbalancer.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancer.py @@ -14,7 +14,7 @@ import copy from gbpservice.nfp.common import constants as const -from gbpservice.nfp.config_orchestrator.common import common +from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport diff --git a/gbpservice/nfp/config_orchestrator/handlers/config/loadbalancerv2.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py similarity index 99% rename from gbpservice/nfp/config_orchestrator/handlers/config/loadbalancerv2.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py index 828b0491f9..aca816ca07 100644 --- a/gbpservice/nfp/config_orchestrator/handlers/config/loadbalancerv2.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py @@ -14,7 +14,7 @@ import copy from gbpservice.nfp.common import constants as const -from gbpservice.nfp.config_orchestrator.common import common +from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport diff --git a/gbpservice/nfp/config_orchestrator/handlers/config/vpn.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/vpn.py similarity index 99% rename from gbpservice/nfp/config_orchestrator/handlers/config/vpn.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/config/vpn.py index b7f430d38d..6daf8daaf9 100644 --- a/gbpservice/nfp/config_orchestrator/handlers/config/vpn.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/vpn.py @@ -12,7 +12,7 @@ import ast import copy -from gbpservice.nfp.config_orchestrator.common import common +from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/event/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/__init__.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/event/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/handlers/event/handler.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/event/handler.py similarity index 99% rename from gbpservice/nfp/config_orchestrator/handlers/event/handler.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/event/handler.py index d1c3b40098..57bfc03f08 100644 --- a/gbpservice/nfp/config_orchestrator/handlers/event/handler.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/event/handler.py @@ -16,7 +16,7 @@ import time import traceback -from gbpservice.nfp.config_orchestrator.common import common +from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.nfp.core.event import Event from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/__init__.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/notification/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/handlers/notification/handler.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py similarity index 98% rename from gbpservice/nfp/config_orchestrator/handlers/notification/handler.py rename to gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py index da5adf448a..1b49fb74e7 100644 --- a/gbpservice/nfp/config_orchestrator/handlers/notification/handler.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py @@ -11,9 +11,9 @@ # under the License. from gbpservice.nfp.common import constants as const -from gbpservice.nfp.config_orchestrator.common import lbv2_constants \ +from gbpservice.contrib.nfp.config_orchestrator.common import lbv2_constants \ as lbv2_const -from gbpservice.nfp.config_orchestrator.common import topics as a_topics +from gbpservice.contrib.nfp.config_orchestrator.common import topics as a_topics from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/modules/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/__init__.py rename to gbpservice/contrib/nfp/config_orchestrator/modules/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/modules/config_orch.py b/gbpservice/contrib/nfp/config_orchestrator/modules/config_orch.py similarity index 88% rename from gbpservice/nfp/config_orchestrator/modules/config_orch.py rename to gbpservice/contrib/nfp/config_orchestrator/modules/config_orch.py index 7b8d412bb3..98341fc31d 100644 --- a/gbpservice/nfp/config_orchestrator/modules/config_orch.py +++ b/gbpservice/contrib/nfp/config_orchestrator/modules/config_orch.py @@ -10,17 +10,17 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.config_orchestrator.common import topics as a_topics -from gbpservice.nfp.config_orchestrator.handlers.config import ( +from gbpservice.contrib.nfp.config_orchestrator.common import topics as a_topics +from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( firewall as fw) -from gbpservice.nfp.config_orchestrator.handlers.config import ( +from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( loadbalancer as lb) -from gbpservice.nfp.config_orchestrator.handlers.config import ( +from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( loadbalancerv2 as lbv2) -from gbpservice.nfp.config_orchestrator.handlers.config import vpn -from gbpservice.nfp.config_orchestrator.handlers.event import ( +from gbpservice.contrib.nfp.config_orchestrator.handlers.config import vpn +from gbpservice.contrib.nfp.config_orchestrator.handlers.event import ( handler as v_handler) -from gbpservice.nfp.config_orchestrator.handlers.notification import ( +from gbpservice.contrib.nfp.config_orchestrator.handlers.notification import ( handler as notif_handler) from gbpservice.nfp.core.rpc import RpcAgent diff --git a/gbpservice/nfp/configurator/Dockerfile b/gbpservice/contrib/nfp/configurator/Dockerfile similarity index 100% rename from gbpservice/nfp/configurator/Dockerfile rename to gbpservice/contrib/nfp/configurator/Dockerfile diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/__init__.py b/gbpservice/contrib/nfp/configurator/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/__init__.py rename to gbpservice/contrib/nfp/configurator/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py b/gbpservice/contrib/nfp/configurator/agents/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py rename to gbpservice/contrib/nfp/configurator/agents/__init__.py diff --git a/gbpservice/nfp/configurator/agents/agent_base.py b/gbpservice/contrib/nfp/configurator/agents/agent_base.py similarity index 99% rename from gbpservice/nfp/configurator/agents/agent_base.py rename to gbpservice/contrib/nfp/configurator/agents/agent_base.py index b59f8c9af8..426027d882 100644 --- a/gbpservice/nfp/configurator/agents/agent_base.py +++ b/gbpservice/contrib/nfp/configurator/agents/agent_base.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.configurator.lib import constants as const +from gbpservice.contrib.nfp.configurator.lib import constants as const from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api diff --git a/gbpservice/nfp/configurator/agents/firewall.py b/gbpservice/contrib/nfp/configurator/agents/firewall.py similarity index 98% rename from gbpservice/nfp/configurator/agents/firewall.py rename to gbpservice/contrib/nfp/configurator/agents/firewall.py index 3bd411db06..78c823f2f4 100644 --- a/gbpservice/nfp/configurator/agents/firewall.py +++ b/gbpservice/contrib/nfp/configurator/agents/firewall.py @@ -14,10 +14,10 @@ import oslo_messaging as messaging import requests -from gbpservice.nfp.configurator.agents import agent_base -from gbpservice.nfp.configurator.lib import constants as common_const -from gbpservice.nfp.configurator.lib import fw_constants as const -from gbpservice.nfp.configurator.lib import utils as load_driver +from gbpservice.contrib.nfp.configurator.agents import agent_base +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import fw_constants as const +from gbpservice.contrib.nfp.configurator.lib import utils as load_driver from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api diff --git a/gbpservice/nfp/configurator/agents/generic_config.py b/gbpservice/contrib/nfp/configurator/agents/generic_config.py similarity index 98% rename from gbpservice/nfp/configurator/agents/generic_config.py rename to gbpservice/contrib/nfp/configurator/agents/generic_config.py index 2965a3a2ff..5e8bb3e59e 100644 --- a/gbpservice/nfp/configurator/agents/generic_config.py +++ b/gbpservice/contrib/nfp/configurator/agents/generic_config.py @@ -12,11 +12,11 @@ import os -from gbpservice.nfp.configurator.agents import agent_base -from gbpservice.nfp.configurator.lib import ( +from gbpservice.contrib.nfp.configurator.agents import agent_base +from gbpservice.contrib.nfp.configurator.lib import ( generic_config_constants as gen_cfg_const) -from gbpservice.nfp.configurator.lib import constants as common_const -from gbpservice.nfp.configurator.lib import utils +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import utils from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api diff --git a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py b/gbpservice/contrib/nfp/configurator/agents/loadbalancer_v1.py similarity index 99% rename from gbpservice/nfp/configurator/agents/loadbalancer_v1.py rename to gbpservice/contrib/nfp/configurator/agents/loadbalancer_v1.py index fb9aec3d74..7246288199 100644 --- a/gbpservice/nfp/configurator/agents/loadbalancer_v1.py +++ b/gbpservice/contrib/nfp/configurator/agents/loadbalancer_v1.py @@ -12,10 +12,10 @@ from neutron import context -from gbpservice.nfp.configurator.agents import agent_base -from gbpservice.nfp.configurator.lib import data_filter -from gbpservice.nfp.configurator.lib import lb_constants -from gbpservice.nfp.configurator.lib import utils +from gbpservice.contrib.nfp.configurator.agents import agent_base +from gbpservice.contrib.nfp.configurator.lib import data_filter +from gbpservice.contrib.nfp.configurator.lib import lb_constants +from gbpservice.contrib.nfp.configurator.lib import utils from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api diff --git a/gbpservice/nfp/configurator/agents/loadbalancer_v2.py b/gbpservice/contrib/nfp/configurator/agents/loadbalancer_v2.py similarity index 99% rename from gbpservice/nfp/configurator/agents/loadbalancer_v2.py rename to gbpservice/contrib/nfp/configurator/agents/loadbalancer_v2.py index 2dd5019d07..1bcaf4c06c 100644 --- a/gbpservice/nfp/configurator/agents/loadbalancer_v2.py +++ b/gbpservice/contrib/nfp/configurator/agents/loadbalancer_v2.py @@ -13,10 +13,10 @@ import os from gbpservice.nfp.common import exceptions -from gbpservice.nfp.configurator.agents import agent_base -from gbpservice.nfp.configurator.lib import data_filter -from gbpservice.nfp.configurator.lib import lbv2_constants as lb_const -from gbpservice.nfp.configurator.lib import utils +from gbpservice.contrib.nfp.configurator.agents import agent_base +from gbpservice.contrib.nfp.configurator.lib import data_filter +from gbpservice.contrib.nfp.configurator.lib import lbv2_constants as lb_const +from gbpservice.contrib.nfp.configurator.lib import utils from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api diff --git a/gbpservice/nfp/configurator/agents/nfp_service.py b/gbpservice/contrib/nfp/configurator/agents/nfp_service.py similarity index 97% rename from gbpservice/nfp/configurator/agents/nfp_service.py rename to gbpservice/contrib/nfp/configurator/agents/nfp_service.py index 41a2cad6c3..6d348bfc52 100644 --- a/gbpservice/nfp/configurator/agents/nfp_service.py +++ b/gbpservice/contrib/nfp/configurator/agents/nfp_service.py @@ -13,9 +13,9 @@ import os import oslo_messaging as messaging -from gbpservice.nfp.configurator.agents import agent_base -from gbpservice.nfp.configurator.lib import nfp_service_constants as const -from gbpservice.nfp.configurator.lib import utils as load_driver +from gbpservice.contrib.nfp.configurator.agents import agent_base +from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const +from gbpservice.contrib.nfp.configurator.lib import utils as load_driver from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core import log as nfp_logging diff --git a/gbpservice/nfp/configurator/agents/vpn.py b/gbpservice/contrib/nfp/configurator/agents/vpn.py similarity index 97% rename from gbpservice/nfp/configurator/agents/vpn.py rename to gbpservice/contrib/nfp/configurator/agents/vpn.py index 2dcb6913c4..c267bd91ea 100644 --- a/gbpservice/nfp/configurator/agents/vpn.py +++ b/gbpservice/contrib/nfp/configurator/agents/vpn.py @@ -13,11 +13,11 @@ import os -from gbpservice.nfp.configurator.agents import agent_base -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.lib import data_filter -from gbpservice.nfp.configurator.lib import utils -from gbpservice.nfp.configurator.lib import vpn_constants as const +from gbpservice.contrib.nfp.configurator.agents import agent_base +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.lib import data_filter +from gbpservice.contrib.nfp.configurator.lib import utils +from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const from gbpservice.nfp.core.event import Event from gbpservice.nfp.core import log as nfp_logging diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/__init__.py b/gbpservice/contrib/nfp/configurator/api/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/__init__.py rename to gbpservice/contrib/nfp/configurator/api/__init__.py diff --git a/gbpservice/nfp/configurator/api/base_controller.py b/gbpservice/contrib/nfp/configurator/api/base_controller.py similarity index 100% rename from gbpservice/nfp/configurator/api/base_controller.py rename to gbpservice/contrib/nfp/configurator/api/base_controller.py diff --git a/gbpservice/nfp/configurator/api/config.py b/gbpservice/contrib/nfp/configurator/api/config.py similarity index 100% rename from gbpservice/nfp/configurator/api/config.py rename to gbpservice/contrib/nfp/configurator/api/config.py diff --git a/gbpservice/nfp/configurator/api/root_controller.py b/gbpservice/contrib/nfp/configurator/api/root_controller.py similarity index 100% rename from gbpservice/nfp/configurator/api/root_controller.py rename to gbpservice/contrib/nfp/configurator/api/root_controller.py diff --git a/gbpservice/nfp/configurator/api/setup.py b/gbpservice/contrib/nfp/configurator/api/setup.py similarity index 100% rename from gbpservice/nfp/configurator/api/setup.py rename to gbpservice/contrib/nfp/configurator/api/setup.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/lib/__init__.py b/gbpservice/contrib/nfp/configurator/api/v1/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/lib/__init__.py rename to gbpservice/contrib/nfp/configurator/api/v1/__init__.py diff --git a/gbpservice/nfp/configurator/api/v1/app.py b/gbpservice/contrib/nfp/configurator/api/v1/app.py similarity index 100% rename from gbpservice/nfp/configurator/api/v1/app.py rename to gbpservice/contrib/nfp/configurator/api/v1/app.py diff --git a/gbpservice/nfp/configurator/api/v1/controllers/__init__.py b/gbpservice/contrib/nfp/configurator/api/v1/controllers/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/api/v1/controllers/__init__.py rename to gbpservice/contrib/nfp/configurator/api/v1/controllers/__init__.py diff --git a/gbpservice/nfp/configurator/api/v1/controllers/controller.py b/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py similarity index 99% rename from gbpservice/nfp/configurator/api/v1/controllers/controller.py rename to gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py index d24c7d92a8..2e352e6b11 100644 --- a/gbpservice/nfp/configurator/api/v1/controllers/controller.py +++ b/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py @@ -19,7 +19,7 @@ import oslo_messaging import pecan -from gbpservice.nfp.configurator.api.base_controller import BaseController +from gbpservice.contrib.nfp.configurator.api.base_controller import BaseController LOG = logging.getLogger(__name__) n_rpc.init(cfg.CONF) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/modules/__init__.py b/gbpservice/contrib/nfp/configurator/config/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/modules/__init__.py rename to gbpservice/contrib/nfp/configurator/config/__init__.py diff --git a/gbpservice/nfp/configurator/config/asav.conf b/gbpservice/contrib/nfp/configurator/config/asav.conf similarity index 100% rename from gbpservice/nfp/configurator/config/asav.conf rename to gbpservice/contrib/nfp/configurator/config/asav.conf diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/test_data/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/base/__init__.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/base/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/base/base_driver.py b/gbpservice/contrib/nfp/configurator/drivers/base/base_driver.py similarity index 98% rename from gbpservice/nfp/configurator/drivers/base/base_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/base/base_driver.py index 2e9041d241..dab884d476 100644 --- a/gbpservice/nfp/configurator/drivers/base/base_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/base/base_driver.py @@ -15,7 +15,7 @@ from oslo_serialization import jsonutils -from gbpservice.nfp.configurator.lib import constants as const +from gbpservice.contrib.nfp.configurator.lib import constants as const from gbpservice.nfp.core import log as nfp_logging LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/config_orchestrator/common/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/__init__.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/common/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/handlers/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/asav/__init__.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/handlers/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/asav/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_constants.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/asav/asav_fw_constants.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_constants.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/asav/asav_fw_constants.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py similarity index 99% rename from gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py index 1f19662ff7..74e95248a3 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/firewall/asav/asav_fw_driver.py @@ -22,11 +22,11 @@ from requests.auth import HTTPBasicAuth -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.drivers.firewall.asav import ( +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.drivers.firewall.asav import ( asav_fw_constants as const) -from gbpservice.nfp.configurator.lib import constants as common_const -from gbpservice.nfp.configurator.lib import fw_constants as fw_const +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import fw_constants as fw_const from gbpservice.nfp.core import log as nfp_logging LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/config_orchestrator/handlers/config/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/paloalto/__init__.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/handlers/config/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/paloalto/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_constants.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_constants.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_constants.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_constants.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_driver.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_driver.py similarity index 99% rename from gbpservice/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_driver.py index b8c06622f9..11824d6c9f 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/firewall/paloalto/paloalto_fw_driver.py @@ -17,11 +17,11 @@ from oslo_serialization import jsonutils -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.drivers.firewall.paloalto import ( +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.drivers.firewall.paloalto import ( paloalto_fw_constants as const) -from gbpservice.nfp.configurator.lib import constants as common_const -from gbpservice.nfp.configurator.lib import fw_constants as fw_const +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import fw_constants as fw_const import sys import json diff --git a/gbpservice/nfp/config_orchestrator/handlers/event/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/__init__.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/handlers/event/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_constants.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_constants.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_constants.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_constants.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py similarity index 98% rename from gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index d96591daaf..6b072714a3 100644 --- a/gbpservice/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -17,11 +17,11 @@ from oslo_serialization import jsonutils -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.drivers.firewall.vyos import ( +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.drivers.firewall.vyos import ( vyos_fw_constants as const) -from gbpservice.nfp.configurator.lib import constants as common_const -from gbpservice.nfp.configurator.lib import fw_constants as fw_const +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import fw_constants as fw_const LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/config_orchestrator/handlers/notification/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/__init__.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/handlers/notification/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/__init__.py diff --git a/gbpservice/nfp/config_orchestrator/modules/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/__init__.py similarity index 100% rename from gbpservice/nfp/config_orchestrator/modules/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/__init__.py diff --git a/gbpservice/nfp/configurator/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py similarity index 99% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py index e6d69b4633..892944a00f 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py @@ -12,11 +12,11 @@ import ast -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( haproxy_rest_client) -from gbpservice.nfp.configurator.lib import constants as common_const -from gbpservice.nfp.configurator.lib import lb_constants +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import lb_constants from gbpservice.nfp.core import log as nfp_logging LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_rest_client.py diff --git a/gbpservice/nfp/configurator/agents/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/agents/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/__init__.py diff --git a/gbpservice/nfp/configurator/api/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/api/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/haproxy_driver.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/haproxy_driver.py similarity index 97% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/haproxy_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/haproxy_driver.py index 47cd357c61..5d539a3055 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/haproxy_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/haproxy_driver.py @@ -17,20 +17,20 @@ from neutron_lbaas.drivers import driver_base as n_driver_base from gbpservice.nfp.common import exceptions -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.drivers.loadbalancer.\ +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.\ v2.haproxy import neutron_lbaas_data_models as n_data_models -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import data_models as o_data_models -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import constants -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ network import data_models as network_data_models -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.\ rest_api_driver import HaproxyAmphoraLoadBalancerDriver -from gbpservice.nfp.configurator.lib import constants as common_const -from gbpservice.nfp.configurator.lib import lb_constants -from gbpservice.nfp.configurator.lib import lbv2_constants +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import lb_constants +from gbpservice.contrib.nfp.configurator.lib import lbv2_constants from gbpservice.nfp.core import log as nfp_logging DRIVER_NAME = 'loadbalancerv2' diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/neutron_lbaas_data_models.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/neutron_lbaas_data_models.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/neutron_lbaas_data_models.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/neutron_lbaas_data_models.py diff --git a/gbpservice/nfp/configurator/api/v1/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/api/v1/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/__init__.py diff --git a/gbpservice/nfp/configurator/config/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/config/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/exceptions.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/exceptions.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/exceptions.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/exceptions.py diff --git a/gbpservice/nfp/configurator/drivers/base/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/base/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/driver_base.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/driver_base.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/driver_base.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/driver_base.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/firewall/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/data_models.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/data_models.py similarity index 97% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/data_models.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/data_models.py index c1e028ce2f..f70b9305bd 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/data_models.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/data_models.py @@ -12,7 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import data_models as models diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/exceptions.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/exceptions.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/exceptions.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/exceptions.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/asav/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/firewall/asav/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/constants.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/constants.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/constants.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/constants.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/data_models.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/data_models.py similarity index 99% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/data_models.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/data_models.py index ec853aa6c5..445c17952f 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/data_models.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/data_models.py @@ -18,7 +18,7 @@ from sqlalchemy.orm import collections -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import constants diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/exceptions.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/exceptions.py similarity index 97% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/exceptions.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/exceptions.py index 4f552d112e..942f652072 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/exceptions.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/exceptions.py @@ -20,9 +20,9 @@ from oslo_utils import excutils from webob import exc -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ i18n import _LE -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ i18n import _LI diff --git a/gbpservice/nfp/configurator/drivers/firewall/paloalto/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/firewall/paloalto/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/firewall/vyos/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/firewall/vyos/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/jinja_cfg.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/jinja_cfg.py similarity index 98% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/jinja_cfg.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/jinja_cfg.py index d0f0736ef7..454b52891f 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/jinja_cfg.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/jinja_cfg.py @@ -19,9 +19,9 @@ import six from oslo_config import cfg -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import constants -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import utils as octavia_utils PROTOCOL_MAP = { diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/base.j2 b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/base.j2 similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/base.j2 rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/base.j2 diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/haproxy.cfg.j2 b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/haproxy.cfg.j2 similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/haproxy.cfg.j2 rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/haproxy.cfg.j2 diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/macros.j2 b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/macros.j2 similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/macros.j2 rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/macros.j2 diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v1/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/cert_parser.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/cert_parser.py similarity index 96% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/cert_parser.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/cert_parser.py index 776a4a70be..2038604b55 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/cert_parser.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/cert_parser.py @@ -19,11 +19,11 @@ from oslo_log import log as logging import six -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import data_models as data_models -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import exceptions -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ i18n import _LE diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/utils.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/utils.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/utils.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/utils.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/i18n.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/i18n.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/i18n.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/i18n.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v1/haproxy/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/data_models.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/data_models.py similarity index 97% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/data_models.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/data_models.py index 9e74c0c9ed..124bba7037 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/data_models.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/data_models.py @@ -12,7 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import data_models diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/rest_api_driver.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/rest_api_driver.py similarity index 95% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/rest_api_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/rest_api_driver.py index 6010d84179..9ab9bd52e0 100644 --- a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/rest_api_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v2/haproxy/rest_api_driver.py @@ -23,22 +23,22 @@ from oslo_config import cfg -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ amphorae.driver_exceptions import exceptions as driver_except -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ amphorae.drivers import driver_base as driver_base -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ amphorae.drivers.haproxy import exceptions as exc # TODO(jiahao): drop vrrp temporarily -# from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib. +# from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib. # amphorae.drivers.keepalived import vrrp_rest_driver -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common.jinja.haproxy import jinja_cfg -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common import constants -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ common.tls_utils import cert_parser -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy.octavia_lib.\ i18n import _LW from gbpservice.nfp.core import log as nfp_logging diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/nfp_service/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/nfp_service/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/nfp_service/heat/heat_driver.py b/gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/heat_driver.py similarity index 89% rename from gbpservice/nfp/configurator/drivers/nfp_service/heat/heat_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/heat_driver.py index bd3e0fe0b8..0596ff34e9 100644 --- a/gbpservice/nfp/configurator/drivers/nfp_service/heat/heat_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/heat_driver.py @@ -13,8 +13,8 @@ from gbpservice.nfp.core import log as nfp_logging -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.lib import nfp_service_constants as const +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/vpn/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/vpn/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/__init__.py b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/__init__.py rename to gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py similarity index 99% rename from gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py rename to gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py index 5f73f97732..3b178d875d 100644 --- a/gbpservice/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py @@ -14,8 +14,8 @@ import copy import requests -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.lib import vpn_constants as const +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const from gbpservice.nfp.core import log as nfp_logging from oslo_concurrency import lockutils diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/__init__.py b/gbpservice/contrib/nfp/configurator/lib/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/driver_exceptions/__init__.py rename to gbpservice/contrib/nfp/configurator/lib/__init__.py diff --git a/gbpservice/nfp/configurator/lib/config_opts.py b/gbpservice/contrib/nfp/configurator/lib/config_opts.py similarity index 100% rename from gbpservice/nfp/configurator/lib/config_opts.py rename to gbpservice/contrib/nfp/configurator/lib/config_opts.py diff --git a/gbpservice/nfp/configurator/lib/constants.py b/gbpservice/contrib/nfp/configurator/lib/constants.py similarity index 96% rename from gbpservice/nfp/configurator/lib/constants.py rename to gbpservice/contrib/nfp/configurator/lib/constants.py index 98b83a5288..b5316fa3c7 100644 --- a/gbpservice/nfp/configurator/lib/constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/constants.py @@ -50,5 +50,5 @@ STATUS_SUCCESS = "SUCCESS" UNHANDLED = "UNHANDLED" -AGENTS_PKG = 'gbpservice.nfp.configurator.agents' +AGENTS_PKG = 'gbpservice.contrib.nfp.configurator.agents' CONFIGURATOR_RPC_TOPIC = 'configurator' diff --git a/gbpservice/nfp/configurator/lib/data_filter.py b/gbpservice/contrib/nfp/configurator/lib/data_filter.py similarity index 99% rename from gbpservice/nfp/configurator/lib/data_filter.py rename to gbpservice/contrib/nfp/configurator/lib/data_filter.py index c58ccfc85e..a5c417455a 100644 --- a/gbpservice/nfp/configurator/lib/data_filter.py +++ b/gbpservice/contrib/nfp/configurator/lib/data_filter.py @@ -12,7 +12,7 @@ import copy -from gbpservice.nfp.configurator.lib import ( +from gbpservice.contrib.nfp.configurator.lib import ( filter_constants as constants) diff --git a/gbpservice/nfp/configurator/lib/demuxer.py b/gbpservice/contrib/nfp/configurator/lib/demuxer.py similarity index 98% rename from gbpservice/nfp/configurator/lib/demuxer.py rename to gbpservice/contrib/nfp/configurator/lib/demuxer.py index 9d92f24bb2..3c4dd80058 100644 --- a/gbpservice/nfp/configurator/lib/demuxer.py +++ b/gbpservice/contrib/nfp/configurator/lib/demuxer.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.configurator.lib import constants as const +from gbpservice.contrib.nfp.configurator.lib import constants as const from gbpservice.nfp.core import log as nfp_logging LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/configurator/lib/filter_constants.py b/gbpservice/contrib/nfp/configurator/lib/filter_constants.py similarity index 100% rename from gbpservice/nfp/configurator/lib/filter_constants.py rename to gbpservice/contrib/nfp/configurator/lib/filter_constants.py diff --git a/gbpservice/nfp/configurator/lib/fw_constants.py b/gbpservice/contrib/nfp/configurator/lib/fw_constants.py similarity index 91% rename from gbpservice/nfp/configurator/lib/fw_constants.py rename to gbpservice/contrib/nfp/configurator/lib/fw_constants.py index d913f082cc..09df5ca694 100644 --- a/gbpservice/nfp/configurator/lib/fw_constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/fw_constants.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -DRIVERS_DIR = 'gbpservice.nfp.configurator.drivers.firewall' +DRIVERS_DIR = 'gbpservice.contrib.nfp.configurator.drivers.firewall' SERVICE_TYPE = 'firewall' FIREWALL_CREATE_EVENT = 'CREATE_FIREWALL' diff --git a/gbpservice/nfp/configurator/lib/generic_config_constants.py b/gbpservice/contrib/nfp/configurator/lib/generic_config_constants.py similarity index 94% rename from gbpservice/nfp/configurator/lib/generic_config_constants.py rename to gbpservice/contrib/nfp/configurator/lib/generic_config_constants.py index 8018a7a10f..995235dca1 100644 --- a/gbpservice/nfp/configurator/lib/generic_config_constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/generic_config_constants.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -DRIVERS_DIR = 'gbpservice.nfp.configurator.drivers' +DRIVERS_DIR = 'gbpservice.contrib.nfp.configurator.drivers' SERVICE_TYPE = 'generic_config' EVENT_CONFIGURE_INTERFACES = 'CONFIGURE_INTERFACES' EVENT_CLEAR_INTERFACES = 'CLEAR_INTERFACES' diff --git a/gbpservice/nfp/configurator/lib/lb_constants.py b/gbpservice/contrib/nfp/configurator/lib/lb_constants.py similarity index 97% rename from gbpservice/nfp/configurator/lib/lb_constants.py rename to gbpservice/contrib/nfp/configurator/lib/lb_constants.py index acd0352bdf..331a547401 100644 --- a/gbpservice/nfp/configurator/lib/lb_constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/lb_constants.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -DRIVERS_DIR = 'gbpservice.nfp.configurator.drivers.loadbalancer.v1' +DRIVERS_DIR = 'gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1' SERVICE_TYPE = 'loadbalancer' NEUTRON = 'neutron' diff --git a/gbpservice/nfp/configurator/lib/lbv2_constants.py b/gbpservice/contrib/nfp/configurator/lib/lbv2_constants.py similarity index 97% rename from gbpservice/nfp/configurator/lib/lbv2_constants.py rename to gbpservice/contrib/nfp/configurator/lib/lbv2_constants.py index 56af89d8c0..575dc454ac 100644 --- a/gbpservice/nfp/configurator/lib/lbv2_constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/lbv2_constants.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -DRIVERS_DIR = 'gbpservice.nfp.configurator.drivers.loadbalancer.v2' +DRIVERS_DIR = 'gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2' SERVICE_TYPE = 'loadbalancerv2' NEUTRON = 'neutron' diff --git a/gbpservice/nfp/configurator/lib/nfp_service_constants.py b/gbpservice/contrib/nfp/configurator/lib/nfp_service_constants.py similarity index 91% rename from gbpservice/nfp/configurator/lib/nfp_service_constants.py rename to gbpservice/contrib/nfp/configurator/lib/nfp_service_constants.py index 853c0398e2..146a19253c 100644 --- a/gbpservice/nfp/configurator/lib/nfp_service_constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/nfp_service_constants.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -DRIVERS_DIR = 'gbpservice.nfp.configurator.drivers.nfp_service' +DRIVERS_DIR = 'gbpservice.contrib.nfp.configurator.drivers.nfp_service' SERVICE_TYPE = 'nfp_service' CREATE_NFP_SERVICE_EVENT = 'CREATE_NFP_SERVICE' UNHANDLED_RESULT = 'unhandled' diff --git a/gbpservice/nfp/configurator/lib/schema.py b/gbpservice/contrib/nfp/configurator/lib/schema.py similarity index 100% rename from gbpservice/nfp/configurator/lib/schema.py rename to gbpservice/contrib/nfp/configurator/lib/schema.py diff --git a/gbpservice/nfp/configurator/lib/schema_validator.py b/gbpservice/contrib/nfp/configurator/lib/schema_validator.py similarity index 96% rename from gbpservice/nfp/configurator/lib/schema_validator.py rename to gbpservice/contrib/nfp/configurator/lib/schema_validator.py index a58077c675..a25ee06a1e 100644 --- a/gbpservice/nfp/configurator/lib/schema_validator.py +++ b/gbpservice/contrib/nfp/configurator/lib/schema_validator.py @@ -12,8 +12,8 @@ from gbpservice.nfp.core import log as nfp_logging -from gbpservice.nfp.configurator.lib import constants as const -import gbpservice.nfp.configurator.lib.schema as schema +from gbpservice.contrib.nfp.configurator.lib import constants as const +import gbpservice.contrib.nfp.configurator.lib.schema as schema LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/nfp/configurator/lib/utils.py b/gbpservice/contrib/nfp/configurator/lib/utils.py similarity index 100% rename from gbpservice/nfp/configurator/lib/utils.py rename to gbpservice/contrib/nfp/configurator/lib/utils.py diff --git a/gbpservice/nfp/configurator/lib/vpn_constants.py b/gbpservice/contrib/nfp/configurator/lib/vpn_constants.py similarity index 95% rename from gbpservice/nfp/configurator/lib/vpn_constants.py rename to gbpservice/contrib/nfp/configurator/lib/vpn_constants.py index f248469cb2..670a10110f 100644 --- a/gbpservice/nfp/configurator/lib/vpn_constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/vpn_constants.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -DRIVERS_DIR = 'gbpservice.nfp.configurator.drivers.vpn' +DRIVERS_DIR = 'gbpservice.contrib.nfp.configurator.drivers.vpn' SERVICE_TYPE = 'vpn' SERVICE_VENDOR = 'vyos' diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/__init__.py b/gbpservice/contrib/nfp/configurator/modules/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/__init__.py rename to gbpservice/contrib/nfp/configurator/modules/__init__.py diff --git a/gbpservice/nfp/configurator/modules/configurator.py b/gbpservice/contrib/nfp/configurator/modules/configurator.py similarity index 98% rename from gbpservice/nfp/configurator/modules/configurator.py rename to gbpservice/contrib/nfp/configurator/modules/configurator.py index 51e0af0ca2..d50528b99c 100644 --- a/gbpservice/nfp/configurator/modules/configurator.py +++ b/gbpservice/contrib/nfp/configurator/modules/configurator.py @@ -12,11 +12,11 @@ from oslo_log import helpers as log_helpers -from gbpservice.nfp.configurator.lib import config_opts -from gbpservice.nfp.configurator.lib import constants as const -from gbpservice.nfp.configurator.lib import demuxer -from gbpservice.nfp.configurator.lib import schema_validator -from gbpservice.nfp.configurator.lib import utils +from gbpservice.contrib.nfp.configurator.lib import config_opts +from gbpservice.contrib.nfp.configurator.lib import constants as const +from gbpservice.contrib.nfp.configurator.lib import demuxer +from gbpservice.contrib.nfp.configurator.lib import schema_validator +from gbpservice.contrib.nfp.configurator.lib import utils from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import rpc diff --git a/gbpservice/nfp/configurator/run.sh b/gbpservice/contrib/nfp/configurator/run.sh similarity index 76% rename from gbpservice/nfp/configurator/run.sh rename to gbpservice/contrib/nfp/configurator/run.sh index 1792208f4c..5a0b8b343e 100644 --- a/gbpservice/nfp/configurator/run.sh +++ b/gbpservice/contrib/nfp/configurator/run.sh @@ -2,7 +2,7 @@ service rabbitmq-server start screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --log-file=/var/log/nfp/nfp_configurator.log -cd /usr/local/lib/python2.7/dist-packages/gbpservice/nfp/configurator/api/ +cd /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/api/ python setup.py develop screen -dmS "pecan" pecan serve config.py /bin/bash diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/__init__.py b/gbpservice/contrib/tests/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/amphorae/drivers/haproxy/__init__.py rename to gbpservice/contrib/tests/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/__init__.py b/gbpservice/contrib/tests/unit/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/__init__.py rename to gbpservice/contrib/tests/unit/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/__init__.py b/gbpservice/contrib/tests/unit/nfp/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/__init__.py rename to gbpservice/contrib/tests/unit/nfp/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/__init__.py b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/__init__.py rename to gbpservice/contrib/tests/unit/nfp/config_orchestrator/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/__init__.py b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/jinja/haproxy/templates/__init__.py rename to gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py similarity index 99% rename from gbpservice/neutron/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py rename to gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py index 34c163865c..f23a72620d 100644 --- a/gbpservice/neutron/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py +++ b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py @@ -10,15 +10,15 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.config_orchestrator.handlers.config import ( +from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( firewall) -from gbpservice.nfp.config_orchestrator.handlers.config import ( +from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( loadbalancer) -from gbpservice.nfp.config_orchestrator.handlers.config import vpn -from gbpservice.nfp.config_orchestrator.handlers.notification import ( +from gbpservice.contrib.nfp.config_orchestrator.handlers.config import vpn +from gbpservice.contrib.nfp.config_orchestrator.handlers.notification import ( handler as notif_handler) -from gbpservice.nfp.config_orchestrator.common import common +from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.nfp.lib import transport import mock from neutron import context as ctx diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/common/tls_utils/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/loadbalancer/v2/haproxy/octavia_lib/network/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/agents/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_firewall.py similarity index 97% rename from gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py rename to gbpservice/contrib/tests/unit/nfp/configurator/agents/test_firewall.py index 8414f88919..26f3f4c68c 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_firewall.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_firewall.py @@ -15,11 +15,11 @@ from neutron.tests import base from oslo_config import cfg -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) -from gbpservice.nfp.configurator.agents import firewall as fw -from gbpservice.nfp.configurator.lib import constants as const -from gbpservice.nfp.configurator.lib import fw_constants as fw_const +from gbpservice.contrib.nfp.configurator.agents import firewall as fw +from gbpservice.contrib.nfp.configurator.lib import constants as const +from gbpservice.contrib.nfp.configurator.lib import fw_constants as fw_const class FWaasRpcManagerTestCase(base.BaseTestCase): diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_generic_config.py similarity index 97% rename from gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py rename to gbpservice/contrib/tests/unit/nfp/configurator/agents/test_generic_config.py index c5350a78b1..73e61b5329 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_generic_config.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_generic_config.py @@ -15,12 +15,12 @@ from neutron.tests import base -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) -from gbpservice.nfp.configurator.agents import generic_config as gc -from gbpservice.nfp.configurator.lib import ( +from gbpservice.contrib.nfp.configurator.agents import generic_config as gc +from gbpservice.contrib.nfp.configurator.lib import ( generic_config_constants as const) -from gbpservice.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import constants as common_const class GenericConfigRpcManagerTestCase(base.BaseTestCase): diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_lb_agent.py similarity index 98% rename from gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py rename to gbpservice/contrib/tests/unit/nfp/configurator/agents/test_lb_agent.py index a8ee850353..6535f28e92 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_lb_agent.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_lb_agent.py @@ -12,12 +12,12 @@ import mock -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( lb_test_data as test_data) -from gbpservice.nfp.configurator.agents import loadbalancer_v1 as lb -from gbpservice.nfp.configurator.lib import constants as const -from gbpservice.nfp.configurator.lib import demuxer -from gbpservice.nfp.configurator.modules import configurator +from gbpservice.contrib.nfp.configurator.agents import loadbalancer_v1 as lb +from gbpservice.contrib.nfp.configurator.lib import constants as const +from gbpservice.contrib.nfp.configurator.lib import demuxer +from gbpservice.contrib.nfp.configurator.modules import configurator from neutron.tests import base """Implement test cases for LBaasRpcSender methods of loadbalancer agent. diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_nfp_service.py similarity index 96% rename from gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py rename to gbpservice/contrib/tests/unit/nfp/configurator/agents/test_nfp_service.py index e8c4f13408..3ba62cd75b 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_nfp_service.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_nfp_service.py @@ -14,10 +14,10 @@ from neutron.tests import base -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( nfp_service_test_data as fo) -from gbpservice.nfp.configurator.agents import nfp_service as ns -from gbpservice.nfp.configurator.lib import nfp_service_constants as const +from gbpservice.contrib.nfp.configurator.agents import nfp_service as ns +from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const class NfpServiceRpcManagerTestCase(base.BaseTestCase): diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_vpn_agent.py similarity index 94% rename from gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py rename to gbpservice/contrib/tests/unit/nfp/configurator/agents/test_vpn_agent.py index 2c5e070346..efe1c973d0 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/agents/test_vpn_agent.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_vpn_agent.py @@ -13,10 +13,10 @@ import mock -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( vpn_test_data) -from gbpservice.nfp.configurator.agents import vpn -from gbpservice.nfp.configurator.lib import vpn_constants as const +from gbpservice.contrib.nfp.configurator.agents import vpn +from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const from neutron.tests import base diff --git a/gbpservice/nfp/configurator/drivers/nfp_service/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/api/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/nfp_service/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/api/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/nfp_service/heat/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/nfp_service/heat/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/api/v1/__init__.py diff --git a/gbpservice/nfp/configurator/drivers/vpn/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/vpn/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py similarity index 97% rename from gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py rename to gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py index 44b6d99d21..224600a8a5 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py @@ -15,7 +15,7 @@ import os import oslo_serialization.jsonutils as jsonutils import pecan -PECAN_CONFIG_FILE = os.getcwd() + "/gbpservice/nfp/configurator/api/config.py" +PECAN_CONFIG_FILE = os.getcwd() + "/gbpservice/contrib/nfp/configurator/api/config.py" pecan.set_config(PECAN_CONFIG_FILE, overwrite=True) import unittest import webtest @@ -23,8 +23,8 @@ from pecan import rest -from gbpservice.nfp.configurator.api import root_controller -from gbpservice.nfp.configurator.api.v1.controllers import controller +from gbpservice.contrib.nfp.configurator.api import root_controller +from gbpservice.contrib.nfp.configurator.api.v1.controllers import controller """This class contains all the unittest cases for REST server of configurator. diff --git a/gbpservice/nfp/configurator/drivers/vpn/vyos/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/drivers/vpn/vyos/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/__init__.py diff --git a/gbpservice/nfp/configurator/lib/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/lib/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_asav_fw_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_asav_fw_driver.py similarity index 98% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_asav_fw_driver.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_asav_fw_driver.py index acd3dc9be1..7ea2c3e90d 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_asav_fw_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_asav_fw_driver.py @@ -17,9 +17,9 @@ from oslo_config import cfg from oslo_serialization import jsonutils -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( asav_fw_test_data as fo) -from gbpservice.nfp.configurator.drivers.firewall.asav import ( +from gbpservice.contrib.nfp.configurator.drivers.firewall.asav import ( asav_fw_driver as fw_dvr) diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py similarity index 97% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index 977583b619..3eaa9e57f1 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -17,11 +17,11 @@ from oslo_config import cfg from oslo_serialization import jsonutils -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) -from gbpservice.nfp.configurator.drivers.firewall.vyos import ( +from gbpservice.contrib.nfp.configurator.drivers.firewall.vyos import ( vyos_fw_driver as fw_dvr) -from gbpservice.nfp.configurator.lib import constants as const +from gbpservice.contrib.nfp.configurator.lib import constants as const class FwGenericConfigDriverTestCase(base.BaseTestCase): diff --git a/gbpservice/nfp/configurator/modules/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/__init__.py similarity index 100% rename from gbpservice/nfp/configurator/modules/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py similarity index 97% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py index 7844ce8a1b..5a53d271ac 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py @@ -12,12 +12,12 @@ import mock -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( lb_test_data as test_data) -from gbpservice.nfp.configurator.agents import loadbalancer_v1 as lb -from gbpservice.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( +from gbpservice.contrib.nfp.configurator.agents import loadbalancer_v1 as lb +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( haproxy_lb_driver as lb_driver) -from gbpservice.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( haproxy_rest_client as _rest_client) from neutron.tests import base from oslo_serialization import jsonutils diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py similarity index 85% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py index 1501286933..889cf0fc76 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py @@ -12,11 +12,11 @@ from neutron.tests import base -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( nfp_service_test_data as fo) -from gbpservice.nfp.configurator.drivers.nfp_service.heat.heat_driver import ( +from gbpservice.contrib.nfp.configurator.drivers.nfp_service.heat.heat_driver import ( HeatDriver) -from gbpservice.nfp.configurator.lib import nfp_service_constants as const +from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const class NfpServiceHeatDriverTestCase(base.BaseTestCase): diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py similarity index 98% rename from gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py rename to gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py index b4518f515b..f2b37c3410 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py @@ -12,11 +12,11 @@ import requests -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( vpn_test_data) -from gbpservice.nfp.configurator.agents import vpn -from gbpservice.nfp.configurator.drivers.base import base_driver -from gbpservice.nfp.configurator.drivers.vpn.vyos import vyos_vpn_driver +from gbpservice.contrib.nfp.configurator.agents import vpn +from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.drivers.vpn.vyos import vyos_vpn_driver from oslo_serialization import jsonutils from neutron.tests import base diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/lib/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/lib/filter_base.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/filter_base.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/lib/filter_base.py rename to gbpservice/contrib/tests/unit/nfp/configurator/lib/filter_base.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/lib/test_demuxer.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_demuxer.py similarity index 95% rename from gbpservice/neutron/tests/unit/nfp/configurator/lib/test_demuxer.py rename to gbpservice/contrib/tests/unit/nfp/configurator/lib/test_demuxer.py index dd076622cb..88123894d5 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/lib/test_demuxer.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_demuxer.py @@ -12,9 +12,9 @@ import unittest -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) -from gbpservice.nfp.configurator.lib import demuxer +from gbpservice.contrib.nfp.configurator.lib import demuxer """ Implements test cases for demuxer of configurator. diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/lib/test_filter.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_filter.py similarity index 99% rename from gbpservice/neutron/tests/unit/nfp/configurator/lib/test_filter.py rename to gbpservice/contrib/tests/unit/nfp/configurator/lib/test_filter.py index d70572345d..b519dedc59 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/lib/test_filter.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_filter.py @@ -12,7 +12,7 @@ import filter_base -from gbpservice.nfp.configurator.lib import data_filter +from gbpservice.contrib.nfp.configurator.lib import data_filter import mock """Test class to test data_filter.py using unittest framework diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/lib/test_schema_validator.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_schema_validator.py similarity index 98% rename from gbpservice/neutron/tests/unit/nfp/configurator/lib/test_schema_validator.py rename to gbpservice/contrib/tests/unit/nfp/configurator/lib/test_schema_validator.py index 080ac7937d..5e3b9f7ad9 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/lib/test_schema_validator.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_schema_validator.py @@ -10,8 +10,8 @@ # License for the specific language governing permissions and limitations # under the License. -import gbpservice.nfp.configurator.lib.schema as schema -import gbpservice.nfp.configurator.lib.schema_validator as sv +import gbpservice.contrib.nfp.configurator.lib.schema as schema +import gbpservice.contrib.nfp.configurator.lib.schema_validator as sv import unittest diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/modules/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/modules/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/modules/test_configurator.py b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py similarity index 97% rename from gbpservice/neutron/tests/unit/nfp/configurator/modules/test_configurator.py rename to gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py index b2a2503ba4..20ee9e1a9f 100644 --- a/gbpservice/neutron/tests/unit/nfp/configurator/modules/test_configurator.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py @@ -15,12 +15,12 @@ from oslo_log import log as logging -from gbpservice.neutron.tests.unit.nfp.configurator.test_data import ( +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) -from gbpservice.nfp.configurator.agents import firewall as fw -from gbpservice.nfp.configurator.agents import generic_config as gc -from gbpservice.nfp.configurator.lib import demuxer as demuxer_lib -from gbpservice.nfp.configurator.modules import configurator as cfgr +from gbpservice.contrib.nfp.configurator.agents import firewall as fw +from gbpservice.contrib.nfp.configurator.agents import generic_config as gc +from gbpservice.contrib.nfp.configurator.lib import demuxer as demuxer_lib +from gbpservice.contrib.nfp.configurator.modules import configurator as cfgr LOG = logging.getLogger(__name__) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/test_data/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/test_data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/asav_fw_test_data.py b/gbpservice/contrib/tests/unit/nfp/configurator/test_data/asav_fw_test_data.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/test_data/asav_fw_test_data.py rename to gbpservice/contrib/tests/unit/nfp/configurator/test_data/asav_fw_test_data.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py b/gbpservice/contrib/tests/unit/nfp/configurator/test_data/fw_test_data.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/test_data/fw_test_data.py rename to gbpservice/contrib/tests/unit/nfp/configurator/test_data/fw_test_data.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/lb_test_data.py b/gbpservice/contrib/tests/unit/nfp/configurator/test_data/lb_test_data.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/test_data/lb_test_data.py rename to gbpservice/contrib/tests/unit/nfp/configurator/test_data/lb_test_data.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py b/gbpservice/contrib/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py rename to gbpservice/contrib/tests/unit/nfp/configurator/test_data/nfp_service_test_data.py diff --git a/gbpservice/neutron/tests/unit/nfp/configurator/test_data/vpn_test_data.py b/gbpservice/contrib/tests/unit/nfp/configurator/test_data/vpn_test_data.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/configurator/test_data/vpn_test_data.py rename to gbpservice/contrib/tests/unit/nfp/configurator/test_data/vpn_test_data.py diff --git a/gbpservice/nfp/bin/nfp_config_orch.ini b/gbpservice/nfp/bin/nfp_config_orch.ini index d2cb106154..abd3fbeebe 100644 --- a/gbpservice/nfp/bin/nfp_config_orch.ini +++ b/gbpservice/nfp/bin/nfp_config_orch.ini @@ -4,7 +4,7 @@ debug=False kombu_reconnect_delay=1.0 rabbit_use_ssl=False rabbit_virtual_host=/ -nfp_modules_path=gbpservice.nfp.config_orchestrator.modules +nfp_modules_path=gbpservice.contrib.nfp.config_orchestrator.modules backend=rpc [RPC] diff --git a/gbpservice/nfp/bin/nfp_configurator.ini b/gbpservice/nfp/bin/nfp_configurator.ini index 52279c94a4..6d0beae9fd 100644 --- a/gbpservice/nfp/bin/nfp_configurator.ini +++ b/gbpservice/nfp/bin/nfp_configurator.ini @@ -14,7 +14,7 @@ rabbit_use_ssl=False rabbit_virtual_host=/ workers=2 -nfp_modules_path=gbpservice.nfp.configurator.modules +nfp_modules_path=gbpservice.contrib.nfp.configurator.modules reportstate_interval=10 periodic_interval=2 diff --git a/gbpservice/nfp/bin/startup/redhat/nfp_pecan.service b/gbpservice/nfp/bin/startup/redhat/nfp_pecan.service index e1d7e6237d..446466fb4b 100644 --- a/gbpservice/nfp/bin/startup/redhat/nfp_pecan.service +++ b/gbpservice/nfp/bin/startup/redhat/nfp_pecan.service @@ -3,7 +3,7 @@ Description=One Convergence NFP Rest Server After=syslog.target network.target [Service] -ExecStart=sudo pecan serve /usr/local/lib/python2.7/dist-packages/gbpservice/nfp/configurator/api/config.py +ExecStart=sudo pecan serve /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/api/config.py Restart=on-abort [Install] diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index 35b079dcf9..de9a6dc47b 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -25,7 +25,7 @@ function create_port_for_vm { function configure_vis_ip_addr_in_docker { echo "Visibility VM IP address is: $IpAddr" - sed -i "s/VIS_VM_IP_ADDRESS/"$IpAddr"/" $NFPSERVICE_DIR/gbpservice/nfp/configurator/Dockerfile + sed -i "s/VIS_VM_IP_ADDRESS/"$IpAddr"/" $NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator/Dockerfile } function create_images { diff --git a/gbpservice/nfp/scripts/mode_shift.sh.enterprise b/gbpservice/nfp/scripts/mode_shift.sh.enterprise index 3aa6f31288..568840010f 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh.enterprise +++ b/gbpservice/nfp/scripts/mode_shift.sh.enterprise @@ -47,7 +47,7 @@ function create_port_for_vm { function configure_vis_ip_addr_in_docker { echo "Visibility VM IP address is: $visibility_ip" - sed -i "s/VIS_VM_IP_ADDRESS/"$visibility_ip"/" $NFPSERVICE_DIR/gbpservice/nfp/configurator/Dockerfile + sed -i "s/VIS_VM_IP_ADDRESS/"$visibility_ip"/" $NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator/Dockerfile } function create_images { diff --git a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py b/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py index 82c586b59e..0d50dddc09 100644 --- a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py +++ b/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py @@ -16,7 +16,7 @@ from oslo_utils import uuidutils from sqlalchemy import orm -from gbpservice.nfp.config_orchestrator.common import topics +from gbpservice.contrib.nfp.config_orchestrator.common import topics import neutron_fwaas.extensions from neutron_fwaas.services.firewall import fwaas_plugin as ref_fw_plugin diff --git a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py b/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py index 1584f3d6ab..11a882ed74 100644 --- a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py +++ b/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py @@ -15,7 +15,7 @@ from oslo_utils import uuidutils from sqlalchemy import orm -from gbpservice.nfp.config_orchestrator.common import topics +from gbpservice.contrib.nfp.config_orchestrator.common import topics import neutron_fwaas.extensions from neutron_fwaas.services.firewall import fwaas_plugin as ref_fw_plugin diff --git a/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py b/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py index 96b7c524d3..d53bfe4b49 100644 --- a/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py +++ b/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py @@ -1,5 +1,5 @@ -from gbpservice.nfp.config_orchestrator.common import topics -from gbpservice.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( +from gbpservice.contrib.nfp.config_orchestrator.common import topics +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( haproxy_lb_driver ) from neutron_lbaas.services.loadbalancer.drivers.common import ( diff --git a/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py b/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py index a818f3357c..fa96b52fac 100644 --- a/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py +++ b/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py @@ -10,8 +10,8 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.config_orchestrator.common import topics -from gbpservice.nfp.configurator.drivers.loadbalancer.v2.haproxy import ( +from gbpservice.contrib.nfp.config_orchestrator.common import topics +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy import ( haproxy_driver ) from neutron_lbaas.drivers.common import agent_driver_base as adb diff --git a/gbpservice/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py b/gbpservice/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py index 0a1211d7cc..9f64d55cfe 100644 --- a/gbpservice/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py +++ b/gbpservice/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py @@ -13,7 +13,7 @@ import socket import time -from gbpservice.nfp.config_orchestrator.common import topics +from gbpservice.contrib.nfp.config_orchestrator.common import topics from neutron_lib import exceptions from neutron.common import rpc as n_rpc from neutron.db import agents_db diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py index c8c825e8d4..e4295faa98 100755 --- a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py @@ -37,7 +37,7 @@ def set_nfp_git_branch(nfp_branch_name, configurator_dir): def create_configurator_docker(nfp_branch_name): - configurator_dir = "%s/../../../nfp/configurator" % cur_dir + configurator_dir = "%s/../../../contrib/nfp/configurator" % cur_dir docker_images = "%s/output/docker_images/" % cur_dir if not os.path.exists(docker_images): os.makedirs(docker_images) diff --git a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py index 011ad07b45..eadfd4f05a 100755 --- a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py @@ -76,7 +76,7 @@ def set_nfp_git_branch(nfp_branch_name, configurator_dir): def create_configurator_docker(nfp_branch_name): - configurator_dir = "%s/../../../nfp/configurator" % cur_dir + configurator_dir = "%s/../../../contrib/nfp/configurator" % cur_dir docker_images = "%s/output/docker_images/" % cur_dir if not os.path.exists(docker_images): os.makedirs(docker_images) From 03d6cf94e2c0d6860169b26f94c29f56ec36cff9 Mon Sep 17 00:00:00 2001 From: pkharat Date: Sun, 17 Jul 2016 15:51:02 +0530 Subject: [PATCH 074/157] Adding back DRIVER_NAME which is used in LB plugin --- .../drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py index 892944a00f..a641accc24 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py @@ -21,6 +21,8 @@ LOG = nfp_logging.getLogger(__name__) +DRIVER_NAME = 'loadbalancer' + class LbGenericConfigDriver(object): """ Loadbalancer generic configuration driver class for handling device @@ -454,6 +456,10 @@ def _delete_pool_health_monitor(self, hm, pool_id, except Exception as e: raise e + @classmethod + def get_name(self): + return DRIVER_NAME + def get_stats(self, pool_id): stats = {} try: @@ -465,8 +471,8 @@ def get_stats(self, pool_id): device_addr = self._get_device_for_pool(pool_id, None) # create REST client object - client = self._get_rest_client(device_addr) + client = self._get_rest_client(device_addr) stats = client.get_resource('stats/%s' % pool_id) for key, value in stats.get('members', {}).items(): From 5ec7e74244c5d4767ecd937b0ba14d2d8e943106 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 18 Jul 2016 11:18:13 +0530 Subject: [PATCH 075/157] Since the patch ain't submitted, we need to point to our repo. Once submitted, we can point to master of gbp openstack repo --- .cache/v/cache/lastfailed | 4 ++++ gbpservice/contrib/nfp/configurator/Dockerfile | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .cache/v/cache/lastfailed diff --git a/.cache/v/cache/lastfailed b/.cache/v/cache/lastfailed new file mode 100644 index 0000000000..db5cd39fc5 --- /dev/null +++ b/.cache/v/cache/lastfailed @@ -0,0 +1,4 @@ +{ + "gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py::ControllerTestCase::test_call": true, + "gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py::ControllerTestCase::test_cast": true +} \ No newline at end of file diff --git a/gbpservice/contrib/nfp/configurator/Dockerfile b/gbpservice/contrib/nfp/configurator/Dockerfile index db93462911..d3983929c4 100644 --- a/gbpservice/contrib/nfp/configurator/Dockerfile +++ b/gbpservice/contrib/nfp/configurator/Dockerfile @@ -47,8 +47,9 @@ RUN git clone -b stable/mitaka --single-branch https://github.com/openstack/neut RUN cp -r /neutron_lib/neutron_lib /usr/local/lib/python2.7/dist-packages/ RUN git clone -b stable/mitaka --single-branch https://github.com/openstack/neutron.git neutron RUN cp -r /neutron/neutron /usr/local/lib/python2.7/dist-packages/ -RUN git clone https://github.com/openstack/group-based-policy.git group-based-policy -RUN cd /group-based-policy && git fetch https://git.openstack.org/openstack/group-based-policy GIT-BRANCH-NAME && git checkout FETCH_HEAD +RUN git clone -b GIT-BRANCH-NAME --single-branch https://github.com/oneconvergence/group-based-policy.git group-based-policy +# RUN git clone https://github.com/openstack/group-based-policy.git group-based-policy +# RUN cd /group-based-policy && git fetch https://git.openstack.org/openstack/group-based-policy GIT-BRANCH-NAME && git checkout FETCH_HEAD RUN cp -r /group-based-policy/gbpservice /usr/local/lib/python2.7/dist-packages/ RUN cp /group-based-policy/gbpservice/nfp/bin/nfp /usr/bin/ RUN chmod +x /usr/bin/nfp From 68ecf0b23d8a218ae09b16ccc2519dad7cd5ca66 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 18 Jul 2016 11:20:03 +0530 Subject: [PATCH 076/157] Since the patch ain't submitted, we need to point to our repo. Once submitted, we can point to master of gbp openstack repo --- .cache/v/cache/lastfailed | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .cache/v/cache/lastfailed diff --git a/.cache/v/cache/lastfailed b/.cache/v/cache/lastfailed deleted file mode 100644 index db5cd39fc5..0000000000 --- a/.cache/v/cache/lastfailed +++ /dev/null @@ -1,4 +0,0 @@ -{ - "gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py::ControllerTestCase::test_call": true, - "gbpservice/neutron/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py::ControllerTestCase::test_cast": true -} \ No newline at end of file From 40afd87674d2cc3be529e0365848038410c17646 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 18 Jul 2016 11:46:35 +0530 Subject: [PATCH 077/157] vyos image creation script picked image from a wrong location. Now fixed --- .../tests/contrib/diskimage-create/vyos/vyos_image_create.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py index c5dcfa8efc..5fd3ca9488 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py @@ -84,7 +84,7 @@ def packer_build(): image_path = "%s/output/%s.qcow2" % (cur_dir, "vyos") print("Image location: %s" % image_path) - with open("/tmp/image_path", "w") as f: + with open("%s/../output/last_built_image_path" % cur_dir, "w") as f: f.write(image_path) f.close() From 8e05ba26433cc5259b33827852f17c9788755997 Mon Sep 17 00:00:00 2001 From: Rahul Shikhare Date: Mon, 18 Jul 2016 12:45:01 +0530 Subject: [PATCH 078/157] enterprise code seperation from advance model code and pep8 error fix. --- .../handlers/config/loadbalancerv2.py | 2 +- .../handlers/event/__init__.py | 0 .../handlers/notification/handler.py | 25 +++++++------ .../modules/config_orch.py | 34 +---------------- .../handler.py => modules/enterprise.py} | 37 ++++++++++++++++--- .../modules/test_config_orch.py | 22 +++++------ 6 files changed, 60 insertions(+), 60 deletions(-) delete mode 100644 gbpservice/contrib/nfp/config_orchestrator/handlers/event/__init__.py rename gbpservice/contrib/nfp/config_orchestrator/{handlers/event/handler.py => modules/enterprise.py} (94%) diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py index aca816ca07..955e085d2a 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py @@ -172,7 +172,7 @@ def _fetch_nf_from_resource_desc(self, desc): nf_id = desc_dict['network_function_id'] return nf_id - #TODO(jiahao): Argument allocate_vip and + # TODO(jiahao): Argument allocate_vip and # delete_vip_port are not implememnted. @log_helpers.log_method_call def create_loadbalancer(self, context, loadbalancer, driver_name, diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/event/__init__.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/event/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py index 1b49fb74e7..d9771a7910 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py @@ -11,9 +11,10 @@ # under the License. from gbpservice.nfp.common import constants as const -from gbpservice.contrib.nfp.config_orchestrator.common import lbv2_constants \ - as lbv2_const -from gbpservice.contrib.nfp.config_orchestrator.common import topics as a_topics +from gbpservice.contrib.nfp.config_orchestrator.common import ( + lbv2_constants as lbv2_const) +from gbpservice.contrib.nfp.config_orchestrator.common import ( + topics as a_topics) from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport @@ -53,10 +54,11 @@ def network_function_notification(self, context, notification_data): except Exception as e: exc_type, exc_value, exc_traceback = sys.exc_info() msg = ("Generic exception (%s) while handling message (%s) : %s" - % (e, notification_data, traceback.format_exception( - exc_type, - exc_value, - exc_traceback))) + % (e, + notification_data, + traceback.format_exception(exc_type, + exc_value, + exc_traceback))) LOG.info(msg) @@ -302,8 +304,9 @@ def handle_notification(self, context, notification_data): except Exception as e: exc_type, exc_value, exc_traceback = sys.exc_info() msg = ("Generic exception (%s) while handling message (%s) : %s" - % (e, notification_data, traceback.format_exception( - exc_type, - exc_value, - exc_traceback))) + % (e, + notification_data, + traceback.format_exception(exc_type, + exc_value, + exc_traceback))) LOG.error(msg) diff --git a/gbpservice/contrib/nfp/config_orchestrator/modules/config_orch.py b/gbpservice/contrib/nfp/config_orchestrator/modules/config_orch.py index 98341fc31d..5df4a491ee 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/modules/config_orch.py +++ b/gbpservice/contrib/nfp/config_orchestrator/modules/config_orch.py @@ -10,7 +10,8 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.contrib.nfp.config_orchestrator.common import topics as a_topics +from gbpservice.contrib.nfp.config_orchestrator.common import ( + topics as a_topics) from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( firewall as fw) from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( @@ -18,16 +19,11 @@ from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( loadbalancerv2 as lbv2) from gbpservice.contrib.nfp.config_orchestrator.handlers.config import vpn -from gbpservice.contrib.nfp.config_orchestrator.handlers.event import ( - handler as v_handler) from gbpservice.contrib.nfp.config_orchestrator.handlers.notification import ( handler as notif_handler) from gbpservice.nfp.core.rpc import RpcAgent -from gbpservice.nfp.lib import transport -from neutron import context as n_context from oslo_config import cfg -import time def rpc_init(sc, conf): @@ -107,31 +103,5 @@ def rpc_init(sc, conf): sc.register_rpc_agents([fwagent, lbagent, lbv2agent, vpnagent, rpcagent]) -def events_init(sc, conf): - """Register event with its handler.""" - evs = v_handler.event_init(sc, conf) - sc.register_events(evs) - - def nfp_module_init(sc, conf): rpc_init(sc, conf) - events_init(sc, conf) - - -def nfp_module_post_init(sc, conf): - ev = sc.new_event(id='SERVICE_OPERATION_POLL_EVENT', - key='SERVICE_OPERATION_POLL_EVENT') - sc.post_event(ev) - - uptime = time.strftime("%c") - body = {'eventdata': {'uptime': uptime, - 'module': 'config_orchestrator'}, - 'eventid': 'NFP_UP_TIME', - 'eventtype': 'NFP_CONTROLLER'} - context = n_context.Context('config_agent_user', 'config_agent_tenant') - transport.send_request_to_configurator(conf, - context, - body, - 'CREATE', - network_function_event=True, - override_backend='tcp_rest') diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/event/handler.py b/gbpservice/contrib/nfp/config_orchestrator/modules/enterprise.py similarity index 94% rename from gbpservice/contrib/nfp/config_orchestrator/handlers/event/handler.py rename to gbpservice/contrib/nfp/config_orchestrator/modules/enterprise.py index 57bfc03f08..0a3cb15329 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/event/handler.py +++ b/gbpservice/contrib/nfp/config_orchestrator/modules/enterprise.py @@ -17,10 +17,10 @@ import traceback from gbpservice.contrib.nfp.config_orchestrator.common import common -from gbpservice.nfp.core.event import Event -from gbpservice.nfp.core import log as nfp_logging -from gbpservice.nfp.core import module as nfp_api -from gbpservice.nfp.lib import transport +from gbpservice.contrib.nfp.core.event import Event +from gbpservice.contrib.nfp.core import log as nfp_logging +from gbpservice.contrib.nfp.core import module as nfp_api +from gbpservice.contrib.nfp.lib import transport from neutron import context as n_context from neutron_fwaas.db.firewall import firewall_db @@ -56,7 +56,34 @@ def event_init(sc, conf): handler=EventsHandler(sc, conf)), Event(id='SERVICE_CREATE_PENDING', handler=EventsHandler(sc, conf))] - return evs + + sc.register_events(evs) + + +def nfp_module_init(sc, conf): + event_init(sc, conf) + + +def nfp_module_post_init(sc, conf): + try: + ev = sc.new_event(id='SERVICE_OPERATION_POLL_EVENT', + key='SERVICE_OPERATION_POLL_EVENT') + sc.post_event(ev) + except Exception as e: + msg = ("%s" % (e)) + LOG.error(msg) + uptime = time.strftime("%c") + body = {'eventdata': {'uptime': uptime, + 'module': 'config_orchestrator'}, + 'eventid': 'NFP_UP_TIME', + 'eventtype': 'NFP_CONTROLLER'} + context = n_context.Context('config_agent_user', 'config_agent_tenant') + transport.send_request_to_configurator(conf, + context, + body, + 'CREATE', + network_function_event=True, + override_backend='tcp_rest') """Periodic Class to service events for visiblity.""" diff --git a/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py index f23a72620d..deab9b49dd 100644 --- a/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py +++ b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py @@ -286,7 +286,7 @@ def _cast_loadbalancer(self, conf, context, body, def _call_to_get_network_function_desc(self): data = call_network_function_info() data['network_function']['description'] = ("\n" + str( - {'service_vendor': 'xyz'})) + {'service_vendor': 'xyz'})) return data['network_function'] def _call_data(self, context, method, **kwargs): @@ -611,8 +611,8 @@ def _cast_vpn(self, conf, context, body, def _call_data(self, context, method, **kwargs): if method.lower() == "get_network_function_details": data = call_network_function_info() - data['network_function']['description'] = ("\n" + - ("ipsec_site_connection_id=%s;service_vendor=xyz" % ( + data['network_function']['description'] = ("\n" + ( + "ipsec_site_connection_id=%s;service_vendor=xyz" % ( str(uuid.uuid4())))) return data['network_function'] @@ -639,8 +639,8 @@ def _prepare_request_data(self, reason, rsrc_type): def _call_to_get_network_function_desc(self): data = call_network_function_info() - data['network_function']['description'] = ("\n" + - ("ipsec_site_connection_id=%s;service_vendor=xyz" % ( + data['network_function']['description'] = ("\n" + ( + "ipsec_site_connection_id=%s;service_vendor=xyz" % ( str(uuid.uuid4())))) return data['network_function'] @@ -745,7 +745,7 @@ def get_notification_data(self): def test_set_firewall_status(self): notification_data = self.get_notification_data() rpc_client = self._get_rpc_client() - transport.RPCClient = mock.MagicMock(return_value = rpc_client) + transport.RPCClient = mock.MagicMock(return_value=rpc_client) self.n_handler.handle_notification(self.context, notification_data) @@ -754,7 +754,7 @@ def test_set_firewall_deleted(self): notification_data['notification'][0]['data'][ 'notification_type'] = 'firewall_deleted' rpc_client = self._get_rpc_client() - transport.RPCClient = mock.MagicMock(return_value = rpc_client) + transport.RPCClient = mock.MagicMock(return_value=rpc_client) self.n_handler.handle_notification(self.context, notification_data) @@ -778,7 +778,7 @@ def setUp(self): def _get_rpc_client(self): class Context(object): def cast(self, context, method, host='', pool_id='', - stats ='', body=''): + stats='', body=''): return {} class RCPClient(object): @@ -802,7 +802,7 @@ def get_notification_data(self): def test_update_status(self): notification_data = self.get_notification_data() rpc_client = self._get_rpc_client() - transport.RPCClient = mock.MagicMock(return_value = rpc_client) + transport.RPCClient = mock.MagicMock(return_value=rpc_client) self.n_handler.handle_notification(self.context, notification_data) @@ -811,7 +811,7 @@ def test_update_pool_stats(self): notification_data['notification'][0]['data'][ 'notification_type'] = 'update_pool_stats' rpc_client = self._get_rpc_client() - transport.RPCClient = mock.MagicMock(return_value = rpc_client) + transport.RPCClient = mock.MagicMock(return_value=rpc_client) self.n_handler.handle_notification(self.context, notification_data) @@ -857,7 +857,7 @@ def get_notification_data(self): def test_update_status(self): notification_data = self.get_notification_data() rpc_client = self._get_rpc_client() - transport.RPCClient = mock.MagicMock(return_value = rpc_client) + transport.RPCClient = mock.MagicMock(return_value=rpc_client) self.n_handler.handle_notification(self.context, notification_data) From 0563ef74b8bce79ad2976a7ffaa55b58af4cad15 Mon Sep 17 00:00:00 2001 From: Rahul Shikhare Date: Mon, 18 Jul 2016 13:03:41 +0530 Subject: [PATCH 079/157] Ran runtest.sh and fixed flake8 errors. --- gbpservice/contrib/nfp/config_orchestrator/common/common.py | 3 ++- .../nfp/config_orchestrator/handlers/config/loadbalancer.py | 2 +- .../nfp/config_orchestrator/handlers/config/loadbalancerv2.py | 2 +- .../nfp/config_orchestrator/handlers/notification/handler.py | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gbpservice/contrib/nfp/config_orchestrator/common/common.py b/gbpservice/contrib/nfp/config_orchestrator/common/common.py index 573e7c641d..fb6cd7475c 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/common/common.py +++ b/gbpservice/contrib/nfp/config_orchestrator/common/common.py @@ -10,7 +10,8 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.contrib.nfp.config_orchestrator.common import topics as a_topics +from gbpservice.contrib.nfp.config_orchestrator.common import ( + topics as a_topics) from gbpservice.nfp.lib import transport from neutron.common import constants as n_constants diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancer.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancer.py index bc7fb6131d..d7e3c04a2f 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancer.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancer.py @@ -13,8 +13,8 @@ import ast import copy -from gbpservice.nfp.common import constants as const from gbpservice.contrib.nfp.config_orchestrator.common import common +from gbpservice.nfp.common import constants as const from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py index 955e085d2a..fd36fedf12 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py @@ -13,8 +13,8 @@ import ast import copy -from gbpservice.nfp.common import constants as const from gbpservice.contrib.nfp.config_orchestrator.common import common +from gbpservice.nfp.common import constants as const from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py index d9771a7910..a86cce2da0 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py @@ -10,11 +10,11 @@ # License for the specific language governing permissions and limitations # under the License. -from gbpservice.nfp.common import constants as const from gbpservice.contrib.nfp.config_orchestrator.common import ( lbv2_constants as lbv2_const) from gbpservice.contrib.nfp.config_orchestrator.common import ( topics as a_topics) +from gbpservice.nfp.common import constants as const from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport From 89faefcc4c1999444778b29f2e6d947d5cb7e5f5 Mon Sep 17 00:00:00 2001 From: Rahul Shikhare Date: Mon, 18 Jul 2016 14:11:40 +0530 Subject: [PATCH 080/157] import error fix --- .../contrib/nfp/config_orchestrator/modules/enterprise.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gbpservice/contrib/nfp/config_orchestrator/modules/enterprise.py b/gbpservice/contrib/nfp/config_orchestrator/modules/enterprise.py index 0a3cb15329..1c476063ca 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/modules/enterprise.py +++ b/gbpservice/contrib/nfp/config_orchestrator/modules/enterprise.py @@ -17,10 +17,10 @@ import traceback from gbpservice.contrib.nfp.config_orchestrator.common import common -from gbpservice.contrib.nfp.core.event import Event -from gbpservice.contrib.nfp.core import log as nfp_logging -from gbpservice.contrib.nfp.core import module as nfp_api -from gbpservice.contrib.nfp.lib import transport +from gbpservice.nfp.core.event import Event +from gbpservice.nfp.core import log as nfp_logging +from gbpservice.nfp.core import module as nfp_api +from gbpservice.nfp.lib import transport from neutron import context as n_context from neutron_fwaas.db.firewall import firewall_db From d44ab6ab39cdebf89ff5992d0cb4307a6af90842 Mon Sep 17 00:00:00 2001 From: pkharat Date: Mon, 18 Jul 2016 15:19:26 +0530 Subject: [PATCH 081/157] 1) Fixed pep8 warnings arised because of configurator dir restructure 2) Addressed review comments in unit test files under nfp/configurator/lib/ and in api server - Moved class comments inside class - used neutron.tests.base class instead of unittest --- .../api/v1/controllers/controller.py | 48 ++++++++----------- .../v1/haproxy/haproxy_lb_driver.py | 4 +- .../nfp/configurator/agents/test_lb_agent.py | 26 +++++----- .../api/v1/controllers/test_controller.py | 12 ++--- .../drivers/loadbalancer/test_lb_driver.py | 16 +++---- .../unit/nfp/configurator/lib/filter_base.py | 9 ++-- .../unit/nfp/configurator/lib/test_demuxer.py | 12 ++--- .../unit/nfp/configurator/lib/test_filter.py | 4 +- .../configurator/lib/test_schema_validator.py | 22 ++++----- 9 files changed, 62 insertions(+), 91 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py b/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py index 2e352e6b11..bd7cc5254e 100644 --- a/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py +++ b/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py @@ -12,31 +12,29 @@ import oslo_serialization.jsonutils as jsonutils -# from neutron.agent.common import config from neutron.common import rpc as n_rpc from oslo_config import cfg from oslo_log import log as logging import oslo_messaging import pecan -from gbpservice.contrib.nfp.configurator.api.base_controller import BaseController +from gbpservice.contrib.nfp.configurator.api import base_controller LOG = logging.getLogger(__name__) n_rpc.init(cfg.CONF) -"""Implements all the APIs Invoked by HTTP requests. -Implements following HTTP methods. - -get - -post - -put -According to the HTTP request received from config-agent this class make -call/cast to configurator and return response to config-agent +class Controller(base_controller.BaseController): + """Implements all the APIs Invoked by HTTP requests. -""" + Implements following HTTP methods. + -get + -post + -put + According to the HTTP request received from config-agent this class make + call/cast to configurator and return response to config-agent - -class Controller(BaseController): + """ def __init__(self, method_name): try: @@ -195,18 +193,16 @@ def _format_description(self, msg): return error_data -"""Implements call/cast methods used in REST Controller. - -Implements following methods. - -call - -cast -This class send an RPC call/cast to configurator according to the data sent -by Controller class of REST server. +class RPCClient(object): + """Implements call/cast methods used in REST Controller. - """ + Implements following methods. + -call + -cast + This class send an RPC call/cast to configurator according to the data sent + by Controller class of REST server. - -class RPCClient(object): + """ API_VERSION = '1.0' @@ -263,12 +259,10 @@ def to_dict(self): return {} -""" CloudService keeps all information of uservice along with initialized - RPCClient object using which rpc is routed to over the cloud service. -""" - - class CloudService(object): + """ CloudService keeps all information of uservice along with initialized + RPCClient object using which rpc is routed to over the cloud service. + """ def __init__(self, **kwargs): self.service_name = kwargs.get('service_name') diff --git a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py index a641accc24..0655e0f394 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py @@ -13,8 +13,8 @@ import ast from gbpservice.contrib.nfp.configurator.drivers.base import base_driver -from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( - haproxy_rest_client) +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.\ + haproxy import (haproxy_rest_client) from gbpservice.contrib.nfp.configurator.lib import constants as common_const from gbpservice.contrib.nfp.configurator.lib import lb_constants from gbpservice.nfp.core import log as nfp_logging diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_lb_agent.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_lb_agent.py index 6535f28e92..d4fa44da7e 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_lb_agent.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_lb_agent.py @@ -12,20 +12,19 @@ import mock -from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( - lb_test_data as test_data) from gbpservice.contrib.nfp.configurator.agents import loadbalancer_v1 as lb from gbpservice.contrib.nfp.configurator.lib import constants as const from gbpservice.contrib.nfp.configurator.lib import demuxer from gbpservice.contrib.nfp.configurator.modules import configurator +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( + lb_test_data as test_data) from neutron.tests import base -"""Implement test cases for LBaasRpcSender methods of loadbalancer agent. - -""" - class LBaasRpcSenderTest(base.BaseTestCase): + """Implements test cases for LBaasRpcSender class methods of + loadbalancer agent. + """ @mock.patch(__name__ + '.test_data.FakeObjects.conf') @mock.patch(__name__ + '.test_data.FakeObjects.sc') @@ -127,12 +126,11 @@ def test_get_logical_device(self): '6350c0fd-07f8-46ff-b797-62acd23760de', test_data.FakeObjects()._get_context_logical_device()) -"""Implement test cases for RPC manager methods of loadbalancer agent. - -""" - class LBaaSRpcManagerTest(base.BaseTestCase): + """Implements test cases for LBaaSRpcManager class methods of + loadbalancer agent. + """ def __init__(self, *args, **kwargs): super(LBaaSRpcManagerTest, self).__init__(*args, **kwargs) @@ -388,12 +386,11 @@ def test_UPDATE_POOL_HEALTH_MONITOR_rpc_manager(self): self.fo.get_request_data_for_update_pool_hm(), self.arg_dict_health_monitor_update) -"""Implement test cases for methods of EventHandler of loadbalancer agent. - -""" - class LBaasEventHandlerTestCase(base.BaseTestCase): + """Implement test cases for LBaaSEventHandler class methods of + loadbalancer agent. + """ def __init__(self, *args, **kwargs): super(LBaasEventHandlerTestCase, self).__init__(*args, **kwargs) @@ -407,7 +404,6 @@ def _get_lb_handler_objects(self, sc, drivers, rpcmgr): :param sc: mocked service controller object of process model framework :param drivers: mocked drivers object of loadbalancer object :param rpcmgr: mocked RPC manager object loadbalancer object - :param nqueue: mocked nqueue object of process model framework Returns: objects of LBaaSEventHandler of loadbalancer agent diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py index 224600a8a5..6f17c67a27 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py @@ -15,12 +15,14 @@ import os import oslo_serialization.jsonutils as jsonutils import pecan -PECAN_CONFIG_FILE = os.getcwd() + "/gbpservice/contrib/nfp/configurator/api/config.py" +PECAN_CONFIG_FILE = (os.getcwd() + + "/gbpservice/contrib/nfp/configurator/api/config.py") pecan.set_config(PECAN_CONFIG_FILE, overwrite=True) -import unittest + import webtest import zlib +from neutron.tests import base from pecan import rest from gbpservice.contrib.nfp.configurator.api import root_controller @@ -38,7 +40,7 @@ """ -class ControllerTestCase(unittest.TestCase, rest.RestController): +class ControllerTestCase(base.BaseTestCase, rest.RestController): @classmethod def setUpClass(cls): @@ -267,7 +269,3 @@ def test_put_update_network_function_config_fail(self): '/v1/nfp/update_network_function_config', expect_errors=True) self.assertEqual(response.status_code, 400) - - -if __name__ == '__main__': - unittest.main() diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py index 5a53d271ac..83b22cac53 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/loadbalancer/test_lb_driver.py @@ -12,22 +12,19 @@ import mock +from gbpservice.contrib.nfp.configurator.agents import loadbalancer_v1 as lb +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.\ + haproxy import (haproxy_lb_driver as lb_driver) +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.\ + haproxy import (haproxy_rest_client as _rest_client) from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( lb_test_data as test_data) -from gbpservice.contrib.nfp.configurator.agents import loadbalancer_v1 as lb -from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( - haproxy_lb_driver as lb_driver) -from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( - haproxy_rest_client as _rest_client) from neutron.tests import base from oslo_serialization import jsonutils -""" Implement test cases for loadbalancer driver. - -""" - class HaproxyOnVmDriverTestCase(base.BaseTestCase): + """ Implements test cases for haproxy loadbalancer driver. """ def __init__(self, *args, **kwargs): super(HaproxyOnVmDriverTestCase, self).__init__(*args, **kwargs) @@ -63,7 +60,6 @@ def _get_lb_handler_objects(self, sc, drivers, rpcmgr): :param sc: mocked service controller object of process model framework :param drivers: mocked drivers object of loadbalancer object :param rpcmgr: mocked RPC manager object loadbalancer object - :param nqueue: mocked nqueue object of process model framework Returns: objects of LBaaSEventHandler of loadbalancer agent diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/lib/filter_base.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/filter_base.py index 81d6a09d71..87b351506a 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/lib/filter_base.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/lib/filter_base.py @@ -11,13 +11,12 @@ # under the License. -import unittest +from neutron.tests import base -""" Defines all the dummy resources needed for test_filter.py -""" - -class BaseTestCase(unittest.TestCase): +class BaseTestCase(base.BaseTestCase): + """ Defines all the dummy resources needed for test_filter.py + """ def __init__(self, *args, **kwargs): super(BaseTestCase, self).__init__(*args, **kwargs) self.service_info = {} diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_demuxer.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_demuxer.py index 88123894d5..85243e46ed 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_demuxer.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_demuxer.py @@ -10,18 +10,14 @@ # License for the specific language governing permissions and limitations # under the License. -import unittest - +from gbpservice.contrib.nfp.configurator.lib import demuxer from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) -from gbpservice.contrib.nfp.configurator.lib import demuxer - -""" Implements test cases for demuxer of configurator. - -""" +from neutron.tests import base -class ServiceAgentDemuxerTestCase(unittest.TestCase): +class ServiceAgentDemuxerTestCase(base.BaseTestCase): + """ Implements test cases for demuxer of configurator. """ def __init__(self, *args, **kwargs): super(ServiceAgentDemuxerTestCase, self).__init__(*args, **kwargs) self.fo = fo.FakeObjects() diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_filter.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_filter.py index b519dedc59..f14b93b049 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_filter.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_filter.py @@ -15,11 +15,9 @@ from gbpservice.contrib.nfp.configurator.lib import data_filter import mock -"""Test class to test data_filter.py using unittest framework -""" - class FilterTest(filter_base.BaseTestCase): + """Test class to test data_filter.py using unittest framework """ def __init__(self, *args, **kwargs): super(FilterTest, self).__init__(*args, **kwargs) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_schema_validator.py b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_schema_validator.py index 5e3b9f7ad9..0260cf8b0f 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_schema_validator.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/lib/test_schema_validator.py @@ -12,15 +12,13 @@ import gbpservice.contrib.nfp.configurator.lib.schema as schema import gbpservice.contrib.nfp.configurator.lib.schema_validator as sv -import unittest - - -"""SchemaResources is a helper class which contains all the dummy resources - needed for TestSchemaValidator class -""" +from neutron.tests import base class SchemaResources(object): + """SchemaResources is a helper class which contains all the dummy resources + needed for TestSchemaValidator class + """ resource_healthmonitor = 'healthmonitor' resource_interfaces = 'interfaces' resource_routes = 'routes' @@ -65,12 +63,11 @@ class SchemaResources(object): 'periodicity': 'initial' } -"""TestSchemaValidator is a test class to test schema_validator.py using - unittest framework -""" - -class TestSchemaValidator(unittest.TestCase): +class TestSchemaValidator(base.BaseTestCase): + """TestSchemaValidator is a test class to test schema_validator.py using + unittest framework + """ def __init__(self, *args, **kwargs): super(TestSchemaValidator, self).__init__(*args, **kwargs) @@ -179,6 +176,3 @@ def test_decode_for_neutron_apis(self): request_data['info']['service_type'] = 'firewall' result = self.sv.decode(request_data, False) self.assertTrue(result) - -if __name__ == '__main__': - unittest.main() From 757601848447711ba1c030065c4b2c69eb6701f0 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Mon, 18 Jul 2016 18:48:07 +0530 Subject: [PATCH 082/157] vpn changes --- devstack/lib/nfp | 4 - .../contrib/nfp/configurator/agents/vpn.py | 27 +++-- .../drivers/vpn/vyos/vyos_vpn_constants.py | 18 ++++ .../drivers/vpn/vyos/vyos_vpn_driver.py | 93 +++++++++-------- .../nfp/configurator/lib/vpn_constants.py | 19 +--- .../config_drivers/heat_driver.py | 99 +++++++++++++++++++ 6 files changed, 182 insertions(+), 78 deletions(-) create mode 100644 gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_constants.py diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 1f3c357ac2..68d0306b20 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -123,10 +123,6 @@ function create_ep_and_nsp { --shared True\ default - gbp ep-create\ - --external-segments default\ - ext_connect - gbp nsp-create\ --network-service-params type=ip_pool,name=vip_ip,value=nat_pool\ svc_mgmt_fip_policy diff --git a/gbpservice/contrib/nfp/configurator/agents/vpn.py b/gbpservice/contrib/nfp/configurator/agents/vpn.py index c267bd91ea..06eb439846 100644 --- a/gbpservice/contrib/nfp/configurator/agents/vpn.py +++ b/gbpservice/contrib/nfp/configurator/agents/vpn.py @@ -18,8 +18,7 @@ from gbpservice.contrib.nfp.configurator.lib import data_filter from gbpservice.contrib.nfp.configurator.lib import utils from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const -from gbpservice.nfp.core.event import Event - +from gbpservice.nfp.core import event as main from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api @@ -181,9 +180,9 @@ def __init__(self, sc, drivers): self._drivers = drivers self._plugin_rpc = VpnaasRpcSender(self._sc) - def _get_driver(self): + def _get_driver(self, service_vendor): - driver_id = const.SERVICE_TYPE + const.SERVICE_VENDOR + driver_id = const.SERVICE_TYPE + service_vendor return self._drivers[driver_id] def handle_event(self, ev): @@ -204,15 +203,16 @@ def handle_event(self, ev): % (os.getpid(), ev.id, const.VPN_GENERIC_CONFIG_RPC_TOPIC)) LOG.debug(msg) - - driver = self._get_driver() + service_vendor = ( + ev.data['context']['agent_info']['service_vendor']) + driver = self._get_driver(service_vendor) + setattr(VPNaasEventHandler, "service_driver", driver) self._vpnservice_updated(ev, driver) except Exception as err: msg = ("Failed to perform the operation: %s. %s" % (ev.id, str(err).capitalize())) LOG.error(msg) - finally: - self._sc.event_done(ev) + def _vpnservice_updated(self, ev, driver): """ @@ -278,9 +278,8 @@ def _sync_ipsec_conns(self, context, svc_context): Returns: None """ try: - self._get_driver() - return self._get_driver().check_status(context, svc_context) + return self.service_driver.check_status(context, svc_context) except Exception as err: msg = ("Failed to sync ipsec connection information. %s." % str(err).capitalize()) @@ -316,10 +315,10 @@ def events_init(sc, drivers): Returns: None """ evs = [ - Event(id='VPNSERVICE_UPDATED', - handler=VPNaasEventHandler(sc, drivers)), - Event(id='VPN_SYNC', - handler=VPNaasEventHandler(sc, drivers))] + main.Event(id='VPNSERVICE_UPDATED', + handler=VPNaasEventHandler(sc, drivers)), + main.Event(id='VPN_SYNC', + handler=VPNaasEventHandler(sc, drivers))] sc.register_events(evs) diff --git a/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_constants.py b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_constants.py new file mode 100644 index 0000000000..aa8c157a74 --- /dev/null +++ b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_constants.py @@ -0,0 +1,18 @@ +# 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. + + +SERVICE_VENDOR = 'vyos' +CONFIGURATION_SERVER_PORT = 8888 +request_url = "http://%s:%s/%s" + +REST_TIMEOUT = 90 diff --git a/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py index 3b178d875d..8123d960cb 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py @@ -15,7 +15,10 @@ import requests from gbpservice.contrib.nfp.configurator.drivers.base import base_driver -from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const +from gbpservice.contrib.nfp.configurator.drivers.vpn.vyos import ( + vyos_vpn_constants as const) +from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.nfp.configurator.lib import vpn_constants as vpn_const from gbpservice.nfp.core import log as nfp_logging from oslo_concurrency import lockutils @@ -234,7 +237,8 @@ def _error_state(self, context, vpnsvc, message=''): Returns: None """ self.agent.update_status( - context, self._update_service_status(vpnsvc, const.STATE_ERROR)) + context, self._update_service_status(vpnsvc, + vpn_const.STATE_ERROR)) raise ResourceErrorState(name='vpn_service', id=vpnsvc['id'], message=message) @@ -249,7 +253,8 @@ def _active_state(self, context, vpnsvc): Returns: None """ self.agent.update_status( - context, self._update_service_status(vpnsvc, const.STATE_ACTIVE)) + context, self._update_service_status(vpnsvc, + vpn_const.STATE_ACTIVE)) def _get_local_cidr(self, vpn_svc): svc_desc = vpn_svc['description'] @@ -290,14 +295,13 @@ def validate(self, context, vpnsvc): self._active_state(context, vpnsvc) -class VpnGenericConfigDriver(object): +class VpnGenericConfigDriver(base_driver.BaseDriver): """ VPN generic config driver for handling device configurations requests. This driver class implements VPN configuration. """ - def __init__(self, conf): - self.conf = conf + def __init__(self): self.timeout = const.REST_TIMEOUT def _configure_static_ips(self, resource_data): @@ -365,7 +369,7 @@ def _configure_static_ips(self, resource_data): msg = ("Static IPs successfully added.") LOG.info(msg) - return const.STATUS_SUCCESS + return common_const.STATUS_SUCCESS def configure_interfaces(self, context, resource_data): """ Configure interfaces for the service VM. @@ -381,6 +385,28 @@ def configure_interfaces(self, context, resource_data): Returns: SUCCESS/Failure message with reason. """ + mgmt_ip = resource_data['mgmt_ip'] + + try: + result_log_forward = self._configure_log_forwarding( + const.request_url, mgmt_ip, self.port) + except Exception as err: + msg = ("Failed to configure log forwarding for service at %s. " + "Error: %s" % (mgmt_ip, err)) + LOG.error(msg) + return msg + else: + if result_log_forward == common_const.UNHANDLED: + pass + elif result_log_forward != common_const.STATUS_SUCCESS: + msg = ("Failed to configure log forwarding for service at %s. " + "Error: %s" % (mgmt_ip, err)) + LOG.error(msg) + return result_log_forward + else: + msg = ("Configured log forwarding for service at %s. " + "Result: %s" % (mgmt_ip, result_log_forward)) + LOG.info(msg) try: result_static_ips = self._configure_static_ips(resource_data) @@ -389,7 +415,7 @@ def configure_interfaces(self, context, resource_data): LOG.error(msg) return msg else: - if result_static_ips != const.STATUS_SUCCESS: + if result_static_ips != common_const.STATUS_SUCCESS: return result_static_ips else: msg = ("Added static IPs. Result: %s" % result_static_ips) @@ -399,8 +425,6 @@ def configure_interfaces(self, context, resource_data): provider_mac=resource_data['provider_mac'], stitching_mac=resource_data['stitching_mac']) - mgmt_ip = resource_data['mgmt_ip'] - url = const.request_url % (mgmt_ip, const.CONFIGURATION_SERVER_PORT, 'add_rule') data = jsonutils.dumps(rule_info) @@ -436,7 +460,7 @@ def configure_interfaces(self, context, resource_data): msg = ("Persistent rule successfully added.") LOG.info(msg) - return const.STATUS_SUCCESS + return common_const.STATUS_SUCCESS def _clear_static_ips(self, resource_data): """ Clear static IPs for provider and stitching @@ -498,7 +522,7 @@ def _clear_static_ips(self, resource_data): msg = ("Static IPs successfully removed.") LOG.info(msg) - return const.STATUS_SUCCESS + return common_const.STATUS_SUCCESS def clear_interfaces(self, context, resource_data): """ Clear interfaces for the service VM. @@ -522,7 +546,7 @@ def clear_interfaces(self, context, resource_data): LOG.error(msg) return msg else: - if result_static_ips != const.STATUS_SUCCESS: + if result_static_ips != common_const.STATUS_SUCCESS: return result_static_ips else: msg = ("Successfully removed static IPs. " @@ -570,7 +594,7 @@ def clear_interfaces(self, context, resource_data): raise Exception(msg) msg = ("Persistent rule successfully deleted.") LOG.info(msg) - return const.STATUS_SUCCESS + return common_const.STATUS_SUCCESS def configure_routes(self, context, resource_data): """ Configure routes for the service VM. @@ -628,7 +652,7 @@ def configure_routes(self, context, resource_data): LOG.error(msg) return msg - if resp.status_code in const.SUCCESS_CODES: + if resp.status_code in common_const.SUCCESS_CODES: message = jsonutils.loads(resp.text) if message.get("status", False): msg = ("Route configured successfully for VYOS" @@ -646,7 +670,7 @@ def configure_routes(self, context, resource_data): % (active_configured)) LOG.info(msg) if active_configured: - return const.STATUS_SUCCESS + return common_const.STATUS_SUCCESS else: return ("Failed to configure source route. Response code: %s." "Response Content: %r" % (resp.status_code, resp.content)) @@ -706,30 +730,31 @@ def clear_routes(self, context, resource_data): LOG.error(msg) return msg - if resp.status_code in const.SUCCESS_CODES: + if resp.status_code in common_const.SUCCESS_CODES: active_configured = True msg = ("Route deletion status : %r " % (active_configured)) LOG.info(msg) if active_configured: - return const.STATUS_SUCCESS + return common_const.STATUS_SUCCESS else: return ("Failed to delete source route. Response code: %s." "Response Content: %r" % (resp.status_code, resp.content)) -class VpnaasIpsecDriver(VpnGenericConfigDriver, base_driver.BaseDriver): +class VpnaasIpsecDriver(VpnGenericConfigDriver): """ Driver class for implementing VPN IPSEC configuration requests from VPNaas Plugin. """ - service_type = const.SERVICE_TYPE + service_type = vpn_const.SERVICE_TYPE service_vendor = const.SERVICE_VENDOR def __init__(self, conf): self.conf = conf + self.port = const.CONFIGURATION_SERVER_PORT self.handlers = { 'vpn_service': { 'create': self.create_vpn_service}, @@ -737,7 +762,7 @@ def __init__(self, conf): 'create': self.create_ipsec_conn, 'update': self.update_ipsec_conn, 'delete': self.delete_ipsec_conn}} - super(VpnaasIpsecDriver, self).__init__(conf) + super(VpnaasIpsecDriver, self).__init__() def _update_conn_status(self, conn, status): """ @@ -775,7 +800,7 @@ def _error_state(self, context, conn, message=''): self.agent.update_status( context, self._update_conn_status(conn, - const.STATE_ERROR)) + vpn_const.STATE_ERROR)) raise ResourceErrorState(id=conn['id'], message=message) def _init_state(self, context, conn): @@ -792,11 +817,11 @@ def _init_state(self, context, conn): LOG.info(msg) self.agent.update_status( context, self._update_conn_status(conn, - const.STATE_INIT)) + vpn_const.STATE_INIT)) for item in context['service_info']['ipsec_site_conns']: if item['id'] == conn['id']: - item['status'] = const.STATE_INIT + item['status'] = vpn_const.STATE_INIT def _get_fip_from_vpnsvc(self, vpn_svc): svc_desc = vpn_svc['description'] @@ -971,7 +996,7 @@ def _ipsec_get_tenant_conns(self, context, mgmt_fip, conn, copy_conns = copy.deepcopy(conn_list) for tconn in copy_conns: if tconn['status'] == ( - const.STATE_PENDING and tconn in conn_list): + vpn_const.STATE_PENDING and tconn in conn_list): conn_list.remove(tconn) return conn_list @@ -1055,7 +1080,7 @@ def _ipsec_is_state_changed(self, svc_context, conn, fip): c_state = None lcidr = self._get_ipsec_tunnel_local_cidr(svc_context) - if conn['status'] == const.STATE_INIT: + if conn['status'] == vpn_const.STATE_INIT: tunnel = { 'peer_address': conn['peer_address'], 'local_cidr': lcidr, @@ -1255,19 +1280,3 @@ def _vpnservice_updated(context, resource_data): self.handlers[rsrc][reason](context, resource_data) return _vpnservice_updated(context, resource_data) - - def configure_healthmonitor(self, context, resource_data): - """Overriding BaseDriver's configure_healthmonitor(). - It does netcat to CONFIGURATION_SERVER_PORT 8888. - Configuration agent runs inside service vm.Once agent is up and - reachable, service vm is assumed to be active. - :param context - context - :param resource_data - resource_data coming from orchestrator - - Returns: SUCCESS/FAILED - - """ - ip = resource_data.get('mgmt_ip') - port = str(const.CONFIGURATION_SERVER_PORT) - command = 'nc ' + ip + ' ' + port + ' -z' - return self._check_vm_health(command) diff --git a/gbpservice/contrib/nfp/configurator/lib/vpn_constants.py b/gbpservice/contrib/nfp/configurator/lib/vpn_constants.py index 670a10110f..6009e7b74c 100644 --- a/gbpservice/contrib/nfp/configurator/lib/vpn_constants.py +++ b/gbpservice/contrib/nfp/configurator/lib/vpn_constants.py @@ -13,32 +13,15 @@ DRIVERS_DIR = 'gbpservice.contrib.nfp.configurator.drivers.vpn' SERVICE_TYPE = 'vpn' -SERVICE_VENDOR = 'vyos' + STATE_PENDING = 'PENDING_CREATE' STATE_INIT = 'INIT' STATE_ACTIVE = 'ACTIVE' STATE_ERROR = 'ERROR' -NEUTRON = 'NEUTRON' - -STATUS_ACTIVE = "ACTIVE" -STATUS_DELETED = "DELETED" -STATUS_UPDATED = "UPDATED" -STATUS_ERROR = "ERROR" -STATUS_SUCCESS = "SUCCESS" -CONFIGURATION_SERVER_PORT = 8888 -REST_TIMEOUT = 90 -request_url = "http://%s:%s/%s" -SUCCESS_CODES = [200, 201, 202, 203, 204] -ERROR_CODES = [400, 404, 500] -VYOS = 'vyos' -SM_RPC_TOPIC = 'VPN-sm-topic' -VPN_RPC_TOPIC = "vpn_topic" VPN_GENERIC_CONFIG_RPC_TOPIC = "vyos_vpn_topic" VPN_PLUGIN_TOPIC = 'vpn_plugin' VPN_AGENT_TOPIC = 'vpn_agent' - -CONFIGURATION_SERVER_PORT = '8888' diff --git a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py index c8df970260..a492f18ef7 100644 --- a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py +++ b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py @@ -820,6 +820,105 @@ def _create_node_config_data(self, auth_token, tenant_id, 'description'] = str(common_desc) nf_desc = str(firewall_desc) + elif service_type == pconst.VPN: + # rvpn_l3_policy = self._get_rvpn_l3_policy(auth_token, + # provider, update) + # if rvpn_l3_policy is None: + # return None, None + # config_param_values['ClientAddressPoolCidr'] = rvpn_l3_policy[ + # 'ip_pool'] + config_param_values['Subnet'] = ( + consumer_port['fixed_ips'][0]['subnet_id'] + if consumer_port else None) + l2p = self.gbp_client.get_l2_policy( + auth_token, provider['l2_policy_id']) + l3p = self.gbp_client.get_l3_policy( + auth_token, l2p['l3_policy_id']) + config_param_values['RouterId'] = l3p['routers'][0] + stitching_cidr = service_details['consumer_subnet']['cidr'] + mgmt_gw_ip = self._get_management_gw_ip(auth_token) + if not mgmt_gw_ip: + return None, None + + services_nsp = self.gbp_client.get_network_service_policies( + auth_token, + filters={'name': ['nfp_services_nsp']}) + if not services_nsp: + fip_nsp = { + 'network_service_policy': { + 'name': 'nfp_services_nsp', + 'description': 'nfp_implicit_resource', + 'shared': False, + 'tenant_id': tenant_id, + 'network_service_params': [ + {"type": "ip_pool", "value": "nat_pool", + "name": "vpn_svc_external_access"}] + } + } + nsp = self.gbp_client.create_network_service_policy( + auth_token, fip_nsp) + else: + nsp = services_nsp[0] + if not base_mode_support: + stitching_pts = self.gbp_client.get_policy_targets( + auth_token, + filters={'port_id': [consumer_port['id']]}) + if not stitching_pts: + LOG.error(_LE("Policy target is not created for the " + "stitching port")) + return None, None + stitching_ptg_id = ( + stitching_pts[0]['policy_target_group_id']) + else: + stitching_ptg_id = consumer['id'] + self.gbp_client.update_policy_target_group( + auth_token, stitching_ptg_id, + {'policy_target_group': { + 'network_service_policy_id': nsp['id']}}) + if not base_mode_support: + floatingips = self.neutron_client.get_floating_ips( + auth_token, consumer_port['id']) + if not floatingips: + LOG.error(_LE("Floating IP for VPN Service has been " + "disassociated Manually")) + return None, None + for fip in floatingips: + if consumer_port['fixed_ips'][0]['ip_address'] == fip[ + 'fixed_ip_address']: + stitching_port_fip = fip['floating_ip_address'] + try: + desc = ('fip=' + mgmt_ip + + ";tunnel_local_cidr=" + + provider_cidr + ";user_access_ip=" + + stitching_port_fip + ";fixed_ip=" + + consumer_port['fixed_ips'][0]['ip_address'] + + ';service_vendor=' + service_vendor + + ';stitching_cidr=' + stitching_cidr + + ';stitching_gateway=' + service_details[ + 'consumer_subnet']['gateway_ip'] + + ';mgmt_gw_ip=' + mgmt_gw_ip + + ';network_function_id=' + network_function['id']) + except Exception: + LOG.error(_LE("Problem in preparing description, some of " + "the fields might not have initialized")) + return None, None + stack_params['ServiceDescription'] = desc + siteconn_keys = self._get_site_conn_keys( + stack_template[resources_key], + is_template_aws_version, + 'OS::Neutron::IPsecSiteConnection') + for siteconn_key in siteconn_keys: + stack_template[resources_key][siteconn_key][ + properties_key]['description'] = str(common_desc) + + vpnservice_key = self._get_heat_resource_key( + stack_template[resources_key], + is_template_aws_version, + 'OS::Neutron::VPNService') + stack_template[resources_key][vpnservice_key][properties_key][ + 'description'] = str(common_desc) + + nf_desc = str(desc) if nf_desc: network_function['description'] = network_function[ From 8c129683aeaf0baa6d1d878abdb90c8f386486ad Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Mon, 18 Jul 2016 18:58:59 +0530 Subject: [PATCH 083/157] fixed pep8 issues --- gbpservice/contrib/nfp/configurator/agents/vpn.py | 1 - .../tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/agents/vpn.py b/gbpservice/contrib/nfp/configurator/agents/vpn.py index 06eb439846..8a089f9a2c 100644 --- a/gbpservice/contrib/nfp/configurator/agents/vpn.py +++ b/gbpservice/contrib/nfp/configurator/agents/vpn.py @@ -213,7 +213,6 @@ def handle_event(self, ev): % (ev.id, str(err).capitalize())) LOG.error(msg) - def _vpnservice_updated(self, ev, driver): """ Makes call to the respective operation method of vpn driver. diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py index f2b37c3410..ca666f0d0d 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py @@ -16,7 +16,8 @@ vpn_test_data) from gbpservice.contrib.nfp.configurator.agents import vpn from gbpservice.contrib.nfp.configurator.drivers.base import base_driver -from gbpservice.contrib.nfp.configurator.drivers.vpn.vyos import vyos_vpn_driver +from gbpservice.contrib.nfp.configurator.drivers.vpn.vyos import ( + vyos_vpn_driver) from oslo_serialization import jsonutils from neutron.tests import base From 8abb0592bf6d3542b254c8f45d1bf82c17e014ab Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 18 Jul 2016 20:44:57 +0530 Subject: [PATCH 084/157] fixed pep8 --- gbpservice/contrib/nfp/configurator/agents/nfp_service.py | 3 ++- .../configurator/drivers/nfp_service/heat/heat_driver.py | 3 ++- .../tests/unit/nfp/configurator/agents/test_firewall.py | 4 ++-- .../unit/nfp/configurator/agents/test_generic_config.py | 4 ++-- .../tests/unit/nfp/configurator/agents/test_nfp_service.py | 5 +++-- .../configurator/drivers/nfp_service/test_heat_driver.py | 7 ++++--- .../unit/nfp/configurator/modules/test_configurator.py | 4 ++-- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/agents/nfp_service.py b/gbpservice/contrib/nfp/configurator/agents/nfp_service.py index 6d348bfc52..3f35b23bb3 100644 --- a/gbpservice/contrib/nfp/configurator/agents/nfp_service.py +++ b/gbpservice/contrib/nfp/configurator/agents/nfp_service.py @@ -14,7 +14,8 @@ import oslo_messaging as messaging from gbpservice.contrib.nfp.configurator.agents import agent_base -from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const +from gbpservice.contrib.nfp.configurator.lib import ( + nfp_service_constants as const) from gbpservice.contrib.nfp.configurator.lib import utils as load_driver from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core import log as nfp_logging diff --git a/gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/heat_driver.py b/gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/heat_driver.py index 0596ff34e9..3ee2b242a5 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/heat_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/nfp_service/heat/heat_driver.py @@ -14,7 +14,8 @@ from gbpservice.contrib.nfp.configurator.drivers.base import base_driver -from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const +from gbpservice.contrib.nfp.configurator.lib import ( + nfp_service_constants as const) LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_firewall.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_firewall.py index 26f3f4c68c..7987328188 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_firewall.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_firewall.py @@ -15,11 +15,11 @@ from neutron.tests import base from oslo_config import cfg -from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( - fw_test_data as fo) from gbpservice.contrib.nfp.configurator.agents import firewall as fw from gbpservice.contrib.nfp.configurator.lib import constants as const from gbpservice.contrib.nfp.configurator.lib import fw_constants as fw_const +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( + fw_test_data as fo) class FWaasRpcManagerTestCase(base.BaseTestCase): diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_generic_config.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_generic_config.py index 73e61b5329..a09a8ebfd9 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_generic_config.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_generic_config.py @@ -15,12 +15,12 @@ from neutron.tests import base -from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( - fw_test_data as fo) from gbpservice.contrib.nfp.configurator.agents import generic_config as gc from gbpservice.contrib.nfp.configurator.lib import ( generic_config_constants as const) from gbpservice.contrib.nfp.configurator.lib import constants as common_const +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( + fw_test_data as fo) class GenericConfigRpcManagerTestCase(base.BaseTestCase): diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_nfp_service.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_nfp_service.py index 3ba62cd75b..403b216a68 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_nfp_service.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_nfp_service.py @@ -14,10 +14,11 @@ from neutron.tests import base +from gbpservice.contrib.nfp.configurator.agents import nfp_service as ns +from gbpservice.contrib.nfp.configurator.lib import ( + nfp_service_constants as const) from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( nfp_service_test_data as fo) -from gbpservice.contrib.nfp.configurator.agents import nfp_service as ns -from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const class NfpServiceRpcManagerTestCase(base.BaseTestCase): diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py index 889cf0fc76..6b1530a140 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/nfp_service/test_heat_driver.py @@ -12,11 +12,12 @@ from neutron.tests import base +from gbpservice.contrib.nfp.configurator.drivers.nfp_service.heat.heat_driver \ + import HeatDriver +from gbpservice.contrib.nfp.configurator.lib import ( + nfp_service_constants as const) from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( nfp_service_test_data as fo) -from gbpservice.contrib.nfp.configurator.drivers.nfp_service.heat.heat_driver import ( - HeatDriver) -from gbpservice.contrib.nfp.configurator.lib import nfp_service_constants as const class NfpServiceHeatDriverTestCase(base.BaseTestCase): diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py index 20ee9e1a9f..e16eae58a1 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py @@ -15,12 +15,12 @@ from oslo_log import log as logging -from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( - fw_test_data as fo) from gbpservice.contrib.nfp.configurator.agents import firewall as fw from gbpservice.contrib.nfp.configurator.agents import generic_config as gc from gbpservice.contrib.nfp.configurator.lib import demuxer as demuxer_lib from gbpservice.contrib.nfp.configurator.modules import configurator as cfgr +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( + fw_test_data as fo) LOG = logging.getLogger(__name__) From 76c5e32835443cbfe4277c8bc8ed12f2a1160165 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 18 Jul 2016 20:58:11 +0530 Subject: [PATCH 085/157] failure in log forward API won't block chain creation --- .../drivers/firewall/vyos/vyos_fw_driver.py | 6 +++-- .../v1/haproxy/haproxy_lb_driver.py | 1 - .../drivers/vpn/vyos/vyos_vpn_driver.py | 24 +++++++++++++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index 6b072714a3..f6edeb28f3 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -167,15 +167,17 @@ def configure_interfaces(self, context, resource_data): msg = ("Failed to configure log forwarding for service at %s. " "Error: %s" % (mgmt_ip, err)) LOG.error(msg) - return msg else: if result_log_forward == common_const.UNHANDLED: pass elif result_log_forward != common_const.STATUS_SUCCESS: + # Failure in log forward configuration won't break chain + # creation. However, error will be logged for detecting + # failure. + # return result_log_forward msg = ("Failed to configure log forwarding for service at %s. " "Error: %s" % (mgmt_ip, result_log_forward)) LOG.error(msg) - return msg try: result_static_ips = self._configure_static_ips(resource_data) diff --git a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py index 0655e0f394..68decee230 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py @@ -53,7 +53,6 @@ def configure_interfaces(self, context, resource_data): msg = ("Failed to configure log forwarding for service at %s. " "Error: %s" % (mgmt_ip, err)) LOG.error(msg) - return msg else: if result_log_forward == common_const.UNHANDLED: pass diff --git a/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py index 3b178d875d..3a4f362d1c 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py @@ -15,6 +15,7 @@ import requests from gbpservice.contrib.nfp.configurator.drivers.base import base_driver +from gbpservice.contrib.nfp.configurator.lib import constants as common_const from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const from gbpservice.nfp.core import log as nfp_logging @@ -382,6 +383,27 @@ def configure_interfaces(self, context, resource_data): """ + mgmt_ip = resource_data['mgmt_ip'] + + try: + result_log_forward = self._configure_log_forwarding( + const.request_url, mgmt_ip, self.port) + except Exception as err: + msg = ("Failed to configure log forwarding for service at %s. " + "Error: %s" % (mgmt_ip, err)) + LOG.error(msg) + else: + if result_log_forward == common_const.UNHANDLED: + pass + elif result_log_forward != common_const.STATUS_SUCCESS: + # Failure in log forward configuration won't break chain + # creation. However, error will be logged for detecting + # failure. + # return result_log_forward + msg = ("Failed to configure log forwarding for service at %s. " + "Error: %s" % (mgmt_ip, result_log_forward)) + LOG.error(msg) + try: result_static_ips = self._configure_static_ips(resource_data) except Exception as err: @@ -399,8 +421,6 @@ def configure_interfaces(self, context, resource_data): provider_mac=resource_data['provider_mac'], stitching_mac=resource_data['stitching_mac']) - mgmt_ip = resource_data['mgmt_ip'] - url = const.request_url % (mgmt_ip, const.CONFIGURATION_SERVER_PORT, 'add_rule') data = jsonutils.dumps(rule_info) From c01df378d71e0c74f0fe007b0e73563b2fc0804a Mon Sep 17 00:00:00 2001 From: SureshDH Date: Tue, 19 Jul 2016 00:39:34 +0530 Subject: [PATCH 086/157] addressed the review comments --- gbpservice/contrib/nfp/configurator/agents/vpn.py | 6 +++--- gbpservice/nfp/orchestrator/config_drivers/heat_driver.py | 6 ------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/agents/vpn.py b/gbpservice/contrib/nfp/configurator/agents/vpn.py index 8a089f9a2c..6025aaf35e 100644 --- a/gbpservice/contrib/nfp/configurator/agents/vpn.py +++ b/gbpservice/contrib/nfp/configurator/agents/vpn.py @@ -18,7 +18,7 @@ from gbpservice.contrib.nfp.configurator.lib import data_filter from gbpservice.contrib.nfp.configurator.lib import utils from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const -from gbpservice.nfp.core import event as main +from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.core import module as nfp_api @@ -314,9 +314,9 @@ def events_init(sc, drivers): Returns: None """ evs = [ - main.Event(id='VPNSERVICE_UPDATED', + nfp_event.Event(id='VPNSERVICE_UPDATED', handler=VPNaasEventHandler(sc, drivers)), - main.Event(id='VPN_SYNC', + nfp_event.Event(id='VPN_SYNC', handler=VPNaasEventHandler(sc, drivers))] sc.register_events(evs) diff --git a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py index a492f18ef7..39c2ea847c 100644 --- a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py +++ b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py @@ -821,12 +821,6 @@ def _create_node_config_data(self, auth_token, tenant_id, nf_desc = str(firewall_desc) elif service_type == pconst.VPN: - # rvpn_l3_policy = self._get_rvpn_l3_policy(auth_token, - # provider, update) - # if rvpn_l3_policy is None: - # return None, None - # config_param_values['ClientAddressPoolCidr'] = rvpn_l3_policy[ - # 'ip_pool'] config_param_values['Subnet'] = ( consumer_port['fixed_ips'][0]['subnet_id'] if consumer_port else None) From 604a0b01a8bc0e426b73c97816b77e46e3c3c999 Mon Sep 17 00:00:00 2001 From: dpaks Date: Tue, 19 Jul 2016 15:07:49 +0530 Subject: [PATCH 087/157] merged into 13th july branch --- .../nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py | 1 - .../drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py | 1 - .../contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py | 1 - 3 files changed, 3 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py index f6edeb28f3..5f7750ca10 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/firewall/vyos/vyos_fw_driver.py @@ -174,7 +174,6 @@ def configure_interfaces(self, context, resource_data): # Failure in log forward configuration won't break chain # creation. However, error will be logged for detecting # failure. - # return result_log_forward msg = ("Failed to configure log forwarding for service at %s. " "Error: %s" % (mgmt_ip, result_log_forward)) LOG.error(msg) diff --git a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py index 68decee230..1cc45701bf 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/loadbalancer/v1/haproxy/haproxy_lb_driver.py @@ -63,7 +63,6 @@ def configure_interfaces(self, context, resource_data): # Failure in log forward configuration won't break chain # creation. However, error will be logged for detecting # failure. - # return result_log_forward else: msg = ("Configured log forwarding for service at %s. " "Result: %s" % (mgmt_ip, result_log_forward)) diff --git a/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py index 595f59f868..e948735ba3 100644 --- a/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py +++ b/gbpservice/contrib/nfp/configurator/drivers/vpn/vyos/vyos_vpn_driver.py @@ -401,7 +401,6 @@ def configure_interfaces(self, context, resource_data): # Failure in log forward configuration won't break chain # creation. However, error will be logged for detecting # failure. - # return result_log_forward msg = ("Failed to configure log forwarding for service at %s. " "Error: %s" % (mgmt_ip, result_log_forward)) LOG.error(msg) From 7cc6627d5a2b90749dddb7192c76a8adbfbc571d Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Tue, 19 Jul 2016 16:45:47 +0530 Subject: [PATCH 088/157] changed the fip retrival api --- .../nfp/orchestrator/config_drivers/heat_driver.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py index 39c2ea847c..3ff144628f 100644 --- a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py +++ b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py @@ -870,16 +870,14 @@ def _create_node_config_data(self, auth_token, tenant_id, {'policy_target_group': { 'network_service_policy_id': nsp['id']}}) if not base_mode_support: - floatingips = self.neutron_client.get_floating_ips( - auth_token, consumer_port['id']) - if not floatingips: + filters = {'port_id': consumer_port['id']} + stitching_port_fip = self.neutron_client.get_floating_ips( + auth_token, + filters)[0]['floating_ip_address'] + if not stitching_port_fip: LOG.error(_LE("Floating IP for VPN Service has been " "disassociated Manually")) return None, None - for fip in floatingips: - if consumer_port['fixed_ips'][0]['ip_address'] == fip[ - 'fixed_ip_address']: - stitching_port_fip = fip['floating_ip_address'] try: desc = ('fip=' + mgmt_ip + ";tunnel_local_cidr=" + From 1edae165f45b269f62a9cc5acecdc881fbd218c7 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Tue, 19 Jul 2016 17:07:29 +0530 Subject: [PATCH 089/157] Fixed enterprise mode shift --- ...sh.enterprise => mode_shift_enterprise.sh} | 113 ++++++++++-------- .../visibility_disk_image_create.py | 12 +- 2 files changed, 68 insertions(+), 57 deletions(-) rename gbpservice/nfp/scripts/{mode_shift.sh.enterprise => mode_shift_enterprise.sh} (70%) diff --git a/gbpservice/nfp/scripts/mode_shift.sh.enterprise b/gbpservice/nfp/scripts/mode_shift_enterprise.sh similarity index 70% rename from gbpservice/nfp/scripts/mode_shift.sh.enterprise rename to gbpservice/nfp/scripts/mode_shift_enterprise.sh index 568840010f..c7922a190f 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh.enterprise +++ b/gbpservice/nfp/scripts/mode_shift_enterprise.sh @@ -2,33 +2,49 @@ source /opt/stack/gbp/gbpservice/nfp/config/mode_shift.conf -DEVSTACK_DIR=/home/stack/devstack -source $DEVSTACK_DIR/local.conf +DEVSTACK_SRC_DIR=/home/stack/devstack +source $DEVSTACK_SRC_DIR/local.conf NFPSERVICE_DIR=/opt/stack/gbp # TODO(DEEPAK): Should be retrieved from a result file populated by advanced mode. EXT_NET_NAME=ext-net +function setup_ssh_key { + sudo ssh-keygen -f "/root/.ssh/known_hosts" -R $configurator_ip + sudo ssh-keygen -f configurator_vm -t rsa -N '' + echo "Give the password for the root user of the Configurator VM when prompted." + sleep 5 + cat configurator_vm.pub | sudo ip netns exec nfp-proxy ssh -o "StrictHostKeyChecking no" root@$configurator_ip 'cat >> .ssh/authorized_keys' + sleep 5 +} + +function copy_files { + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@120.0.0.3\ + docker exec configurator\ + cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config +} + function nfp_configure_nova { NOVA_CONF_DIR=/etc/nova NOVA_CONF=$NOVA_CONF_DIR/nova.conf - source $DEVSTACK_DIR/inc/ini-config + source $DEVSTACK_SRC_DIR/inc/ini-config iniset $NOVA_CONF DEFAULT instance_usage_audit "True" - source $DEVSTACK_DIR/functions-common - stop_process n-cpu - stop_process n-cond - stop_process n-sch - stop_process n-novnc - stop_process n-cauth - stop_process n-api + source $DEVSTACK_SRC_DIR/functions-common + sudo stop_process n-cpu + sudo stop_process n-cond + sudo stop_process n-sch + sudo stop_process n-novnc + sudo stop_process n-cauth + sudo stop_process n-api - source $DEVSTACK_DIR/lib/nova - start_nova_compute - start_nova_api - run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" - run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" - run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" - run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" + source $DEVSTACK_SRC_DIR/lib/nova + sudo start_nova_compute + sudo start_nova_api + sudo run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" + sudo run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" + sudo run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" + sudo run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" } function create_port_for_vm { @@ -46,15 +62,13 @@ function create_port_for_vm { } function configure_vis_ip_addr_in_docker { - echo "Visibility VM IP address is: $visibility_ip" - sed -i "s/VIS_VM_IP_ADDRESS/"$visibility_ip"/" $NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator/Dockerfile + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator\ + sed -i "s/log_forward_ip_address=*.*/log_forward_ip_address=$visibility_ip/" /etc/nfp_configurator.ini } function create_images { - source $DEVSTACK_DIR/openrc neutron service - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - # prepare visibility image and upload it into glance VISIBILITY_QCOW2_IMAGE=${VISIBILITY_QCOW2_IMAGE:-build} VISIBILITY_QCOW2_IMAGE_NAME=visibility @@ -71,8 +85,8 @@ function create_images { sudo git clone https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git -b $VISIBILITY_GIT_BRANCH echo "Building Image: $VISIBILITY_QCOW2_IMAGE_NAME" cd $NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create/ - sudo python visibility_disk_image_create.py visibility_conf.json $DEVSTACK_DIR/local.conf - VISIBILITY_QCOW2_IMAGE=$(cat /tmp/image_path) + sudo python visibility_disk_image_create.py visibility_conf.json $GBPSERVICE_BRANCH $DOCKER_IMAGES_URL + VISIBILITY_QCOW2_IMAGE=$(cat output/last_built_image_path) fi echo "Uploading Image: $VISIBILITY_QCOW2_IMAGE_NAME" glance image-create --name $VISIBILITY_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $VISIBILITY_QCOW2_IMAGE @@ -97,7 +111,7 @@ function configure_visibility_user_data { # $1 is the Visibility VM's IP address CUR_DIR=$PWD visibility_vm_ip=$1 - configurator_ip= + configurator_ip=`neutron port-show pt_configuratorVM_instance -f value -c fixed_ips | cut -d'"' -f8` sudo rm -rf /opt/visibility_user_data sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. cd /opt @@ -114,9 +128,6 @@ function configure_visibility_user_data { } function attach_security_groups { - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - SecGroup="allow_all" nova secgroup-create $SecGroup "allow all traffic" nova secgroup-add-rule $SecGroup udp 1 65535 120.0.0.0/24 @@ -180,29 +191,33 @@ function nfp_logs_forword { } function restart_processes { - source $DEVSTACK_DIR/functions-common - source $DEVSTACK_DIR/openrc neutron service - - # restart proxy - stop_process proxy - run_process proxy "source $NFPSERVICE_DIR/devstack/lib/nfp;namespace_delete $DEVSTACK_DIR;namespace_create $DEVSTACK_DIR $IpAddr" - echo "Restarted proxy process" - sleep 10 - - # restart proxy agent - stop_process proxy_agent - run_process proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file /opt/stack/logs/nfp_proxy_agent.log" - echo "Restarted proxy agent process" - sleep 3 + # restart configurator + configurator_ip=120.0.0.3 + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator screen -S configurator -X quit + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --config-dir=/etc/nfp_config --log-file=/var/log/nfp/nfp_configurator.log } function prepare_for_mode_shift { if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then - source $DEST/gbp/devstack/lib/nfp - + source $DEVSTACK_SRC_DIR/openrc neutron service + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + configurator_ip=`neutron port-show pt_configuratorVM_instance -f value -c fixed_ips | cut -d'"' -f8` + echo "Configurator's IP: $configurator_ip" + + echo "Setting up ssh key in configurator for password less ssh" + setup_ssh_key + echo "Copy files and configure" + copy_files + #echo "Configuring nova" + #nfp_configure_nova + #sleep 10 echo "Preparing image creation" - nfp_configure_nova - sleep 10 create_images echo "Launching the Visibility VM" launch_visibilityVM @@ -225,9 +240,9 @@ function mode_shift { echo "Task: Shifting mode of NFP from $FROM mode to $TO mode." echo "Preparing for the NFP mode shift." -prepare_for_mode_shift +#prepare_for_mode_shift -echo "Shifting NFP to $TO mode. There will be a little downtime. Kindly bear with me." +echo "Shifting NFP to $TO mode. There will be a little downtime. Kindly bear with it." mode_shift echo "Successfully shifted NFP from $FROM mode to $TO mode." diff --git a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py index eadfd4f05a..31d508af71 100755 --- a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py @@ -162,7 +162,7 @@ def update_haproxy_repo(): return 0 -def dib(nfp_branch_name, local_conf_file_path): +def dib(nfp_branch_name, docker_images_url): dib = conf['dib'] elems = "%s/elements/" % cur_dir @@ -203,10 +203,7 @@ def dib(nfp_branch_name, local_conf_file_path): create_visibility_docker() # create_configurator_docker(nfp_branch_name) # set environment variable, needed by 'extra-data.d' - p1 = subprocess.Popen(['grep', 'DOCKER_IMAGES_URL', local_conf_file_path], stdout=subprocess.PIPE) - p2 = subprocess.Popen(['cut', '-d', '=', '-f', '2'], stdin=p1.stdout, stdout=subprocess.PIPE) - p3 = subprocess.Popen(['tr', '-d', '[[:space:]]'], stdin=p2.stdout, stdout=subprocess.PIPE) - os.environ['DOCKER_IMAGES_URL'] = p3.communicate()[0] + os.environ['DOCKER_IMAGES_URL'] = docker_images_url # for bigger size images dib_args.append('--no-tmpfs') elif element == 'haproxy': @@ -238,9 +235,8 @@ def dib(nfp_branch_name, local_conf_file_path): if not ret: image_path = "%s/output/%s.qcow2" % (cur_dir, image_name) print("Image location: %s" % image_path) - with open("/tmp/image_path", "w") as f: + with open("%s/output/last_built_image_path" % cur_dir, "w") as f: f.write(image_path) - f.close() if __name__ == "__main__": @@ -250,7 +246,7 @@ def dib(nfp_branch_name, local_conf_file_path): print("Usage:\n\t%s NFP_BRANCH_NAME local.conf file" % sys.argv[0]) print("\twhere: contains all the configuration") print("\tNFP_BRANCH_NAME is the string") - print("\tand is the configuration file from the devstack directory.") + print("\tand DOCKER_IMAGES_URL is the URL string.") exit() # save PWD From 081c8d8868ebd1d6b9c326a4c98882191e00cfe3 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Tue, 19 Jul 2016 17:22:46 +0530 Subject: [PATCH 090/157] Enabled mode shift(uncommented) --- gbpservice/nfp/scripts/mode_shift_enterprise.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/nfp/scripts/mode_shift_enterprise.sh b/gbpservice/nfp/scripts/mode_shift_enterprise.sh index c7922a190f..f8c931baaa 100644 --- a/gbpservice/nfp/scripts/mode_shift_enterprise.sh +++ b/gbpservice/nfp/scripts/mode_shift_enterprise.sh @@ -240,7 +240,7 @@ function mode_shift { echo "Task: Shifting mode of NFP from $FROM mode to $TO mode." echo "Preparing for the NFP mode shift." -#prepare_for_mode_shift +prepare_for_mode_shift echo "Shifting NFP to $TO mode. There will be a little downtime. Kindly bear with it." mode_shift From 86051973d587da7c398961d52e557e1aa3652172 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Tue, 19 Jul 2016 17:51:06 +0530 Subject: [PATCH 091/157] Fixed configure nova --- .../nfp/scripts/mode_shift_enterprise.sh | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/gbpservice/nfp/scripts/mode_shift_enterprise.sh b/gbpservice/nfp/scripts/mode_shift_enterprise.sh index f8c931baaa..1d73e77885 100644 --- a/gbpservice/nfp/scripts/mode_shift_enterprise.sh +++ b/gbpservice/nfp/scripts/mode_shift_enterprise.sh @@ -31,20 +31,20 @@ function nfp_configure_nova { iniset $NOVA_CONF DEFAULT instance_usage_audit "True" source $DEVSTACK_SRC_DIR/functions-common - sudo stop_process n-cpu - sudo stop_process n-cond - sudo stop_process n-sch - sudo stop_process n-novnc - sudo stop_process n-cauth - sudo stop_process n-api + stop_process n-cpu + stop_process n-cond + stop_process n-sch + stop_process n-novnc + stop_process n-cauth + stop_process n-api source $DEVSTACK_SRC_DIR/lib/nova - sudo start_nova_compute - sudo start_nova_api - sudo run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" - sudo run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" - sudo run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" - sudo run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" + start_nova_compute + start_nova_api + run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" + run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" + run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" + run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" } function create_port_for_vm { @@ -214,9 +214,9 @@ function prepare_for_mode_shift { setup_ssh_key echo "Copy files and configure" copy_files - #echo "Configuring nova" - #nfp_configure_nova - #sleep 10 + echo "Configuring nova" + nfp_configure_nova + sleep 10 echo "Preparing image creation" create_images echo "Launching the Visibility VM" From 6efa37f2ccf91970b1383589fbbc41128408fe84 Mon Sep 17 00:00:00 2001 From: dpaks Date: Tue, 19 Jul 2016 20:32:28 +0530 Subject: [PATCH 092/157] pep8 fix --- .../nfp/configurator/drivers/firewall/test_vyos_fw_driver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index 3eaa9e57f1..04555b24ef 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -17,11 +17,11 @@ from oslo_config import cfg from oslo_serialization import jsonutils -from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( - fw_test_data as fo) from gbpservice.contrib.nfp.configurator.drivers.firewall.vyos import ( vyos_fw_driver as fw_dvr) from gbpservice.contrib.nfp.configurator.lib import constants as const +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( + fw_test_data as fo) class FwGenericConfigDriverTestCase(base.BaseTestCase): From 5ea0b47563a4e9b58b56f0742e3f4e7c984492a4 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Wed, 20 Jul 2016 09:03:40 +0530 Subject: [PATCH 093/157] Addressed few review comments --- .../nfp/scripts/mode_shift_enterprise.sh | 78 ++++++++++++++----- 1 file changed, 57 insertions(+), 21 deletions(-) diff --git a/gbpservice/nfp/scripts/mode_shift_enterprise.sh b/gbpservice/nfp/scripts/mode_shift_enterprise.sh index 1d73e77885..571591c7a4 100644 --- a/gbpservice/nfp/scripts/mode_shift_enterprise.sh +++ b/gbpservice/nfp/scripts/mode_shift_enterprise.sh @@ -1,11 +1,11 @@ #! /bin/bash -source /opt/stack/gbp/gbpservice/nfp/config/mode_shift.conf - +#FIXME(RPM): Devstack can be at different location. Fix this DEVSTACK_SRC_DIR=/home/stack/devstack source $DEVSTACK_SRC_DIR/local.conf -NFPSERVICE_DIR=/opt/stack/gbp -# TODO(DEEPAK): Should be retrieved from a result file populated by advanced mode. +NFPSERVICE_DIR=$DEST/gbp +source $NFPSERVICE_DIR/gbpservice/nfp/config/mode_shift.conf +# BUGBUG(DEEPAK): Should be retrieved from a result file populated by advanced mode. EXT_NET_NAME=ext-net function setup_ssh_key { @@ -13,17 +13,22 @@ function setup_ssh_key { sudo ssh-keygen -f configurator_vm -t rsa -N '' echo "Give the password for the root user of the Configurator VM when prompted." sleep 5 - cat configurator_vm.pub | sudo ip netns exec nfp-proxy ssh -o "StrictHostKeyChecking no" root@$configurator_ip 'cat >> .ssh/authorized_keys' + cat configurator_vm.pub |\ + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" root@$configurator_ip\ + 'cat >> .ssh/authorized_keys' sleep 5 } function copy_files { sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@120.0.0.3\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator\ cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config + # BUGBUG(RPM): Add any other enterprise files here, and configure them } +# FIXME(RPM): Not working, this need to be fixed. function nfp_configure_nova { NOVA_CONF_DIR=/etc/nova NOVA_CONF=$NOVA_CONF_DIR/nova.conf @@ -74,36 +79,59 @@ function create_images { VISIBILITY_QCOW2_IMAGE_NAME=visibility InstanceName="VisibilityVM_instance" create_port_for_vm $VISIBILITY_QCOW2_IMAGE_NAME $InstanceName + # edits the docker file to add visibility vm IP address + configure_vis_ip_addr_in_docker if [[ $VISIBILITY_QCOW2_IMAGE = build ]]; then - # edits the docker file to add visibility vm IP address - configure_vis_ip_addr_in_docker - # prepare visibility source, this is needed for diskimage build cd /home/stack/ sudo rm -rf visibility - sudo git clone https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git -b $VISIBILITY_GIT_BRANCH + sudo git clone\ + https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git\ + -b $VISIBILITY_GIT_BRANCH echo "Building Image: $VISIBILITY_QCOW2_IMAGE_NAME" cd $NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create/ - sudo python visibility_disk_image_create.py visibility_conf.json $GBPSERVICE_BRANCH $DOCKER_IMAGES_URL + sudo python visibility_disk_image_create.py\ + visibility_conf.json $GBPSERVICE_BRANCH $DOCKER_IMAGES_URL VISIBILITY_QCOW2_IMAGE=$(cat output/last_built_image_path) fi echo "Uploading Image: $VISIBILITY_QCOW2_IMAGE_NAME" - glance image-create --name $VISIBILITY_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $VISIBILITY_QCOW2_IMAGE + glance image-create\ + --name $VISIBILITY_QCOW2_IMAGE_NAME\ + --disk-format qcow2\ + --container-format bare\ + --visibility public\ + --file $VISIBILITY_QCOW2_IMAGE sleep 4 if ! [[ -z $AsavQcow2Image ]]; then - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=asav,device_type=nova --vendor NFP asav_fw_profile + gbp service-profile-create\ + --servicetype FIREWALL\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=asav,device_type=nova\ + --vendor NFP\ + asav_fw_profile ASAV_QCOW2_IMAGE_NAME=asav echo "Uploading Image: $ASAV_QCOW2_IMAGE_NAME" - glance image-create --name $ASAV_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $AsavQcow2Image + glance image-create\ + --name $ASAV_QCOW2_IMAGE_NAME\ + --disk-format qcow2\ + --container-format bare\ + --visibility public\ + --file $AsavQcow2Image fi if ! [[ -z $PaloAltoQcow2Image ]]; then PALO_ALTO_QCOW2_IMAGE_NAME=paloalto echo "Uploading Image: $PALO_ALTO_QCOW2_IMAGE_NAME" - glance image-create --name $PALO_ALTO_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $PaloAltoQcow2Image + glance image-create\ + --name $PALO_ALTO_QCOW2_IMAGE_NAME\ + --disk-format qcow2\ + --container-format bare\ + --visibility public\ + --file $PaloAltoQcow2Image fi } @@ -111,7 +139,6 @@ function configure_visibility_user_data { # $1 is the Visibility VM's IP address CUR_DIR=$PWD visibility_vm_ip=$1 - configurator_ip=`neutron port-show pt_configuratorVM_instance -f value -c fixed_ips | cut -d'"' -f8` sudo rm -rf /opt/visibility_user_data sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. cd /opt @@ -121,6 +148,7 @@ function configure_visibility_user_data { sudo echo $value sudo sed -i "s||${value}|" visibility_user_data sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data + #BUGBUG(RPM): Verify HOST_IP sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data @@ -166,7 +194,13 @@ function launch_visibilityVM { configure_visibility_user_data $visibility_ip echo "Launching Visibility image" - nova boot --image $ImageId --flavor m1.xlarge --user-data /opt/visibility_user_data --nic port-id=$visibility_port_id --nic port-id=$ExtPortId $InstanceName + nova boot\ + --image $ImageId\ + --flavor m1.xlarge\ + --user-data /opt/visibility_user_data\ + --nic port-id=$visibility_port_id\ + --nic port-id=$ExtPortId\ + $InstanceName sleep 10 attach_security_groups } @@ -192,7 +226,6 @@ function nfp_logs_forword { function restart_processes { # restart configurator - configurator_ip=120.0.0.3 sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator screen -S configurator -X quit @@ -207,6 +240,7 @@ function prepare_for_mode_shift { unset OS_USER_DOMAIN_ID unset OS_PROJECT_DOMAIN_ID + # BUGBUG(RPM): Configurator's port name should be retrieved from a result file populated by advanced mode. configurator_ip=`neutron port-show pt_configuratorVM_instance -f value -c fixed_ips | cut -d'"' -f8` echo "Configurator's IP: $configurator_ip" @@ -214,9 +248,11 @@ function prepare_for_mode_shift { setup_ssh_key echo "Copy files and configure" copy_files - echo "Configuring nova" - nfp_configure_nova - sleep 10 + # FIXME(RPM): Restart of the processes in nfp_configure_nova + # is not working, this need to be fixed. + #echo "Configuring nova" + #nfp_configure_nova + #sleep 10 echo "Preparing image creation" create_images echo "Launching the Visibility VM" From 621ed88b5b4d26375d6bcc564edc096853a16a0b Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Wed, 20 Jul 2016 11:26:16 +0530 Subject: [PATCH 094/157] fixed pep8 issue in vpn driver --- .../nfp/configurator/drivers/vpn/test_vpn_driver.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py index ca666f0d0d..fcb3cd7d89 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py @@ -12,18 +12,18 @@ import requests -from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( - vpn_test_data) +import json +import mock + from gbpservice.contrib.nfp.configurator.agents import vpn from gbpservice.contrib.nfp.configurator.drivers.base import base_driver from gbpservice.contrib.nfp.configurator.drivers.vpn.vyos import ( vyos_vpn_driver) -from oslo_serialization import jsonutils - +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( + vpn_test_data) from neutron.tests import base -import json -import mock +from oslo_serialization import jsonutils bdobj = base_driver.BaseDriver('conf') From 6953eb009122f9bc472ce48c4cae8c0eb692e2a6 Mon Sep 17 00:00:00 2001 From: DhuldevValekar Date: Wed, 20 Jul 2016 11:34:41 +0530 Subject: [PATCH 095/157] l3policy-update fix --- devstack/lib/nfp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 68d0306b20..8acd047798 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -213,6 +213,8 @@ function create_nfp_gbp_resources { neutron router-gateway-clear\ l3p_service_management + gbp l3policy-update --external-segment "" service_management + } # create_port_for_vm() - Create a port, and get its details From e686136c045cae01c09a38979cac4a38e8b7b069 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Wed, 20 Jul 2016 11:57:24 +0530 Subject: [PATCH 096/157] fixed testcase failure and pep8 isses --- .../tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py index fcb3cd7d89..cee0c45724 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/vpn/test_vpn_driver.py @@ -21,6 +21,7 @@ vyos_vpn_driver) from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( vpn_test_data) + from neutron.tests import base from oslo_serialization import jsonutils @@ -158,7 +159,7 @@ def __init__(self, *args, **kwargs): self.context = self.test_dict.make_service_context() self.plugin_rpc = vpn.VpnaasRpcSender(self.test_dict.sc) self.rest_apt = vyos_vpn_driver.RestApi(self.test_dict.vm_mgmt_ip) - self.driver = vyos_vpn_driver.VpnGenericConfigDriver(self.conf) + self.driver = vyos_vpn_driver.VpnGenericConfigDriver() self.resp = mock.Mock() self.fake_resp_dict = {'status': True} self.kwargs = self.test_dict.fake_resource_data() From d2a7ee175e4a56aa6a71b7cca1bd0c9fd84bbef1 Mon Sep 17 00:00:00 2001 From: Rahul Shikhare Date: Wed, 20 Jul 2016 12:22:08 +0530 Subject: [PATCH 097/157] unit test and import related commets fix. --- .../nfp/config_orchestrator/common/common.py | 2 +- .../handlers/config/loadbalancerv2.py | 9 +++-- .../handlers/notification/handler.py | 6 ++-- .../modules/test_config_orch.py | 33 ++++++++++--------- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/gbpservice/contrib/nfp/config_orchestrator/common/common.py b/gbpservice/contrib/nfp/config_orchestrator/common/common.py index fb6cd7475c..64b1a13145 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/common/common.py +++ b/gbpservice/contrib/nfp/config_orchestrator/common/common.py @@ -12,13 +12,13 @@ from gbpservice.contrib.nfp.config_orchestrator.common import ( topics as a_topics) +from gbpservice.nfp.core import log as nfp_logging from gbpservice.nfp.lib import transport from neutron.common import constants as n_constants from neutron.common import rpc as n_rpc from neutron.common import topics as n_topics -from gbpservice.nfp.core import log as nfp_logging import oslo_messaging as messaging LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py index fd36fedf12..a967ef896d 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/config/loadbalancerv2.py @@ -87,7 +87,7 @@ def _context(self, **kwargs): if context.is_admin: kwargs['tenant_id'] = context.tenant_id core_db = self._get_core_context(context, kwargs['tenant_id']) - # TODO(jiahao): _get_lb_context() fails for flavor_id, disable it + # REVISIT(jiahao): _get_lb_context() fails for flavor_id, disable it # for now. Sent the whole core_db to cofigurator # lb_db = self._get_lb_context(**kwargs) # db = self._filter_service_info_with_resource(lb_db, core_db) @@ -139,8 +139,7 @@ def _data_wrapper(self, context, tenant_id, name, reason, nf, **kwargs): 'context': context, 'description': str(description)} - ctx_dict, rsrc_ctx_dict = self.\ - _prepare_resource_context_dicts(**args) + ctx_dict, rsrc_ctx_dict = self._prepare_resource_context_dicts(**args) nfp_context.update({'neutron_context': ctx_dict, 'requester': 'nas_service', @@ -172,7 +171,7 @@ def _fetch_nf_from_resource_desc(self, desc): nf_id = desc_dict['network_function_id'] return nf_id - # TODO(jiahao): Argument allocate_vip and + # REVISIT(jiahao): Argument allocate_vip and # delete_vip_port are not implememnted. @log_helpers.log_method_call def create_loadbalancer(self, context, loadbalancer, driver_name, @@ -295,7 +294,7 @@ def delete_healthmonitor(self, context, healthmonitor): 'healthmonitor', nf, healthmonitor=healthmonitor) nfp_logging.clear_logging_context() - # TODO(jiahao): L7policy support not implemented + # REVISIT(jiahao): L7policy support not implemented # disable L7policy # def create_l7policy(self, context, l7policy): # self._post( diff --git a/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py index a86cce2da0..a3f9961c0e 100644 --- a/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py +++ b/gbpservice/contrib/nfp/config_orchestrator/handlers/notification/handler.py @@ -10,6 +10,9 @@ # License for the specific language governing permissions and limitations # under the License. +import sys +import traceback + from gbpservice.contrib.nfp.config_orchestrator.common import ( lbv2_constants as lbv2_const) from gbpservice.contrib.nfp.config_orchestrator.common import ( @@ -20,9 +23,6 @@ import oslo_messaging as messaging -import sys -import traceback - LOG = nfp_logging.getLogger(__name__) diff --git a/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py index deab9b49dd..ae43ac9450 100644 --- a/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py +++ b/gbpservice/contrib/tests/unit/nfp/config_orchestrator/modules/test_config_orch.py @@ -10,6 +10,10 @@ # License for the specific language governing permissions and limitations # under the License. +import mock +import uuid + +from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( firewall) from gbpservice.contrib.nfp.config_orchestrator.handlers.config import ( @@ -17,13 +21,10 @@ from gbpservice.contrib.nfp.config_orchestrator.handlers.config import vpn from gbpservice.contrib.nfp.config_orchestrator.handlers.notification import ( handler as notif_handler) - -from gbpservice.contrib.nfp.config_orchestrator.common import common from gbpservice.nfp.lib import transport -import mock + from neutron import context as ctx -import unittest -import uuid +from neutron.tests import base class TestContext(object): @@ -181,9 +182,10 @@ def _check_resource_header_data(self, rsrc_name, data, resource): return mod_method(data, resource) -class FirewallTestCase(unittest.TestCase): +class FirewallTestCase(base.BaseTestCase): def setUp(self): + super(FirewallTestCase, self).setUp() self.conf = Conf() self.fw_handler = firewall.FwAgent(self.conf, 'sc') self.context = TestContext().get_context() @@ -254,9 +256,10 @@ def test_delete_firewall(self): self.fw_handler.delete_firewall(self.context, self.fw, self.host) -class LoadBalanceTestCase(unittest.TestCase): +class LoadBalanceTestCase(base.BaseTestCase): def setUp(self): + super(LoadBalanceTestCase, self).setUp() self.conf = Conf() self.lb_handler = loadbalancer.LbAgent(self.conf, 'sc') self.context = TestContext().get_context() @@ -583,9 +586,10 @@ def test_delete_pool_health_monitor(self): self.context, hm, pool_id) -class VPNTestCase(unittest.TestCase): +class VPNTestCase(base.BaseTestCase): def setUp(self): + super(VPNTestCase, self).setUp() self.conf = Conf() self.vpn_handler = vpn.VpnAgent(self.conf, 'sc') self.context = TestContext().get_context() @@ -704,7 +708,7 @@ def test_update_vpnservice_for_ipsec_site_connection(self): self.vpn_handler.vpnservice_updated(self.context, **kwargs) -class FirewallNotifierTestCase(unittest.TestCase): +class FirewallNotifierTestCase(base.BaseTestCase): class Controller(object): @@ -715,6 +719,7 @@ def post_event(self, event): return def setUp(self): + super(FirewallNotifierTestCase, self).setUp() self.conf = Conf() self.n_handler = notif_handler.NaasNotificationHandler( self.conf, self.Controller()) @@ -759,7 +764,7 @@ def test_set_firewall_deleted(self): notification_data) -class LoadbalancerNotifierTestCase(unittest.TestCase): +class LoadbalancerNotifierTestCase(base.BaseTestCase): class Controller(object): @@ -770,6 +775,7 @@ def post_event(self, event): return def setUp(self): + super(LoadbalancerNotifierTestCase, self).setUp() self.conf = Conf() self.n_handler = notif_handler.NaasNotificationHandler( self.conf, self.Controller()) @@ -816,7 +822,7 @@ def test_update_pool_stats(self): notification_data) -class VpnNotifierTestCase(unittest.TestCase): +class VpnNotifierTestCase(base.BaseTestCase): class Controller(object): @@ -827,6 +833,7 @@ def post_event(self, event): return def setUp(self): + super(VpnNotifierTestCase, self).setUp() self.conf = Conf() self.n_handler = notif_handler.NaasNotificationHandler( self.conf, self.Controller()) @@ -860,7 +867,3 @@ def test_update_status(self): transport.RPCClient = mock.MagicMock(return_value=rpc_client) self.n_handler.handle_notification(self.context, notification_data) - - -if __name__ == '__main__': - unittest.main() From 11ce3891175ce0a58c402f83563346d234be8d6e Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Wed, 20 Jul 2016 12:24:15 +0530 Subject: [PATCH 098/157] fixed pep8 issued --- .../tests/unit/nfp/configurator/agents/test_vpn_agent.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_vpn_agent.py b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_vpn_agent.py index efe1c973d0..67012ead1a 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_vpn_agent.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/agents/test_vpn_agent.py @@ -13,10 +13,10 @@ import mock -from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( - vpn_test_data) from gbpservice.contrib.nfp.configurator.agents import vpn from gbpservice.contrib.nfp.configurator.lib import vpn_constants as const +from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( + vpn_test_data) from neutron.tests import base From c3c505e8fabe18a176e94d6a154af94eff5124a3 Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 20 Jul 2016 14:53:34 +0530 Subject: [PATCH 099/157] run_tests will read all unit test files under gbservice --- .testr.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.testr.conf b/.testr.conf index 9ceb874d29..418e573987 100644 --- a/.testr.conf +++ b/.testr.conf @@ -2,6 +2,6 @@ test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \ OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \ OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \ - ${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./gbpservice/neutron/tests/unit} $LISTOPT $IDOPTION + ${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./gbpservice} $LISTOPT $IDOPTION test_id_option=--load-list $IDFILE test_list_option=--list From 63e1d0880c438563a0fe1ca213dd27c8580d508e Mon Sep 17 00:00:00 2001 From: dpaks Date: Wed, 20 Jul 2016 17:14:28 +0530 Subject: [PATCH 100/157] fixed unit test --- .../drivers/firewall/test_vyos_fw_driver.py | 21 ------------------- .../configurator/modules/test_configurator.py | 8 ++----- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py index 04555b24ef..187d4110ac 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/drivers/firewall/test_vyos_fw_driver.py @@ -40,27 +40,6 @@ def __init__(self, *args, **kwargs): self.fake_resp_dict = {'status': True, 'reason': 'not found!'} self.kwargs = self.fo._fake_resource_data() - def test_configure_log_forward(self): - """ Implements test case for configure log forward method - of generic config driver. - - Returns: none - - """ - - resp_data = self.fake_resp_dict - resp_data['status'] = False - with mock.patch.object( - requests, 'post', return_value=self.resp) as mock_post, ( - mock.patch.object( - self.resp, 'json', return_value=resp_data)): - self.driver.configure_interfaces(self.fo.context, self.kwargs) - - data = jsonutils.dumps(self.fo.log_forward_data()) - mock_post.assert_called_with( - self.fo.get_url_for_api('log_forward'), - data, timeout=self.fo.timeout) - def test_configure_static_ip(self): """ Implements test case for configure static ip method of generic config driver. diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py index e16eae58a1..c5ec2dfdfd 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py @@ -11,8 +11,8 @@ # under the License. import mock -import unittest +from neutron.tests import base from oslo_log import log as logging from gbpservice.contrib.nfp.configurator.agents import firewall as fw @@ -31,7 +31,7 @@ """ -class ConfiguratorRpcManagerTestCase(unittest.TestCase): +class ConfiguratorRpcManagerTestCase(base.BaseTestCase): def __init__(self, *args, **kwargs): super(ConfiguratorRpcManagerTestCase, self).__init__(*args, **kwargs) @@ -335,7 +335,3 @@ def test_get_notifications_generic_configurator_api(self): """ self._test_notifications() - - -if __name__ == '__main__': - unittest.main() From bc84e8aba4fcbef11919f586c4efcbf03d9a8f83 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Wed, 20 Jul 2016 18:07:30 +0530 Subject: [PATCH 101/157] Removed service agents dependancy in devstack --- devstack/lib/gbp | 13 +- devstack/lib/nfp | 33 +-- devstack/override-defaults | 12 + devstack/plugin.sh | 7 +- devstack/settings | 15 +- .../diskimage-create/disk_image_create.py | 67 ----- .../disk_image_create_advanced.py | 229 ++++++++++++++++++ 7 files changed, 267 insertions(+), 109 deletions(-) create mode 100755 gbpservice/tests/contrib/diskimage-create/disk_image_create_advanced.py diff --git a/devstack/lib/gbp b/devstack/lib/gbp index 1d3d41b5e1..cb93d0735d 100755 --- a/devstack/lib/gbp +++ b/devstack/lib/gbp @@ -26,6 +26,8 @@ AIM_REPO=http://github.com/noironetworks/aci-integration-module.git AIM_DIR=$DEST/aim APICML2_REPO=http://github.com/noironetworks/apic-ml2-driver.git APICML2_DIR=$DEST/apic_ml2 +OPFLEX_REPO=http://github.com/noironetworks/python-opflex-agent.git +OPFLEX_DIR=$DEST/opflexagent # Save trace setting XTRACE=$(set +o | grep xtrace) @@ -81,17 +83,6 @@ function install_gbpui { mv $GBPUI_DIR/_test-requirements.txt $GBPUI_DIR/test-requirements.txt } -function install_aim { - git_clone $AIM_REPO $AIM_DIR $AIM_BRANCH - mv $AIM_DIR/test-requirements.txt $AIM_DIR/_test-requirements.txt - setup_develop $AIM_DIR - mv $AIM_DIR/_test-requirements.txt $AIM_DIR/test-requirements.txt -} - -function init_aim { - aim -c $NEUTRON_CONF db-migration upgrade -} - function install_apic_ml2 { git_clone $APICML2_REPO $APICML2_DIR $APICML2_BRANCH mv $APICML2_DIR/test-requirements.txt $APICML2_DIR/_test-requirements.txt diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 8acd047798..01e5f4a49a 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -213,8 +213,10 @@ function create_nfp_gbp_resources { neutron router-gateway-clear\ l3p_service_management - gbp l3policy-update --external-segment "" service_management + gbp l3policy-update\ + --external-segment ""\ + service_management } # create_port_for_vm() - Create a port, and get its details @@ -239,10 +241,6 @@ function create_nfp_image { unset OS_USER_DOMAIN_ID unset OS_PROJECT_DOMAIN_ID - # during diskimage build, the following setting in apache2 is needed for local repo - sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/ - sudo service apache2 restart - if [[ $NFP_DEVSTACK_MODE = base ]]; then RefConfiguratorQcow2ImageName=reference_configurator_image echo "Building Image: $RefConfiguratorQcow2ImageName" @@ -264,30 +262,17 @@ function create_nfp_image { glance image-create --name $ConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $ConfiguratorQcow2Image VyosQcow2ImageName=vyos - if [[ $VyosQcow2Image = build ]]; then - echo "Building Image: $VyosQcow2ImageName" - cur_dir=$PWD - cd $DISKIMAGE_CREATE_DIR/vyos/ - sudo python vyos_image_create.py vyos_conf.json - cd $cur_dir - VyosQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) + if ! [[ -z $VyosQcow2Image ]]; then + echo "Uploading Image: $VyosQcow2ImageName" + glance image-create --name $VyosQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $VyosQcow2Image fi - echo "Uploading Image: $VyosQcow2ImageName" - glance image-create --name $VyosQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $VyosQcow2Image HaproxyQcow2ImageName=haproxy - if [[ $HaproxyQcow2Image = build ]]; then - echo "Building Image: $HaproxyQcow2ImageName" - sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/haproxy_conf.json - HaproxyQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) + if ! [[ -z $HaproxyQcow2Image ]]; then + echo "Uploading Image: $HaproxyQcow2ImageName" + glance image-create --name $HaproxyQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $HaproxyQcow2Image fi - echo "Uploading Image: $HaproxyQcow2ImageName" - glance image-create --name $HaproxyQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $HaproxyQcow2Image fi - - # restore the apache2 setting that we did above - sudo rm /etc/apache2/sites-enabled/000-default.conf - sudo service apache2 restart } # configure_configurator_user_data() - Configure Configurator user data diff --git a/devstack/override-defaults b/devstack/override-defaults index 09ac66b05e..91a11bb8cd 100755 --- a/devstack/override-defaults +++ b/devstack/override-defaults @@ -1 +1,13 @@ NEUTRON_CREATE_INITIAL_NETWORKS="False" + +ENABLE_APIC_AIM=${ENABLE_APIC_AIM:-False} + +if [[ $ENABLE_APIC_AIM = True ]]; then + echo_summary "Overriding defaults for apic_aim" + + Q_PLUGIN=${Q_PLUGIN:-ml2} + Q_ML2_TENANT_NETWORK_TYPE=${Q_ML2_TENANT_NETWORK_TYPE:-opflex} + Q_ML2_PLUGIN_TYPE_DRIVERS=${Q_ML2_PLUGIN_TYPE_DRIVERS:-local,vlan,opflex} + Q_ML2_PLUGIN_MECHANISM_DRIVERS=${Q_ML2_PLUGIN_MECHANISM_DRIVERS:-apic_aim} + Q_ML2_PLUGIN_EXT_DRIVERS=${Q_ML2_PLUGIN_EXT_DRIVERS-apic_aim,port_security} +fi diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 08b12193f7..881fe0db17 100755 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -86,6 +86,7 @@ if is_service_enabled group-policy; then echo_summary "Preparing $GBP" elif [[ "$1" == "stack" && "$2" == "install" ]]; then echo_summary "Installing $GBP" + [[ $ENABLE_APIC_AIM = True ]] && install_apic_aim if [[ $ENABLE_NFP = True ]]; then echo_summary "Installing $NFP" prepare_nfp_image_builder @@ -104,9 +105,8 @@ if is_service_enabled group-policy; then configure_nfp_vpn fi fi -# install_apic_ml2 -# install_aim -# init_aim + # REVISIT move installs to install phase? + # install_apic_ml2 install_gbpclient install_gbpservice [[ $ENABLE_NFP = True ]] && install_nfpgbpservice @@ -114,6 +114,7 @@ if is_service_enabled group-policy; then [[ $ENABLE_NFP = True ]] && init_nfpgbpservice install_gbpheat install_gbpui + [[ $ENABLE_APIC_AIM = True ]] && configure_apic_aim stop_apache_server start_apache_server elif [[ "$1" == "stack" && "$2" == "extra" ]]; then diff --git a/devstack/settings b/devstack/settings index 9f2d2598f2..62be0cbaae 100755 --- a/devstack/settings +++ b/devstack/settings @@ -1,12 +1,13 @@ # Make sure the plugin name in local.conf is "gbp", as in: enable_plugin gbp source $DEST/gbp/devstack/lib/gbp + +[[ $ENABLE_APIC_AIM = True ]] && source $DEST/gbp/devstack/lib/apic_aim + ENABLE_NFP=${ENABLE_NFP:-False} [[ $ENABLE_NFP = True ]] && NFP_DEVSTACK_MODE=${NFP_DEVSTACK_MODE:-base} [[ $ENABLE_NFP = True ]] && source $DEST/gbp/devstack/lib/nfp # VM locations ConfiguratorQcow2Image=${ConfiguratorQcow2Image:-build} -VyosQcow2Image=${VyosQcow2Image:-build} -HaproxyQcow2Image=${HaproxyQcow2Image:-build} # Enable necessary Neutron plugins, including group_policy and ncp Q_SERVICE_PLUGIN_CLASSES=neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,group_policy,ncp @@ -25,14 +26,20 @@ GBPHEAT_REPO=${GBPHEAT_REPO:-${GIT_BASE}/openstack/group-based-policy-automation GBPHEAT_BRANCH=${GBPHEAT_BRANCH:-master} AIM_BRANCH=${AIM_BRANCH:-master} APICML2_BRANCH=${APICML2_BRANCH:-master} +OPFLEX_BRANCH=${OPFLEX_BRANCH:-master} # Enable necessary services, including group-policy (and disable others) disable_service n-net enable_service n-novnc enable_service q-svc -enable_service q-agt +if [[ $ENABLE_APIC_AIM = True ]]; then + disable_service q-agt + disable_service q-l3 +else + enable_service q-agt + enable_service q-l3 +fi enable_service q-dhcp -enable_service q-l3 enable_service q-fwaas [[ $ENABLE_NFP = True ]] && [[ $NFP_DEVSTACK_MODE = advanced ]] && enable_service neutron-vpnaas enable_service q-lbaas diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py index e4295faa98..90df7bcd85 100755 --- a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py @@ -10,7 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import commands import os from oslo_serialization import jsonutils import subprocess @@ -66,63 +65,6 @@ def create_configurator_docker(nfp_branch_name): return 0 -def create_apt_source_list(): - """ - Creates a file 00-haproxy-agent-debs, this will be executed by dib to - create a file haproxy-agent-debs.list file inside VM - at /etc/apt/sources.list.d/ - This file will contain entries for apt to fetch any debs from - our local repo - """ - elems = "%s/elements" % cur_dir - - # update repo_host ip in 00-haproxy-agent-debs file - # this file will be copied to VM at /etc/apt/sources.list.d/ - os.chdir("%s/debs/pre-install.d/" % elems) - with open("00-haproxy-agent-debs", "w") as f: - f.write("#!/bin/bash\n\n") - f.write("set -eu\n") - f.write("set -o xtrace\n\n") - f.write("apt-get install ubuntu-cloud-keyring\n") - if 'haproxy' in conf['dib']['elements']: - tmp_str = ('echo "deb http://%s/ /haproxy/"' - ' > /etc/apt/sources.list.d/haproxy-agent-debs.list' - % 'localhost') - f.write(tmp_str + '\n') - - -def update_haproxy_repo(): - haproxy_vendor_dir = ("%s/../../../nfp/service_vendor_agents/haproxy" - % cur_dir) - service = 'haproxy-agent' - version = '1' - release = '1' - subprocess.call(['rm', '-rf', - "%s/%s/deb-packages" % (haproxy_vendor_dir, service)]) - os.chdir(haproxy_vendor_dir) - ret = subprocess.call(['bash', - 'build_haproxy_agent_deb.sh', - service, - version, release]) - if(ret): - print("ERROR: Unable to generate haproxy-agent deb package") - return 1 - - subprocess.call(["rm", "-rf", "/var/www/html/haproxy"]) - out = subprocess.call(["mkdir", "-p", "/var/www/html/haproxy/"]) - haproxy_agent_deb = ("%s/%s/deb-packages/%s-%s-%s.deb" - % (haproxy_vendor_dir, service, - service, version, release)) - subprocess.call(["cp", haproxy_agent_deb, "/var/www/html/haproxy/"]) - - os.chdir("/var/www/html") - out = commands.getoutput("dpkg-scanpackages haproxy/ /dev/null" - " | gzip -9c > haproxy/Packages.gz") - print(out) - - return 0 - - def dib(nfp_branch_name): dib = conf['dib'] elems = "%s/elements/" % cur_dir @@ -163,10 +105,6 @@ def dib(nfp_branch_name): create_configurator_docker(nfp_branch_name) # for bigger size images dib_args.append('--no-tmpfs') - elif element == 'haproxy': - image_name = 'haproxy' - dib_args.append('debs') - create_apt_source_list() # offline mode, assuming the image cache (tar) already exists dib_args.append('--offline') @@ -213,11 +151,6 @@ def dib(nfp_branch_name): # parse args from json file parse_json(sys.argv[1]) - elements = conf['dib']['elements'] - elem = 'haproxy' - if elem in elements: - if(update_haproxy_repo()): - exit() nfp_branch_name = sys.argv[2] if len(sys.argv) == 3 else None diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create_advanced.py b/gbpservice/tests/contrib/diskimage-create/disk_image_create_advanced.py new file mode 100755 index 0000000000..e4295faa98 --- /dev/null +++ b/gbpservice/tests/contrib/diskimage-create/disk_image_create_advanced.py @@ -0,0 +1,229 @@ +# 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 commands +import os +from oslo_serialization import jsonutils +import subprocess +import sys + + +conf = [] +cur_dir = '' + + +def parse_json(j_file): + global conf + + with open(j_file) as json_data: + conf = jsonutils.load(json_data) + return + + +def set_nfp_git_branch(nfp_branch_name, configurator_dir): + Dockerfile_path = configurator_dir + '/Dockerfile' + cmd = "sudo sed -i \"s/GIT-BRANCH-NAME/%s/g\" %s" % ( + nfp_branch_name.replace('/', '\/'), Dockerfile_path) + os.system(cmd) + + +def create_configurator_docker(nfp_branch_name): + configurator_dir = "%s/../../../contrib/nfp/configurator" % cur_dir + docker_images = "%s/output/docker_images/" % cur_dir + if not os.path.exists(docker_images): + os.makedirs(docker_images) + + # create a docker image + os.chdir(configurator_dir) + set_nfp_git_branch(nfp_branch_name, configurator_dir) + docker_args = ['docker', 'build', '-t', 'configurator-docker', '.'] + ret = subprocess.call(docker_args) + if(ret): + print("Failed to build docker image [configurator-docker]") + return -1 + + os.chdir(docker_images) + del(docker_args) + # save the docker image + docker_args = ['docker', 'save', '-o', 'configurator-docker', + 'configurator-docker'] + ret = subprocess.call(docker_args) + if(ret): + print("Failed to save docker image [configurator-docker]") + return -1 + # set environment variable, needed by 'extra-data.d' + os.environ['DOCKER_IMAGES_PATH'] = docker_images + + return 0 + + +def create_apt_source_list(): + """ + Creates a file 00-haproxy-agent-debs, this will be executed by dib to + create a file haproxy-agent-debs.list file inside VM + at /etc/apt/sources.list.d/ + This file will contain entries for apt to fetch any debs from + our local repo + """ + elems = "%s/elements" % cur_dir + + # update repo_host ip in 00-haproxy-agent-debs file + # this file will be copied to VM at /etc/apt/sources.list.d/ + os.chdir("%s/debs/pre-install.d/" % elems) + with open("00-haproxy-agent-debs", "w") as f: + f.write("#!/bin/bash\n\n") + f.write("set -eu\n") + f.write("set -o xtrace\n\n") + f.write("apt-get install ubuntu-cloud-keyring\n") + if 'haproxy' in conf['dib']['elements']: + tmp_str = ('echo "deb http://%s/ /haproxy/"' + ' > /etc/apt/sources.list.d/haproxy-agent-debs.list' + % 'localhost') + f.write(tmp_str + '\n') + + +def update_haproxy_repo(): + haproxy_vendor_dir = ("%s/../../../nfp/service_vendor_agents/haproxy" + % cur_dir) + service = 'haproxy-agent' + version = '1' + release = '1' + subprocess.call(['rm', '-rf', + "%s/%s/deb-packages" % (haproxy_vendor_dir, service)]) + os.chdir(haproxy_vendor_dir) + ret = subprocess.call(['bash', + 'build_haproxy_agent_deb.sh', + service, + version, release]) + if(ret): + print("ERROR: Unable to generate haproxy-agent deb package") + return 1 + + subprocess.call(["rm", "-rf", "/var/www/html/haproxy"]) + out = subprocess.call(["mkdir", "-p", "/var/www/html/haproxy/"]) + haproxy_agent_deb = ("%s/%s/deb-packages/%s-%s-%s.deb" + % (haproxy_vendor_dir, service, + service, version, release)) + subprocess.call(["cp", haproxy_agent_deb, "/var/www/html/haproxy/"]) + + os.chdir("/var/www/html") + out = commands.getoutput("dpkg-scanpackages haproxy/ /dev/null" + " | gzip -9c > haproxy/Packages.gz") + print(out) + + return 0 + + +def dib(nfp_branch_name): + dib = conf['dib'] + elems = "%s/elements/" % cur_dir + + # set the elements path in environment variable + os.environ['ELEMENTS_PATH'] = elems + # set the Ubuntu Release for the build in environment variable + os.environ['DIB_RELEASE'] = conf['ubuntu_release']['release'] + + # basic elements + dib_args = ['disk-image-create', 'base', 'vm', 'ubuntu'] + + # configures elements + for element in dib['elements']: + dib_args.append(element) + # root login enabled, set password environment varaible + if element == 'root-passwd': + os.environ['DIB_PASSWORD'] = dib['root_password'] + elif element == 'devuser': + os.environ['DIB_DEV_USER_USERNAME'] = 'ubuntu' + os.environ['DIB_DEV_USER_SHELL'] = '/bin/bash' + elif element == 'nfp-reference-configurator': + image_name = 'nfp_reference_service' + service_dir = "%s/../nfp_service/" % cur_dir + pecan_dir = os.path.abspath(os.path.join(cur_dir, + '../../../nfp')) + service_dir = os.path.realpath(service_dir) + pecan_dir = os.path.realpath(pecan_dir) + os.environ['PECAN_GIT_PATH'] = pecan_dir + os.environ['SERVICE_GIT_PATH'] = service_dir + if 'devuser' in dib['elements']: + os.environ['SSH_RSS_KEY'] = ( + "%s/output/%s" % (cur_dir, image_name)) + os.environ['DIB_DEV_USER_AUTHORIZED_KEYS'] = ( + "%s.pub" % os.environ['SSH_RSS_KEY']) + elif element == 'configurator': + image_name = 'configurator' + create_configurator_docker(nfp_branch_name) + # for bigger size images + dib_args.append('--no-tmpfs') + elif element == 'haproxy': + image_name = 'haproxy' + dib_args.append('debs') + create_apt_source_list() + + # offline mode, assuming the image cache (tar) already exists + dib_args.append('--offline') + cache_path = dib['cache_path'].replace('~', os.environ.get('HOME', '-1')) + dib_args.append('--image-cache') + dib_args.append(cache_path) + + dib_args.append('--image-size') + dib_args.append(str(dib['image_size_in_GB'])) + dib_args.append('-o') + dib_args.append(str(image_name)) + + os.chdir(cur_dir) + out_dir = 'output' + if not os.path.isdir(out_dir): + os.makedirs(out_dir) + os.chdir(out_dir) + print("DIB-ARGS: %r" % dib_args) + + ret = subprocess.call(dib_args) + if not ret: + image_path = "%s/output/%s.qcow2" % (cur_dir, image_name) + print("Image location: %s" % image_path) + with open("%s/output/last_built_image_path" % cur_dir, "w") as f: + f.write(image_path) + + +if __name__ == "__main__": + + if len(sys.argv) < 2: + print("ERROR: Invalid Usage") + print("Usage:\n\t%s [NFP_BRANCH_NAME]" + % sys.argv[0]) + print("\twhere: contains all the configuration") + print("\tand NFP_BRANCH_NAME is the string, and is optional.") + exit() + + # save PWD + cur_dir = os.path.dirname(__file__) + cur_dir = os.path.realpath(cur_dir) + if not cur_dir: + # if script is executed from current dir, get abs path + cur_dir = os.path.realpath('./') + + # parse args from json file + parse_json(sys.argv[1]) + elements = conf['dib']['elements'] + elem = 'haproxy' + if elem in elements: + if(update_haproxy_repo()): + exit() + + nfp_branch_name = sys.argv[2] if len(sys.argv) == 3 else None + + if 'configurator' in elements and nfp_branch_name is None: + print("ERROR: You have to pass NFP_BRANCH_NAME.") + exit() + + # run Disk Image Builder to create VM image + dib(nfp_branch_name) From 4ccfa361b1ba2d8b09ee54cc7d36d62e067f47fd Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Wed, 20 Jul 2016 18:11:21 +0530 Subject: [PATCH 102/157] Updated Readme(s) and local.conf --- devstack/README-NFP-Advanced-Mode | 2 +- devstack/Readme-NFP-install.txt | 4 ++-- devstack/local.conf.nfp | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/devstack/README-NFP-Advanced-Mode b/devstack/README-NFP-Advanced-Mode index 56a377e443..f59c67f83f 100644 --- a/devstack/README-NFP-Advanced-Mode +++ b/devstack/README-NFP-Advanced-Mode @@ -18,7 +18,7 @@ Fresh Installation Steps: EXT_NET_ALLOCATION_POOL_END= EXT_NET_CIDR= # Configure the following image paths(optional), - # Leave them empty, so that the images are built during installation + # Leave ConfiguratorQcow2Image empty to let the install step build it. ConfiguratorQcow2Image= VyosQcow2Image= HaproxyQcow2Image= diff --git a/devstack/Readme-NFP-install.txt b/devstack/Readme-NFP-install.txt index ccce7e2dca..3b30e72614 100644 --- a/devstack/Readme-NFP-install.txt +++ b/devstack/Readme-NFP-install.txt @@ -23,8 +23,8 @@ Fresh Installation Steps: EXT_NET_ALLOCATION_POOL_START= EXT_NET_ALLOCATION_POOL_END= EXT_NET_CIDR= - # Service VM image path(s) - # (optional - Leave them empty, so that they will be built during installation) + # Service VM image path(s) (optional) + # (Leave ConfiguratorQcow2Image empty to let the install step build it) ConfiguratorQcow2Image= VyosQcow2Image= HaproxyQcow2Image= diff --git a/devstack/local.conf.nfp b/devstack/local.conf.nfp index 40304934fe..29f5799866 100644 --- a/devstack/local.conf.nfp +++ b/devstack/local.conf.nfp @@ -30,8 +30,7 @@ if [[ $ENABLE_NFP = True ]]; then EXT_NET_CIDR= # Following image path options are optional - # Configure them to use the custom images - # Leave them empty, so that they will be built during the installation + # Leave ConfiguratorQcow2Image empty to let the install step build it ConfiguratorQcow2Image= VyosQcow2Image= HaproxyQcow2Image= From b9a8c5af439b37b94635b066b8bcead8563bae4b Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Wed, 20 Jul 2016 18:35:35 +0530 Subject: [PATCH 103/157] code generalization of base and reference configurator --- .../{api => }/base_controller.py | 0 .../{api/v1 => }/controllers/__init__.py | 32 ++++---- .../{api/v1 => }/controllers/controller.py | 76 +++---------------- .../api => pecan}/__init__.py | 0 .../api/v1 => pecan/api}/__init__.py | 0 .../api/config.py | 7 -- .../api/configurator_decider.py} | 27 ++++--- .../pecan}/api/root_controller.py | 19 ++++- .../{base_configurator => pecan}/api/setup.py | 9 ++- .../api => nfp/pecan/api/v1}/__init__.py | 0 .../pecan}/api/v1/app.py | 1 - .../api/v1/app.py => pecan/constants.py} | 18 +++-- .../reference_configurator/api/config.py | 68 ----------------- .../reference_configurator/api/setup.py | 34 --------- .../reference_configurator/api/v1/__init__.py | 0 .../reference_configurator/bin/nfp-pecan | 5 +- .../config/pecan.service | 2 +- .../{api/v1 => }/controllers/__init__.py | 0 .../{api/v1 => }/controllers/controller.py | 5 +- 19 files changed, 74 insertions(+), 229 deletions(-) rename gbpservice/nfp/base_configurator/{api => }/base_controller.py (100%) rename gbpservice/nfp/base_configurator/{api/v1 => }/controllers/__init__.py (73%) rename gbpservice/nfp/base_configurator/{api/v1 => }/controllers/controller.py (72%) rename gbpservice/nfp/{base_configurator/api => pecan}/__init__.py (100%) rename gbpservice/nfp/{base_configurator/api/v1 => pecan/api}/__init__.py (100%) rename gbpservice/nfp/{base_configurator => pecan}/api/config.py (93%) rename gbpservice/nfp/{base_configurator/api/root_controller.py => pecan/api/configurator_decider.py} (52%) rename gbpservice/{tests/contrib/nfp_service/reference_configurator => nfp/pecan}/api/root_controller.py (58%) rename gbpservice/nfp/{base_configurator => pecan}/api/setup.py (74%) rename gbpservice/{tests/contrib/nfp_service/reference_configurator/api => nfp/pecan/api/v1}/__init__.py (100%) rename gbpservice/{tests/contrib/nfp_service/reference_configurator => nfp/pecan}/api/v1/app.py (99%) rename gbpservice/nfp/{base_configurator/api/v1/app.py => pecan/constants.py} (60%) delete mode 100644 gbpservice/tests/contrib/nfp_service/reference_configurator/api/config.py delete mode 100644 gbpservice/tests/contrib/nfp_service/reference_configurator/api/setup.py delete mode 100644 gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/__init__.py rename gbpservice/tests/contrib/nfp_service/reference_configurator/{api/v1 => }/controllers/__init__.py (100%) rename gbpservice/tests/contrib/nfp_service/reference_configurator/{api/v1 => }/controllers/controller.py (98%) diff --git a/gbpservice/nfp/base_configurator/api/base_controller.py b/gbpservice/nfp/base_configurator/base_controller.py similarity index 100% rename from gbpservice/nfp/base_configurator/api/base_controller.py rename to gbpservice/nfp/base_configurator/base_controller.py diff --git a/gbpservice/nfp/base_configurator/api/v1/controllers/__init__.py b/gbpservice/nfp/base_configurator/controllers/__init__.py similarity index 73% rename from gbpservice/nfp/base_configurator/api/v1/controllers/__init__.py rename to gbpservice/nfp/base_configurator/controllers/__init__.py index 2f9fe51b03..cded74e180 100644 --- a/gbpservice/nfp/base_configurator/api/v1/controllers/__init__.py +++ b/gbpservice/nfp/base_configurator/controllers/__init__.py @@ -12,20 +12,19 @@ import pecan -import controller +from gbpservice.nfp.base_configurator.controllers import controller -"""This class forwards HTTP request to controller class. -This class create an object of Controller class with appropriate -parameter according to the path of HTTP request. According to the -parameter passed to Controller class it sends an RPC call/cast to -configurator. - -""" +class ControllerResolver(object): + """This class forwards HTTP request to controller class. -class ControllerResolver(object): + This class create an object of Controller class with appropriate + parameter according to the path of HTTP request. According to the + parameter passed to Controller class it sends an RPC call/cast to + configurator. + """ create_network_function_device_config = controller.Controller( "create_network_function_device_config") delete_network_function_device_config = controller.Controller( @@ -41,22 +40,19 @@ class ControllerResolver(object): get_notifications = controller.Controller("get_notifications") -""" This class forwards HTTP requests starting with /v1/nfp. - -All HTTP requests with path starting from /v1 -land here. This class forward request with path starting from /v1/nfp -to ControllerResolver. - -""" +class V1Controller(object): + """ This class forwards HTTP requests starting with /v1/nfp. + All HTTP requests with path starting from /v1 + land here. This class forward request with path starting from /v1/nfp + to ControllerResolver. -class V1Controller(object): + """ nfp = ControllerResolver() @pecan.expose() def get(self): - # TODO(blogan): decide what exactly should be here, if anything return {'versions': [{'status': 'CURRENT', 'updated': '2014-12-11T00:00:00Z', 'id': 'v1'}]} diff --git a/gbpservice/nfp/base_configurator/api/v1/controllers/controller.py b/gbpservice/nfp/base_configurator/controllers/controller.py similarity index 72% rename from gbpservice/nfp/base_configurator/api/v1/controllers/controller.py rename to gbpservice/nfp/base_configurator/controllers/controller.py index 949ca14bdc..faa9f968b2 100644 --- a/gbpservice/nfp/base_configurator/api/v1/controllers/controller.py +++ b/gbpservice/nfp/base_configurator/controllers/controller.py @@ -18,7 +18,7 @@ import subprocess import time -from gbpservice.nfp.base_configurator.api.base_controller import BaseController +from gbpservice.nfp.base_configurator.base_controller import BaseController LOG = logging.getLogger(__name__) TOPIC = 'configurator' @@ -26,13 +26,6 @@ SUCCESS_RESULTS = ['unhandled', 'success'] FAILURE = 'failure' -"""Implements all the APIs Invoked by HTTP requests. - -Implements following HTTP methods. - -get - -post - -""" notifications = [] cache_ips = set() @@ -40,6 +33,13 @@ class Controller(BaseController): + """Implements all the APIs Invoked by HTTP requests. + + Implements following HTTP methods. + -get + -post + + """ def __init__(self, method_name): try: self.method_name = method_name @@ -50,7 +50,7 @@ def __init__(self, method_name): str(err).capitalize()) LOG.error(msg) self.vm_port = '8080' - self.max_retries = 24 + self.max_retries = 60 def _push_notification(self, context, result, config_data, service_type): global notifications @@ -188,64 +188,6 @@ def post(self, **body): error_data = self._format_description(msg) return jsonutils.dumps(error_data) - @pecan.expose(method='PUT', content_type='application/json') - def put(self, **body): - """Method of REST server to handle all the put requests. - - This method sends an RPC cast to configurator according to the - HTTP request. - - :param body: This method excepts dictionary as a parameter in HTTP - request and send this dictionary to configurator with RPC cast. - - Returns: None - - """ - - try: - global cache_ips - global notifications - body = None - if pecan.request.is_body_readable: - body = pecan.request.json_body - - # Assuming config list will have only one element - config_data = body['config'][0] - context = body['info']['context'] - service_type = body['info']['service_type'] - resource = config_data['resource'] - - if 'device_ip' in context: - msg = ("PUTTING DATA TO VM :: %s" % body) - LOG.info(msg) - device_ip = context['device_ip'] - ip = str(device_ip) - is_vm_reachable = self._verify_vm_reachability(ip, - self.vm_port) - if is_vm_reachable: - requests.post( - 'http://' + ip + ':' + self.vm_port + '/v1/nfp/' + - self.method_name, data=jsonutils.dumps(body)) - else: - raise Exception('VM is not reachable') - cache_ips.add(device_ip) - else: - if (resource in NFP_SERVICE_LIST): - result = "unhandled" - self._push_notification(context, - result, config_data, service_type) - else: - result = "error" - self._push_notification(context, - result, config_data, service_type) - except Exception as err: - pecan.response.status = 400 - msg = ("Failed to serve HTTP post request %s %s." - % (self.method_name, str(err).capitalize())) - LOG.error(msg) - error_data = self._format_description(msg) - return jsonutils.dumps(error_data) - def _format_description(self, msg): """This methgod formats error description. diff --git a/gbpservice/nfp/base_configurator/api/__init__.py b/gbpservice/nfp/pecan/__init__.py similarity index 100% rename from gbpservice/nfp/base_configurator/api/__init__.py rename to gbpservice/nfp/pecan/__init__.py diff --git a/gbpservice/nfp/base_configurator/api/v1/__init__.py b/gbpservice/nfp/pecan/api/__init__.py similarity index 100% rename from gbpservice/nfp/base_configurator/api/v1/__init__.py rename to gbpservice/nfp/pecan/api/__init__.py diff --git a/gbpservice/nfp/base_configurator/api/config.py b/gbpservice/nfp/pecan/api/config.py similarity index 93% rename from gbpservice/nfp/base_configurator/api/config.py rename to gbpservice/nfp/pecan/api/config.py index 442308d9d0..0cab883dca 100644 --- a/gbpservice/nfp/base_configurator/api/config.py +++ b/gbpservice/nfp/pecan/api/config.py @@ -59,10 +59,3 @@ } } } - -# Custom Configurations must be in Python dictionary format:: -# -# foo = {'bar':'baz'} -# -# All configurations are accessible at:: -# pecan.conf diff --git a/gbpservice/nfp/base_configurator/api/root_controller.py b/gbpservice/nfp/pecan/api/configurator_decider.py similarity index 52% rename from gbpservice/nfp/base_configurator/api/root_controller.py rename to gbpservice/nfp/pecan/api/configurator_decider.py index a2cc5d4dce..b97c52c38e 100644 --- a/gbpservice/nfp/base_configurator/api/root_controller.py +++ b/gbpservice/nfp/pecan/api/configurator_decider.py @@ -11,21 +11,20 @@ # under the License. import pecan -from v1 import controllers +from gbpservice.nfp.pecan import constants -class RootController(object): - """This is root controller that forward the request to __init__.py - file inside controller folder inside v1 - """ +class DecideConfigurator(pecan.commands.serve.ServeCommand): + ''' decides the type of configurtor to be used + like base_configurator or reference_configurator + ''' + arguments = pecan.commands.serve.ServeCommand.arguments + ({ + 'name': '--mode', + 'help': 'decides the type of configurtor to be used', + 'choices': constants.modes, + },) - v1 = controllers.V1Controller() - - @pecan.expose() - def get(self): - # TODO(blogan): once a decision is made on how to do versions, do that - # here - return {'versions': [{'status': 'CURRENT', - 'updated': '2014-12-11T00:00:00Z', - 'id': 'v1'}]} + def run(self, args): + setattr(pecan, 'mode', args.mode) + super(DecideConfigurator, self).run(args) diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/root_controller.py b/gbpservice/nfp/pecan/api/root_controller.py similarity index 58% rename from gbpservice/tests/contrib/nfp_service/reference_configurator/api/root_controller.py rename to gbpservice/nfp/pecan/api/root_controller.py index 5407e27222..dd40f11dd1 100644 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/root_controller.py +++ b/gbpservice/nfp/pecan/api/root_controller.py @@ -12,7 +12,7 @@ import pecan -from v1 import controllers +from gbpservice.nfp.pecan import constants class RootController(object): @@ -20,13 +20,24 @@ class RootController(object): file inside controller folder inside v1 """ + _controllers = {} - v1 = controllers.V1Controller() + for name, controller in constants.controllers.items(): + try: + _controllers.update({name: __import__(controller, + globals(), + locals(), + ['controllers'], -1)}) + except Exception: + pass + + if pecan.mode == constants.base_with_vm: + v1 = _controllers[constants.REFERENCE_CONTROLLER].V1Controller() + elif pecan.mode == constants.base: + v1 = _controllers[constants.BASE_CONTROLLER].V1Controller() @pecan.expose() def get(self): - # TODO(blogan): once a decision is made on how to do versions, do that - # here return {'versions': [{'status': 'CURRENT', 'updated': '2014-12-11T00:00:00Z', 'id': 'v1'}]} diff --git a/gbpservice/nfp/base_configurator/api/setup.py b/gbpservice/nfp/pecan/api/setup.py similarity index 74% rename from gbpservice/nfp/base_configurator/api/setup.py rename to gbpservice/nfp/pecan/api/setup.py index e6042b44f2..1e84d2d961 100644 --- a/gbpservice/nfp/base_configurator/api/setup.py +++ b/gbpservice/nfp/pecan/api/setup.py @@ -10,7 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -# -*- coding: utf-8 -*- try: import setuptools except ImportError: @@ -30,5 +29,11 @@ test_suite='api', zip_safe=False, include_package_data=True, - packages=setuptools.find_packages(exclude=['ez_setup']) + packages=setuptools.find_packages(exclude=['ez_setup']), + # Having entry point gives the option to define custom classes + # to improve the flexibility in accessing different configurators + entry_points=""" + [pecan.command] + configurator_decider = configurator_decider:DecideConfigurator + """ ) diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/__init__.py b/gbpservice/nfp/pecan/api/v1/__init__.py similarity index 100% rename from gbpservice/tests/contrib/nfp_service/reference_configurator/api/__init__.py rename to gbpservice/nfp/pecan/api/v1/__init__.py diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/app.py b/gbpservice/nfp/pecan/api/v1/app.py similarity index 99% rename from gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/app.py rename to gbpservice/nfp/pecan/api/v1/app.py index f65e34406b..3dcb5ea236 100644 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/app.py +++ b/gbpservice/nfp/pecan/api/v1/app.py @@ -16,7 +16,6 @@ def setup_app(config): app_conf = dict(config.app) - return pecan.make_app( app_conf.pop('root'), logging=getattr(config, 'logging', {}), diff --git a/gbpservice/nfp/base_configurator/api/v1/app.py b/gbpservice/nfp/pecan/constants.py similarity index 60% rename from gbpservice/nfp/base_configurator/api/v1/app.py rename to gbpservice/nfp/pecan/constants.py index f65e34406b..e7b9f3f37a 100644 --- a/gbpservice/nfp/base_configurator/api/v1/app.py +++ b/gbpservice/nfp/pecan/constants.py @@ -10,15 +10,17 @@ # License for the specific language governing permissions and limitations # under the License. -import pecan +BASE_CONTROLLER = 'base_controller' +REFERENCE_CONTROLLER = 'reference_controller' -def setup_app(config): - app_conf = dict(config.app) +controllers = { + BASE_CONTROLLER: 'gbpservice.nfp.base_configurator.controllers', + REFERENCE_CONTROLLER: ('gbpservice.tests.contrib' + '.nfp_service.reference_configurator.controllers') +} - return pecan.make_app( - app_conf.pop('root'), - logging=getattr(config, 'logging', {}), - **app_conf - ) +base_with_vm = 'base_with_vm' +base = 'base' +modes = [base, base_with_vm] diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/config.py b/gbpservice/tests/contrib/nfp_service/reference_configurator/api/config.py deleted file mode 100644 index 442308d9d0..0000000000 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/config.py +++ /dev/null @@ -1,68 +0,0 @@ -# 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. - -# Server Specific Configurations -server = { - 'port': '8080', - 'host': '0.0.0.0' -} - -# Pecan Application Configurations -app = { - 'root': 'root_controller.RootController', - 'modules': ['v1'], - 'debug': True, - 'errors': { - 404: '/error/404', - '__force_dict__': True - } -} - -logging = { - 'root': {'level': 'INFO', 'handlers': ['console']}, - 'loggers': { - 'pecanlog': {'level': 'INFO', - 'handlers': ['console'], - 'propagate': False}, - 'pecan': {'level': 'INFO', - 'handlers': ['console'], - 'propagate': False}, - 'py.warnings': {'handlers': ['console']}, - '__force_dict__': True - }, - 'handlers': { - 'console': { - 'level': 'INFO', - 'class': 'logging.StreamHandler', - 'formatter': 'color' - } - }, - 'formatters': { - 'simple': { - 'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]' - '[%(threadName)s] %(message)s') - }, - 'color': { - '()': 'pecan.log.ColorFormatter', - 'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]' - '[%(threadName)s] %(message)s'), - '__force_dict__': True - } - } -} - -# Custom Configurations must be in Python dictionary format:: -# -# foo = {'bar':'baz'} -# -# All configurations are accessible at:: -# pecan.conf diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/setup.py b/gbpservice/tests/contrib/nfp_service/reference_configurator/api/setup.py deleted file mode 100644 index e6042b44f2..0000000000 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/setup.py +++ /dev/null @@ -1,34 +0,0 @@ -# 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. - -# -*- coding: utf-8 -*- -try: - import setuptools -except ImportError: - import ez_setup - ez_setup.use_setuptools() - import setuptools - -setuptools.setup( - name='api', - version='0.1', - description='', - author='', - author_email='', - install_requires=[ - "pecan", - ], - test_suite='api', - zip_safe=False, - include_package_data=True, - packages=setuptools.find_packages(exclude=['ez_setup']) -) diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/__init__.py b/gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan b/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan index cecabd8edc..88498579f6 100644 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan +++ b/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan @@ -1,4 +1,3 @@ #!/bin/sh -script='/home/ubuntu/reference_configurator/api/config.py' -pecan serve $script & - +script='/usr/local/lib/python2.7/dist-packages/gbpservice/nfp/pecan/api/config.py' +pecan configurator_decider $script --mode base_with_vm & diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/config/pecan.service b/gbpservice/tests/contrib/nfp_service/reference_configurator/config/pecan.service index 5a334c3fcb..0e2a7cc8eb 100644 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/config/pecan.service +++ b/gbpservice/tests/contrib/nfp_service/reference_configurator/config/pecan.service @@ -5,7 +5,7 @@ After=network.target auditd.service [Service] Type=forking Restart=always -ExecStart=/home/ubuntu/reference_configurator/bin/nfp-pecan +ExecStart=/usr/local/lib/python2.7/dist-packages/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan KillMode=process Restart=on-failure diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/controllers/__init__.py b/gbpservice/tests/contrib/nfp_service/reference_configurator/controllers/__init__.py similarity index 100% rename from gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/controllers/__init__.py rename to gbpservice/tests/contrib/nfp_service/reference_configurator/controllers/__init__.py diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/controllers/controller.py b/gbpservice/tests/contrib/nfp_service/reference_configurator/controllers/controller.py similarity index 98% rename from gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/controllers/controller.py rename to gbpservice/tests/contrib/nfp_service/reference_configurator/controllers/controller.py index 882f696b0a..199c8edbb6 100644 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/api/v1/controllers/controller.py +++ b/gbpservice/tests/contrib/nfp_service/reference_configurator/controllers/controller.py @@ -27,8 +27,9 @@ SUCCESS = 'SUCCESS' notifications = [] -FW_SCRIPT_PATH = ("/home/ubuntu/reference_configurator/" + - "scripts/configure_fw_rules.py") +FW_SCRIPT_PATH = ("/usr/local/lib/python2.7/dist-packages/" + + "gbpservice/tests/contrib/nfp_service/" + + "reference_configurator/scripts/configure_fw_rules.py") class Controller(rest.RestController): From dbdd0add7c69c9038dc8f72ee40126a3b924aaa2 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Wed, 20 Jul 2016 19:40:13 +0530 Subject: [PATCH 104/157] Addressed review comments --- devstack/README-NFP-Advanced-Mode | 8 ++++++-- devstack/Readme-NFP-install.txt | 8 ++++++-- devstack/lib/gbp | 13 +++++++++++-- devstack/local.conf.nfp | 10 +++++++--- devstack/override-defaults | 12 ------------ devstack/plugin.sh | 7 +++---- devstack/settings | 13 ++----------- ...disk_image_create_advanced.py => build_image.py} | 0 8 files changed, 35 insertions(+), 36 deletions(-) rename gbpservice/tests/contrib/diskimage-create/{disk_image_create_advanced.py => build_image.py} (100%) diff --git a/devstack/README-NFP-Advanced-Mode b/devstack/README-NFP-Advanced-Mode index f59c67f83f..70440fd916 100644 --- a/devstack/README-NFP-Advanced-Mode +++ b/devstack/README-NFP-Advanced-Mode @@ -17,9 +17,13 @@ Fresh Installation Steps: EXT_NET_ALLOCATION_POOL_START= EXT_NET_ALLOCATION_POOL_END= EXT_NET_CIDR= - # Configure the following image paths(optional), - # Leave ConfiguratorQcow2Image empty to let the install step build it. + # Configure the Configurator VM image path(optional), + # If configured, install step uploads the specified image + # If not configured, install step will build a new one and upload it ConfiguratorQcow2Image= + # Configure the Service VM image paths(optional), + # If configured, install step uploads the specified images + # If not configured, install step ignores uploading these service images VyosQcow2Image= HaproxyQcow2Image= # Configure PUBLIC_INTERFACE with the public interface name diff --git a/devstack/Readme-NFP-install.txt b/devstack/Readme-NFP-install.txt index 3b30e72614..d77f4e6250 100644 --- a/devstack/Readme-NFP-install.txt +++ b/devstack/Readme-NFP-install.txt @@ -23,9 +23,13 @@ Fresh Installation Steps: EXT_NET_ALLOCATION_POOL_START= EXT_NET_ALLOCATION_POOL_END= EXT_NET_CIDR= - # Service VM image path(s) (optional) - # (Leave ConfiguratorQcow2Image empty to let the install step build it) + # Configurator VM image path, its optional + # If configured, install step uploads the specified image + # If not configured, install step will build a new one and upload it ConfiguratorQcow2Image= + # Service VM image paths, they are optional + # If configured, install step uploads the specified images + # If not configured, install step ignores uploading these service images VyosQcow2Image= HaproxyQcow2Image= # Public interface name diff --git a/devstack/lib/gbp b/devstack/lib/gbp index cb93d0735d..1d3d41b5e1 100755 --- a/devstack/lib/gbp +++ b/devstack/lib/gbp @@ -26,8 +26,6 @@ AIM_REPO=http://github.com/noironetworks/aci-integration-module.git AIM_DIR=$DEST/aim APICML2_REPO=http://github.com/noironetworks/apic-ml2-driver.git APICML2_DIR=$DEST/apic_ml2 -OPFLEX_REPO=http://github.com/noironetworks/python-opflex-agent.git -OPFLEX_DIR=$DEST/opflexagent # Save trace setting XTRACE=$(set +o | grep xtrace) @@ -83,6 +81,17 @@ function install_gbpui { mv $GBPUI_DIR/_test-requirements.txt $GBPUI_DIR/test-requirements.txt } +function install_aim { + git_clone $AIM_REPO $AIM_DIR $AIM_BRANCH + mv $AIM_DIR/test-requirements.txt $AIM_DIR/_test-requirements.txt + setup_develop $AIM_DIR + mv $AIM_DIR/_test-requirements.txt $AIM_DIR/test-requirements.txt +} + +function init_aim { + aim -c $NEUTRON_CONF db-migration upgrade +} + function install_apic_ml2 { git_clone $APICML2_REPO $APICML2_DIR $APICML2_BRANCH mv $APICML2_DIR/test-requirements.txt $APICML2_DIR/_test-requirements.txt diff --git a/devstack/local.conf.nfp b/devstack/local.conf.nfp index 29f5799866..8b75948ff9 100644 --- a/devstack/local.conf.nfp +++ b/devstack/local.conf.nfp @@ -29,12 +29,16 @@ if [[ $ENABLE_NFP = True ]]; then EXT_NET_ALLOCATION_POOL_END= EXT_NET_CIDR= - # Following image path options are optional - # Leave ConfiguratorQcow2Image empty to let the install step build it + # Configurator image path option, its optional + # If configured, install step uploads the specified image + # If not configured, install step will build a new one and upload it ConfiguratorQcow2Image= + # Service VM image path options, they are optional + # If configured, install step uploads the specified images + # If not configured, install step ignores uploading these service images VyosQcow2Image= HaproxyQcow2Image= - + # Make sure that your public interface is not attached to any bridge. PUBLIC_INTERFACE= diff --git a/devstack/override-defaults b/devstack/override-defaults index 91a11bb8cd..09ac66b05e 100755 --- a/devstack/override-defaults +++ b/devstack/override-defaults @@ -1,13 +1 @@ NEUTRON_CREATE_INITIAL_NETWORKS="False" - -ENABLE_APIC_AIM=${ENABLE_APIC_AIM:-False} - -if [[ $ENABLE_APIC_AIM = True ]]; then - echo_summary "Overriding defaults for apic_aim" - - Q_PLUGIN=${Q_PLUGIN:-ml2} - Q_ML2_TENANT_NETWORK_TYPE=${Q_ML2_TENANT_NETWORK_TYPE:-opflex} - Q_ML2_PLUGIN_TYPE_DRIVERS=${Q_ML2_PLUGIN_TYPE_DRIVERS:-local,vlan,opflex} - Q_ML2_PLUGIN_MECHANISM_DRIVERS=${Q_ML2_PLUGIN_MECHANISM_DRIVERS:-apic_aim} - Q_ML2_PLUGIN_EXT_DRIVERS=${Q_ML2_PLUGIN_EXT_DRIVERS-apic_aim,port_security} -fi diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 881fe0db17..08b12193f7 100755 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -86,7 +86,6 @@ if is_service_enabled group-policy; then echo_summary "Preparing $GBP" elif [[ "$1" == "stack" && "$2" == "install" ]]; then echo_summary "Installing $GBP" - [[ $ENABLE_APIC_AIM = True ]] && install_apic_aim if [[ $ENABLE_NFP = True ]]; then echo_summary "Installing $NFP" prepare_nfp_image_builder @@ -105,8 +104,9 @@ if is_service_enabled group-policy; then configure_nfp_vpn fi fi - # REVISIT move installs to install phase? - # install_apic_ml2 +# install_apic_ml2 +# install_aim +# init_aim install_gbpclient install_gbpservice [[ $ENABLE_NFP = True ]] && install_nfpgbpservice @@ -114,7 +114,6 @@ if is_service_enabled group-policy; then [[ $ENABLE_NFP = True ]] && init_nfpgbpservice install_gbpheat install_gbpui - [[ $ENABLE_APIC_AIM = True ]] && configure_apic_aim stop_apache_server start_apache_server elif [[ "$1" == "stack" && "$2" == "extra" ]]; then diff --git a/devstack/settings b/devstack/settings index 62be0cbaae..54bd1d39d0 100755 --- a/devstack/settings +++ b/devstack/settings @@ -1,8 +1,5 @@ # Make sure the plugin name in local.conf is "gbp", as in: enable_plugin gbp source $DEST/gbp/devstack/lib/gbp - -[[ $ENABLE_APIC_AIM = True ]] && source $DEST/gbp/devstack/lib/apic_aim - ENABLE_NFP=${ENABLE_NFP:-False} [[ $ENABLE_NFP = True ]] && NFP_DEVSTACK_MODE=${NFP_DEVSTACK_MODE:-base} [[ $ENABLE_NFP = True ]] && source $DEST/gbp/devstack/lib/nfp @@ -26,20 +23,14 @@ GBPHEAT_REPO=${GBPHEAT_REPO:-${GIT_BASE}/openstack/group-based-policy-automation GBPHEAT_BRANCH=${GBPHEAT_BRANCH:-master} AIM_BRANCH=${AIM_BRANCH:-master} APICML2_BRANCH=${APICML2_BRANCH:-master} -OPFLEX_BRANCH=${OPFLEX_BRANCH:-master} # Enable necessary services, including group-policy (and disable others) disable_service n-net enable_service n-novnc enable_service q-svc -if [[ $ENABLE_APIC_AIM = True ]]; then - disable_service q-agt - disable_service q-l3 -else - enable_service q-agt - enable_service q-l3 -fi +enable_service q-agt enable_service q-dhcp +enable_service q-l3 enable_service q-fwaas [[ $ENABLE_NFP = True ]] && [[ $NFP_DEVSTACK_MODE = advanced ]] && enable_service neutron-vpnaas enable_service q-lbaas diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create_advanced.py b/gbpservice/tests/contrib/diskimage-create/build_image.py similarity index 100% rename from gbpservice/tests/contrib/diskimage-create/disk_image_create_advanced.py rename to gbpservice/tests/contrib/diskimage-create/build_image.py From 1608277ff84d7c6488c81dbdbee98d2eda4bc4f9 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Wed, 20 Jul 2016 20:03:27 +0530 Subject: [PATCH 105/157] code generalization for advanced mode controller --- .../__init__.py | 0 .../controller.py | 2 +- .../contrib/nfp/configurator/api/__init__.py | 0 .../contrib/nfp/configurator/api/config.py | 87 ------------------- .../nfp/configurator/api/root_controller.py | 31 ------- .../contrib/nfp/configurator/api/setup.py | 34 -------- .../nfp/configurator/api/v1/__init__.py | 0 .../contrib/nfp/configurator/api/v1/app.py | 24 ----- gbpservice/contrib/nfp/configurator/run.sh | 4 +- .../nfp/base_configurator/base_controller.py | 49 ----------- .../controllers/controller.py | 4 +- gbpservice/nfp/pecan/api/root_controller.py | 9 +- .../api => nfp/pecan}/base_controller.py | 0 gbpservice/nfp/pecan/constants.py | 7 +- 14 files changed, 16 insertions(+), 235 deletions(-) rename gbpservice/contrib/nfp/configurator/{api/v1/controllers => advanced_controller}/__init__.py (100%) rename gbpservice/contrib/nfp/configurator/{api/v1/controllers => advanced_controller}/controller.py (99%) delete mode 100644 gbpservice/contrib/nfp/configurator/api/__init__.py delete mode 100644 gbpservice/contrib/nfp/configurator/api/config.py delete mode 100644 gbpservice/contrib/nfp/configurator/api/root_controller.py delete mode 100644 gbpservice/contrib/nfp/configurator/api/setup.py delete mode 100644 gbpservice/contrib/nfp/configurator/api/v1/__init__.py delete mode 100644 gbpservice/contrib/nfp/configurator/api/v1/app.py delete mode 100644 gbpservice/nfp/base_configurator/base_controller.py rename gbpservice/{contrib/nfp/configurator/api => nfp/pecan}/base_controller.py (100%) diff --git a/gbpservice/contrib/nfp/configurator/api/v1/controllers/__init__.py b/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py similarity index 100% rename from gbpservice/contrib/nfp/configurator/api/v1/controllers/__init__.py rename to gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py diff --git a/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py b/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py similarity index 99% rename from gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py rename to gbpservice/contrib/nfp/configurator/advanced_controller/controller.py index bd7cc5254e..f6f281417e 100644 --- a/gbpservice/contrib/nfp/configurator/api/v1/controllers/controller.py +++ b/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py @@ -18,7 +18,7 @@ import oslo_messaging import pecan -from gbpservice.contrib.nfp.configurator.api import base_controller +from gbpservice.nfp.pecan import base_controller LOG = logging.getLogger(__name__) n_rpc.init(cfg.CONF) diff --git a/gbpservice/contrib/nfp/configurator/api/__init__.py b/gbpservice/contrib/nfp/configurator/api/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/contrib/nfp/configurator/api/config.py b/gbpservice/contrib/nfp/configurator/api/config.py deleted file mode 100644 index 28498d2070..0000000000 --- a/gbpservice/contrib/nfp/configurator/api/config.py +++ /dev/null @@ -1,87 +0,0 @@ -# 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. - -# Server Specific Configurations -server = { - 'port': '8080', - 'host': '0.0.0.0' -} - -# Pecan Application Configurations -app = { - 'root': 'root_controller.RootController', - 'modules': ['v1'], - 'debug': True, - 'errors': { - 404: '/error/404', - '__force_dict__': True - } -} - -logging = { - 'root': {'level': 'INFO', 'handlers': ['console', 'logfile']}, - 'loggers': { - 'pecanlog': {'level': 'INFO', - 'handlers': ['console', 'logfile'], - 'propagate': False}, - 'pecan': {'level': 'INFO', - 'handlers': ['console', 'logfile'], - 'propagate': False}, - 'py.warnings': {'handlers': ['console', 'logfile']}, - '__force_dict__': True - }, - 'handlers': { - 'console': { - 'level': 'INFO', - 'class': 'logging.StreamHandler', - 'formatter': 'color' - }, - 'logfile': { - 'class': 'logging.FileHandler', - 'filename': '/var/log/nfp/nfp_pecan.log', - 'level': 'INFO' - } - }, - 'formatters': { - 'simple': { - 'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]' - '[%(threadName)s] %(message)s') - }, - 'color': { - '()': 'pecan.log.ColorFormatter', - 'format': ('%(asctime)s [%(padded_color_levelname)s] [%(name)s]' - '[%(threadName)s] %(message)s'), - '__force_dict__': True - } - } -} - -cloud_services = [ - {'service_name': 'configurator', - 'topic': 'configurator', - 'reporting_interval': '10', # in seconds - 'apis': ['CONFIGURATION'] - }, - - {'service_name': 'visibility', - 'topic': 'visibility', - 'reporting_interval': '10', # in seconds - 'apis': ['VISIBILITY'] - }, -] - -# Custom Configurations must be in Python dictionary format:: -# -# foo = {'bar':'baz'} -# -# All configurations are accessible at:: -# pecan.conf diff --git a/gbpservice/contrib/nfp/configurator/api/root_controller.py b/gbpservice/contrib/nfp/configurator/api/root_controller.py deleted file mode 100644 index a2cc5d4dce..0000000000 --- a/gbpservice/contrib/nfp/configurator/api/root_controller.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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 pecan -from v1 import controllers - - -class RootController(object): - """This is root controller that forward the request to __init__.py - file inside controller folder inside v1 - - """ - - v1 = controllers.V1Controller() - - @pecan.expose() - def get(self): - # TODO(blogan): once a decision is made on how to do versions, do that - # here - return {'versions': [{'status': 'CURRENT', - 'updated': '2014-12-11T00:00:00Z', - 'id': 'v1'}]} diff --git a/gbpservice/contrib/nfp/configurator/api/setup.py b/gbpservice/contrib/nfp/configurator/api/setup.py deleted file mode 100644 index e6042b44f2..0000000000 --- a/gbpservice/contrib/nfp/configurator/api/setup.py +++ /dev/null @@ -1,34 +0,0 @@ -# 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. - -# -*- coding: utf-8 -*- -try: - import setuptools -except ImportError: - import ez_setup - ez_setup.use_setuptools() - import setuptools - -setuptools.setup( - name='api', - version='0.1', - description='', - author='', - author_email='', - install_requires=[ - "pecan", - ], - test_suite='api', - zip_safe=False, - include_package_data=True, - packages=setuptools.find_packages(exclude=['ez_setup']) -) diff --git a/gbpservice/contrib/nfp/configurator/api/v1/__init__.py b/gbpservice/contrib/nfp/configurator/api/v1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/contrib/nfp/configurator/api/v1/app.py b/gbpservice/contrib/nfp/configurator/api/v1/app.py deleted file mode 100644 index f65e34406b..0000000000 --- a/gbpservice/contrib/nfp/configurator/api/v1/app.py +++ /dev/null @@ -1,24 +0,0 @@ -# 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 pecan - - -def setup_app(config): - - app_conf = dict(config.app) - - return pecan.make_app( - app_conf.pop('root'), - logging=getattr(config, 'logging', {}), - **app_conf - ) diff --git a/gbpservice/contrib/nfp/configurator/run.sh b/gbpservice/contrib/nfp/configurator/run.sh index 5a0b8b343e..1dcd8eb472 100644 --- a/gbpservice/contrib/nfp/configurator/run.sh +++ b/gbpservice/contrib/nfp/configurator/run.sh @@ -2,8 +2,8 @@ service rabbitmq-server start screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --log-file=/var/log/nfp/nfp_configurator.log -cd /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/api/ +cd /usr/local/lib/python2.7/dist-packages/gbpservice/nfp/pecan/api/ python setup.py develop -screen -dmS "pecan" pecan serve config.py +screen -dmS "pecan" pecan serve config.py --mode advanced /bin/bash diff --git a/gbpservice/nfp/base_configurator/base_controller.py b/gbpservice/nfp/base_configurator/base_controller.py deleted file mode 100644 index 1a434c88d5..0000000000 --- a/gbpservice/nfp/base_configurator/base_controller.py +++ /dev/null @@ -1,49 +0,0 @@ -# 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 oslo_log import log as logging -import oslo_serialization.jsonutils as jsonutils - -from pecan.hooks import HookController -from pecan.hooks import PecanHook -from pecan import rest -import zlib - -LOG = logging.getLogger(__name__) - - -class ZipperHook(PecanHook): - - def before(self, state): - if state.request.method.upper() != 'GET': - try: - zippedBody = state.request.body - body = zlib.decompress(zippedBody) - body = jsonutils.loads(body) - state.request.json_body = body - state.request.content_type = "application/json" - except Exception as e: - msg = ("Failed to process data ,Reason: %s" % (e)) - LOG.error(msg) - - def after(self, state): - data = state.response.body - state.response.body = zlib.compress(data) - state.response.content_type = "application/octet-stream" - - -class BaseController(rest.RestController, HookController): - """This is root controller that forward the request to __init__.py - file inside controller folder inside v1 - - """ - __hooks__ = [ZipperHook()] diff --git a/gbpservice/nfp/base_configurator/controllers/controller.py b/gbpservice/nfp/base_configurator/controllers/controller.py index faa9f968b2..d472e625e9 100644 --- a/gbpservice/nfp/base_configurator/controllers/controller.py +++ b/gbpservice/nfp/base_configurator/controllers/controller.py @@ -18,7 +18,7 @@ import subprocess import time -from gbpservice.nfp.base_configurator.base_controller import BaseController +from gbpservice.nfp.pecan import base_controller LOG = logging.getLogger(__name__) TOPIC = 'configurator' @@ -31,7 +31,7 @@ cache_ips = set() -class Controller(BaseController): +class Controller(base_controller.BaseController): """Implements all the APIs Invoked by HTTP requests. diff --git a/gbpservice/nfp/pecan/api/root_controller.py b/gbpservice/nfp/pecan/api/root_controller.py index dd40f11dd1..7d48555414 100644 --- a/gbpservice/nfp/pecan/api/root_controller.py +++ b/gbpservice/nfp/pecan/api/root_controller.py @@ -31,10 +31,13 @@ class RootController(object): except Exception: pass - if pecan.mode == constants.base_with_vm: - v1 = _controllers[constants.REFERENCE_CONTROLLER].V1Controller() - elif pecan.mode == constants.base: + if pecan.mode == constants.base: v1 = _controllers[constants.BASE_CONTROLLER].V1Controller() + elif pecan.mode == constants.base_with_vm: + v1 = _controllers[constants.REFERENCE_CONTROLLER].V1Controller() + elif pecan.mode == constants.advanced: + v1 = _controllers[constants.ADVANCED_CONTROLLER].V1Controller() + @pecan.expose() def get(self): diff --git a/gbpservice/contrib/nfp/configurator/api/base_controller.py b/gbpservice/nfp/pecan/base_controller.py similarity index 100% rename from gbpservice/contrib/nfp/configurator/api/base_controller.py rename to gbpservice/nfp/pecan/base_controller.py diff --git a/gbpservice/nfp/pecan/constants.py b/gbpservice/nfp/pecan/constants.py index e7b9f3f37a..421c4e34cf 100644 --- a/gbpservice/nfp/pecan/constants.py +++ b/gbpservice/nfp/pecan/constants.py @@ -13,14 +13,17 @@ BASE_CONTROLLER = 'base_controller' REFERENCE_CONTROLLER = 'reference_controller' +ADVANCED_CONTROLLER = 'advanced_controller' controllers = { BASE_CONTROLLER: 'gbpservice.nfp.base_configurator.controllers', REFERENCE_CONTROLLER: ('gbpservice.tests.contrib' - '.nfp_service.reference_configurator.controllers') + '.nfp_service.reference_configurator.controllers'), + ADVANCED_CONTROLLER: 'gbpservice.contrib.nfp.configurator.advanced_controller' } base_with_vm = 'base_with_vm' base = 'base' -modes = [base, base_with_vm] +advanced = 'advanced' +modes = [base, base_with_vm, advanced] From 5b37f4a6bcdfaf89fef48b6a4a6ab1f940e61c0b Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Wed, 20 Jul 2016 20:30:25 +0530 Subject: [PATCH 106/157] added configurator decider --- gbpservice/contrib/nfp/configurator/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/contrib/nfp/configurator/run.sh b/gbpservice/contrib/nfp/configurator/run.sh index 1dcd8eb472..73da244bcf 100644 --- a/gbpservice/contrib/nfp/configurator/run.sh +++ b/gbpservice/contrib/nfp/configurator/run.sh @@ -4,6 +4,6 @@ service rabbitmq-server start screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --log-file=/var/log/nfp/nfp_configurator.log cd /usr/local/lib/python2.7/dist-packages/gbpservice/nfp/pecan/api/ python setup.py develop -screen -dmS "pecan" pecan serve config.py --mode advanced +screen -dmS "pecan" pecan configurator_decider config.py --mode advanced /bin/bash From b27fa6a488fcae8e7e38be6618f6e6f3d5fe6dea Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Wed, 20 Jul 2016 23:07:49 +0530 Subject: [PATCH 107/157] Fixed diskimage_create script --- gbpservice/tests/contrib/diskimage-create/disk_image_create.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py index 90df7bcd85..d3fe131a7b 100755 --- a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py @@ -151,6 +151,7 @@ def dib(nfp_branch_name): # parse args from json file parse_json(sys.argv[1]) + elements = conf['dib']['elements'] nfp_branch_name = sys.argv[2] if len(sys.argv) == 3 else None From f9a08d79cd3182c61229b625fe435b0a752700cc Mon Sep 17 00:00:00 2001 From: SureshDH Date: Wed, 20 Jul 2016 23:41:27 +0530 Subject: [PATCH 108/157] addressed pep8 isses --- gbpservice/nfp/pecan/api/root_controller.py | 1 - gbpservice/nfp/pecan/constants.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gbpservice/nfp/pecan/api/root_controller.py b/gbpservice/nfp/pecan/api/root_controller.py index 7d48555414..6b4ce09902 100644 --- a/gbpservice/nfp/pecan/api/root_controller.py +++ b/gbpservice/nfp/pecan/api/root_controller.py @@ -38,7 +38,6 @@ class RootController(object): elif pecan.mode == constants.advanced: v1 = _controllers[constants.ADVANCED_CONTROLLER].V1Controller() - @pecan.expose() def get(self): return {'versions': [{'status': 'CURRENT', diff --git a/gbpservice/nfp/pecan/constants.py b/gbpservice/nfp/pecan/constants.py index 421c4e34cf..dedddc19f0 100644 --- a/gbpservice/nfp/pecan/constants.py +++ b/gbpservice/nfp/pecan/constants.py @@ -20,7 +20,8 @@ BASE_CONTROLLER: 'gbpservice.nfp.base_configurator.controllers', REFERENCE_CONTROLLER: ('gbpservice.tests.contrib' '.nfp_service.reference_configurator.controllers'), - ADVANCED_CONTROLLER: 'gbpservice.contrib.nfp.configurator.advanced_controller' + ADVANCED_CONTROLLER: ('gbpservice.contrib.nfp.configurator' + '.advanced_controller') } base_with_vm = 'base_with_vm' From fd48fd140b9b7c1f495ee5c88dccdea69ae2a980 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Thu, 21 Jul 2016 11:04:53 +0530 Subject: [PATCH 109/157] fixed testcase file --- .../nfp/configurator/{api => advanced_controller}/__init__.py | 0 .../v1/controllers => advanced_controller}/test_controller.py | 2 +- .../contrib/tests/unit/nfp/configurator/api/v1/__init__.py | 0 .../tests/unit/nfp/configurator/api/v1/controllers/__init__.py | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename gbpservice/contrib/tests/unit/nfp/configurator/{api => advanced_controller}/__init__.py (100%) rename gbpservice/contrib/tests/unit/nfp/configurator/{api/v1/controllers => advanced_controller}/test_controller.py (99%) delete mode 100644 gbpservice/contrib/tests/unit/nfp/configurator/api/v1/__init__.py delete mode 100644 gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/__init__.py diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/api/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/__init__.py similarity index 100% rename from gbpservice/contrib/tests/unit/nfp/configurator/api/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/__init__.py diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py similarity index 99% rename from gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py rename to gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py index 6f17c67a27..7aeffdfa81 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py @@ -16,7 +16,7 @@ import oslo_serialization.jsonutils as jsonutils import pecan PECAN_CONFIG_FILE = (os.getcwd() + - "/gbpservice/contrib/nfp/configurator/api/config.py") + "/gbpservice/nfp/pecan/api/config.py") pecan.set_config(PECAN_CONFIG_FILE, overwrite=True) import webtest diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/api/v1/controllers/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From 53ee7d7fbb185d9c57954213fdaf804e59993e11 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 11:47:47 +0530 Subject: [PATCH 110/157] Modified to get the enterprise source from our repo --- gbpservice/nfp/config/mode_shift.conf | 3 ++ gbpservice/nfp/scripts/README.txt | 24 +++++++++++ .../nfp/scripts/mode_shift_enterprise.sh | 40 ++++++++++++++++--- 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 gbpservice/nfp/scripts/README.txt diff --git a/gbpservice/nfp/config/mode_shift.conf b/gbpservice/nfp/config/mode_shift.conf index 6721bc7df4..3e96d2b4fe 100644 --- a/gbpservice/nfp/config/mode_shift.conf +++ b/gbpservice/nfp/config/mode_shift.conf @@ -7,6 +7,8 @@ FROM=advanced TO=enterprise +DEVSTACK_DRC_DIR= + #----------------------------------# # enterprise mode specific options # #----------------------------------# @@ -22,3 +24,4 @@ DOCKER_IMAGES_URL=http://192.168.100.50/docker_images/ # Optional parameter AsavQcow2Image= +PaloAltoQcow2Image= diff --git a/gbpservice/nfp/scripts/README.txt b/gbpservice/nfp/scripts/README.txt new file mode 100644 index 0000000000..58bc67b3d4 --- /dev/null +++ b/gbpservice/nfp/scripts/README.txt @@ -0,0 +1,24 @@ +Steps to shift the advanced mode to enterprise mode: +=================================================== + +(1) Get the enterprise source + # git clone\ + -b mitaka_21st_march_base\ + --single-branch\ + https://github.com/oneconvergence/group-based-policy.git\ + /home/stack/gbp_mitaka_21st_march_base + +(2) Configure the /home/stack/gbp_mitaka_21st_march_base/gbpservice/nfp/config/mode_shift.conf + # DEVSTACK_SRC_DIR= + + For shifting to enterprise, + # VISIBILITY_GIT_BRANCH=master + # GIT_ACCESS_USERNAME= + # GIT_ACCESS_PASSWORD= + # DOCKER_IMAGES_URL=http://192.168.100.50/docker_images/ + # AsavQcow2Image= + # PaloAltoQcow2Image= + +(3) Execute the script. + # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/nfp/scripts/ + # bash mode_shift.sh diff --git a/gbpservice/nfp/scripts/mode_shift_enterprise.sh b/gbpservice/nfp/scripts/mode_shift_enterprise.sh index 571591c7a4..38e04ca997 100644 --- a/gbpservice/nfp/scripts/mode_shift_enterprise.sh +++ b/gbpservice/nfp/scripts/mode_shift_enterprise.sh @@ -1,10 +1,10 @@ #! /bin/bash -#FIXME(RPM): Devstack can be at different location. Fix this -DEVSTACK_SRC_DIR=/home/stack/devstack +SCRIPT_DIR=$PWD +ENTERPRISE_NFPSERVICE_DIR=$SCRIPT_DIR/../../../ +source $SCRIPT_DIR/../config/mode_shift.conf source $DEVSTACK_SRC_DIR/local.conf -NFPSERVICE_DIR=$DEST/gbp -source $NFPSERVICE_DIR/gbpservice/nfp/config/mode_shift.conf +INSTALLED_NFPSERVICE_DIR=$DEST/gbp # BUGBUG(DEEPAK): Should be retrieved from a result file populated by advanced mode. EXT_NET_NAME=ext-net @@ -21,10 +21,38 @@ function setup_ssh_key { } function copy_files { + # Copy Orchestrator from enterprise source + sudo cp -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp/orchestrator\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/nfp/ + + # Copy Config Orchestrator from enterprise source + sudo cp -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp/config_orchestrator\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/contrib/nfp/ + + # Copy Configurator from enterprise source + sudo cp -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/contrib/nfp/ + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + mkdir ~/enterprise_src + sudo ip netns exec nfp-proxy\ + scp -o "StrictHostKeyChecking no" -i configurator_vm -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator\ + root@$configurator_ip:~/enterprise_src/ + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker cp\ + ~/enterprise_src/configurator\ + configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/ sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator\ cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config + + # Copy # BUGBUG(RPM): Add any other enterprise files here, and configure them } @@ -90,7 +118,7 @@ function create_images { https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git\ -b $VISIBILITY_GIT_BRANCH echo "Building Image: $VISIBILITY_QCOW2_IMAGE_NAME" - cd $NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create/ + cd $ENTERPRISE_NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create/ sudo python visibility_disk_image_create.py\ visibility_conf.json $GBPSERVICE_BRANCH $DOCKER_IMAGES_URL VISIBILITY_QCOW2_IMAGE=$(cat output/last_built_image_path) @@ -140,7 +168,7 @@ function configure_visibility_user_data { CUR_DIR=$PWD visibility_vm_ip=$1 sudo rm -rf /opt/visibility_user_data - sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. + sudo cp -r $ENTERPRISE_NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. cd /opt sudo rm -rf my.key my.key.pub sudo ssh-keygen -t rsa -N "" -f my.key From 5d87f768d5b302bc90a5c2d1ae9be9d9db055f5f Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 21 Jul 2016 12:25:30 +0530 Subject: [PATCH 111/157] 1. Moved configurator and config orch bin and ini files to contrib whilst taking care of the dependencies 2. Moved svc plugins to contrib whilst taking care of the dependencies 3. Removed unused configurator scripts intended to start it as a service inside docker --- devstack/lib/nfp | 2 +- devstack/plugin.sh | 6 +- .../{ => contrib}/nfp/bin/nfp_config_orch.ini | 0 .../nfp/bin/nfp_configurator.ini | 0 gbpservice/{ => contrib}/nfp/bin/policy.json | 0 .../contrib/nfp/configurator/Dockerfile | 4 +- .../nfp/service_plugins/__init__.py | 0 .../nfp/service_plugins/firewall/__init__.py | 0 .../firewall/nfp_fwaas_plugin-liberty.py | 0 .../firewall/nfp_fwaas_plugin.py | 0 .../service_plugins/loadbalancer/__init__.py | 0 .../loadbalancer/drivers/__init__.py | 0 .../drivers/nfp_lbaas_plugin_driver.py | 0 .../drivers/nfp_lbaasv2_plugin_driver.py | 0 .../nfp/service_plugins/vpn/__init__.py | 0 .../service_plugins/vpn/drivers/__init__.py | 0 .../vpn/drivers/nfp_vpnaas_driver.py | 0 gbpservice/nfp/bin/nfp_configurator | 113 ------------------ gbpservice/nfp/bin/nfp_configurator.conf | 23 ---- 19 files changed, 6 insertions(+), 142 deletions(-) rename gbpservice/{ => contrib}/nfp/bin/nfp_config_orch.ini (100%) rename gbpservice/{ => contrib}/nfp/bin/nfp_configurator.ini (100%) rename gbpservice/{ => contrib}/nfp/bin/policy.json (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/firewall/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/firewall/nfp_fwaas_plugin.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/loadbalancer/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/loadbalancer/drivers/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/vpn/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/vpn/drivers/__init__.py (100%) rename gbpservice/{ => contrib}/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py (100%) delete mode 100755 gbpservice/nfp/bin/nfp_configurator delete mode 100755 gbpservice/nfp/bin/nfp_configurator.conf diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 01e5f4a49a..88bc95157d 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -421,7 +421,7 @@ function copy_nfp_files_and_start_process { sudo rm -rf /etc/nfp_* sudo cp -r bin/nfp_orchestrator.ini /etc/ sudo cp -r bin/nfp_proxy_agent.ini /etc/ - [[ $NFP_DEVSTACK_MODE = advanced ]] && sudo cp -r bin/nfp_config_orch.ini /etc/ + [[ $NFP_DEVSTACK_MODE = advanced ]] && sudo cp -r ../contrib/nfp/bin/nfp_config_orch.ini /etc/ sudo cp -r bin/nfp_proxy.ini /etc/nfp_proxy.ini sudo cp -r bin/nfp_proxy /usr/bin/ diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 08b12193f7..21bbb4d022 100755 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -51,7 +51,7 @@ function configure_nfp_loadbalancer { 's'/\ ':default'/\ '\n'\ -'service_provider = LOADBALANCER:loadbalancer:gbpservice.nfp.service_plugins.loadbalancer.drivers.nfp_lbaas_plugin_driver.HaproxyOnVMPluginDriver:default'/\ +'service_provider = LOADBALANCER:loadbalancer:gbpservice.contrib.nfp.service_plugins.loadbalancer.drivers.nfp_lbaas_plugin_driver.HaproxyOnVMPluginDriver:default'/\ /etc/neutron/neutron_lbaas.conf } @@ -63,7 +63,7 @@ function configure_nfp_firewall { '/^service_plugins/'\ 's'/\ 'neutron_fwaas.services.firewall.fwaas_plugin.FirewallPlugin'/\ -'gbpservice.nfp.service_plugins.firewall.nfp_fwaas_plugin.NFPFirewallPlugin'/\ +'gbpservice.contrib.nfp.service_plugins.firewall.nfp_fwaas_plugin.NFPFirewallPlugin'/\ /etc/neutron/neutron.conf } @@ -76,7 +76,7 @@ function configure_nfp_vpn { 's'/\ ':default'/\ '\n'\ -'service_provider = VPN:vpn:gbpservice.nfp.service_plugins.vpn.drivers.nfp_vpnaas_driver.NFPIPsecVPNDriver:default'/\ +'service_provider = VPN:vpn:gbpservice.contrib.nfp.service_plugins.vpn.drivers.nfp_vpnaas_driver.NFPIPsecVPNDriver:default'/\ /etc/neutron/neutron_vpnaas.conf } diff --git a/gbpservice/nfp/bin/nfp_config_orch.ini b/gbpservice/contrib/nfp/bin/nfp_config_orch.ini similarity index 100% rename from gbpservice/nfp/bin/nfp_config_orch.ini rename to gbpservice/contrib/nfp/bin/nfp_config_orch.ini diff --git a/gbpservice/nfp/bin/nfp_configurator.ini b/gbpservice/contrib/nfp/bin/nfp_configurator.ini similarity index 100% rename from gbpservice/nfp/bin/nfp_configurator.ini rename to gbpservice/contrib/nfp/bin/nfp_configurator.ini diff --git a/gbpservice/nfp/bin/policy.json b/gbpservice/contrib/nfp/bin/policy.json similarity index 100% rename from gbpservice/nfp/bin/policy.json rename to gbpservice/contrib/nfp/bin/policy.json diff --git a/gbpservice/contrib/nfp/configurator/Dockerfile b/gbpservice/contrib/nfp/configurator/Dockerfile index d3983929c4..b47a8227a5 100644 --- a/gbpservice/contrib/nfp/configurator/Dockerfile +++ b/gbpservice/contrib/nfp/configurator/Dockerfile @@ -53,9 +53,9 @@ RUN git clone -b GIT-BRANCH-NAME --single-branch https://github.com/oneconvergen RUN cp -r /group-based-policy/gbpservice /usr/local/lib/python2.7/dist-packages/ RUN cp /group-based-policy/gbpservice/nfp/bin/nfp /usr/bin/ RUN chmod +x /usr/bin/nfp -RUN cp /group-based-policy/gbpservice/nfp/bin/nfp_configurator.ini /etc/ +RUN cp /group-based-policy/gbpservice/contrib/nfp/bin/nfp_configurator.ini /etc/ RUN sed -i "s/log_forward_ip_address=*.*/log_forward_ip_address=VIS_VM_IP_ADDRESS/" /etc/nfp_configurator.ini -RUN cp /group-based-policy/gbpservice/nfp/bin/policy.json /etc/ +RUN cp /group-based-policy/gbpservice/contrib/nfp/bin/policy.json /etc/ RUN mkdir -p /var/log/nfp RUN touch /var/log/nfp/nfp_configurator.log RUN touch /var/log/nfp/nfp_pecan.log diff --git a/gbpservice/nfp/service_plugins/__init__.py b/gbpservice/contrib/nfp/service_plugins/__init__.py similarity index 100% rename from gbpservice/nfp/service_plugins/__init__.py rename to gbpservice/contrib/nfp/service_plugins/__init__.py diff --git a/gbpservice/nfp/service_plugins/firewall/__init__.py b/gbpservice/contrib/nfp/service_plugins/firewall/__init__.py similarity index 100% rename from gbpservice/nfp/service_plugins/firewall/__init__.py rename to gbpservice/contrib/nfp/service_plugins/firewall/__init__.py diff --git a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py b/gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py similarity index 100% rename from gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py rename to gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin-liberty.py diff --git a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py b/gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin.py similarity index 100% rename from gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py rename to gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin.py diff --git a/gbpservice/nfp/service_plugins/loadbalancer/__init__.py b/gbpservice/contrib/nfp/service_plugins/loadbalancer/__init__.py similarity index 100% rename from gbpservice/nfp/service_plugins/loadbalancer/__init__.py rename to gbpservice/contrib/nfp/service_plugins/loadbalancer/__init__.py diff --git a/gbpservice/nfp/service_plugins/loadbalancer/drivers/__init__.py b/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/__init__.py similarity index 100% rename from gbpservice/nfp/service_plugins/loadbalancer/drivers/__init__.py rename to gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/__init__.py diff --git a/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py b/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py similarity index 100% rename from gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py rename to gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py diff --git a/gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py b/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py similarity index 100% rename from gbpservice/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py rename to gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py diff --git a/gbpservice/nfp/service_plugins/vpn/__init__.py b/gbpservice/contrib/nfp/service_plugins/vpn/__init__.py similarity index 100% rename from gbpservice/nfp/service_plugins/vpn/__init__.py rename to gbpservice/contrib/nfp/service_plugins/vpn/__init__.py diff --git a/gbpservice/nfp/service_plugins/vpn/drivers/__init__.py b/gbpservice/contrib/nfp/service_plugins/vpn/drivers/__init__.py similarity index 100% rename from gbpservice/nfp/service_plugins/vpn/drivers/__init__.py rename to gbpservice/contrib/nfp/service_plugins/vpn/drivers/__init__.py diff --git a/gbpservice/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py b/gbpservice/contrib/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py similarity index 100% rename from gbpservice/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py rename to gbpservice/contrib/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py diff --git a/gbpservice/nfp/bin/nfp_configurator b/gbpservice/nfp/bin/nfp_configurator deleted file mode 100755 index 5a8fee0a25..0000000000 --- a/gbpservice/nfp/bin/nfp_configurator +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/sh - -PATH=/sbin:/usr/sbin:/bin:/usr/bin -DESC="NFP CONFIGURATOR agent" -PROJECT_NAME=nfp -NAME=${PROJECT_NAME}_configurator -DAEMON_ARGS="--config-file=/etc/nfp_configurator.ini" -#!/bin/sh -if [ -z "${DAEMON}" ] ; then - DAEMON=/usr/bin/${PROJECT_NAME} -fi -PIDFILE=/var/run/${PROJECT_NAME}/${NAME}.pid -if [ -z "${SCRIPTNAME}" ] ; then - SCRIPTNAME=/etc/init.d/${NAME} -fi -if [ -z "${SYSTEM_USER}" ] ; then - SYSTEM_USER=root -fi -if [ -z "${SYSTEM_USER}" ] ; then - SYSTEM_GROUP=root -fi -if [ "${SYSTEM_USER}" != "root" ] ; then - STARTDAEMON_CHUID="--chuid ${SYSTEM_USER}:${SYSTEM_GROUP}" -fi -if [ -z "${CONFIG_FILE}" ] ; then - CONFIG_FILE=/etc/init/nfp_configurator.conf -fi -LOGFILE=/var/log/${PROJECT_NAME}/${NAME}.log -DAEMON_ARGS="${DAEMON_ARGS} --config-file=${CONFIG_FILE}" - -# If ran as root, create /var/lock/X, /var/run/X, /var/lib/X and /var/log/X as needed -if [ `whoami` = "root" ] ; then - for i in lock run log; do - mkdir -p /var/$i/${PROJECT_NAME} - chown ${SYSTEM_USER} /var/$i/${PROJECT_NAME} - done -fi - -# This defines init_is_upstart which we use later on (+ more...) -. /lib/lsb/init-functions - -# Manage log options: logfile and/or syslog, depending on user's choosing -#[ -r /etc/default/$NAME ] && . /etc/default/$NAME -DAEMON_ARGS="$DAEMON_ARGS --log-file=$LOGFILE" - - -do_start() { - start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --startas $DAEMON \ - --test > /dev/null || return 1 - start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --startas $DAEMON \ - -- $DAEMON_ARGS || return 2 -} - -do_stop() { - start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE - RETVAL=$? - rm -f $PIDFILE - return "$RETVAL" -} - -do_systemd_start() { - exec $DAEMON $DAEMON_ARGS -} - -case "$1" in -start) - init_is_upstart > /dev/null 2>&1 && exit 1 - log_daemon_msg "Starting $DESC" "$NAME" - do_start - case $? in - 0|1) log_end_msg 0 ;; - 2) log_end_msg 1 ;; - esac -;; -stop) - init_is_upstart > /dev/null 2>&1 && exit 0 - log_daemon_msg "Stopping $DESC" "$NAME" - do_stop - case $? in - 0|1) log_end_msg 0 ;; - 2) log_end_msg 1 ;; - esac -;; -status) - status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? -;; -systemd-start) - do_systemd_start -;; -restart|force-reload) - init_is_upstart > /dev/null 2>&1 && exit 1 - log_daemon_msg "Restarting $DESC" "$NAME" - do_stop - case $? in - 0|1) - do_start - case $? in - 0) log_end_msg 0 ;; - 1) log_end_msg 1 ;; # Old process is still running - *) log_end_msg 1 ;; # Failed to start - esac - ;; - *) log_end_msg 1 ;; # Failed to stop - esac -;; -*) - echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|systemd-start}" >&2 - exit 3 -;; -esac - -exit 0 - diff --git a/gbpservice/nfp/bin/nfp_configurator.conf b/gbpservice/nfp/bin/nfp_configurator.conf deleted file mode 100755 index 0730377174..0000000000 --- a/gbpservice/nfp/bin/nfp_configurator.conf +++ /dev/null @@ -1,23 +0,0 @@ -description "NFP Configurator" - -start on runlevel [2345] -stop on runlevel [!2345] - -respawn - -chdir /var/run - -pre-start script - mkdir -p /var/run/nfp - chown root:root /var/run/nfp - mkdir -p /var/log/nfp - chown root:root /var/log/nfp - touch /var/log/nfp/nfp_configurator.log - chown root:root /var/log/nfp/nfp_configurator.log - chmod +x /var/log/nfp/nfp_configurator.log -end script - -exec start-stop-daemon --start --exec /usr/bin/nfp -- \ - --config-file=/etc/nfp_configurator.ini \ - --log-file=/var/log/nfp/nfp_configurator.log - From d7abe6e99ee85df21d5014e187e0f87e805cc054 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Thu, 21 Jul 2016 12:26:21 +0530 Subject: [PATCH 112/157] changed base mode testfile directory --- .../configurator/advanced_controller/test_controller.py | 8 ++++++-- .../tests/unit/nfp/base_configurator/api/v1/__init__.py | 0 .../nfp/base_configurator/api/v1/controllers/__init__.py | 0 .../base_configurator/{api => controllers}/__init__.py | 0 .../{api/v1 => }/controllers/test_controller.py | 6 +++++- 5 files changed, 11 insertions(+), 3 deletions(-) delete mode 100644 gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/__init__.py delete mode 100644 gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/controllers/__init__.py rename gbpservice/neutron/tests/unit/nfp/base_configurator/{api => controllers}/__init__.py (100%) rename gbpservice/neutron/tests/unit/nfp/base_configurator/{api/v1 => }/controllers/test_controller.py (97%) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py index 7aeffdfa81..7342e937db 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py @@ -25,8 +25,12 @@ from neutron.tests import base from pecan import rest -from gbpservice.contrib.nfp.configurator.api import root_controller -from gbpservice.contrib.nfp.configurator.api.v1.controllers import controller +from gbpservice.nfp.pecan import constants + +setattr(pecan, 'mode', constants.base) + +from gbpservice.nfp.pecan.api import root_controller +from gbpservice.contrib.nfp.configurator.advanced_controller import controller """This class contains all the unittest cases for REST server of configurator. diff --git a/gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/__init__.py b/gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/controllers/__init__.py b/gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/controllers/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gbpservice/neutron/tests/unit/nfp/base_configurator/api/__init__.py b/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/__init__.py similarity index 100% rename from gbpservice/neutron/tests/unit/nfp/base_configurator/api/__init__.py rename to gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/__init__.py diff --git a/gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/controllers/test_controller.py b/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py similarity index 97% rename from gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/controllers/test_controller.py rename to gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py index 90b2fa18e9..e99b6584bf 100644 --- a/gbpservice/neutron/tests/unit/nfp/base_configurator/api/v1/controllers/test_controller.py +++ b/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py @@ -19,7 +19,11 @@ import webtest import zlib -from gbpservice.nfp.base_configurator.api import root_controller +from gbpservice.nfp.pecan import constants + +setattr(pecan, 'mode', constants.base) + +from gbpservice.nfp.pecan.api import root_controller ERROR = 'error' UNHANDLED = 'unhandled' From e76a74f022d8d6711e0cb6180e397d6f07b90370 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 12:51:00 +0530 Subject: [PATCH 113/157] Added README for service image build and upload --- devstack/Readme-NFP-install.txt | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/devstack/Readme-NFP-install.txt b/devstack/Readme-NFP-install.txt index d77f4e6250..cdfd5694d1 100644 --- a/devstack/Readme-NFP-install.txt +++ b/devstack/Readme-NFP-install.txt @@ -32,6 +32,7 @@ Fresh Installation Steps: # If not configured, install step ignores uploading these service images VyosQcow2Image= HaproxyQcow2Image= + # NOTE: The Service images can be built using a script. Refer the section "Build images". # Public interface name PUBLIC_INTERFACE= # Change the value of GBPSERVICE_BRANCH to use different branch(in OC repo)/patch(in Openstack repo) @@ -53,3 +54,35 @@ Re-installation Steps: (2) Follow the fresh installation steps + +Build images: +============= + +Steps to get the scripts to build images + # git clone\ + -b mitaka_21st_march_base\ + --single-branch\ + https://github.com/oneconvergence/group-based-policy.git\ + /home/stack/gbp_mitaka_21st_march_base + +Steps to build VyOS service image: + # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/ + # sudo python vyos_image_create.py vyos_conf.json +Image location: + # /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/output/vyos.qcow2 + +Steps to build Haproxy service image: + # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/ + # sudo python build_image.py haproxy_conf.json +Image location: + # /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/output/haproxy.qcow2 + + +Upload images: +============= + +Steps to upload VyOS service image: + # glance image-create --name vyos --disk-format qcow2 --container-format bare --visibility public --file /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/output/vyos.qcow2 + +Steps to upload Haproxy service image: + # glance image-create --name haproxy --disk-format qcow2 --container-format bare --visibility public --file /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/output/haproxy.qcow2 From 0cdca1af0ce9d62999481b11c921bf918bbd02a4 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 13:16:22 +0530 Subject: [PATCH 114/157] Addressed review comments --- devstack/Readme-NFP-install.txt | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/devstack/Readme-NFP-install.txt b/devstack/Readme-NFP-install.txt index cdfd5694d1..9eb1a20bfb 100644 --- a/devstack/Readme-NFP-install.txt +++ b/devstack/Readme-NFP-install.txt @@ -28,11 +28,11 @@ Fresh Installation Steps: # If not configured, install step will build a new one and upload it ConfiguratorQcow2Image= # Service VM image paths, they are optional + # One can build service images referring to the section "Build service images". # If configured, install step uploads the specified images - # If not configured, install step ignores uploading these service images + # If not configured, install step ignores uploading these service images. VyosQcow2Image= HaproxyQcow2Image= - # NOTE: The Service images can be built using a script. Refer the section "Build images". # Public interface name PUBLIC_INTERFACE= # Change the value of GBPSERVICE_BRANCH to use different branch(in OC repo)/patch(in Openstack repo) @@ -55,15 +55,11 @@ Re-installation Steps: (2) Follow the fresh installation steps -Build images: -============= +Build service images: +==================== Steps to get the scripts to build images - # git clone\ - -b mitaka_21st_march_base\ - --single-branch\ - https://github.com/oneconvergence/group-based-policy.git\ - /home/stack/gbp_mitaka_21st_march_base + # git clone -b mitaka_21st_march_base --single-branch https://github.com/oneconvergence/group-based-policy.git /home/stack/gbp_mitaka_21st_march_base Steps to build VyOS service image: # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/ @@ -78,8 +74,8 @@ Image location: # /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/output/haproxy.qcow2 -Upload images: -============= +Upload service images: +===================== Steps to upload VyOS service image: # glance image-create --name vyos --disk-format qcow2 --container-format bare --visibility public --file /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/output/vyos.qcow2 From b4e0a61eb887aa6fe55464fa78693a8b78e44cb7 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 14:44:13 +0530 Subject: [PATCH 115/157] Fixed the script to restart the processes, and adding README --- gbpservice/nfp/config/mode_shift.conf | 2 +- gbpservice/nfp/scripts/README.txt | 11 +-- .../nfp/scripts/mode_shift_enterprise.sh | 77 ++++++++++++++----- 3 files changed, 62 insertions(+), 28 deletions(-) diff --git a/gbpservice/nfp/config/mode_shift.conf b/gbpservice/nfp/config/mode_shift.conf index 3e96d2b4fe..94b8f0dc30 100644 --- a/gbpservice/nfp/config/mode_shift.conf +++ b/gbpservice/nfp/config/mode_shift.conf @@ -7,7 +7,7 @@ FROM=advanced TO=enterprise -DEVSTACK_DRC_DIR= +DEVSTACK_SRC_DIR= #----------------------------------# # enterprise mode specific options # diff --git a/gbpservice/nfp/scripts/README.txt b/gbpservice/nfp/scripts/README.txt index 58bc67b3d4..918d9c320f 100644 --- a/gbpservice/nfp/scripts/README.txt +++ b/gbpservice/nfp/scripts/README.txt @@ -2,13 +2,10 @@ Steps to shift the advanced mode to enterprise mode: =================================================== (1) Get the enterprise source - # git clone\ - -b mitaka_21st_march_base\ - --single-branch\ - https://github.com/oneconvergence/group-based-policy.git\ - /home/stack/gbp_mitaka_21st_march_base + # ENTERPRISE_BRANCH=mitaka_21st_march_base + # git clone -b $ENTERPRISE_BRANCH --single-branch https://github.com/oneconvergence/group-based-policy.git /home/stack/gbp_$ENTERPRISE_BRANCH -(2) Configure the /home/stack/gbp_mitaka_21st_march_base/gbpservice/nfp/config/mode_shift.conf +(2) Configure the /home/stack/gbp_$ENTERPRISE_BRANCH/gbpservice/nfp/config/mode_shift.conf # DEVSTACK_SRC_DIR= For shifting to enterprise, @@ -20,5 +17,5 @@ Steps to shift the advanced mode to enterprise mode: # PaloAltoQcow2Image= (3) Execute the script. - # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/nfp/scripts/ + # cd /home/stack/gbp_$ENTERPRISE_BRANCH/gbpservice/nfp/scripts/ # bash mode_shift.sh diff --git a/gbpservice/nfp/scripts/mode_shift_enterprise.sh b/gbpservice/nfp/scripts/mode_shift_enterprise.sh index 38e04ca997..3bf226d2c1 100644 --- a/gbpservice/nfp/scripts/mode_shift_enterprise.sh +++ b/gbpservice/nfp/scripts/mode_shift_enterprise.sh @@ -9,6 +9,7 @@ INSTALLED_NFPSERVICE_DIR=$DEST/gbp EXT_NET_NAME=ext-net function setup_ssh_key { + cd $SCRIPT_DIR sudo ssh-keygen -f "/root/.ssh/known_hosts" -R $configurator_ip sudo ssh-keygen -f configurator_vm -t rsa -N '' echo "Give the password for the root user of the Configurator VM when prompted." @@ -21,39 +22,47 @@ function setup_ssh_key { } function copy_files { - # Copy Orchestrator from enterprise source - sudo cp -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp/orchestrator\ - $INSTALLED_NFPSERVICE_DIR/gbpservice/nfp/ + cd $SCRIPT_DIR - # Copy Config Orchestrator from enterprise source + # Copy gbpservice/nfp from enterprise source sudo cp -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp/config_orchestrator\ - $INSTALLED_NFPSERVICE_DIR/gbpservice/contrib/nfp/ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/ - # Copy Configurator from enterprise source + # Copy gbpservice/contrib/nfp from enterprise source sudo cp -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator\ - $INSTALLED_NFPSERVICE_DIR/gbpservice/contrib/nfp/ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/contrib/ + + # Copy to Configurator from enterprise source + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + mkdir /enterprise_src + + sudo ip netns exec nfp-proxy\ + scp -o "StrictHostKeyChecking no" -i configurator_vm -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp\ + root@$configurator_ip:/enterprise_src/ sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - mkdir ~/enterprise_src + docker cp\ + /enterprise_src/nfp\ + configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/ + sudo ip netns exec nfp-proxy\ scp -o "StrictHostKeyChecking no" -i configurator_vm -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator\ - root@$configurator_ip:~/enterprise_src/ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp\ + root@$configurator_ip:/enterprise_src/contrib_nfp sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker cp\ - ~/enterprise_src/configurator\ - configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/ + /enterprise_src/contrib_nfp\ + configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp + sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator\ cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config - - # Copy - # BUGBUG(RPM): Add any other enterprise files here, and configure them } # FIXME(RPM): Not working, this need to be fixed. @@ -95,6 +104,7 @@ function create_port_for_vm { } function configure_vis_ip_addr_in_docker { + cd $SCRIPT_DIR sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator\ @@ -176,7 +186,6 @@ function configure_visibility_user_data { sudo echo $value sudo sed -i "s||${value}|" visibility_user_data sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data - #BUGBUG(RPM): Verify HOST_IP sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data @@ -252,8 +261,36 @@ function nfp_logs_forword { fi } +function restart_screen_process { + SCREEN_NAME=stack + SERVICE_DIR=$DEST/status + name=$1 + cmd=$2 + + # stop the process + screen -S $SCREEN_NAME -p $name -X kill + + sleep 2 + + # start the process + screen -S $SCREEN_NAME -X screen -t $name + screen -S $SCREEN_NAME -p $name -X stuff "$cmd & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${name}.pid; fg || echo \"$name failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${name}.failure\"\n" + + sleep 5 +} + function restart_processes { - # restart configurator + cd $SCRIPT_DIR + + restart_screen_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log" + + restart_screen_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log" + + restart_screen_process nfp_proxy "source $INSTALLED_NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete; namespace_create" + + restart_screen_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file $DEST/logs/nfp_config_orchestrator.log" + + # restart nfp_configurator sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator screen -S configurator -X quit From c0ce4279c7f5f389ef2f388f32e6ff4eb391f301 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Thu, 21 Jul 2016 15:01:36 +0530 Subject: [PATCH 116/157] fixed testcase errors --- .../configurator/advanced_controller/__init__.py | 3 ++- .../advanced_controller/test_controller.py | 7 ++++--- gbpservice/nfp/pecan/api/config.py | 13 +++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py b/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py index 3dd0d6079e..46e418b159 100644 --- a/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py +++ b/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py @@ -12,7 +12,8 @@ import pecan -import controller +from gbpservice.contrib.nfp.configurator.advanced_controller import ( + controller) """This class forwards HTTP request to controller class. diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py index 7342e937db..83aacdcdce 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py @@ -15,8 +15,9 @@ import os import oslo_serialization.jsonutils as jsonutils import pecan -PECAN_CONFIG_FILE = (os.getcwd() + - "/gbpservice/nfp/pecan/api/config.py") +PECAN_CONFIG_FILE = (os.path.abspath(os.path.join(os.getcwd(), + "./../../../../../../nfp/pecan/api/config.py"))) + pecan.set_config(PECAN_CONFIG_FILE, overwrite=True) import webtest @@ -27,7 +28,7 @@ from gbpservice.nfp.pecan import constants -setattr(pecan, 'mode', constants.base) +setattr(pecan, 'mode', constants.advanced) from gbpservice.nfp.pecan.api import root_controller from gbpservice.contrib.nfp.configurator.advanced_controller import controller diff --git a/gbpservice/nfp/pecan/api/config.py b/gbpservice/nfp/pecan/api/config.py index 0cab883dca..d3b946f223 100644 --- a/gbpservice/nfp/pecan/api/config.py +++ b/gbpservice/nfp/pecan/api/config.py @@ -59,3 +59,16 @@ } } } +cloud_services = [ + {'service_name': 'configurator', + 'topic': 'configurator', + 'reporting_interval': '10', # in seconds + 'apis': ['CONFIGURATION'] + }, + + {'service_name': 'visibility', + 'topic': 'visibility', + 'reporting_interval': '10', # in seconds + 'apis': ['VISIBILITY'] + }, +] From 1d856092d1d9b267d9ab0563e95e94ff184568f1 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 17:00:03 +0530 Subject: [PATCH 117/157] Renamed mode_shift_enterprise.sh to mode_shift.sh --- gbpservice/nfp/scripts/mode_shift.sh | 373 +++++++++++++----- .../nfp/scripts/mode_shift_enterprise.sh | 349 ---------------- 2 files changed, 279 insertions(+), 443 deletions(-) delete mode 100644 gbpservice/nfp/scripts/mode_shift_enterprise.sh diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index de9a6dc47b..be08812878 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -1,152 +1,337 @@ #! /bin/bash -source /opt/stack/gbp/gbpservice/nfp/config/mode_shift.conf - -DEVSTACK_DIR=/home/stack/devstack -source $DEVSTACK_DIR/local.conf -NFPSERVICE_DIR=/opt/stack/gbp -# TODO(DEEPAK): Should be retrieved from a result file populated by advanced mode. +SCRIPT_DIR=$PWD +ENTERPRISE_NFPSERVICE_DIR=$SCRIPT_DIR/../../../ +source $SCRIPT_DIR/../config/mode_shift.conf +source $DEVSTACK_SRC_DIR/local.conf +INSTALLED_NFPSERVICE_DIR=$DEST/gbp +# BUGBUG(DEEPAK): Should be retrieved from a result file populated by advanced mode. EXT_NET_NAME=ext-net -function create_port_for_vm { - image_name=$1 +function setup_ssh_key { + cd $SCRIPT_DIR + sudo ssh-keygen -f "/root/.ssh/known_hosts" -R $configurator_ip + sudo ssh-keygen -f configurator_vm -t rsa -N '' + echo "Give the password for the root user of the Configurator VM when prompted." + sleep 5 + cat configurator_vm.pub |\ + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" root@$configurator_ip\ + 'cat >> .ssh/authorized_keys' + sleep 5 +} - GROUP="svc_management_ptg" - echo "GroupName: $GROUP" - PortId=$(gbp policy-target-create --policy-target-group $GROUP $InstanceName | grep port_id | awk '{print $4}') +function copy_files { + cd $SCRIPT_DIR + + # Copy gbpservice/nfp from enterprise source + sudo cp -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/ + + # Copy gbpservice/contrib/nfp from enterprise source + sudo cp -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/contrib/ + + # Copy to Configurator from enterprise source + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + mkdir /enterprise_src + + sudo ip netns exec nfp-proxy\ + scp -o "StrictHostKeyChecking no" -i configurator_vm -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp\ + root@$configurator_ip:/enterprise_src/ + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker cp\ + /enterprise_src/nfp\ + configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/ + + sudo ip netns exec nfp-proxy\ + scp -o "StrictHostKeyChecking no" -i configurator_vm -r\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp\ + root@$configurator_ip:/enterprise_src/contrib_nfp + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker cp\ + /enterprise_src/contrib_nfp\ + configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp + + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator\ + cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config +} - echo "Getting IpAddr for port: $PortId" - IpAddr_extractor=`neutron port-list|grep $PortId|awk '{print $11}'` +# FIXME(RPM): Not working, this need to be fixed. +function nfp_configure_nova { + NOVA_CONF_DIR=/etc/nova + NOVA_CONF=$NOVA_CONF_DIR/nova.conf + source $DEVSTACK_SRC_DIR/inc/ini-config + iniset $NOVA_CONF DEFAULT instance_usage_audit "True" + + source $DEVSTACK_SRC_DIR/functions-common + stop_process n-cpu + stop_process n-cond + stop_process n-sch + stop_process n-novnc + stop_process n-cauth + stop_process n-api + + source $DEVSTACK_SRC_DIR/lib/nova + start_nova_compute + start_nova_api + run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" + run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" + run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" + run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" +} + +function create_port_for_vm { +# $1 is image_name +# $2 is instance name + GROUP="svc_management_ptg" + PortId=$(gbp policy-target-create --policy-target-group $GROUP $2 | grep port_id | awk '{print $4}') + IpAddr_extractor=`neutron port-list --format value | grep $PortId | awk '{print $7}'` IpAddr_purge_last=${IpAddr_extractor::-1} IpAddr=${IpAddr_purge_last//\"/} - echo "Collecting IpAddr : for $PortId" - echo $IpAddr + echo "IpAddr of port($PortId): $IpAddr" + visibility_image_name=$1 + visibility_port_id=$PortId + visibility_ip=$IpAddr } function configure_vis_ip_addr_in_docker { - echo "Visibility VM IP address is: $IpAddr" - sed -i "s/VIS_VM_IP_ADDRESS/"$IpAddr"/" $NFPSERVICE_DIR/gbpservice/contrib/nfp/configurator/Dockerfile + cd $SCRIPT_DIR + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator\ + sed -i "s/log_forward_ip_address=*.*/log_forward_ip_address=$visibility_ip/" /etc/nfp_configurator.ini } function create_images { - source $DEVSTACK_DIR/openrc neutron service - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - # prepare visibility image and upload it into glance VISIBILITY_QCOW2_IMAGE=${VISIBILITY_QCOW2_IMAGE:-build} VISIBILITY_QCOW2_IMAGE_NAME=visibility InstanceName="VisibilityVM_instance" - create_port_for_vm $VISIBILITY_QCOW2_IMAGE_NAME + create_port_for_vm $VISIBILITY_QCOW2_IMAGE_NAME $InstanceName + # edits the docker file to add visibility vm IP address + configure_vis_ip_addr_in_docker if [[ $VISIBILITY_QCOW2_IMAGE = build ]]; then - # edits the docker file to add visibility vm IP address - configure_vis_ip_addr_in_docker - # prepare visibility source, this is needed for diskimage build cd /home/stack/ sudo rm -rf visibility - sudo git clone https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git -b $VISIBILITY_GIT_BRANCH + sudo git clone\ + https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git\ + -b $VISIBILITY_GIT_BRANCH echo "Building Image: $VISIBILITY_QCOW2_IMAGE_NAME" - cd $DEST/gbp/gbpservice/tests/contrib/diskimage-create/ - sudo python visibility_disk_image_create.py visibility_conf.json $DEVSTACK_DIR/local.conf - VISIBILITY_QCOW2_IMAGE=$(cat /tmp/image_path) + cd $ENTERPRISE_NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create/ + sudo python visibility_disk_image_create.py\ + visibility_conf.json $GBPSERVICE_BRANCH $DOCKER_IMAGES_URL + VISIBILITY_QCOW2_IMAGE=$(cat output/last_built_image_path) fi echo "Uploading Image: $VISIBILITY_QCOW2_IMAGE_NAME" - glance image-create --name $VISIBILITY_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $VISIBILITY_QCOW2_IMAGE + glance image-create\ + --name $VISIBILITY_QCOW2_IMAGE_NAME\ + --disk-format qcow2\ + --container-format bare\ + --visibility public\ + --file $VISIBILITY_QCOW2_IMAGE sleep 4 if ! [[ -z $AsavQcow2Image ]]; then - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=asav,device_type=nova --vendor NFP asav_fw_profile + gbp service-profile-create\ + --servicetype FIREWALL\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=asav,device_type=nova\ + --vendor NFP\ + asav_fw_profile ASAV_QCOW2_IMAGE_NAME=asav echo "Uploading Image: $ASAV_QCOW2_IMAGE_NAME" - glance image-create --name $ASAV_QCOW2_IMAGE_NAME --disk-format qcow2 --container-format bare --visibility public --file $AsavQcow2Image + glance image-create\ + --name $ASAV_QCOW2_IMAGE_NAME\ + --disk-format qcow2\ + --container-format bare\ + --visibility public\ + --file $AsavQcow2Image + fi + + if ! [[ -z $PaloAltoQcow2Image ]]; then + PALO_ALTO_QCOW2_IMAGE_NAME=paloalto + echo "Uploading Image: $PALO_ALTO_QCOW2_IMAGE_NAME" + glance image-create\ + --name $PALO_ALTO_QCOW2_IMAGE_NAME\ + --disk-format qcow2\ + --container-format bare\ + --visibility public\ + --file $PaloAltoQcow2Image fi } -function nfp_configure_nova { - NOVA_CONF_DIR=/etc/nova - NOVA_CONF=$NOVA_CONF_DIR/nova.conf - source $DEVSTACK_DIR/inc/ini-config - iniset $NOVA_CONF DEFAULT instance_usage_audit "True" - - source $DEVSTACK_DIR/functions-common - stop_process n-cpu - stop_process n-cond - stop_process n-sch - stop_process n-novnc - stop_process n-cauth - stop_process n-api - - source $DEVSTACK_DIR/lib/nova - start_nova_compute - start_nova_api - run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" - run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" - run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" - run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" +function configure_visibility_user_data { +# $1 is the Visibility VM's IP address + CUR_DIR=$PWD + visibility_vm_ip=$1 + sudo rm -rf /opt/visibility_user_data + sudo cp -r $ENTERPRISE_NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. + cd /opt + sudo rm -rf my.key my.key.pub + sudo ssh-keygen -t rsa -N "" -f my.key + value=`sudo cat my.key.pub` + sudo echo $value + sudo sed -i "s||${value}|" visibility_user_data + sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data + sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data + sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data + sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data + cd $CUR_DIR } -function prepare_for_mode_shift { - if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then - source $DEST/gbp/devstack/lib/nfp +function attach_security_groups { + SecGroup="allow_all" + nova secgroup-create $SecGroup "allow all traffic" + nova secgroup-add-rule $SecGroup udp 1 65535 120.0.0.0/24 + nova secgroup-add-rule $SecGroup icmp -1 -1 120.0.0.0/24 + nova secgroup-add-rule $SecGroup tcp 1 65535 120.0.0.0/24 + nova secgroup-add-rule $SecGroup tcp 80 80 0.0.0.0/0 + nova secgroup-add-rule $SecGroup udp 514 514 0.0.0.0/0 + nova secgroup-add-rule $SecGroup tcp 443 443 0.0.0.0/0 - echo "Preparing image creation" - create_images - nfp_configure_nova - sleep 10 - echo "Launching the Visibility VM" - launch_visibilityVM + nova add-secgroup $InstanceName $SecGroup +} - nfp_logs_forword +function launch_visibilityVM { + neutron net-create visibility-network + neutron subnet-create visibility-network 188.0.0.0/24 --name visibility-subnet + neutron router-create visibility-router + neutron router-gateway-set visibility-router $EXT_NET_NAME + neutron router-interface-add visibility-router visibility-subnet + ExtPortId=$(neutron port-create visibility-network | grep ' id ' | awk '{print $4}') + fip_id=$(neutron floatingip-create $EXT_NET_NAME | grep ' id '| awk '{print $4}') + neutron floatingip-associate $fip_id $ExtPortId + IpAddr_extractor=`neutron port-list --format value|grep $ExtPortId|awk '{print $6}'` + IpAddr_purge_last=${IpAddr_extractor::-1} + IpAddr2=${IpAddr_purge_last//\"/} + echo "Collecting IpAddr : for $ExtPortId" + echo $IpAddr2 + + echo "Collecting ImageId : for $visibility_image_name" + ImageId=`glance image-list|grep $visibility_image_name |awk '{print $2}'` + if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then + echo $ImageId else - echo "Shifting from $FROM mode to $TO mode is not supported." + echo "No image found with name $visibility_image_name ..." + exit fi + + configure_visibility_user_data $visibility_ip + echo "Launching Visibility image" + nova boot\ + --image $ImageId\ + --flavor m1.xlarge\ + --user-data /opt/visibility_user_data\ + --nic port-id=$visibility_port_id\ + --nic port-id=$ExtPortId\ + $InstanceName + sleep 10 + attach_security_groups } -function delete_instance_and_image { - - # delete the instance - echo "Deleting the running '$2' instance." - nova delete $2 +function nfp_logs_forword { + VISIBILITY_CONF="/etc/rsyslog.d/visibility.conf" + SYSLOG_CONFIG="/etc/rsyslog.conf" + log_facility=local1 + + sudo sed -i '/#$ModLoad imudp/ s/^#//' $SYSLOG_CONFIG + sudo sed -i '/#$UDPServerRun 514/ s/^#//' $SYSLOG_CONFIG + echo "Successfully enabled UDP in syslog" + + visibility_vm_ip_address=$(neutron floatingip-list --format value | grep "$IpAddr2" | awk '{print $3}') + echo "$log_facility.* @$visibility_vm_ip_address:514" | sudo tee $VISIBILITY_CONF + echo "Created $VISIBILITY_CONF file" + + sudo service rsyslog restart + if [ $? -ne 0 ]; then + echo "ERROR: Failed to restart rsyslog" + fi +} + +function restart_screen_process { + SCREEN_NAME=stack + SERVICE_DIR=$DEST/status + name=$1 + cmd=$2 + + # stop the process + screen -S $SCREEN_NAME -p $name -X kill + + sleep 2 + + # start the process + screen -S $SCREEN_NAME -X screen -t $name + screen -S $SCREEN_NAME -p $name -X stuff "$cmd & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${name}.pid; fg || echo \"$name failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${name}.failure\"\n" + sleep 5 - - echo "Deleting '$1' glance image." - image_id=$(glance image-list | grep $1 | awk '{print $2}') - glance image-delete $image_id } - function restart_processes { - source $DEVSTACK_DIR/functions-common - source $DEVSTACK_DIR/openrc neutron service - - # restart proxy - stop_process proxy - run_process proxy "source $NFPSERVICE_DIR/devstack/lib/nfp;namespace_delete $DEVSTACK_DIR;namespace_create $DEVSTACK_DIR $IpAddr" - echo "Restarted proxy process" - sleep 10 + cd $SCRIPT_DIR - # restart proxy agent - stop_process proxy_agent - run_process proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file /opt/stack/logs/nfp_proxy_agent.log" - echo "Restarted proxy agent process" - sleep 3 + restart_screen_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log" + # restart_screen_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log" + + # restart_screen_process nfp_proxy "source $INSTALLED_NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete; namespace_create" + + restart_screen_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file $DEST/logs/nfp_config_orchestrator.log" + + # restart nfp_configurator + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator screen -S configurator -X quit + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --config-dir=/etc/nfp_config --log-file=/var/log/nfp/nfp_configurator.log } +function prepare_for_mode_shift { + if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then + source $DEVSTACK_SRC_DIR/openrc neutron service + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + # BUGBUG(RPM): Configurator's port name should be retrieved from a result file populated by advanced mode. + configurator_ip=`neutron port-show pt_configuratorVM_instance -f value -c fixed_ips | cut -d'"' -f8` + echo "Configurator's IP: $configurator_ip" + + echo "Setting up ssh key in configurator for password less ssh" + setup_ssh_key + echo "Copy files and configure" + copy_files + # FIXME(RPM): Restart of the processes in nfp_configure_nova + # is not working, this need to be fixed. + #echo "Configuring nova" + #nfp_configure_nova + #sleep 10 + echo "Preparing image creation" + create_images + echo "Launching the Visibility VM" + launch_visibilityVM + nfp_logs_forword + else + echo "Shifting from $FROM mode to $TO mode is not supported." + fi +} function mode_shift { if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then - sudo sed -i 's/rest_server_address=.*/rest_server_address='$IpAddr'/' /etc/nfp_proxy.ini - echo "Restarting various processes" restart_processes - - image=configurator - instance_name=configuratorVM_instance - delete_instance_and_image $image $instance_name else echo "Shifting from $FROM mode to $TO mode is not supported." fi @@ -158,7 +343,7 @@ echo "Task: Shifting mode of NFP from $FROM mode to $TO mode." echo "Preparing for the NFP mode shift." prepare_for_mode_shift -echo "Shifting NFP to $TO mode. There will be a little downtime. Kindly bear with me." +echo "Shifting NFP to $TO mode. There will be a little downtime. Kindly bear with it." mode_shift echo "Successfully shifted NFP from $FROM mode to $TO mode." diff --git a/gbpservice/nfp/scripts/mode_shift_enterprise.sh b/gbpservice/nfp/scripts/mode_shift_enterprise.sh deleted file mode 100644 index 3bf226d2c1..0000000000 --- a/gbpservice/nfp/scripts/mode_shift_enterprise.sh +++ /dev/null @@ -1,349 +0,0 @@ -#! /bin/bash - -SCRIPT_DIR=$PWD -ENTERPRISE_NFPSERVICE_DIR=$SCRIPT_DIR/../../../ -source $SCRIPT_DIR/../config/mode_shift.conf -source $DEVSTACK_SRC_DIR/local.conf -INSTALLED_NFPSERVICE_DIR=$DEST/gbp -# BUGBUG(DEEPAK): Should be retrieved from a result file populated by advanced mode. -EXT_NET_NAME=ext-net - -function setup_ssh_key { - cd $SCRIPT_DIR - sudo ssh-keygen -f "/root/.ssh/known_hosts" -R $configurator_ip - sudo ssh-keygen -f configurator_vm -t rsa -N '' - echo "Give the password for the root user of the Configurator VM when prompted." - sleep 5 - cat configurator_vm.pub |\ - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" root@$configurator_ip\ - 'cat >> .ssh/authorized_keys' - sleep 5 -} - -function copy_files { - cd $SCRIPT_DIR - - # Copy gbpservice/nfp from enterprise source - sudo cp -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp\ - $INSTALLED_NFPSERVICE_DIR/gbpservice/ - - # Copy gbpservice/contrib/nfp from enterprise source - sudo cp -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp\ - $INSTALLED_NFPSERVICE_DIR/gbpservice/contrib/ - - # Copy to Configurator from enterprise source - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - mkdir /enterprise_src - - sudo ip netns exec nfp-proxy\ - scp -o "StrictHostKeyChecking no" -i configurator_vm -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp\ - root@$configurator_ip:/enterprise_src/ - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - docker cp\ - /enterprise_src/nfp\ - configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/ - - sudo ip netns exec nfp-proxy\ - scp -o "StrictHostKeyChecking no" -i configurator_vm -r\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/contrib/nfp\ - root@$configurator_ip:/enterprise_src/contrib_nfp - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - docker cp\ - /enterprise_src/contrib_nfp\ - configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp - - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - docker exec configurator\ - cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config -} - -# FIXME(RPM): Not working, this need to be fixed. -function nfp_configure_nova { - NOVA_CONF_DIR=/etc/nova - NOVA_CONF=$NOVA_CONF_DIR/nova.conf - source $DEVSTACK_SRC_DIR/inc/ini-config - iniset $NOVA_CONF DEFAULT instance_usage_audit "True" - - source $DEVSTACK_SRC_DIR/functions-common - stop_process n-cpu - stop_process n-cond - stop_process n-sch - stop_process n-novnc - stop_process n-cauth - stop_process n-api - - source $DEVSTACK_SRC_DIR/lib/nova - start_nova_compute - start_nova_api - run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" - run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" - run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" - run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" -} - -function create_port_for_vm { -# $1 is image_name -# $2 is instance name - GROUP="svc_management_ptg" - PortId=$(gbp policy-target-create --policy-target-group $GROUP $2 | grep port_id | awk '{print $4}') - IpAddr_extractor=`neutron port-list --format value | grep $PortId | awk '{print $7}'` - IpAddr_purge_last=${IpAddr_extractor::-1} - IpAddr=${IpAddr_purge_last//\"/} - echo "IpAddr of port($PortId): $IpAddr" - visibility_image_name=$1 - visibility_port_id=$PortId - visibility_ip=$IpAddr -} - -function configure_vis_ip_addr_in_docker { - cd $SCRIPT_DIR - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - docker exec configurator\ - sed -i "s/log_forward_ip_address=*.*/log_forward_ip_address=$visibility_ip/" /etc/nfp_configurator.ini -} - -function create_images { - # prepare visibility image and upload it into glance - VISIBILITY_QCOW2_IMAGE=${VISIBILITY_QCOW2_IMAGE:-build} - VISIBILITY_QCOW2_IMAGE_NAME=visibility - InstanceName="VisibilityVM_instance" - create_port_for_vm $VISIBILITY_QCOW2_IMAGE_NAME $InstanceName - # edits the docker file to add visibility vm IP address - configure_vis_ip_addr_in_docker - - if [[ $VISIBILITY_QCOW2_IMAGE = build ]]; then - # prepare visibility source, this is needed for diskimage build - cd /home/stack/ - sudo rm -rf visibility - sudo git clone\ - https://$GIT_ACCESS_USERNAME:$GIT_ACCESS_PASSWORD@github.com/oneconvergence/visibility.git\ - -b $VISIBILITY_GIT_BRANCH - echo "Building Image: $VISIBILITY_QCOW2_IMAGE_NAME" - cd $ENTERPRISE_NFPSERVICE_DIR/gbpservice/tests/contrib/diskimage-create/ - sudo python visibility_disk_image_create.py\ - visibility_conf.json $GBPSERVICE_BRANCH $DOCKER_IMAGES_URL - VISIBILITY_QCOW2_IMAGE=$(cat output/last_built_image_path) - fi - echo "Uploading Image: $VISIBILITY_QCOW2_IMAGE_NAME" - glance image-create\ - --name $VISIBILITY_QCOW2_IMAGE_NAME\ - --disk-format qcow2\ - --container-format bare\ - --visibility public\ - --file $VISIBILITY_QCOW2_IMAGE - sleep 4 - - if ! [[ -z $AsavQcow2Image ]]; then - gbp service-profile-create\ - --servicetype FIREWALL\ - --insertion-mode l3\ - --shared True\ - --service-flavor service_vendor=asav,device_type=nova\ - --vendor NFP\ - asav_fw_profile - - ASAV_QCOW2_IMAGE_NAME=asav - echo "Uploading Image: $ASAV_QCOW2_IMAGE_NAME" - glance image-create\ - --name $ASAV_QCOW2_IMAGE_NAME\ - --disk-format qcow2\ - --container-format bare\ - --visibility public\ - --file $AsavQcow2Image - fi - - if ! [[ -z $PaloAltoQcow2Image ]]; then - PALO_ALTO_QCOW2_IMAGE_NAME=paloalto - echo "Uploading Image: $PALO_ALTO_QCOW2_IMAGE_NAME" - glance image-create\ - --name $PALO_ALTO_QCOW2_IMAGE_NAME\ - --disk-format qcow2\ - --container-format bare\ - --visibility public\ - --file $PaloAltoQcow2Image - fi -} - -function configure_visibility_user_data { -# $1 is the Visibility VM's IP address - CUR_DIR=$PWD - visibility_vm_ip=$1 - sudo rm -rf /opt/visibility_user_data - sudo cp -r $ENTERPRISE_NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/visibility_user_data /opt/. - cd /opt - sudo rm -rf my.key my.key.pub - sudo ssh-keygen -t rsa -N "" -f my.key - value=`sudo cat my.key.pub` - sudo echo $value - sudo sed -i "s||${value}|" visibility_user_data - sudo sed -i "s/visibility_vm_ip=*.*/visibility_vm_ip=$visibility_vm_ip/g" visibility_user_data - sudo sed -i "s/os_controller_ip=*.*/os_controller_ip=$HOST_IP/g" visibility_user_data - sudo sed -i "s/statsd_host=*.*/statsd_host=$visibility_vm_ip/g" visibility_user_data - sudo sed -i "s/rabbit_host=*.*/rabbit_host=$configurator_ip/g" visibility_user_data - cd $CUR_DIR -} - -function attach_security_groups { - SecGroup="allow_all" - nova secgroup-create $SecGroup "allow all traffic" - nova secgroup-add-rule $SecGroup udp 1 65535 120.0.0.0/24 - nova secgroup-add-rule $SecGroup icmp -1 -1 120.0.0.0/24 - nova secgroup-add-rule $SecGroup tcp 1 65535 120.0.0.0/24 - nova secgroup-add-rule $SecGroup tcp 80 80 0.0.0.0/0 - nova secgroup-add-rule $SecGroup udp 514 514 0.0.0.0/0 - nova secgroup-add-rule $SecGroup tcp 443 443 0.0.0.0/0 - - nova add-secgroup $InstanceName $SecGroup -} - -function launch_visibilityVM { - neutron net-create visibility-network - neutron subnet-create visibility-network 188.0.0.0/24 --name visibility-subnet - neutron router-create visibility-router - neutron router-gateway-set visibility-router $EXT_NET_NAME - neutron router-interface-add visibility-router visibility-subnet - ExtPortId=$(neutron port-create visibility-network | grep ' id ' | awk '{print $4}') - fip_id=$(neutron floatingip-create $EXT_NET_NAME | grep ' id '| awk '{print $4}') - neutron floatingip-associate $fip_id $ExtPortId - IpAddr_extractor=`neutron port-list --format value|grep $ExtPortId|awk '{print $6}'` - IpAddr_purge_last=${IpAddr_extractor::-1} - IpAddr2=${IpAddr_purge_last//\"/} - echo "Collecting IpAddr : for $ExtPortId" - echo $IpAddr2 - - echo "Collecting ImageId : for $visibility_image_name" - ImageId=`glance image-list|grep $visibility_image_name |awk '{print $2}'` - if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then - echo $ImageId - else - echo "No image found with name $visibility_image_name ..." - exit - fi - - configure_visibility_user_data $visibility_ip - echo "Launching Visibility image" - nova boot\ - --image $ImageId\ - --flavor m1.xlarge\ - --user-data /opt/visibility_user_data\ - --nic port-id=$visibility_port_id\ - --nic port-id=$ExtPortId\ - $InstanceName - sleep 10 - attach_security_groups -} - -function nfp_logs_forword { - VISIBILITY_CONF="/etc/rsyslog.d/visibility.conf" - SYSLOG_CONFIG="/etc/rsyslog.conf" - log_facility=local1 - - sudo sed -i '/#$ModLoad imudp/ s/^#//' $SYSLOG_CONFIG - sudo sed -i '/#$UDPServerRun 514/ s/^#//' $SYSLOG_CONFIG - echo "Successfully enabled UDP in syslog" - - visibility_vm_ip_address=$(neutron floatingip-list --format value | grep "$IpAddr2" | awk '{print $3}') - echo "$log_facility.* @$visibility_vm_ip_address:514" | sudo tee $VISIBILITY_CONF - echo "Created $VISIBILITY_CONF file" - - sudo service rsyslog restart - if [ $? -ne 0 ]; then - echo "ERROR: Failed to restart rsyslog" - fi -} - -function restart_screen_process { - SCREEN_NAME=stack - SERVICE_DIR=$DEST/status - name=$1 - cmd=$2 - - # stop the process - screen -S $SCREEN_NAME -p $name -X kill - - sleep 2 - - # start the process - screen -S $SCREEN_NAME -X screen -t $name - screen -S $SCREEN_NAME -p $name -X stuff "$cmd & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${name}.pid; fg || echo \"$name failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${name}.failure\"\n" - - sleep 5 -} - -function restart_processes { - cd $SCRIPT_DIR - - restart_screen_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log" - - restart_screen_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log" - - restart_screen_process nfp_proxy "source $INSTALLED_NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete; namespace_create" - - restart_screen_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file $DEST/logs/nfp_config_orchestrator.log" - - # restart nfp_configurator - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - docker exec configurator screen -S configurator -X quit - sudo ip netns exec nfp-proxy\ - ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ - docker exec configurator screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --config-dir=/etc/nfp_config --log-file=/var/log/nfp/nfp_configurator.log -} - -function prepare_for_mode_shift { - if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then - source $DEVSTACK_SRC_DIR/openrc neutron service - unset OS_USER_DOMAIN_ID - unset OS_PROJECT_DOMAIN_ID - - # BUGBUG(RPM): Configurator's port name should be retrieved from a result file populated by advanced mode. - configurator_ip=`neutron port-show pt_configuratorVM_instance -f value -c fixed_ips | cut -d'"' -f8` - echo "Configurator's IP: $configurator_ip" - - echo "Setting up ssh key in configurator for password less ssh" - setup_ssh_key - echo "Copy files and configure" - copy_files - # FIXME(RPM): Restart of the processes in nfp_configure_nova - # is not working, this need to be fixed. - #echo "Configuring nova" - #nfp_configure_nova - #sleep 10 - echo "Preparing image creation" - create_images - echo "Launching the Visibility VM" - launch_visibilityVM - nfp_logs_forword - else - echo "Shifting from $FROM mode to $TO mode is not supported." - fi -} - -function mode_shift { - if [[ $FROM = advanced ]] && [[ $TO = enterprise ]]; then - echo "Restarting various processes" - restart_processes - else - echo "Shifting from $FROM mode to $TO mode is not supported." - fi -} - - -echo "Task: Shifting mode of NFP from $FROM mode to $TO mode." - -echo "Preparing for the NFP mode shift." -prepare_for_mode_shift - -echo "Shifting NFP to $TO mode. There will be a little downtime. Kindly bear with it." -mode_shift - -echo "Successfully shifted NFP from $FROM mode to $TO mode." From 2396e50e93e31b87c7f9a30b3453de131508805c Mon Sep 17 00:00:00 2001 From: Rahul Shikhare Date: Thu, 21 Jul 2016 17:15:41 +0530 Subject: [PATCH 118/157] changed the constants and imports --- devstack/lib/nfp | 2 +- .../__init__.py | 3 +-- .../controller.py | 0 gbpservice/contrib/nfp/configurator/run.sh | 2 +- .../__init__.py | 0 .../test_controller.py | 4 ++-- .../controllers/test_controller.py | 2 +- gbpservice/nfp/pecan/api/root_controller.py | 16 +++++++------- gbpservice/nfp/pecan/constants.py | 21 ++++++++----------- .../reference_configurator/bin/nfp-pecan | 2 +- 10 files changed, 24 insertions(+), 28 deletions(-) rename gbpservice/contrib/nfp/configurator/{advanced_controller => controller}/__init__.py (96%) rename gbpservice/contrib/nfp/configurator/{advanced_controller => controller}/controller.py (100%) rename gbpservice/contrib/tests/unit/nfp/configurator/{advanced_controller => controller}/__init__.py (100%) rename gbpservice/contrib/tests/unit/nfp/configurator/{advanced_controller => controller}/test_controller.py (98%) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 01e5f4a49a..fa53bf1f71 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -458,7 +458,7 @@ function copy_nfp_files_and_start_process { cd pecan/api sudo python setup.py develop echo "Starting nfp_base_configurator under screen named nfp_base_configurator" - run_process nfp_base_configurator "cd $NFPSERVICE_DIR/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" + run_process nfp_base_configurator "cd $NFPSERVICE_DIR/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base_controller" fi sleep 1 diff --git a/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py b/gbpservice/contrib/nfp/configurator/controller/__init__.py similarity index 96% rename from gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py rename to gbpservice/contrib/nfp/configurator/controller/__init__.py index 46e418b159..8fc1b10116 100644 --- a/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py +++ b/gbpservice/contrib/nfp/configurator/controller/__init__.py @@ -12,8 +12,7 @@ import pecan -from gbpservice.contrib.nfp.configurator.advanced_controller import ( - controller) +from gbpservice.contrib.nfp.configurator.controller import controller """This class forwards HTTP request to controller class. diff --git a/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py b/gbpservice/contrib/nfp/configurator/controller/controller.py similarity index 100% rename from gbpservice/contrib/nfp/configurator/advanced_controller/controller.py rename to gbpservice/contrib/nfp/configurator/controller/controller.py diff --git a/gbpservice/contrib/nfp/configurator/run.sh b/gbpservice/contrib/nfp/configurator/run.sh index 73da244bcf..c33d9d0078 100644 --- a/gbpservice/contrib/nfp/configurator/run.sh +++ b/gbpservice/contrib/nfp/configurator/run.sh @@ -4,6 +4,6 @@ service rabbitmq-server start screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --log-file=/var/log/nfp/nfp_configurator.log cd /usr/local/lib/python2.7/dist-packages/gbpservice/nfp/pecan/api/ python setup.py develop -screen -dmS "pecan" pecan configurator_decider config.py --mode advanced +screen -dmS "pecan" pecan configurator_decider config.py --mode controller /bin/bash diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/controller/__init__.py similarity index 100% rename from gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/controller/__init__.py diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/controller/test_controller.py similarity index 98% rename from gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py rename to gbpservice/contrib/tests/unit/nfp/configurator/controller/test_controller.py index 83aacdcdce..65f481fe2c 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/controller/test_controller.py @@ -28,10 +28,10 @@ from gbpservice.nfp.pecan import constants -setattr(pecan, 'mode', constants.advanced) +setattr(pecan, 'mode', constants.controller) +from gbpservice.contrib.nfp.configurator.controller import controller from gbpservice.nfp.pecan.api import root_controller -from gbpservice.contrib.nfp.configurator.advanced_controller import controller """This class contains all the unittest cases for REST server of configurator. diff --git a/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py b/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py index e99b6584bf..5067f1af2b 100644 --- a/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py +++ b/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py @@ -21,7 +21,7 @@ from gbpservice.nfp.pecan import constants -setattr(pecan, 'mode', constants.base) +setattr(pecan, 'mode', constants.base_controller) from gbpservice.nfp.pecan.api import root_controller diff --git a/gbpservice/nfp/pecan/api/root_controller.py b/gbpservice/nfp/pecan/api/root_controller.py index 6b4ce09902..528a2ef5a9 100644 --- a/gbpservice/nfp/pecan/api/root_controller.py +++ b/gbpservice/nfp/pecan/api/root_controller.py @@ -22,21 +22,21 @@ class RootController(object): """ _controllers = {} - for name, controller in constants.controllers.items(): + for name, _controller in constants.controllers.items(): try: - _controllers.update({name: __import__(controller, + _controllers.update({name: __import__(_controller, globals(), locals(), ['controllers'], -1)}) except Exception: pass - if pecan.mode == constants.base: - v1 = _controllers[constants.BASE_CONTROLLER].V1Controller() - elif pecan.mode == constants.base_with_vm: - v1 = _controllers[constants.REFERENCE_CONTROLLER].V1Controller() - elif pecan.mode == constants.advanced: - v1 = _controllers[constants.ADVANCED_CONTROLLER].V1Controller() + if pecan.mode == constants.base_controller: + v1 = _controllers[constants.base_controller].V1Controller() + elif pecan.mode == constants.base_vm: + v1 = _controllers[constants.base_vm].V1Controller() + elif pecan.mode == constants.controller: + v1 = _controllers[constants.controller].V1Controller() @pecan.expose() def get(self): diff --git a/gbpservice/nfp/pecan/constants.py b/gbpservice/nfp/pecan/constants.py index dedddc19f0..d2927fca7b 100644 --- a/gbpservice/nfp/pecan/constants.py +++ b/gbpservice/nfp/pecan/constants.py @@ -11,20 +11,17 @@ # under the License. -BASE_CONTROLLER = 'base_controller' -REFERENCE_CONTROLLER = 'reference_controller' -ADVANCED_CONTROLLER = 'advanced_controller' +base_vm = 'base_vm' +base_controller = 'base_controller' +controller = 'controller' controllers = { - BASE_CONTROLLER: 'gbpservice.nfp.base_configurator.controllers', - REFERENCE_CONTROLLER: ('gbpservice.tests.contrib' - '.nfp_service.reference_configurator.controllers'), - ADVANCED_CONTROLLER: ('gbpservice.contrib.nfp.configurator' - '.advanced_controller') + base_controller: 'gbpservice.nfp.base_configurator.controllers', + base_vm: ('gbpservice.tests.contrib.nfp_service' + '.reference_configurator.controllers' + ), + controller: 'gbpservice.contrib.nfp.configurator.controller' } -base_with_vm = 'base_with_vm' -base = 'base' -advanced = 'advanced' -modes = [base, base_with_vm, advanced] +modes = [base_controller, base_vm, controller] diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan b/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan index 88498579f6..0a8bd3bab1 100644 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan +++ b/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan @@ -1,3 +1,3 @@ #!/bin/sh script='/usr/local/lib/python2.7/dist-packages/gbpservice/nfp/pecan/api/config.py' -pecan configurator_decider $script --mode base_with_vm & +pecan configurator_decider $script --mode base_vm & From 9af95a20082795671cf7556f024b6acf43f10fa7 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 17:53:04 +0530 Subject: [PATCH 119/157] Synced with the submitted source --- .../contrib/devstack/exercises-nfp/fw.sh | 138 +++++++++++ .../contrib/devstack/exercises-nfp/fw_lb.sh | 204 +++++++++++++++ .../contrib/devstack/exercises-nfp/fw_vm.sh | 138 +++++++++++ .../devstack/exercises-nfp/fw_vm_lb.sh | 204 +++++++++++++++ .../contrib/devstack/exercises-nfp/lb.sh | 159 ++++++++++++ .../tests/contrib/devstack/local-nfp.conf | 117 +++++++++ gbpservice/tests/contrib/devstack/nfp | 232 ++++++++++++++++++ .../devstack/nfp-templates/fw_template.yml | 45 ++++ .../nfp-templates/fw_updated_template.yml | 31 +++ .../devstack/nfp-templates/haproxy.template | 65 +++++ gbpservice/tests/contrib/functions-gbp | 14 ++ gbpservice/tests/contrib/gate_nfp_hook.sh | 34 +++ .../tests/contrib/post_test_nfp_hook.sh | 25 ++ 13 files changed, 1406 insertions(+) create mode 100755 gbpservice/tests/contrib/devstack/exercises-nfp/fw.sh create mode 100755 gbpservice/tests/contrib/devstack/exercises-nfp/fw_lb.sh create mode 100755 gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm.sh create mode 100755 gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm_lb.sh create mode 100755 gbpservice/tests/contrib/devstack/exercises-nfp/lb.sh create mode 100644 gbpservice/tests/contrib/devstack/local-nfp.conf create mode 100644 gbpservice/tests/contrib/devstack/nfp create mode 100644 gbpservice/tests/contrib/devstack/nfp-templates/fw_template.yml create mode 100644 gbpservice/tests/contrib/devstack/nfp-templates/fw_updated_template.yml create mode 100644 gbpservice/tests/contrib/devstack/nfp-templates/haproxy.template create mode 100644 gbpservice/tests/contrib/gate_nfp_hook.sh create mode 100644 gbpservice/tests/contrib/post_test_nfp_hook.sh diff --git a/gbpservice/tests/contrib/devstack/exercises-nfp/fw.sh b/gbpservice/tests/contrib/devstack/exercises-nfp/fw.sh new file mode 100755 index 0000000000..b1aa6565e1 --- /dev/null +++ b/gbpservice/tests/contrib/devstack/exercises-nfp/fw.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +# **fw.sh** + +# Sanity check that firewall service is created with NFP + +echo "*********************************************************************" +echo "Begin NFP Exercise: $0" +echo "*********************************************************************" + +# Settings +# ======== + +# This script exits on an error so that errors don't compound and you see +# only the first error that occurred. +set -o errexit + +# Keep track of the current directory +EXERCISE_DIR=$(cd $(dirname "$0") && pwd) +TOP_DIR=$(cd $EXERCISE_DIR/..; pwd) + +source $TOP_DIR/openrc neutron service + +create_gbp_resources() { + gbp servicechain-node-create --service-profile base_mode_fw --template-file $TOP_DIR/nfp-templates/fw_template.yml FWNODE + gbp servicechain-spec-create --nodes "FWNODE" fw-chainspec + gbp policy-action-create --action-type REDIRECT --action-value fw-chainspec redirect-to-fw + gbp policy-action-create --action-type ALLOW allow-to-fw + gbp policy-classifier-create --protocol tcp --direction bi fw-web-classifier-tcp + gbp policy-classifier-create --protocol udp --direction bi fw-web-classifier-udp + gbp policy-classifier-create --protocol icmp --direction bi fw-web-classifier-icmp + gbp policy-rule-create --classifier fw-web-classifier-tcp --actions redirect-to-fw fw-web-redirect-rule + gbp policy-rule-create --classifier fw-web-classifier-tcp --actions allow-to-fw fw-web-allow-rule-tcp + gbp policy-rule-create --classifier fw-web-classifier-udp --actions allow-to-fw fw-web-allow-rule-udp + gbp policy-rule-create --classifier fw-web-classifier-icmp --actions allow-to-fw fw-web-allow-rule-icmp + gbp policy-rule-set-create --policy-rules "fw-web-redirect-rule fw-web-allow-rule-tcp fw-web-allow-rule-udp fw-web-allow-rule-icmp" fw-webredirect-ruleset + gbp group-create fw-consumer --consumed-policy-rule-sets "fw-webredirect-ruleset=None" + gbp group-create fw-provider --provided-policy-rule-sets "fw-webredirect-ruleset=None" +} + +delete_gbp_resources() { + gbp group-delete fw-provider + gbp group-delete fw-consumer + gbp policy-rule-set-delete fw-webredirect-ruleset + gbp policy-rule-delete fw-web-redirect-rule + gbp policy-rule-delete fw-web-allow-rule-tcp + gbp policy-rule-delete fw-web-allow-rule-icmp + gbp policy-rule-delete fw-web-allow-rule-udp + gbp policy-classifier-delete fw-web-classifier-tcp + gbp policy-classifier-delete fw-web-classifier-icmp + gbp policy-classifier-delete fw-web-classifier-udp + gbp policy-action-delete redirect-to-fw + gbp policy-action-delete allow-to-fw + gbp servicechain-spec-delete fw-chainspec + gbp servicechain-node-delete FWNODE +} + +validate_gbp_resources() { + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain creation Succeded" + else + echo "Chain creation failed" + fi +} + +validate_firewall_resources() { + FirewallRuleCount=`neutron firewall-rule-list -f value | grep Rule | wc -l` + if [ "$FirewallRuleCount" -eq "4" ]; then + echo "Firewall Rule resource created" + else + echo "Firewall Rule resource not created" + fi + + FirewallPolicyCount=`neutron firewall-policy-list -f value | grep fw | wc -l` + if [ "$FirewallPolicyCount" -eq "1" ]; then + echo "Firewall Policy resource created" + else + echo "Firewall Policy resource not created" + fi + + FirewallCount=`neutron firewall-list -f value | wc -l` + if [ "$FirewallCount" -eq "1" ]; then + echo "Firewall resource created" + FirewallUUID=`neutron firewall-list -f value | awk '{print $1}'` + FirewallStatus=`neutron firewall-show $FirewallUUID -f value -c status` + echo "Firewall resource is in $FirewallStatus state" + else + echo "Firewall resource not created" + fi +} + +update_gbp_resources() { + # Update existing chain, by removing 2 rules + #gbp servicechain-node-update FWNODE --template-file $TOP_DIR/nfp-templates/fw_updated_template.yml + + #FirewallRuleCount=`neutron firewall-rule-list -f value | wc -l` + #if [ "$FirewallRuleCount" -eq "2" ]; then + # echo "Chain created" + #else + # echo "Chain not created" + #fi + + gbp group-delete fw-provider + gbp group-delete fw-consumer + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain deleted" + else + echo "Chain not deleted" + fi + + # Service chain creation/deletion through PRS update + gbp group-create fw-consumer --consumed-policy-rule-sets "fw-webredirect-ruleset=None" + gbp group-create fw-provider + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain not created" + else + echo "Chain not deleted" + fi + + gbp group-update fw-provider --provided-policy-rule-sets "fw-webredirect-ruleset=None" + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain created" + else + echo "Chain not created" + fi +} + +create_gbp_resources +validate_gbp_resources +validate_firewall_resources + +update_gbp_resources + +delete_gbp_resources diff --git a/gbpservice/tests/contrib/devstack/exercises-nfp/fw_lb.sh b/gbpservice/tests/contrib/devstack/exercises-nfp/fw_lb.sh new file mode 100755 index 0000000000..397f80a5c0 --- /dev/null +++ b/gbpservice/tests/contrib/devstack/exercises-nfp/fw_lb.sh @@ -0,0 +1,204 @@ +#!/usr/bin/env bash + +# **fw_lb.sh** + +# Sanity check that firewall and loadbalancer service chain is created with NFP + +echo "*********************************************************************" +echo "Begin NFP Exercise: $0" +echo "*********************************************************************" + +# Settings +# ======== + +# This script exits on an error so that errors don't compound and you see +# only the first error that occurred. +set -o errexit + +# Keep track of the current directory +EXERCISE_DIR=$(cd $(dirname "$0") && pwd) +TOP_DIR=$(cd $EXERCISE_DIR/..; pwd) + +source $TOP_DIR/openrc neutron service + +create_gbp_resources() { + # E-W insertion + gbp servicechain-node-create --service-profile base_mode_fw --template-file $TOP_DIR/nfp-templates/fw_template.yml FW_LB-FWNODE + gbp servicechain-node-create --service-profile base_mode_lb --template-file $TOP_DIR/nfp-templates/haproxy.template FW_LB-LBNODE + gbp servicechain-spec-create --nodes "FW_LB-FWNODE FW_LB-LBNODE" fw_lb_chainspec + gbp policy-action-create --action-type REDIRECT --action-value fw_lb_chainspec redirect-to-fw_lb + gbp policy-classifier-create --protocol tcp --direction bi fw_lb-webredirect + gbp policy-rule-create --classifier fw_lb-webredirect --actions redirect-to-fw_lb fw_lb-web-redirect-rule + gbp policy-rule-set-create --policy-rules "fw_lb-web-redirect-rule" fw_lb-webredirect-ruleset + gbp network-service-policy-create --network-service-params type=ip_single,name=vip_ip,value=self_subnet fw_lb_nsp + gbp group-create fw_lb-consumer --consumed-policy-rule-sets "fw_lb-webredirect-ruleset=None" + gbp group-create fw_lb-provider --provided-policy-rule-sets "fw_lb-webredirect-ruleset=None" --network-service-policy fw_lb_nsp +} + +delete_gbp_resources() { + gbp group-delete fw_lb-provider + gbp group-delete fw_lb-consumer + gbp network-service-policy-delete fw_lb_nsp + gbp policy-rule-set-delete fw_lb-webredirect-ruleset + gbp policy-rule-delete fw_lb-web-redirect-rule + gbp policy-classifier-delete fw_lb-webredirect + gbp policy-action-delete redirect-to-fw_lb + gbp servicechain-spec-delete fw_lb_chainspec + gbp servicechain-node-delete FW_LB-LBNODE + gbp servicechain-node-delete FW_LB-FWNODE +} + +validate_gbp_resources() { + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain creation Succeded" + else + echo "Chain creation failed" + fi + + ServiceChainNodeCount=`gbp scn-list -f value | grep FW_LB | wc -l` + if [ "$ServiceChainNodeCount" -eq "2" ]; then + echo "Network function creation Succeded" + else + echo "Network function creation failed" + fi +} + +validate_firewall_resources() { + FirewallRuleCount=`neutron firewall-rule-list -f value | grep Rule | wc -l` + if [ "$FirewallRuleCount" -eq "4" ]; then + echo "Firewall Rule resource created" + else + echo "Firewall Rule resource not created" + fi + + FirewallPolicyCount=`neutron firewall-policy-list -f value | grep fw | wc -l` + if [ "$FirewallPolicyCount" -eq "1" ]; then + echo "Firewall Policy resource created" + else + echo "Firewall Policy resource not created" + fi + + FirewallCount=`neutron firewall-list -f value | wc -l` + if [ "$FirewallCount" -eq "1" ]; then + echo "Firewall resource created" + FirewallUUID=`neutron firewall-list -f value | awk '{print $1}'` + FirewallStatus=`neutron firewall-show $FirewallUUID -f value -c status` + echo "Firewall resource is in $FirewallStatus state" + else + echo "Firewall resource not created" + fi +} + +validate_loadbalancer_resources() { + LBPoolCount=`neutron lb-pool-list -f value | wc -l` + if [ "$LBPoolCount" -eq "1" ]; then + echo "LB Pool resource created" + LBPoolUUID=`neutron lb-pool-list -f value | awk '{print $1}'` + LBPoolStatus=`neutron lb-pool-show $LBPoolUUID -f value -c status` + echo "LB Pool resource is in $LBPoolStatus state" + else + echo "LB Pool resource not created" + fi + + LBVIPCount=`neutron lb-vip-list -f value | wc -l` + if [ "$LBVIPCount" -eq "1" ]; then + echo "LB VIP resource created" + LBVIPUUID=`neutron lb-vip-list -f value | awk '{print $1}'` + LBVIPStatus=`neutron lb-vip-show $LBVIPUUID -f value -c status` + echo "LB VIP resource is in $LBVIPStatus state" + else + echo "LB VIP resource not created" + fi + + LBHMCount=`neutron lb-healthmonitor-list -f value | wc -l` + if [ "$LBHMCount" -eq "1" ]; then + echo "LB Healthmonitor resource created" + else + echo "LB Healthmonitor resource not created" + fi + + gbp policy-target-create --policy-target-group fw_lb-provider provider_pt1 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "1" ]; then + echo "LB Member resource created" + else + echo "LB Member resource not created" + fi + + gbp policy-target-create --policy-target-group fw_lb-provider provider_pt2 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "2" ]; then + echo "LB Member resource created" + else + echo "LB Member resource not created" + fi + + gbp policy-target-delete provider_pt1 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "1" ]; then + echo "LB Member resource deleted" + else + echo "LB Member resource not deleted" + fi + + gbp policy-target-delete provider_pt2 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "0" ]; then + echo "LB Member resource deleted" + else + echo "LB Member resource not deleted" + fi +} + +update_gbp_resources() { + # Update existing chain, by removing 2 rules + #gbp servicechain-node-update FW_LB-FWNODE --template-file $TOP_DIR/nfp-templates/fw_updated_template.yml + + #FirewallRuleCount=`neutron firewall-rule-list -f value | wc -l` + #if [ "$FirewallRuleCount" -eq "2" ]; then + # echo "Chain created" + #else + # echo "Chain not created" + #fi + + gbp group-delete fw_lb-provider + gbp group-delete fw_lb-consumer + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain deleted" + else + echo "Chain not deleted" + fi + + # Service chain creation/deletion through PRS update + gbp group-create fw_lb-consumer --consumed-policy-rule-sets "fw_lb-webredirect-ruleset=None" + gbp group-create fw_lb-provider + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain not created" + else + echo "Chain not deleted" + fi + + gbp group-update fw_lb-provider --provided-policy-rule-sets "fw_lb-webredirect-ruleset=None" --network-service-policy fw_lb_nsp + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain created" + else + echo "Chain not created" + fi +} + +create_gbp_resources +validate_gbp_resources +validate_firewall_resources +validate_loadbalancer_resources + +update_gbp_resources + +delete_gbp_resources diff --git a/gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm.sh b/gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm.sh new file mode 100755 index 0000000000..8d294fee1c --- /dev/null +++ b/gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +# **fw_vm.sh** + +# Sanity check that firewall(in service VM) service is created with NFP + +echo "*********************************************************************" +echo "Begin NFP Exercise: $0" +echo "*********************************************************************" + +# Settings +# ======== + +# This script exits on an error so that errors don't compound and you see +# only the first error that occurred. +set -o errexit + +# Keep track of the current directory +EXERCISE_DIR=$(cd $(dirname "$0") && pwd) +TOP_DIR=$(cd $EXERCISE_DIR/..; pwd) + +source $TOP_DIR/openrc neutron service + +create_gbp_resources() { + gbp servicechain-node-create --service-profile base_mode_fw_vm --config 'custom_json:{"mimetype": "config/custom+json","rules": [{"action": "log", "name": "tcp", "service": "tcp/80"}, {"action": "log", "name": "tcp", "service": "tcp/8080"}, {"action": "accept", "name": "tcp", "service": "tcp/22"}, {"action": "accept", "name": "icmp", "service": "icmp"}]}' FWNODE + gbp servicechain-spec-create --nodes "FWNODE" fw-chainspec + gbp policy-action-create --action-type REDIRECT --action-value fw-chainspec redirect-to-fw + gbp policy-action-create --action-type ALLOW allow-to-fw + gbp policy-classifier-create --protocol tcp --direction bi fw-web-classifier-tcp + gbp policy-classifier-create --protocol udp --direction bi fw-web-classifier-udp + gbp policy-classifier-create --protocol icmp --direction bi fw-web-classifier-icmp + gbp policy-rule-create --classifier fw-web-classifier-tcp --actions redirect-to-fw fw-web-redirect-rule + gbp policy-rule-create --classifier fw-web-classifier-tcp --actions allow-to-fw fw-web-allow-rule-tcp + gbp policy-rule-create --classifier fw-web-classifier-udp --actions allow-to-fw fw-web-allow-rule-udp + gbp policy-rule-create --classifier fw-web-classifier-icmp --actions allow-to-fw fw-web-allow-rule-icmp + gbp policy-rule-set-create --policy-rules "fw-web-redirect-rule fw-web-allow-rule-tcp fw-web-allow-rule-udp fw-web-allow-rule-icmp" fw-webredirect-ruleset + gbp group-create fw-consumer --consumed-policy-rule-sets "fw-webredirect-ruleset=None" + gbp group-create fw-provider --provided-policy-rule-sets "fw-webredirect-ruleset=None" +} + +delete_gbp_resources() { + gbp group-delete fw-provider + gbp group-delete fw-consumer + gbp policy-rule-set-delete fw-webredirect-ruleset + gbp policy-rule-delete fw-web-redirect-rule + gbp policy-rule-delete fw-web-allow-rule-tcp + gbp policy-rule-delete fw-web-allow-rule-icmp + gbp policy-rule-delete fw-web-allow-rule-udp + gbp policy-classifier-delete fw-web-classifier-tcp + gbp policy-classifier-delete fw-web-classifier-icmp + gbp policy-classifier-delete fw-web-classifier-udp + gbp policy-action-delete redirect-to-fw + gbp policy-action-delete allow-to-fw + gbp servicechain-spec-delete fw-chainspec + gbp servicechain-node-delete FWNODE +} + +validate_gbp_resources() { + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain creation Succeded" + else + echo "Chain creation failed" + fi +} + +validate_firewall_resources() { + FirewallRuleCount=`neutron firewall-rule-list -f value | grep Rule | wc -l` + if [ "$FirewallRuleCount" -eq "4" ]; then + echo "Firewall Rule resource created" + else + echo "Firewall Rule resource not created" + fi + + FirewallPolicyCount=`neutron firewall-policy-list -f value | grep fw | wc -l` + if [ "$FirewallPolicyCount" -eq "1" ]; then + echo "Firewall Policy resource created" + else + echo "Firewall Policy resource not created" + fi + + FirewallCount=`neutron firewall-list -f value | wc -l` + if [ "$FirewallCount" -eq "1" ]; then + echo "Firewall resource created" + FirewallUUID=`neutron firewall-list -f value | awk '{print $1}'` + FirewallStatus=`neutron firewall-show $FirewallUUID -f value -c status` + echo "Firewall resource is in $FirewallStatus state" + else + echo "Firewall resource not created" + fi +} + +update_gbp_resources() { + # Update existing chain, by removing 2 rules + #gbp servicechain-node-update FWNODE --template-file $TOP_DIR/nfp-templates/fw_updated_template.yml + + #FirewallRuleCount=`neutron firewall-rule-list -f value | wc -l` + #if [ "$FirewallRuleCount" -eq "2" ]; then + # echo "Chain created" + #else + # echo "Chain not created" + #fi + + gbp group-delete fw-provider + gbp group-delete fw-consumer + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain deleted" + else + echo "Chain not deleted" + fi + + # Service chain creation/deletion through PRS update + gbp group-create fw-consumer --consumed-policy-rule-sets "fw-webredirect-ruleset=None" + gbp group-create fw-provider + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain not created" + else + echo "Chain not deleted" + fi + + gbp group-update fw-provider --provided-policy-rule-sets "fw-webredirect-ruleset=None" + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain created" + else + echo "Chain not created" + fi +} + +create_gbp_resources +validate_gbp_resources +validate_firewall_resources + +update_gbp_resources + +delete_gbp_resources diff --git a/gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm_lb.sh b/gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm_lb.sh new file mode 100755 index 0000000000..0614f4c798 --- /dev/null +++ b/gbpservice/tests/contrib/devstack/exercises-nfp/fw_vm_lb.sh @@ -0,0 +1,204 @@ +#!/usr/bin/env bash + +# **fw_vm_lb.sh** + +# Sanity check that firewall(in service VM) and loadbalancer service chain is created with NFP + +echo "*********************************************************************" +echo "Begin NFP Exercise: $0" +echo "*********************************************************************" + +# Settings +# ======== + +# This script exits on an error so that errors don't compound and you see +# only the first error that occurred. +set -o errexit + +# Keep track of the current directory +EXERCISE_DIR=$(cd $(dirname "$0") && pwd) +TOP_DIR=$(cd $EXERCISE_DIR/..; pwd) + +source $TOP_DIR/openrc neutron service + +create_gbp_resources() { + # E-W insertion + gbp servicechain-node-create --service-profile base_mode_fw_vm --config 'custom_json:{"mimetype": "config/custom+json","rules": [{"action": "log", "name": "tcp", "service": "tcp/80"}, {"action": "log", "name": "tcp", "service": "tcp/8080"}, {"action": "accept", "name": "tcp", "service": "tcp/22"}, {"action": "accept", "name": "icmp", "service": "icmp"}]}' FW_LB-FWNODE + gbp servicechain-node-create --service-profile base_mode_lb --template-file $TOP_DIR/nfp-templates/haproxy.template FW_LB-LBNODE + gbp servicechain-spec-create --nodes "FW_LB-FWNODE FW_LB-LBNODE" fw_lb_chainspec + gbp policy-action-create --action-type REDIRECT --action-value fw_lb_chainspec redirect-to-fw_lb + gbp policy-classifier-create --protocol tcp --direction bi fw_lb-webredirect + gbp policy-rule-create --classifier fw_lb-webredirect --actions redirect-to-fw_lb fw_lb-web-redirect-rule + gbp policy-rule-set-create --policy-rules "fw_lb-web-redirect-rule" fw_lb-webredirect-ruleset + gbp network-service-policy-create --network-service-params type=ip_single,name=vip_ip,value=self_subnet fw_lb_nsp + gbp group-create fw_lb-consumer --consumed-policy-rule-sets "fw_lb-webredirect-ruleset=None" + gbp group-create fw_lb-provider --provided-policy-rule-sets "fw_lb-webredirect-ruleset=None" --network-service-policy fw_lb_nsp +} + +delete_gbp_resources() { + gbp group-delete fw_lb-provider + gbp group-delete fw_lb-consumer + gbp network-service-policy-delete fw_lb_nsp + gbp policy-rule-set-delete fw_lb-webredirect-ruleset + gbp policy-rule-delete fw_lb-web-redirect-rule + gbp policy-classifier-delete fw_lb-webredirect + gbp policy-action-delete redirect-to-fw_lb + gbp servicechain-spec-delete fw_lb_chainspec + gbp servicechain-node-delete FW_LB-LBNODE + gbp servicechain-node-delete FW_LB-FWNODE +} + +validate_gbp_resources() { + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain creation Succeded" + else + echo "Chain creation failed" + fi + + ServiceChainNodeCount=`gbp scn-list -f value | grep FW_LB | wc -l` + if [ "$ServiceChainNodeCount" -eq "2" ]; then + echo "Network function creation Succeded" + else + echo "Network function creation failed" + fi +} + +validate_firewall_resources() { + FirewallRuleCount=`neutron firewall-rule-list -f value | grep Rule | wc -l` + if [ "$FirewallRuleCount" -eq "4" ]; then + echo "Firewall Rule resource created" + else + echo "Firewall Rule resource not created" + fi + + FirewallPolicyCount=`neutron firewall-policy-list -f value | grep fw | wc -l` + if [ "$FirewallPolicyCount" -eq "1" ]; then + echo "Firewall Policy resource created" + else + echo "Firewall Policy resource not created" + fi + + FirewallCount=`neutron firewall-list -f value | wc -l` + if [ "$FirewallCount" -eq "1" ]; then + echo "Firewall resource created" + FirewallUUID=`neutron firewall-list -f value | awk '{print $1}'` + FirewallStatus=`neutron firewall-show $FirewallUUID -f value -c status` + echo "Firewall resource is in $FirewallStatus state" + else + echo "Firewall resource not created" + fi +} + +validate_loadbalancer_resources() { + LBPoolCount=`neutron lb-pool-list -f value | wc -l` + if [ "$LBPoolCount" -eq "1" ]; then + echo "LB Pool resource created" + LBPoolUUID=`neutron lb-pool-list -f value | awk '{print $1}'` + LBPoolStatus=`neutron lb-pool-show $LBPoolUUID -f value -c status` + echo "LB Pool resource is in $LBPoolStatus state" + else + echo "LB Pool resource not created" + fi + + LBVIPCount=`neutron lb-vip-list -f value | wc -l` + if [ "$LBVIPCount" -eq "1" ]; then + echo "LB VIP resource created" + LBVIPUUID=`neutron lb-vip-list -f value | awk '{print $1}'` + LBVIPStatus=`neutron lb-vip-show $LBVIPUUID -f value -c status` + echo "LB VIP resource is in $LBVIPStatus state" + else + echo "LB VIP resource not created" + fi + + LBHMCount=`neutron lb-healthmonitor-list -f value | wc -l` + if [ "$LBHMCount" -eq "1" ]; then + echo "LB Healthmonitor resource created" + else + echo "LB Healthmonitor resource not created" + fi + + gbp policy-target-create --policy-target-group fw_lb-provider provider_pt1 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "1" ]; then + echo "LB Member resource created" + else + echo "LB Member resource not created" + fi + + gbp policy-target-create --policy-target-group fw_lb-provider provider_pt2 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "2" ]; then + echo "LB Member resource created" + else + echo "LB Member resource not created" + fi + + gbp policy-target-delete provider_pt1 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "1" ]; then + echo "LB Member resource deleted" + else + echo "LB Member resource not deleted" + fi + + gbp policy-target-delete provider_pt2 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "0" ]; then + echo "LB Member resource deleted" + else + echo "LB Member resource not deleted" + fi +} + +update_gbp_resources() { + # Update existing chain, by removing 2 rules + #gbp servicechain-node-update FW_LB-FWNODE --template-file $TOP_DIR/nfp-templates/fw_updated_template.yml + + #FirewallRuleCount=`neutron firewall-rule-list -f value | wc -l` + #if [ "$FirewallRuleCount" -eq "2" ]; then + # echo "Chain created" + #else + # echo "Chain not created" + #fi + + gbp group-delete fw_lb-provider + gbp group-delete fw_lb-consumer + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain deleted" + else + echo "Chain not deleted" + fi + + # Service chain creation/deletion through PRS update + gbp group-create fw_lb-consumer --consumed-policy-rule-sets "fw_lb-webredirect-ruleset=None" + gbp group-create fw_lb-provider + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain not created" + else + echo "Chain not deleted" + fi + + gbp group-update fw_lb-provider --provided-policy-rule-sets "fw_lb-webredirect-ruleset=None" --network-service-policy fw_lb_nsp + ServiceChainInstanceCount=`gbp sci-list -f value | grep fw_lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain created" + else + echo "Chain not created" + fi +} + +create_gbp_resources +validate_gbp_resources +validate_firewall_resources +validate_loadbalancer_resources + +update_gbp_resources + +delete_gbp_resources diff --git a/gbpservice/tests/contrib/devstack/exercises-nfp/lb.sh b/gbpservice/tests/contrib/devstack/exercises-nfp/lb.sh new file mode 100755 index 0000000000..4b621f22f6 --- /dev/null +++ b/gbpservice/tests/contrib/devstack/exercises-nfp/lb.sh @@ -0,0 +1,159 @@ + +#!/usr/bin/env bash + +# **lb.sh** + +# Sanity check that loadbalancer service is created with NFP + +echo "*********************************************************************" +echo "Begin NFP Exercise: $0" +echo "*********************************************************************" + +# Settings +# ======== + +# This script exits on an error so that errors don't compound and you see +# only the first error that occurred. +set -o errexit + +# Keep track of the current directory +EXERCISE_DIR=$(cd $(dirname "$0") && pwd) +TOP_DIR=$(cd $EXERCISE_DIR/..; pwd) + +source $TOP_DIR/openrc neutron service + +create_gbp_resources() { + # E-W insertion + gbp servicechain-node-create --service-profile base_mode_lb --template-file $TOP_DIR/nfp-templates/haproxy.template LB-NODE + gbp servicechain-spec-create --nodes "LB-NODE" lb_chainspec + gbp policy-action-create --action-type REDIRECT --action-value lb_chainspec redirect-to-lb + gbp policy-classifier-create --protocol tcp --direction bi lb-webredirect + gbp policy-rule-create --classifier lb-webredirect --actions redirect-to-lb lb-webredirect-rule + gbp policy-rule-set-create --policy-rules "lb-webredirect-rule" lb-webredirect-ruleset + gbp network-service-policy-create --network-service-params type=ip_single,name=vip_ip,value=self_subnet lb_nsp + gbp group-create lb-consumer --consumed-policy-rule-sets "lb-webredirect-ruleset=None" + gbp group-create lb-provider --provided-policy-rule-sets "lb-webredirect-ruleset=None" --network-service-policy lb_nsp +} + +delete_gbp_resources() { + gbp group-delete lb-consumer + gbp group-delete lb-provider + gbp network-service-policy-delete lb_nsp + gbp policy-rule-set-delete lb-webredirect-ruleset + gbp policy-rule-delete lb-webredirect-rule + gbp policy-classifier-delete lb-webredirect + gbp policy-action-delete redirect-to-lb + gbp servicechain-spec-delete lb_chainspec + gbp servicechain-node-delete LB-NODE +} + +validate_gbp_resources() { + ServiceChainInstanceCount=`gbp sci-list -f value | grep lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain creation Succeded" + else + echo "Chain creation failed" + fi +} + +validate_loadbalancer_resources() { + LBPoolCount=`neutron lb-pool-list -f value | wc -l` + if [ "$LBPoolCount" -eq "1" ]; then + echo "LB Pool resource created" + LBPoolUUID=`neutron lb-pool-list -f value | awk '{print $1}'` + LBPoolStatus=`neutron lb-pool-show $LBPoolUUID -f value -c status` + echo "LB Pool resource is in $LBPoolStatus state" + else + echo "LB Pool resource not created" + fi + + LBVIPCount=`neutron lb-vip-list -f value | wc -l` + if [ "$LBVIPCount" -eq "1" ]; then + echo "LB VIP resource created" + LBVIPUUID=`neutron lb-vip-list -f value | awk '{print $1}'` + LBVIPStatus=`neutron lb-vip-show $LBVIPUUID -f value -c status` + echo "LB VIP resource is in $LBVIPStatus state" + else + echo "LB VIP resource not created" + fi + + LBHMCount=`neutron lb-healthmonitor-list -f value | wc -l` + if [ "$LBHMCount" -eq "1" ]; then + echo "LB Healthmonitor resource created" + else + echo "LB Healthmonitor resource not created" + fi + + gbp policy-target-create --policy-target-group lb-provider provider_pt1 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "1" ]; then + echo "LB Member resource created" + else + echo "LB Member resource not created" + fi + + gbp policy-target-create --policy-target-group lb-provider provider_pt2 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "2" ]; then + echo "LB Member resource created" + else + echo "LB Member resource not created" + fi + + gbp policy-target-delete provider_pt1 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "1" ]; then + echo "LB Member resource deleted" + else + echo "LB Member resource not deleted" + fi + + gbp policy-target-delete provider_pt2 + sleep 5 + LBMemberCount=`neutron lb-member-list -f value | wc -l` + if [ "$LBMemberCount" -eq "0" ]; then + echo "LB Member resource deleted" + else + echo "LB Member resource not deleted" + fi +} + +update_gbp_resources() { + gbp group-delete lb-provider + gbp group-delete lb-consumer + ServiceChainInstanceCount=`gbp sci-list -f value | grep lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain deleted" + else + echo "Chain not deleted" + fi + + # Service chain creation/deletion through PRS update + gbp group-create lb-consumer --consumed-policy-rule-sets "lb-webredirect-ruleset=None" + gbp group-create lb-provider + ServiceChainInstanceCount=`gbp sci-list -f value | grep lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "0" ]; then + echo "Chain not created" + else + echo "Chain not deleted" + fi + + gbp group-update lb-provider --provided-policy-rule-sets "lb-webredirect-ruleset=None" --network-service-policy lb_nsp + ServiceChainInstanceCount=`gbp sci-list -f value | grep lb-provider | wc -l` + if [ "$ServiceChainInstanceCount" -eq "1" ]; then + echo "Chain created" + else + echo "Chain not created" + fi +} + +create_gbp_resources +validate_gbp_resources +validate_loadbalancer_resources + +update_gbp_resources + +delete_gbp_resources diff --git a/gbpservice/tests/contrib/devstack/local-nfp.conf b/gbpservice/tests/contrib/devstack/local-nfp.conf new file mode 100644 index 0000000000..31061547fb --- /dev/null +++ b/gbpservice/tests/contrib/devstack/local-nfp.conf @@ -0,0 +1,117 @@ +[[local|localrc]] +DATABASE_PASSWORD=abc123 +ADMIN_PASSWORD=abc123 +MYSQL_PASSWORD=$DATABASE_PASSWORD +RABBIT_PASSWORD=abc123 +SERVICE_PASSWORD=$ADMIN_PASSWORD +SERVICE_TOKEN=abc123 + +Q_SERVICE_PLUGIN_CLASSES=neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,group_policy,ncp + + +# Using group-policy branches +# --------------------------- + +GIT_BASE=${GIT_BASE:-git://git.openstack.org} + +GBPSERVICE_REPO=${GIT_BASE}/openstack/group-based-policy.git +#GBPSERVICE_BRANCH=master +#GBPSERVICE_REPO=https://review.openstack.org/openstack/group-based-policy +#GBPSERVICE_BRANCH=refs/changes/85/298385/154 + +GBPCLIENT_REPO=${GIT_BASE}/openstack/python-group-based-policy-client.git +GBPCLIENT_BRANCH=master +#GBPCLIENT_REPO=https://review.openstack.org/openstack/python-group-based-policy-client +#GBPCLIENT_BRANCH=refs/changes/95/311695/3 + +GBPUI_REPO=${GIT_BASE}/openstack/group-based-policy-ui.git +GBPUI_BRANCH=master +#GBPUI_REPO=https://review.openstack.org/openstack/group-based-policy-ui +#GBPUI_BRANCH=refs/changes/02/136802/14 + +GBPHEAT_REPO=${GIT_BASE}/openstack/group-based-policy-automation.git +GBPHEAT_BRANCH=master +#GBPHEAT_REPO= +#GBPHEAT_BRANCH= + +# Enable neutron for group-policy-poc +# ----------------------------------- +disable_service n-net +#disable_service h-eng +#disable_service h-api +#disable_service h-api-cfn +#disable_service h-api-cw +enable_service q-svc +enable_service q-agt +enable_service q-dhcp +enable_service q-l3 +enable_service q-fwaas +enable_service q-lbaas +enable_service q-meta +enable_service neutron +enable_service group-policy +disable_service tempest +ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng +enable_service orchestrator,proxy,proxy_agent,base_configurator + +LOG_COLOR=False +DEST=/opt/stack/new +SCREEN_LOGDIR=$DEST/logs/screen +LOGFILE=$DEST/logs/stack.sh.log +SKIP_EXERCISES=volumes,trove,swift,sahara,euca,bundle,boot_from_volume,aggregates,zaqar,client-env,client-args,sec_groups,neutron-adv-test,floating_ips,horizon + +#OFFLINE=True +RECLONE=True + +# Group-based Policy configuration +# Comment the lines below if you don't want to configure the datapath +# and use the dummy driver. +[[post-config|/etc/nova/nova.conf]] +[neutron] +allow_duplicate_networks = True + +#[[post-config|/etc/heat/heat.conf]] +#[DEFAULT] +#plugin_dirs=/opt/stack/gbpautomation/gbpautomation/heat + +[[post-config|/etc/neutron/neutron.conf]] +[keystone_authtoken] +admin_tenant_name = service +admin_user = neutron +admin_password = abc123 + +[group_policy] +policy_drivers=implicit_policy,resource_mapping,chain_mapping +extension_drivers=proxy_group + +[servicechain] +servicechain_drivers = simplechain_driver +#servicechain_drivers = chain_with_two_arm_appliance_driver + +[node_composition_plugin] +node_plumber = admin_owned_resources_apic_plumber +node_drivers = heat_node_driver,nfp_node_driver + +[admin_owned_resources_apic_tscp] +plumbing_resource_owner_user = neutron +plumbing_resource_owner_password = abc123 +plumbing_resource_owner_tenant_name = service + +[group_policy_implicit_policy] +default_ip_pool = 10.0.0.0/8 +default_proxy_ip_pool = 192.169.0.0/16 +default_external_segment_name = default + +[nfp_node_driver] +is_service_admin_owned = True +svc_management_ptg_name = svc_management_ptg + +[quotas] +default_quota = -1 +quota_network = -1 +quota_subnet = -1 +quota_port = -1 +quota_security_group = -1 +quota_security_group_rule = -1 +quota_router = -1 +quota_floatingip = -1 diff --git a/gbpservice/tests/contrib/devstack/nfp b/gbpservice/tests/contrib/devstack/nfp new file mode 100644 index 0000000000..61629bc52d --- /dev/null +++ b/gbpservice/tests/contrib/devstack/nfp @@ -0,0 +1,232 @@ +#!/bin/bash +NEW_BASE="$BASE/new" +DISK_IMAGE_DIR=$NEW_BASE/group-based-policy/gbpservice/tests/contrib + +function prepare_nfp_image_builder { + #setup_develop $NFPSERVICE_DIR + sudo -H -E pip install -r $DISK_IMAGE_DIR/diskimage-create/requirements.txt + sudo apt-get install -y --force-yes qemu-utils +} + +function create_nfp_image { + TOP_DIR=$1 + sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/conf.json + BUILT_IMAGE_PATH=$(cat /tmp/nfp_image_path) + upload_image file://$BUILT_IMAGE_PATH + + openstack --os-cloud=devstack-admin flavor create --ram 512 --disk 3 --vcpus 1 m1.nfp-tiny +} + +function assign_user_role_credential { + TOP_DIR=$1 + source $TOP_DIR/openrc admin admin + #set -x + serviceTenantID=`keystone tenant-list | grep "service" | awk '{print $2}'` + serviceRoleID=`keystone role-list | grep "service" | awk '{print $2}'` + adminRoleID=`keystone role-list | grep "admin" | awk '{print $2}'` + keystone user-role-add --user nova --tenant $serviceTenantID --role $serviceRoleID + keystone user-role-add --user neutron --tenant $serviceTenantID --role $adminRoleID +} + +function namespace_delete { + TOP_DIR=$1 + source $TOP_DIR/openrc neutron service + #Deletion namespace + NFP_P=`sudo ip netns | grep "nfp-proxy"` + if [ ${#NFP_P} -ne 0 ]; then + sudo ip netns delete nfp-proxy + echo "namespace removed" + fi + + #Delete veth peer + PEER=`ip a | grep pt1` + if [ ${#PEER} -ne 0 ]; then + echo "veth peer removed" + sudo ip link delete pt1 + fi + + #pt1 port removing from ovs + PORT=`sudo ovs-vsctl show | grep "pt1"` + if [ ${#PORT} -ne 0 ]; then + sudo ovs-vsctl del-port br-int pt1 + echo "ovs port ptr1 is removed" + fi + + echo "nfp-proxy cleaning success.... " +} + +function namespace_create { + TOP_DIR=$1 + #doing it in namespace_delete, so no need to do it again + #source $1/openrc neutron service + SERVICE_MGMT_NET="l2p_svc_management_ptg" + cidr="/24" + echo "Creating new namespace nfp-proxy...." + + #new namespace with name proxy + NFP_P=`sudo ip netns add nfp-proxy` + if [ ${#NFP_P} -eq 0 ]; then + echo "New namepace nfp-proxt create" + else + echo "nfp-proxy creation failed" + exit 0 + fi + + #Create veth peer + PEER=`sudo ip link add pt0 type veth peer name pt1` + if [ ${#PEER} -eq 0 ]; then + echo "New veth pair created" + else + echo "veth pair creation failed" + exit 0 + fi + sleep 1 + + #move one side of veth into namesape + sudo ip link set pt0 netns nfp-proxy + + #create new neutron port in service mgmt network + new_ip=`neutron port-create --name nfp-proxy_port $SERVICE_MGMT_NET | grep "fixed_ips" | awk '{print $7}' | sed 's/^\"\(.*\)\"}$/\1/'` + if [ ${#new_ip} -lt 5 ]; then + echo "new_ip =$new_ip" + echo "Neutron port creation failed (check source) " + exit 0 + else + echo "New Neutron Port Created on Service management network with ip =$new_ip" + fi + new_ip_cidr+="$new_ip/24" + sleep 2 + + #get the ip address of new port eg : 11.0.0.6 and asign to namespace + sudo ip netns exec nfp-proxy ip addr add $new_ip_cidr dev pt0 + + #move other side of veth into ovs : br-int + sudo ovs-vsctl add-port br-int pt1 + + #get id of service management network + smn_id=`neutron net-list | grep "$SERVICE_MGMT_NET" | awk '{print $2}'` + + #get the dhcp namespace of service management network + nm_space=`sudo ip netns | grep "$smn_id"` + + #get port id from router nampace + port=`sudo ip netns exec $nm_space ip a | grep "tap" | tail -n 1 | awk '{print $7}'` + + #get tag_id form port in ovs-bridge + tag_id=`sudo ovs-vsctl list port $port | grep "tag" | tail -n 1 | awk '{print $3}'` + + sudo ovs-vsctl set port pt1 tag=$tag_id + + #up the both ports + sudo ip netns exec nfp-proxy ip link set pt0 up + sudo ip netns exec nfp-proxy ip link set lo up + sudo ip link set pt1 up + + PING=`sudo ip netns exec nfp-proxy ping $2 -q -c 2 > /dev/null` + if [ ${#PING} -eq 0 ] + then + echo "nfp-proxy namespcace creation success and reaching to $2" + else + echo "Fails reaching to $2" + fi + + sudo ip netns exec nfp-proxy /usr/bin/nfp_proxy --config-file=/etc/nfp_proxy.ini +} + +function create_nfp_gbp_resources { + TOP_DIR=$1 + source $TOP_DIR/openrc neutron service + IMAGE_PATH=$(cat /tmp/nfp_image_path) + IMAGE_NAME=`basename "$IMAGE_PATH"` + IMAGE_NAME_FLAT="${IMAGE_NAME%.*}" + FLAVOR=m1.nfp-tiny + + gbp network-service-policy-create --network-service-params type=ip_pool,name=vip_ip,value=nat_pool svc_mgmt_fip_policy + gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=None --vendor NFP base_mode_lb + gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=None --vendor NFP base_mode_fw + gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME_FLAT,flavor=$FLAVOR --vendor NFP base_mode_fw_vm + gbp group-create svc_management_ptg --service_management True +} + +function delete_nfp_gbp_resources { + TOP_DIR=$1 + source $TOP_DIR/openrc neutron service + + neutron port-delete nfp-proxy_port + + gbp ptg-show svc_management_ptg -f value -c policy_targets + gbp ptg-show svc_management_ptg -f value -c policy_targets | xargs -I {} gbp pt-show {} + nova list + + gbp group-delete svc_management_ptg + gbp service-profile-delete base_mode_fw_vm + gbp service-profile-delete base_mode_fw + gbp service-profile-delete base_mode_lb + gbp network-service-policy-delete svc_mgmt_fip_policy +} + +function get_router_namespace { + TOP_DIR=$1 + source $TOP_DIR/openrc neutron service + + GROUP="svc_management_ptg" + echo "GroupName: $GROUP" + + l2p_id=`gbp ptg-show svc_management_ptg | grep l2_policy_id | awk '{print $4}'` + l3p_id=`gbp l2p-show $l2p_id | grep l3_policy_id | awk '{print $4}'` + RouterId=`gbp l3p-show $l3p_id | grep routers | awk '{print $4}'` +} + +function copy_nfp_files_and_start_process { + TOP_DIR=$1 + cd $NEW_BASE/group-based-policy/gbpservice/nfp + sudo cp -r bin/nfp /usr/bin/ + sudo chmod +x /usr/bin/nfp + sudo rm -rf /etc/nfp_* + sudo cp -r bin/nfp_orchestrator.ini /etc/ + sudo cp -r bin/nfp_proxy_agent.ini /etc/ + sudo cp -r bin/nfp_proxy.ini /etc/nfp_proxy.ini + sudo cp -r bin/nfp_proxy /usr/bin/ + + IpAddr=127.0.0.1 + echo "Configuring proxy.ini .... with rest_server_address as $IpAddr" + sudo sed -i "s/rest_server_address=*.*/rest_server_address=$IpAddr/g" /etc/nfp_proxy.ini + sudo sed -i "s/rest_server_port= *.*/rest_server_port=8080/g" /etc/nfp_proxy.ini + ipnetns_router=`sudo ip netns |grep $RouterId` + + source $TOP_DIR/functions-common + + echo "Starting orchestrator >>>> under screen named : orchestrator" + run_process orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log" + sleep 1 + + echo "Starting proxy_agent >>>> under screen named : proxy_agent" + run_process proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log" + sleep 1 + + echo "Starting proxy server under Namespace : nfp-proxy namespace >>>> under screen named : proxy" + run_process proxy "source $NEW_BASE/devstack/lib/nfp;namespace_delete $TOP_DIR;namespace_create $TOP_DIR $IpAddr" + sleep 10 + + cd pecan/api + sudo python setup.py develop + echo "Starting base_configurator >>>> under screen named : base_configurator" + run_process base_configurator "cd $NEW_BASE/group-based-policy/gbpservice/nfp/pecan/api;sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" + sleep 1 + + echo "Running gbp-db-manage" + + source $TOP_DIR/openrc neutron service + + gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head + sleep 2 + echo "Configuration success ... " +} +function nfp_setup { + prepare_nfp_image_builder + create_nfp_image $1 + assign_user_role_credential $1 + create_nfp_gbp_resources $1 + get_router_namespace $1 + copy_nfp_files_and_start_process $1 +} diff --git a/gbpservice/tests/contrib/devstack/nfp-templates/fw_template.yml b/gbpservice/tests/contrib/devstack/nfp-templates/fw_template.yml new file mode 100644 index 0000000000..24f1b9509e --- /dev/null +++ b/gbpservice/tests/contrib/devstack/nfp-templates/fw_template.yml @@ -0,0 +1,45 @@ +heat_template_version: 2013-05-23 + +description: Template to deploy firewall + +resources: + sc_firewall: + type: OS::Neutron::Firewall + + properties: + description: "{'insert_type': 'east_west', 'vm_management_ip': u'192.168.20.138', 'provider_ptg_info': ['fa:16:3e:28:7d:b2']}" + + firewall_policy_id: { get_resource: sc_firewall_policy } + name: "serviceVM_infra_FW" + + sc_firewall_policy: + type: OS::Neutron::FirewallPolicy + properties: + name: "" + firewall_rules: [{ get_resource: sc_firewall_rule1 } , { get_resource: sc_firewall_rule2 }, { get_resource: sc_firewall_rule3 },{get_resource: sc_firewall_rule4 }] + sc_firewall_rule1: + type: OS::Neutron::FirewallRule + properties: + name: "Rule_1" + action: "allow" + protocol: "udp" + sc_firewall_rule2: + type: OS::Neutron::FirewallRule + properties: + name: "Rule_2" + action: "allow" + protocol: "icmp" + sc_firewall_rule3: + type: OS::Neutron::FirewallRule + properties: + name: "Rule_3" + action: "allow" + protocol: "tcp" + destination_port: "22" + sc_firewall_rule4: + type: OS::Neutron::FirewallRule + properties: + name: "Rule_4" + action: "allow" + protocol: "tcp" + destination_port: "80" diff --git a/gbpservice/tests/contrib/devstack/nfp-templates/fw_updated_template.yml b/gbpservice/tests/contrib/devstack/nfp-templates/fw_updated_template.yml new file mode 100644 index 0000000000..2e5b5a3d8a --- /dev/null +++ b/gbpservice/tests/contrib/devstack/nfp-templates/fw_updated_template.yml @@ -0,0 +1,31 @@ +heat_template_version: 2013-05-23 + +description: Template to deploy firewall + +resources: + sc_firewall: + type: OS::Neutron::Firewall + + properties: + description: "{'insert_type': 'east_west', 'vm_management_ip': u'192.168.20.138', 'provider_ptg_info': ['fa:16:3e:28:7d:b2']}" + + firewall_policy_id: { get_resource: sc_firewall_policy } + name: "serviceVM_infra_FW" + + sc_firewall_policy: + type: OS::Neutron::FirewallPolicy + properties: + name: "" + firewall_rules: [{ get_resource: sc_firewall_rule1 } , { get_resource: sc_firewall_rule2 }] + sc_firewall_rule1: + type: OS::Neutron::FirewallRule + properties: + name: "Rule_1" + action: "allow" + protocol: "udp" + sc_firewall_rule2: + type: OS::Neutron::FirewallRule + properties: + name: "Rule_2" + action: "allow" + protocol: "icmp" diff --git a/gbpservice/tests/contrib/devstack/nfp-templates/haproxy.template b/gbpservice/tests/contrib/devstack/nfp-templates/haproxy.template new file mode 100644 index 0000000000..31f3810346 --- /dev/null +++ b/gbpservice/tests/contrib/devstack/nfp-templates/haproxy.template @@ -0,0 +1,65 @@ +{ + "AWSTemplateFormatVersion" : "2010-09-09", + "Description": "Template to test Haproxy Loadbalacer service", + + "Parameters": { + "Subnet": { + "Description": "Pool Subnet CIDR, on which VIP port should be created", + "Type": "String" + }, + "vip_ip": { + "Description": "VIP IP Address", + "Type": "String" + }, + "service_chain_metadata": { + "Description": "sc metadata", + "Type": "String" + } + }, + + "Resources" : { + "HttpHM": { + "Type": "OS::Neutron::HealthMonitor", + "Properties": { + "admin_state_up": true, + "delay": 20, + "expected_codes": "200", + "http_method": "GET", + "max_retries": 3, + "timeout": 10, + "type": "HTTP", + "url_path": "/" + } + }, + "HaproxyPool": { + "Type": "OS::Neutron::Pool", + "Properties": { + "admin_state_up": true, + "description": "Haproxy pool from teplate", + "lb_method": "ROUND_ROBIN", + "monitors": [{"Ref":"HttpHM"}], + "name": "Haproxy pool", + "provider": "haproxy", + "protocol": "HTTP", + "subnet_id": {"Ref":"Subnet"}, + "vip": { + "subnet": {"Ref":"Subnet"}, + "address": {"Ref":"vip_ip"}, + "name": "Haproxy vip", + "description": {"Ref":"service_chain_metadata"}, + "protocol_port": 80, + "connection_limit": -1, + "admin_state_up": true + } + } + }, + "HaproxyLb": { + "Type": "OS::Neutron::LoadBalancer", + "Properties": { + "pool_id": {"Ref":"HaproxyPool"}, + "protocol_port": 80 + } + } + } +} + diff --git a/gbpservice/tests/contrib/functions-gbp b/gbpservice/tests/contrib/functions-gbp index 21f8090293..2eda412cb8 100644 --- a/gbpservice/tests/contrib/functions-gbp +++ b/gbpservice/tests/contrib/functions-gbp @@ -24,6 +24,20 @@ function prepare_gbp_devstack { source $TOP_DIR/functions-common } +function prepare_nfp_devstack { + cd $TOP_DIR + sudo cp $CONTRIB_DIR/devstack/local-nfp.conf $TOP_DIR/local.conf + sudo rm -rf $TOP_DIR/exercises/*.sh + sudo cp $CONTRIB_DIR/devstack/exercises-nfp/*.sh $TOP_DIR/exercises/ + sudo cp -r $CONTRIB_DIR/devstack/nfp-templates $TOP_DIR + sudo cp $CONTRIB_DIR/devstack/nfp $TOP_DIR/lib/ + sed -i 's/source $TOP_DIR\/lib\/dstat/source $TOP_DIR\/lib\/dstat\nsource $TOP_DIR\/lib\/nfp/g' stack.sh + sed -i 's/# Restore\/close logging file descriptors/nfp_setup $TOP_DIR\n# Restore\/close logging file descriptors/g' stack.sh + source $TOP_DIR/functions + source $TOP_DIR/functions-common + +} + function source_creds { local xtrace=$(set +o | grep xtrace) set +o xtrace diff --git a/gbpservice/tests/contrib/gate_nfp_hook.sh b/gbpservice/tests/contrib/gate_nfp_hook.sh new file mode 100644 index 0000000000..35beb2e5b6 --- /dev/null +++ b/gbpservice/tests/contrib/gate_nfp_hook.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +CONTRIB_DIR="$BASE/new/group-based-policy/gbpservice/tests/contrib" +cp $CONTRIB_DIR/functions-gbp . +source functions-gbp + +set -x + +trap prepare_logs ERR + +prepare_gbp_devstack +prepare_nfp_devstack +$TOP_DIR/stack.sh + +# Use devstack functions to install mysql and psql servers +source $TOP_DIR/stackrc +source $TOP_DIR/lib/database +disable_service postgresql +enable_service mysql +initialize_database_backends +install_database + +# Set up the 'openstack_citest' user and database in each backend +tmp_dir=`mktemp -d` + +cat << EOF > $tmp_dir/mysql.sql +CREATE DATABASE openstack_citest; +CREATE USER 'openstack_citest'@'localhost' IDENTIFIED BY 'openstack_citest'; +CREATE USER 'openstack_citest' IDENTIFIED BY 'openstack_citest'; +GRANT ALL PRIVILEGES ON *.* TO 'openstack_citest'@'localhost'; +GRANT ALL PRIVILEGES ON *.* TO 'openstack_citest'; +FLUSH PRIVILEGES; +EOF +/usr/bin/mysql -u root < $tmp_dir/mysql.sql diff --git a/gbpservice/tests/contrib/post_test_nfp_hook.sh b/gbpservice/tests/contrib/post_test_nfp_hook.sh new file mode 100644 index 0000000000..392ed39c62 --- /dev/null +++ b/gbpservice/tests/contrib/post_test_nfp_hook.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +source functions-gbp + +set -x + +trap prepare_logs ERR + +# Run exercise scripts +$TOP_DIR/exercise.sh +exercises_exit_code=$? + +source $TOP_DIR/lib/nfp +delete_nfp_gbp_resources $TOP_DIR + +# Check if exercises left any resources undeleted +check_residual_resources neutron service +check_residual_resources admin admin +check_residual_resources admin demo +check_residual_resources demo demo + +# Prepare the log files for Jenkins to upload +prepare_logs + +exit $(($exercises_exit_code)) From 67b57510a1571c21782f210c7b4b7041c8a2c674 Mon Sep 17 00:00:00 2001 From: dpaks Date: Thu, 21 Jul 2016 18:29:30 +0530 Subject: [PATCH 120/157] addressed review comments --- devstack/plugin.sh | 3 --- gbpservice/contrib/nfp/bin/nfp_configurator.ini | 8 -------- gbpservice/contrib/nfp/configurator/Dockerfile | 1 - 3 files changed, 12 deletions(-) diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 21bbb4d022..62dba15285 100755 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -104,9 +104,6 @@ if is_service_enabled group-policy; then configure_nfp_vpn fi fi -# install_apic_ml2 -# install_aim -# init_aim install_gbpclient install_gbpservice [[ $ENABLE_NFP = True ]] && install_nfpgbpservice diff --git a/gbpservice/contrib/nfp/bin/nfp_configurator.ini b/gbpservice/contrib/nfp/bin/nfp_configurator.ini index 6d0beae9fd..6efbc4db26 100644 --- a/gbpservice/contrib/nfp/bin/nfp_configurator.ini +++ b/gbpservice/contrib/nfp/bin/nfp_configurator.ini @@ -4,7 +4,6 @@ debug=False rabbit_password=guest rabbit_userid=guest rabbit_hosts=127.0.0.1 -# #Example 192.168.2.107:5672 rabbit_port=5672 rabbit_host= kombu_reconnect_delay=1.0 @@ -21,10 +20,3 @@ periodic_interval=2 log_forward_ip_address= log_forward_port=514 log_level=debug - - -#logging_exception_prefix = %(color)s%(asctime)s.%(msecs)03d TRACE %(name)s ^[[01;35m%(instance)s^[[00m -#logging_debug_format_suffix = ^[[00;33mfrom (pid=%(process)d) %(funcName)s %(pathname)s:%(lineno)d^[[00m -#logging_default_format_string = %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [^[[00;36m-%(color)s] ^[[01;35m%(instance)s%(color)s%(message)s^[[00m -#logging_context_format_string = %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [^[[01;36m%(request_id)s ^[[00;36m%(user_name)s %(project_id)s%(color)s] ^[[01;35m%(instance)s%(color)s%(message)s^[[00m - diff --git a/gbpservice/contrib/nfp/configurator/Dockerfile b/gbpservice/contrib/nfp/configurator/Dockerfile index b47a8227a5..b3cd198d88 100644 --- a/gbpservice/contrib/nfp/configurator/Dockerfile +++ b/gbpservice/contrib/nfp/configurator/Dockerfile @@ -54,7 +54,6 @@ RUN cp -r /group-based-policy/gbpservice /usr/local/lib/python2.7/dist-packages/ RUN cp /group-based-policy/gbpservice/nfp/bin/nfp /usr/bin/ RUN chmod +x /usr/bin/nfp RUN cp /group-based-policy/gbpservice/contrib/nfp/bin/nfp_configurator.ini /etc/ -RUN sed -i "s/log_forward_ip_address=*.*/log_forward_ip_address=VIS_VM_IP_ADDRESS/" /etc/nfp_configurator.ini RUN cp /group-based-policy/gbpservice/contrib/nfp/bin/policy.json /etc/ RUN mkdir -p /var/log/nfp RUN touch /var/log/nfp/nfp_configurator.log From 3b0bd9350994342940cc40f935478c68dab29c01 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 19:11:43 +0530 Subject: [PATCH 121/157] Fixed configurator copy to docker --- gbpservice/nfp/scripts/mode_shift.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index be08812878..bc785a693a 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -57,7 +57,16 @@ function copy_files { ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker cp\ /enterprise_src/contrib_nfp\ - configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp + configurator:/usr/local/lib/python2.7/dist-packages/gbpservice/contrib/ + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator\ + rm -rf /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp + sudo ip netns exec nfp-proxy\ + ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ + docker exec configurator\ + mv /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/contrib_nfp\ + /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp sudo ip netns exec nfp-proxy\ ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ From a26a41c48cdb8143c35a0e7bea986772c2316c1f Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Thu, 21 Jul 2016 19:17:35 +0530 Subject: [PATCH 122/157] reverted the commits --- devstack/lib/nfp | 2 +- .../__init__.py | 3 ++- .../controller.py | 0 gbpservice/contrib/nfp/configurator/run.sh | 2 +- .../__init__.py | 0 .../test_controller.py | 8 +++---- .../controllers/test_controller.py | 2 +- gbpservice/nfp/pecan/api/root_controller.py | 16 +++++++------- gbpservice/nfp/pecan/constants.py | 21 +++++++++++-------- .../reference_configurator/bin/nfp-pecan | 2 +- 10 files changed, 30 insertions(+), 26 deletions(-) rename gbpservice/contrib/nfp/configurator/{controller => advanced_controller}/__init__.py (96%) rename gbpservice/contrib/nfp/configurator/{controller => advanced_controller}/controller.py (100%) rename gbpservice/contrib/tests/unit/nfp/configurator/{controller => advanced_controller}/__init__.py (100%) rename gbpservice/contrib/tests/unit/nfp/configurator/{controller => advanced_controller}/test_controller.py (97%) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index fa53bf1f71..01e5f4a49a 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -458,7 +458,7 @@ function copy_nfp_files_and_start_process { cd pecan/api sudo python setup.py develop echo "Starting nfp_base_configurator under screen named nfp_base_configurator" - run_process nfp_base_configurator "cd $NFPSERVICE_DIR/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base_controller" + run_process nfp_base_configurator "cd $NFPSERVICE_DIR/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" fi sleep 1 diff --git a/gbpservice/contrib/nfp/configurator/controller/__init__.py b/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py similarity index 96% rename from gbpservice/contrib/nfp/configurator/controller/__init__.py rename to gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py index 8fc1b10116..46e418b159 100644 --- a/gbpservice/contrib/nfp/configurator/controller/__init__.py +++ b/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py @@ -12,7 +12,8 @@ import pecan -from gbpservice.contrib.nfp.configurator.controller import controller +from gbpservice.contrib.nfp.configurator.advanced_controller import ( + controller) """This class forwards HTTP request to controller class. diff --git a/gbpservice/contrib/nfp/configurator/controller/controller.py b/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py similarity index 100% rename from gbpservice/contrib/nfp/configurator/controller/controller.py rename to gbpservice/contrib/nfp/configurator/advanced_controller/controller.py diff --git a/gbpservice/contrib/nfp/configurator/run.sh b/gbpservice/contrib/nfp/configurator/run.sh index c33d9d0078..73da244bcf 100644 --- a/gbpservice/contrib/nfp/configurator/run.sh +++ b/gbpservice/contrib/nfp/configurator/run.sh @@ -4,6 +4,6 @@ service rabbitmq-server start screen -dmS "configurator" /usr/bin/python2 /usr/bin/nfp --config-file=/etc/nfp_configurator.ini --log-file=/var/log/nfp/nfp_configurator.log cd /usr/local/lib/python2.7/dist-packages/gbpservice/nfp/pecan/api/ python setup.py develop -screen -dmS "pecan" pecan configurator_decider config.py --mode controller +screen -dmS "pecan" pecan configurator_decider config.py --mode advanced /bin/bash diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/controller/__init__.py b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/__init__.py similarity index 100% rename from gbpservice/contrib/tests/unit/nfp/configurator/controller/__init__.py rename to gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/__init__.py diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/controller/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py similarity index 97% rename from gbpservice/contrib/tests/unit/nfp/configurator/controller/test_controller.py rename to gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py index 65f481fe2c..8b0acc27d4 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/controller/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py @@ -15,8 +15,8 @@ import os import oslo_serialization.jsonutils as jsonutils import pecan -PECAN_CONFIG_FILE = (os.path.abspath(os.path.join(os.getcwd(), - "./../../../../../../nfp/pecan/api/config.py"))) +PECAN_CONFIG_FILE = (os.getcwd() + + "/gbpservice/nfp/pecan/api/config.py") pecan.set_config(PECAN_CONFIG_FILE, overwrite=True) @@ -28,10 +28,10 @@ from gbpservice.nfp.pecan import constants -setattr(pecan, 'mode', constants.controller) +setattr(pecan, 'mode', constants.advanced) -from gbpservice.contrib.nfp.configurator.controller import controller from gbpservice.nfp.pecan.api import root_controller +from gbpservice.contrib.nfp.configurator.advanced_controller import controller """This class contains all the unittest cases for REST server of configurator. diff --git a/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py b/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py index 5067f1af2b..e99b6584bf 100644 --- a/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py +++ b/gbpservice/neutron/tests/unit/nfp/base_configurator/controllers/test_controller.py @@ -21,7 +21,7 @@ from gbpservice.nfp.pecan import constants -setattr(pecan, 'mode', constants.base_controller) +setattr(pecan, 'mode', constants.base) from gbpservice.nfp.pecan.api import root_controller diff --git a/gbpservice/nfp/pecan/api/root_controller.py b/gbpservice/nfp/pecan/api/root_controller.py index 528a2ef5a9..6b4ce09902 100644 --- a/gbpservice/nfp/pecan/api/root_controller.py +++ b/gbpservice/nfp/pecan/api/root_controller.py @@ -22,21 +22,21 @@ class RootController(object): """ _controllers = {} - for name, _controller in constants.controllers.items(): + for name, controller in constants.controllers.items(): try: - _controllers.update({name: __import__(_controller, + _controllers.update({name: __import__(controller, globals(), locals(), ['controllers'], -1)}) except Exception: pass - if pecan.mode == constants.base_controller: - v1 = _controllers[constants.base_controller].V1Controller() - elif pecan.mode == constants.base_vm: - v1 = _controllers[constants.base_vm].V1Controller() - elif pecan.mode == constants.controller: - v1 = _controllers[constants.controller].V1Controller() + if pecan.mode == constants.base: + v1 = _controllers[constants.BASE_CONTROLLER].V1Controller() + elif pecan.mode == constants.base_with_vm: + v1 = _controllers[constants.REFERENCE_CONTROLLER].V1Controller() + elif pecan.mode == constants.advanced: + v1 = _controllers[constants.ADVANCED_CONTROLLER].V1Controller() @pecan.expose() def get(self): diff --git a/gbpservice/nfp/pecan/constants.py b/gbpservice/nfp/pecan/constants.py index d2927fca7b..dedddc19f0 100644 --- a/gbpservice/nfp/pecan/constants.py +++ b/gbpservice/nfp/pecan/constants.py @@ -11,17 +11,20 @@ # under the License. -base_vm = 'base_vm' -base_controller = 'base_controller' -controller = 'controller' +BASE_CONTROLLER = 'base_controller' +REFERENCE_CONTROLLER = 'reference_controller' +ADVANCED_CONTROLLER = 'advanced_controller' controllers = { - base_controller: 'gbpservice.nfp.base_configurator.controllers', - base_vm: ('gbpservice.tests.contrib.nfp_service' - '.reference_configurator.controllers' - ), - controller: 'gbpservice.contrib.nfp.configurator.controller' + BASE_CONTROLLER: 'gbpservice.nfp.base_configurator.controllers', + REFERENCE_CONTROLLER: ('gbpservice.tests.contrib' + '.nfp_service.reference_configurator.controllers'), + ADVANCED_CONTROLLER: ('gbpservice.contrib.nfp.configurator' + '.advanced_controller') } -modes = [base_controller, base_vm, controller] +base_with_vm = 'base_with_vm' +base = 'base' +advanced = 'advanced' +modes = [base, base_with_vm, advanced] diff --git a/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan b/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan index 0a8bd3bab1..88498579f6 100644 --- a/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan +++ b/gbpservice/tests/contrib/nfp_service/reference_configurator/bin/nfp-pecan @@ -1,3 +1,3 @@ #!/bin/sh script='/usr/local/lib/python2.7/dist-packages/gbpservice/nfp/pecan/api/config.py' -pecan configurator_decider $script --mode base_vm & +pecan configurator_decider $script --mode base_with_vm & From 696034dfe1bab88d86cc2330d976030f3d0c7bf3 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Thu, 21 Jul 2016 20:04:37 +0530 Subject: [PATCH 123/157] added packes in test_requirements --- test-requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test-requirements.txt b/test-requirements.txt index 0abfc34831..db41102e9a 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -18,6 +18,8 @@ cairocffi>=0.1 cliff>=1.15.0 # Apache-2.0 coverage>=3.6 # Apache-2.0 fixtures>=1.3.1 # Apache-2.0/BSD +ipaddr==2.1.10 +iptools==0.6.1 httplib2>=0.7.5 mock>=1.2 # BSD python-subunit>=0.0.18 # Apache-2.0/BSD From ce70792655c5ead040ae0838cb09bafdd11c00e7 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Thu, 21 Jul 2016 22:59:53 +0530 Subject: [PATCH 124/157] fixed pep8 issues --- .../advanced_controller/test_controller.py | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py index 8b0acc27d4..3c85335a87 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/advanced_controller/test_controller.py @@ -30,23 +30,21 @@ setattr(pecan, 'mode', constants.advanced) -from gbpservice.nfp.pecan.api import root_controller from gbpservice.contrib.nfp.configurator.advanced_controller import controller - - -"""This class contains all the unittest cases for REST server of configurator. - -This class tests success and failure cases for all the HTTP requests which -are implemented in REST server. run_tests.sh file is used for running all -the tests in this class. All the methods of this class started with test -prefix called and on success it will print ok and on failure it will -print the error trace. - -""" +from gbpservice.nfp.pecan.api import root_controller class ControllerTestCase(base.BaseTestCase, rest.RestController): + """ + This class contains all the unittest cases for REST server of configurator. + + This class tests success and failure cases for all the HTTP requests which + are implemented in REST server. run_tests.sh file is used for running all + the tests in this class. All the methods of this class started with test + prefix called and on success it will print ok and on failure it will + print the error trace. + """ @classmethod def setUpClass(cls): """A class method called before tests in an individual class run From 9dbafffe8acf61e397883184c707d9b4b3f48994 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 23:05:14 +0530 Subject: [PATCH 125/157] Adding the DB schema for enterprise into ne version file. Updated HEAD --- .../versions/54ee8e8d205a_nfp_db.py | 19 -------- .../alembic_migrations/versions/HEAD | 2 +- .../d2aab79622fe_nfp_enterprise_db.py | 46 +++++++++++++++++++ 3 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py b/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py index 58355825af..4184baab65 100644 --- a/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py @@ -154,25 +154,6 @@ def upgrade(): sa.PrimaryKeyConstraint('network_function_instance_id', 'data_port_id') ) - op.create_table( - 'nfp_network_function_device_interfaces', - sa.Column('tenant_id', sa.String(length=255), nullable=True), - sa.Column('id', sa.String(length=36), nullable=False), - sa.Column('plugged_in_port_id', sa.String(length=36), nullable=True), - sa.Column('interface_position', - sa.Integer(), - nullable=True), - sa.Column('mapped_real_port_id', sa.String(length=36), nullable=True), - sa.Column('network_function_device_id', sa.String(length=36), nullable=True), - sa.ForeignKeyConstraint(['plugged_in_port_id'], - ['nfp_port_infos.id'], - ondelete='SET NULL'), - sa.ForeignKeyConstraint(['network_function_device_id'], - ['nfp_network_function_devices.id'], - ondelete='SET NULL'), - sa.PrimaryKeyConstraint('id') - ) - def downgrade(): pass diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD b/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD index d0c9e6d269..759508a41a 100644 --- a/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD @@ -1 +1 @@ -c1aab79622fe +d2aab79622fe diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py b/gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py new file mode 100644 index 0000000000..228f7a4b7a --- /dev/null +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py @@ -0,0 +1,46 @@ +# Copyright 2016 OpenStack Foundation +# +# 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. +# + +# revision identifiers, used by Alembic. +revision = 'd2aab79622fe' +down_revision = 'c1aab79622fe' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.create_table( + 'nfp_network_function_device_interfaces', + sa.Column('tenant_id', sa.String(length=255), nullable=True), + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('plugged_in_port_id', sa.String(length=36), nullable=True), + sa.Column('interface_position', + sa.Integer(), + nullable=True), + sa.Column('mapped_real_port_id', sa.String(length=36), nullable=True), + sa.Column('network_function_device_id', sa.String(length=36), nullable=True), + sa.ForeignKeyConstraint(['plugged_in_port_id'], + ['nfp_port_infos.id'], + ondelete='SET NULL'), + sa.ForeignKeyConstraint(['network_function_device_id'], + ['nfp_network_function_devices.id'], + ondelete='SET NULL'), + sa.PrimaryKeyConstraint('id') + ) + + +def downgrade(): + pass From b3b788c629aae25813f0c7f68d74bb5dcba94347 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Thu, 21 Jul 2016 23:21:07 +0530 Subject: [PATCH 126/157] Added update db model --- gbpservice/nfp/scripts/mode_shift.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index bc785a693a..7c2c342b9f 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -72,6 +72,13 @@ function copy_files { ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator\ cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config + + # Update the DB model + sudo cp\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/ + echo "d2aab79622fe" > $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD + gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head } # FIXME(RPM): Not working, this need to be fixed. From 2e1ddd5f9eaa721b63b50bae6971a19dec98d568 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 22 Jul 2016 11:44:23 +0530 Subject: [PATCH 127/157] fixed configurator unit test file --- .../configurator/modules/test_configurator.py | 205 +++++++----------- 1 file changed, 79 insertions(+), 126 deletions(-) diff --git a/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py index c5ec2dfdfd..1e4407669b 100644 --- a/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py +++ b/gbpservice/contrib/tests/unit/nfp/configurator/modules/test_configurator.py @@ -13,25 +13,17 @@ import mock from neutron.tests import base -from oslo_log import log as logging -from gbpservice.contrib.nfp.configurator.agents import firewall as fw -from gbpservice.contrib.nfp.configurator.agents import generic_config as gc from gbpservice.contrib.nfp.configurator.lib import demuxer as demuxer_lib from gbpservice.contrib.nfp.configurator.modules import configurator as cfgr from gbpservice.contrib.tests.unit.nfp.configurator.test_data import ( fw_test_data as fo) -LOG = logging.getLogger(__name__) - -STATUS_ACTIVE = "ACTIVE" - -""" Tests RPC manager class of configurator - -""" - class ConfiguratorRpcManagerTestCase(base.BaseTestCase): + """ Tests RPC manager class of configurator + + """ def __init__(self, *args, **kwargs): super(ConfiguratorRpcManagerTestCase, self).__init__(*args, **kwargs) @@ -52,51 +44,10 @@ def _get_ConfiguratorRpcManager_object(self, sc, conf): cm = cfgr.ConfiguratorModule(sc) demuxer = demuxer_lib.ServiceAgentDemuxer() rpc_mgr = cfgr.ConfiguratorRpcManager(sc, cm, conf, demuxer) - return sc, conf, rpc_mgr - - def _get_GenericConfigRpcManager_object(self, conf, sc): - """ Retrieves RPC manager object of generic config agent. - - :param sc: mocked service controller object of process model framework - :param conf: mocked OSLO configuration file - - Returns: object of generic config's RPC manager - and service controller. - - """ - - agent = gc.GenericConfigRpcManager(sc, conf) - return agent, sc - - @mock.patch(__name__ + '.fo.FakeObjects.drivers') - def _get_GenericConfigEventHandler_object(self, sc, rpcmgr, drivers): - """ Retrieves event handler object of generic configuration. - - :param sc: mocked service controller object of process model framework - :param rpcmgr: object of configurator's RPC manager - :param drivers: list of driver objects for firewall agent + return sc, rpc_mgr - Returns: object of generic config's event handler - - """ - - agent = gc.GenericConfigEventHandler(sc, drivers, rpcmgr) - return agent - - def _get_FWaasRpcManager_object(self, conf, sc): - """ Retrieves RPC manager object of firewall agent. - - :param sc: mocked service controller object of process model framework - :param conf: mocked OSLO configuration file - - Returns: object of firewall's RPC manager and service controller - - """ - - agent = fw.FWaasRpcManager(sc, conf) - return agent, sc - - def _test_network_device_config(self, operation, method, batch=False): + def _test_network_function_device_config(self, operation, + method, batch=False): """ Tests generic config APIs :param operation: create/delete @@ -109,8 +60,8 @@ def _test_network_device_config(self, operation, method, batch=False): """ - sc, conf, rpc_mgr = self._get_ConfiguratorRpcManager_object() - agent, sc = self._get_GenericConfigRpcManager_object(conf, sc) + sc, rpc_mgr = self._get_ConfiguratorRpcManager_object() + agent = mock.Mock() request_data = {'batch': { 'request_data_actual': ( @@ -136,12 +87,10 @@ def _test_network_device_config(self, operation, method, batch=False): request_data_actual, request_data_expected = ( request_data['single'].values()) - with mock.patch.object( - sc, 'new_event', return_value='foo') as mock_sc_event, \ - mock.patch.object(sc, 'post_event') as mock_sc_rpc_event, \ - mock.patch.object(rpc_mgr, - '_get_service_agent_instance', - return_value=agent): + with mock.patch.object(rpc_mgr, + '_get_service_agent_instance', + return_value=agent), ( + mock.patch.object(agent, 'process_request')) as mock_request: if operation == 'create': rpc_mgr.create_network_function_device_config( @@ -163,24 +112,27 @@ def _test_network_device_config(self, operation, method, batch=False): 'context': context, 'notification_data': {} }) - resource_data = request_data_expected['config'][0]['resource_data'] + notification_data = dict() + sa_req_list = self.fo.fake_sa_req_list() + + response_data = {'single': {'routes': [sa_req_list[1]], + 'interfaces': [sa_req_list[0]]}, + 'batch': sa_req_list} + if batch: - sa_req_list = self.fo.fake_sa_req_list() + data = response_data['batch'] if operation == 'delete': - sa_req_list[0]['method'] = 'clear_interfaces' - sa_req_list[1]['method'] = 'clear_routes' - args_dict = { - 'sa_req_list': sa_req_list, - 'notification_data': {} - } + data[0]['method'] = 'clear_interfaces' + data[1]['method'] = 'clear_routes' else: - args_dict = {'context': agent_info, - 'resource_data': resource_data} - mock_sc_event.assert_called_with(id=method, - data=args_dict, key=None) - mock_sc_rpc_event.assert_called_with('foo') + data = response_data['single'][method.split('_')[1].lower()] + if operation == 'delete': + data[0]['method'] = data[0]['method'].replace( + 'configure', 'clear', 1) + mock_request.assert_called_with(data, + notification_data) - def _test_fw_event_creation(self, operation): + def _test_network_function_config(self, operation): """ Tests firewall APIs :param operation: CREATE_FIREWALL/UPDATE_FIREWALL/DELETE_FIREWALL @@ -189,27 +141,32 @@ def _test_fw_event_creation(self, operation): """ - sc, conf, rpc_mgr = self._get_ConfiguratorRpcManager_object() - agent, sc = self._get_FWaasRpcManager_object(conf, sc) - arg_dict = {'context': self.fo.fw_context, - 'firewall': self.fo._fake_firewall_obj(), - 'host': self.fo.host} - method = {'CREATE_FIREWALL': 'create_network_function_config', - 'UPDATE_FIREWALL': 'update_network_function_config', - 'DELETE_FIREWALL': 'delete_network_function_config'} + sc, rpc_mgr = self._get_ConfiguratorRpcManager_object() + agent = mock.Mock() + method = {'CREATE': 'create_network_function_config', + 'UPDATE': 'update_network_function_config', + 'DELETE': 'delete_network_function_config'} request_data = self.fo.fake_request_data_fw() - with mock.patch.object(sc, 'new_event', return_value='foo') as ( - mock_sc_event), \ - mock.patch.object(sc, 'post_event') as mock_sc_rpc_event, \ - mock.patch.object(rpc_mgr, - '_get_service_agent_instance', - return_value=agent): - getattr(rpc_mgr, method[operation])(self.fo.fw_context, - request_data) - - mock_sc_event.assert_called_with(id=operation, - data=arg_dict, key=None) - mock_sc_rpc_event.assert_called_with('foo') + with mock.patch.object(rpc_mgr, + '_get_service_agent_instance', + return_value=agent), ( + mock.patch.object(agent, 'process_request')) as mock_request: + + getattr(rpc_mgr, method[operation.split('_')[0]])( + self.fo.fw_context, + request_data) + + notification_data = dict() + data = self.fo.fake_sa_req_list_fw() + if 'UPDATE' in operation: + data[0]['method'] = data[0]['method'].replace( + 'create', 'update', 1) + elif 'DELETE' in operation: + data[0]['method'] = data[0]['method'].replace( + 'create', 'delete', 1) + + mock_request.assert_called_with(data, + notification_data) def _test_notifications(self): """ Tests response path notification APIs @@ -218,22 +175,18 @@ def _test_notifications(self): """ - sc, conf, rpc_mgr = self._get_ConfiguratorRpcManager_object() - agent = self._get_GenericConfigEventHandler_object(sc, rpc_mgr) + sc, rpc_mgr = self._get_ConfiguratorRpcManager_object() - data = "PUT ME IN THE QUEUE!" - with mock.patch.object(sc, 'new_event', return_value='foo') as ( - mock_new_event),\ - mock.patch.object(sc, 'stash_event') as mock_poll_event: + events = fo.FakeEventGetNotifications() + with mock.patch.object(sc, 'get_stashed_events', + return_value=[events]): - agent.notify._notification(data) + return_value = rpc_mgr.get_notifications('context') - mock_new_event.assert_called_with(id='STASH_EVENT', - key='STASH_EVENT', - data=data) - mock_poll_event.assert_called_with('foo') + expected_value = [events.data] + self.assertEqual(return_value, expected_value) - def test_configure_routes_configurator_api(self): + def test_configure_routes_generic_api(self): """ Implements test case for configure routes API Returns: none @@ -242,9 +195,9 @@ def test_configure_routes_configurator_api(self): method = "CONFIGURE_ROUTES" operation = 'create' - self._test_network_device_config(operation, method) + self._test_network_function_device_config(operation, method) - def test_clear_routes_configurator_api(self): + def test_clear_routes_generic_api(self): """ Implements test case for clear routes API Returns: none @@ -253,9 +206,9 @@ def test_clear_routes_configurator_api(self): method = "CLEAR_ROUTES" operation = 'delete' - self._test_network_device_config(operation, method) + self._test_network_function_device_config(operation, method) - def test_configure_interfaces_configurator_api(self): + def test_configure_interfaces_generic_api(self): """ Implements test case for configure interfaces API Returns: none @@ -264,9 +217,9 @@ def test_configure_interfaces_configurator_api(self): method = "CONFIGURE_INTERFACES" operation = 'create' - self._test_network_device_config(operation, method) + self._test_network_function_device_config(operation, method) - def test_clear_interfaces_configurator_api(self): + def test_clear_interfaces_generic_api(self): """ Implements test case for clear interfaces API Returns: none @@ -275,9 +228,9 @@ def test_clear_interfaces_configurator_api(self): method = "CLEAR_INTERFACES" operation = 'delete' - self._test_network_device_config(operation, method) + self._test_network_function_device_config(operation, method) - def test_configure_bulk_configurator_api(self): + def test_configure_bulk_generic_api(self): """ Implements test case for bulk configure request API Returns: none @@ -286,9 +239,9 @@ def test_configure_bulk_configurator_api(self): method = "PROCESS_BATCH" operation = 'create' - self._test_network_device_config(operation, method, True) + self._test_network_function_device_config(operation, method, True) - def test_clear_bulk_configurator_api(self): + def test_clear_bulk_generic_api(self): """ Implements test case for bulk clear request API Returns: none @@ -297,34 +250,34 @@ def test_clear_bulk_configurator_api(self): method = "PROCESS_BATCH" operation = 'delete' - self._test_network_device_config(operation, method, True) + self._test_network_function_device_config(operation, method, True) - def test_create_firewall_configurator_api(self): + def test_network_function_create_api(self): """ Implements test case for create firewall API Returns: none """ - self._test_fw_event_creation('CREATE_FIREWALL') + self._test_network_function_config('CREATE_FIREWALL') - def test_update_firewall_configurator_api(self): + def test_network_function_update_api(self): """ Implements test case for update firewall API Returns: none """ - self._test_fw_event_creation('UPDATE_FIREWALL') + self._test_network_function_config('UPDATE_FIREWALL') - def test_delete_firewall_configurator_api(self): + def test_network_function_delete_api(self): """ Implements test case for delete firewall API Returns: none """ - self._test_fw_event_creation('DELETE_FIREWALL') + self._test_network_function_config('DELETE_FIREWALL') def test_get_notifications_generic_configurator_api(self): """ Implements test case for get notifications API From 92f46df9bbf19adf3b904898e5e9cc06a3396495 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 22 Jul 2016 15:48:34 +0530 Subject: [PATCH 128/157] Restarts standard devstack processes --- gbpservice/nfp/scripts/mode_shift.sh | 80 ++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index 7c2c342b9f..5b90f3fead 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -81,28 +81,76 @@ function copy_files { gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head } -# FIXME(RPM): Not working, this need to be fixed. function nfp_configure_nova { NOVA_CONF_DIR=/etc/nova NOVA_CONF=$NOVA_CONF_DIR/nova.conf source $DEVSTACK_SRC_DIR/inc/ini-config iniset $NOVA_CONF DEFAULT instance_usage_audit "True" + + for proc in n-cpu n-cond n-sch n-novnc n-cauth n-api; do + # can be used to run the binary in a specific environment + # A silly example will be 'watch free -m' where watch is the + # sandbox and free is the proc + sandbox= + param=--config-file\ /etc/nova/nova.conf + # multiple config files can be given as space separated + # e.g.: --config-file \ --config-file\ + extra_param= + case $proc in + n-cpu) + sandbox=sg\ libvirtd + proc_name=nova-compute + ;; + n-cond) + proc_name=nova-conductor + ;; + n-sch) + proc_name=nova-scheduler + ;; + n-novnc) + proc_name=nova-novncproxy + extra_param=--web\ /opt/stack/noVNC + ;; + n-cauth) + proc_name=nova-consoleauth + ;; + n-api) + proc_name=nova-api + param= + ;; + esac + restart_devstack_screen_processes "$proc" "$sandbox" "$proc_name" "$param" "$extra_param" + done +} + +function restart_devstack_screen_processes { + SCREEN_NAME=stack + SERVICE_DIR=$DEST/status/$SCREEN_NAME + bin=/usr/local/bin + proc_screen_name=$1 + sandbox=$2 + proc_name=$3 + param=$4 + extra_param=$5 + + cmd=$bin/$proc_name\ $param\ $extra_param + cmd="$(echo -e "${cmd}" | sed -e 's/[[:space:]]*$//')" - source $DEVSTACK_SRC_DIR/functions-common - stop_process n-cpu - stop_process n-cond - stop_process n-sch - stop_process n-novnc - stop_process n-cauth - stop_process n-api - - source $DEVSTACK_SRC_DIR/lib/nova - start_nova_compute - start_nova_api - run_process n-cond "$NOVA_BIN_DIR/nova-conductor --config-file $NOVA_CONF" - run_process n-sch "$NOVA_BIN_DIR/nova-scheduler --config-file $NOVA_CONF" - run_process n-novnc "$NOVA_BIN_DIR/nova-novncproxy --config-file $NOVA_CONF --web $DEST/noVNC" - run_process n-cauth "$NOVA_BIN_DIR/nova-consoleauth --config-file $NOVA_CONF" + if [[ ! -z "${sandbox// }" ]]; then + cmd=$sandbox\ \'$cmd\' + fi + + # stop the process + screen -S $SCREEN_NAME -p $proc_screen_name -X kill + sleep 4 + + # start the process + screen -S $SCREEN_NAME -X screen -t $proc_screen_name + screen -S $SCREEN_NAME -p $proc_screen_name -X stuff "$cmd \ + & echo \$! >$SERVICE_DIR/${proc_screen_name}.pid; fg || \ + echo \"$proc_screen_name failed to start\" \ + | tee \"$SERVICE_DIR/${proc_screen_name}.failure\"\n" + sleep 5 } function create_port_for_vm { From a8c5a0a4bb1e66cef0fba714d102ee9aa04f81d1 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 22 Jul 2016 16:38:46 +0530 Subject: [PATCH 129/157] Restarts standard devstack processes --- gbpservice/nfp/scripts/mode_shift.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index 5b90f3fead..ef5af8adf8 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -377,11 +377,11 @@ function prepare_for_mode_shift { setup_ssh_key echo "Copy files and configure" copy_files - # FIXME(RPM): Restart of the processes in nfp_configure_nova - # is not working, this need to be fixed. - #echo "Configuring nova" - #nfp_configure_nova - #sleep 10 + + echo "Configuring nova" + nfp_configure_nova + sleep 10 + echo "Preparing image creation" create_images echo "Launching the Visibility VM" From 3d2985a1c98794045170a4823484f991d42ad68d Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Fri, 22 Jul 2016 17:47:27 +0530 Subject: [PATCH 130/157] floating ip fix in NS --- .../ncp/node_drivers/nfp_node_driver.py | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py b/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py index 79f3956700..a0ad15bd9c 100644 --- a/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py +++ b/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py @@ -26,6 +26,8 @@ from neutron.common import rpc as n_rpc from neutron.db import model_base from neutron.plugins.common import constants as pconst +from neutron import manager + from oslo_config import cfg from oslo_log import log as logging import oslo_messaging @@ -65,6 +67,7 @@ LOG = logging.getLogger(__name__) +APIC_OWNED_RES = 'apic_owned_res_' class InvalidServiceType(exc.NodeCompositionPluginBadRequest): message = _("The NFP Node driver only supports the services " @@ -247,6 +250,14 @@ def __init__(self): def name(self): return self._name + @property + def lbaas_plugin(self): + if self._lbaas_plugin: + return self._lbaas_plugin + self._lbaas_plugin = manager.NeutronManager.get_service_plugins().get( + pconst.LOADBALANCER) + return self._lbaas_plugin + def initialize(self, name): self.initialized = True self._name = name @@ -423,6 +434,7 @@ def create(self, context): result = self._wait(gth) self.active_threads = [] + def update(self, context): context._plugin_context = self._get_resource_owner_context( context._plugin_context) @@ -565,6 +577,38 @@ def _wait_for_network_function_delete_completion(self, context, {'network_function': network_function_id}) raise NodeInstanceDeleteFailed() + def _create_pt(self, context, ptg_id, name, port_id=None): + policy_target = {'name': name, + 'description': '', + 'tenant_id': context.plugin_context.tenant_id, + 'policy_target_group_id': ptg_id, + 'port_id': port_id, + 'proxy_gateway': False, + 'group_default_gateway': False, + 'cluster_id': ""} + return context.gbp_plugin.create_policy_target( + context.plugin_context, {"policy_target": policy_target}) + + def _create_policy_target_for_vip(self, context): + provider_subnet = None + provider_l2p_subnets = context.core_plugin.get_subnets( + context.plugin_context, + filters={'id': context.provider['subnets']}) + for subnet in provider_l2p_subnets: + if not subnet['name'].startswith(APIC_OWNED_RES): + provider_subnet = subnet + break + if provider_subnet: + lb_pool_ids = self.lbaas_plugin.get_pools( + context.plugin_context, + filters={'subnet_id': [provider_subnet['id']]}) + if lb_pool_ids and lb_pool_ids[0]['vip_id']: + lb_vip = self.lbaas_plugin.get_vip( + context.plugin_context, lb_pool_ids[0]['vip_id']) + self._create_pt(context, context.provider['id'], + "service_target_vip_pt", + port_id=lb_vip['port_id']) + def _wait_for_network_function_operation_completion(self, context, network_function_id, operation): @@ -606,6 +650,12 @@ def _wait_for_network_function_operation_completion(self, context, elif operation.lower() == 'update': raise NodeInstanceUpdateFailed() + if (self._get_service_type( + context.current_profile) == pconst.LOADBALANCER and + operation=='create'): + self._create_policy_target_for_vip(context) + + def _is_service_target(self, policy_target): if policy_target['name'] and (policy_target['name'].startswith( plumber_base.SERVICE_TARGET_NAME_PREFIX) or @@ -791,7 +841,6 @@ def _is_node_order_in_spec_supported(self, context): if service_type_list_in_chain not in allowed_chain_combinations: raise InvalidNodeOrderInChain( node_order=allowed_chain_combinations) - self.sc_node_count = len(node_list) def _get_consumers_for_provider(self, context, provider): From 2997fa48020f77d31a644957e7a466c921d73e44 Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Fri, 22 Jul 2016 18:07:42 +0530 Subject: [PATCH 131/157] review comment fix --- .../ncp/node_drivers/nfp_node_driver.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py b/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py index a0ad15bd9c..2e9c12d917 100644 --- a/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py +++ b/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py @@ -599,15 +599,17 @@ def _create_policy_target_for_vip(self, context): provider_subnet = subnet break if provider_subnet: - lb_pool_ids = self.lbaas_plugin.get_pools( + lb_pools = self.lbaas_plugin.get_pools( context.plugin_context, filters={'subnet_id': [provider_subnet['id']]}) - if lb_pool_ids and lb_pool_ids[0]['vip_id']: - lb_vip = self.lbaas_plugin.get_vip( - context.plugin_context, lb_pool_ids[0]['vip_id']) - self._create_pt(context, context.provider['id'], - "service_target_vip_pt", - port_id=lb_vip['port_id']) + if lb_pools: + lb_pool = lb_pools[0] + if lb_pool['vip_id']: + lb_vip = self.lbaas_plugin.get_vip( + context.plugin_context, lb_pool['vip_id']) + self._create_pt(context, context.provider['id'], + "service_target_vip_pt", + port_id=lb_vip['port_id']) def _wait_for_network_function_operation_completion(self, context, network_function_id, @@ -652,7 +654,7 @@ def _wait_for_network_function_operation_completion(self, context, if (self._get_service_type( context.current_profile) == pconst.LOADBALANCER and - operation=='create'): + operation.lower()=='create'): self._create_policy_target_for_vip(context) From 1a7571976ad542e63dd39cc7393708562b173bdf Mon Sep 17 00:00:00 2001 From: mak Date: Fri, 22 Jul 2016 06:57:16 -0700 Subject: [PATCH 132/157] removed hard coded revision number --- .../neutron/db/migration/alembic_migrations/versions/HEAD | 2 +- ...79622fe_nfp_enterprise_db.py => nfp_enterprise_db-temp.py} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename gbpservice/neutron/db/migration/alembic_migrations/versions/{d2aab79622fe_nfp_enterprise_db.py => nfp_enterprise_db-temp.py} (96%) diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD b/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD index 759508a41a..d0c9e6d269 100644 --- a/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD @@ -1 +1 @@ -d2aab79622fe +c1aab79622fe diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py b/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db-temp.py similarity index 96% rename from gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py rename to gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db-temp.py index 228f7a4b7a..4bd0e7dec9 100644 --- a/gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db-temp.py @@ -14,8 +14,8 @@ # # revision identifiers, used by Alembic. -revision = 'd2aab79622fe' -down_revision = 'c1aab79622fe' +revision = +down_revision = from alembic import op import sqlalchemy as sa From 69613f6f8e228f0fd5a12cfb7a8ec3d54ff19b30 Mon Sep 17 00:00:00 2001 From: dpaks Date: Fri, 22 Jul 2016 19:57:27 +0530 Subject: [PATCH 133/157] automating db migration for enterprise mode --- gbpservice/nfp/scripts/mode_shift.sh | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index ef5af8adf8..7d80514b0f 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -74,10 +74,22 @@ function copy_files { cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config # Update the DB model + new_db_name=nfp_enterprise_db + temp_db_name=$new_db_name\-temp + gbp-db-manage --config-file /etc/neutron/neutron.conf revision -m "$new_db_name" + + revision=$(sed -n '/revision = /p' *$new_db_name.py | awk 'NR==1{print $3}') + down_revision=$(sed -n '/revision = /p' *$new_db_name.py | awk 'NR==2{print $3}') + + sed -i "s/revision = *.*/revision = $revision/"\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$temp_db_name.py + sed -i "s/down_revision = *.*/down_revision = $down_revision/"\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$temp_db_name.py + sudo cp\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/d2aab79622fe_nfp_enterprise_db.py\ - $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/ - echo "d2aab79622fe" > $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/HEAD + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$temp_db_name.py\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$new_db_name.py + gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head } @@ -88,12 +100,12 @@ function nfp_configure_nova { iniset $NOVA_CONF DEFAULT instance_usage_audit "True" for proc in n-cpu n-cond n-sch n-novnc n-cauth n-api; do - # can be used to run the binary in a specific environment + # Can be used to run the binary in a specific environment # A silly example will be 'watch free -m' where watch is the # sandbox and free is the proc sandbox= param=--config-file\ /etc/nova/nova.conf - # multiple config files can be given as space separated + # Multiple config files can be given as space separated # e.g.: --config-file \ --config-file\ extra_param= case $proc in From 35e469ec2895517e27d6470d19c400600508c622 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Fri, 22 Jul 2016 20:48:03 +0530 Subject: [PATCH 134/157] fixed pep8 issues --- .../contrib/nfp/configurator/advanced_controller/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py b/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py index f6f281417e..db58f496aa 100644 --- a/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py +++ b/gbpservice/contrib/nfp/configurator/advanced_controller/controller.py @@ -38,12 +38,12 @@ class Controller(base_controller.BaseController): def __init__(self, method_name): try: + self.method_name = method_name self.services = pecan.conf['cloud_services'] self.rpc_routing_table = {} for service in self.services: self._entry_to_rpc_routing_table(service) - self.method_name = method_name super(Controller, self).__init__() except Exception as err: msg = ( From cdacf82cf4d7523007d68bf70e20a9036f13e7fa Mon Sep 17 00:00:00 2001 From: dpaks Date: Sat, 23 Jul 2016 13:13:06 +0530 Subject: [PATCH 135/157] removed the unnecessary variables --- gbpservice/nfp/scripts/mode_shift.sh | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index 7d80514b0f..6e76b7b954 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -74,21 +74,24 @@ function copy_files { cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config # Update the DB model - new_db_name=nfp_enterprise_db - temp_db_name=$new_db_name\-temp - gbp-db-manage --config-file /etc/neutron/neutron.conf revision -m "$new_db_name" - - revision=$(sed -n '/revision = /p' *$new_db_name.py | awk 'NR==1{print $3}') - down_revision=$(sed -n '/revision = /p' *$new_db_name.py | awk 'NR==2{print $3}') + db_name=nfp_enterprise_db + gbp-db-manage --config-file /etc/neutron/neutron.conf revision -m "$db_name" + + revision=$(sed -n '/revision = /p'\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$db_name.py |\ + awk 'NR==1{print $3}') + down_revision=$(sed -n '/revision = /p'\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$db_name.py |\ + awk 'NR==2{print $3}') sed -i "s/revision = *.*/revision = $revision/"\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$temp_db_name.py + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py sed -i "s/down_revision = *.*/down_revision = $down_revision/"\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$temp_db_name.py + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py sudo cp\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$temp_db_name.py\ - $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$new_db_name.py + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py\ + $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$db_name.py gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head } From 8e720e0bd41f8ece8379b7dc58b01ba69cf5dd0d Mon Sep 17 00:00:00 2001 From: dpaks Date: Sat, 23 Jul 2016 13:17:56 +0530 Subject: [PATCH 136/157] renamed nfp_enterprise_db-temp.py to nfp_enterprise_db.py --- .../versions/{nfp_enterprise_db-temp.py => nfp_enterprise_db.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename gbpservice/neutron/db/migration/alembic_migrations/versions/{nfp_enterprise_db-temp.py => nfp_enterprise_db.py} (100%) diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db-temp.py b/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py similarity index 100% rename from gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db-temp.py rename to gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py From e4ae76078c04047c6df3c6811aa93f8b45642672 Mon Sep 17 00:00:00 2001 From: dpaks Date: Sat, 23 Jul 2016 14:27:01 +0530 Subject: [PATCH 137/157] bug fix --- .../alembic_migrations/versions/nfp_enterprise_db.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py b/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py index 4bd0e7dec9..0c8fac3193 100644 --- a/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py @@ -14,8 +14,8 @@ # # revision identifiers, used by Alembic. -revision = -down_revision = +revision = '' +down_revision = '' from alembic import op import sqlalchemy as sa From e18b49c97f1954bbca91045bd5493caea794fd60 Mon Sep 17 00:00:00 2001 From: mak Date: Sat, 23 Jul 2016 16:22:06 +0530 Subject: [PATCH 138/157] fixed creation of pt for lb vip after heat stack is complete --- .../ncp/node_drivers/nfp_node_driver.py | 53 +------------------ .../config_drivers/heat_driver.py | 14 +++++ 2 files changed, 15 insertions(+), 52 deletions(-) diff --git a/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py b/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py index 2e9c12d917..79f3956700 100644 --- a/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py +++ b/gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py @@ -26,8 +26,6 @@ from neutron.common import rpc as n_rpc from neutron.db import model_base from neutron.plugins.common import constants as pconst -from neutron import manager - from oslo_config import cfg from oslo_log import log as logging import oslo_messaging @@ -67,7 +65,6 @@ LOG = logging.getLogger(__name__) -APIC_OWNED_RES = 'apic_owned_res_' class InvalidServiceType(exc.NodeCompositionPluginBadRequest): message = _("The NFP Node driver only supports the services " @@ -250,14 +247,6 @@ def __init__(self): def name(self): return self._name - @property - def lbaas_plugin(self): - if self._lbaas_plugin: - return self._lbaas_plugin - self._lbaas_plugin = manager.NeutronManager.get_service_plugins().get( - pconst.LOADBALANCER) - return self._lbaas_plugin - def initialize(self, name): self.initialized = True self._name = name @@ -434,7 +423,6 @@ def create(self, context): result = self._wait(gth) self.active_threads = [] - def update(self, context): context._plugin_context = self._get_resource_owner_context( context._plugin_context) @@ -577,40 +565,6 @@ def _wait_for_network_function_delete_completion(self, context, {'network_function': network_function_id}) raise NodeInstanceDeleteFailed() - def _create_pt(self, context, ptg_id, name, port_id=None): - policy_target = {'name': name, - 'description': '', - 'tenant_id': context.plugin_context.tenant_id, - 'policy_target_group_id': ptg_id, - 'port_id': port_id, - 'proxy_gateway': False, - 'group_default_gateway': False, - 'cluster_id': ""} - return context.gbp_plugin.create_policy_target( - context.plugin_context, {"policy_target": policy_target}) - - def _create_policy_target_for_vip(self, context): - provider_subnet = None - provider_l2p_subnets = context.core_plugin.get_subnets( - context.plugin_context, - filters={'id': context.provider['subnets']}) - for subnet in provider_l2p_subnets: - if not subnet['name'].startswith(APIC_OWNED_RES): - provider_subnet = subnet - break - if provider_subnet: - lb_pools = self.lbaas_plugin.get_pools( - context.plugin_context, - filters={'subnet_id': [provider_subnet['id']]}) - if lb_pools: - lb_pool = lb_pools[0] - if lb_pool['vip_id']: - lb_vip = self.lbaas_plugin.get_vip( - context.plugin_context, lb_pool['vip_id']) - self._create_pt(context, context.provider['id'], - "service_target_vip_pt", - port_id=lb_vip['port_id']) - def _wait_for_network_function_operation_completion(self, context, network_function_id, operation): @@ -652,12 +606,6 @@ def _wait_for_network_function_operation_completion(self, context, elif operation.lower() == 'update': raise NodeInstanceUpdateFailed() - if (self._get_service_type( - context.current_profile) == pconst.LOADBALANCER and - operation.lower()=='create'): - self._create_policy_target_for_vip(context) - - def _is_service_target(self, policy_target): if policy_target['name'] and (policy_target['name'].startswith( plumber_base.SERVICE_TARGET_NAME_PREFIX) or @@ -843,6 +791,7 @@ def _is_node_order_in_spec_supported(self, context): if service_type_list_in_chain not in allowed_chain_combinations: raise InvalidNodeOrderInChain( node_order=allowed_chain_combinations) + self.sc_node_count = len(node_list) def _get_consumers_for_provider(self, context, provider): diff --git a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py index 3ff144628f..42439c9d56 100644 --- a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py +++ b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py @@ -246,6 +246,19 @@ def loadbalancer_post_stack_create(self, network_function_details): if port_info['port_model'] != nfp_constants.GBP_PORT: return + def _post_stack_create(self, nfp_context): + service_details = self.get_service_details_from_nfp_context( + nfp_context) + service_details = service_details['service_details'] + service_type = service_details['service_type'] + + if service_type in [pconst.LOADBALANCER]: + auth_token = nfp_context['resource_owner_context']['admin_token'] + provider_tenant_id = nfp_context['tenant_id'] + provider = service_details['provider_ptg'] + self._create_policy_target_for_vip( + auth_token, provider_tenant_id, provider) + def _create_policy_target_for_vip(self, auth_token, provider_tenant_id, provider): provider_subnet = None @@ -1421,6 +1434,7 @@ def check_config_complete(self, nfp_context): if stack.stack_status == 'DELETE_FAILED': return failure_status elif stack.stack_status == 'CREATE_COMPLETE': + self._post_stack_create(nfp_context) return success_status elif stack.stack_status == 'UPDATE_COMPLETE': return success_status From 978079af1127c9c2cc643b968261c52cb6b73bb0 Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Sat, 23 Jul 2016 18:12:35 +0530 Subject: [PATCH 139/157] added provider auth_token for creating pt --- gbpservice/nfp/orchestrator/config_drivers/heat_driver.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py index 42439c9d56..242f4d7fcd 100644 --- a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py +++ b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py @@ -253,7 +253,8 @@ def _post_stack_create(self, nfp_context): service_type = service_details['service_type'] if service_type in [pconst.LOADBALANCER]: - auth_token = nfp_context['resource_owner_context']['admin_token'] + logging_context = nfp_logging.get_logging_context() + auth_token = logging_context['auth_token'] provider_tenant_id = nfp_context['tenant_id'] provider = service_details['provider_ptg'] self._create_policy_target_for_vip( From f6fd658b6b146415a1d4b604eff0ead36f97ea1c Mon Sep 17 00:00:00 2001 From: SureshDH Date: Sat, 23 Jul 2016 12:54:53 -0700 Subject: [PATCH 140/157] fixed unittest --- .../advanced_controller/__init__.py | 64 ------------------- .../advanced_controller/controller_loader.py | 64 +++++++++++++++++++ gbpservice/nfp/pecan/api/config.py | 8 +-- gbpservice/nfp/pecan/constants.py | 2 +- 4 files changed, 66 insertions(+), 72 deletions(-) create mode 100644 gbpservice/contrib/nfp/configurator/advanced_controller/controller_loader.py diff --git a/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py b/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py index 46e418b159..e69de29bb2 100644 --- a/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py +++ b/gbpservice/contrib/nfp/configurator/advanced_controller/__init__.py @@ -1,64 +0,0 @@ -# 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 pecan - -from gbpservice.contrib.nfp.configurator.advanced_controller import ( - controller) - -"""This class forwards HTTP request to controller class. - -This class create an object of Controller class with appropriate -parameter according to the path of HTTP request. According to the -parameter passed to Controller class it sends an RPC call/cast to -configurator. - -""" - - -class ControllerResolver(object): - - create_network_function_device_config = controller.Controller( - "create_network_function_device_config") - delete_network_function_device_config = controller.Controller( - "delete_network_function_device_config") - update_network_function_device_config = controller.Controller( - "update_network_function_device_config") - create_network_function_config = controller.Controller( - "create_network_function_config") - delete_network_function_config = controller.Controller( - "delete_network_function_config") - update_network_function_config = controller.Controller( - "update_network_function_config") - get_notifications = controller.Controller("get_notifications") - network_function_event = controller.Controller("network_function_event") - get_requests = controller.Controller("get_requests") - -""" This class forwards HTTP requests starting with /v1/nfp. - -All HTTP requests with path starting from /v1 -land here. This class forward request with path starting from /v1/nfp -to ControllerResolver. - -""" - - -class V1Controller(object): - - nfp = ControllerResolver() - - @pecan.expose() - def get(self): - # TODO(blogan): decide what exactly should be here, if anything - return {'versions': [{'status': 'CURRENT', - 'updated': '2014-12-11T00:00:00Z', - 'id': 'v1'}]} diff --git a/gbpservice/contrib/nfp/configurator/advanced_controller/controller_loader.py b/gbpservice/contrib/nfp/configurator/advanced_controller/controller_loader.py new file mode 100644 index 0000000000..46e418b159 --- /dev/null +++ b/gbpservice/contrib/nfp/configurator/advanced_controller/controller_loader.py @@ -0,0 +1,64 @@ +# 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 pecan + +from gbpservice.contrib.nfp.configurator.advanced_controller import ( + controller) + +"""This class forwards HTTP request to controller class. + +This class create an object of Controller class with appropriate +parameter according to the path of HTTP request. According to the +parameter passed to Controller class it sends an RPC call/cast to +configurator. + +""" + + +class ControllerResolver(object): + + create_network_function_device_config = controller.Controller( + "create_network_function_device_config") + delete_network_function_device_config = controller.Controller( + "delete_network_function_device_config") + update_network_function_device_config = controller.Controller( + "update_network_function_device_config") + create_network_function_config = controller.Controller( + "create_network_function_config") + delete_network_function_config = controller.Controller( + "delete_network_function_config") + update_network_function_config = controller.Controller( + "update_network_function_config") + get_notifications = controller.Controller("get_notifications") + network_function_event = controller.Controller("network_function_event") + get_requests = controller.Controller("get_requests") + +""" This class forwards HTTP requests starting with /v1/nfp. + +All HTTP requests with path starting from /v1 +land here. This class forward request with path starting from /v1/nfp +to ControllerResolver. + +""" + + +class V1Controller(object): + + nfp = ControllerResolver() + + @pecan.expose() + def get(self): + # TODO(blogan): decide what exactly should be here, if anything + return {'versions': [{'status': 'CURRENT', + 'updated': '2014-12-11T00:00:00Z', + 'id': 'v1'}]} diff --git a/gbpservice/nfp/pecan/api/config.py b/gbpservice/nfp/pecan/api/config.py index d3b946f223..cb09110a3e 100644 --- a/gbpservice/nfp/pecan/api/config.py +++ b/gbpservice/nfp/pecan/api/config.py @@ -64,11 +64,5 @@ 'topic': 'configurator', 'reporting_interval': '10', # in seconds 'apis': ['CONFIGURATION'] - }, - - {'service_name': 'visibility', - 'topic': 'visibility', - 'reporting_interval': '10', # in seconds - 'apis': ['VISIBILITY'] - }, + } ] diff --git a/gbpservice/nfp/pecan/constants.py b/gbpservice/nfp/pecan/constants.py index dedddc19f0..b04b622ed7 100644 --- a/gbpservice/nfp/pecan/constants.py +++ b/gbpservice/nfp/pecan/constants.py @@ -21,7 +21,7 @@ REFERENCE_CONTROLLER: ('gbpservice.tests.contrib' '.nfp_service.reference_configurator.controllers'), ADVANCED_CONTROLLER: ('gbpservice.contrib.nfp.configurator' - '.advanced_controller') + '.advanced_controller.controller_loader') } base_with_vm = 'base_with_vm' From 054a5b3085a5c828d490d7e6fcffeb8fc5321177 Mon Sep 17 00:00:00 2001 From: Suresh Dharavath Date: Sun, 24 Jul 2016 01:29:11 +0530 Subject: [PATCH 141/157] added fix for vpn --- gbpservice/contrib/nfp/configurator/agents/vpn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/contrib/nfp/configurator/agents/vpn.py b/gbpservice/contrib/nfp/configurator/agents/vpn.py index 6025aaf35e..85c706b723 100644 --- a/gbpservice/contrib/nfp/configurator/agents/vpn.py +++ b/gbpservice/contrib/nfp/configurator/agents/vpn.py @@ -354,7 +354,7 @@ def register_service_agent(cm, sc, conf): Returns: None """ - rpcmgr = VPNaasRpcManager(sc, conf) + rpcmgr = VPNaasRpcManager(conf, sc) cm.register_service_agent(const.SERVICE_TYPE, rpcmgr) From 9fb45e399f8d39c6aa5c26f88e0075fabc1f40c1 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Sun, 24 Jul 2016 09:36:02 +0530 Subject: [PATCH 142/157] Fix for haproxy image build --- .../tests/contrib/diskimage-create/build_image.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/gbpservice/tests/contrib/diskimage-create/build_image.py b/gbpservice/tests/contrib/diskimage-create/build_image.py index e4295faa98..8ba71b3920 100755 --- a/gbpservice/tests/contrib/diskimage-create/build_image.py +++ b/gbpservice/tests/contrib/diskimage-create/build_image.py @@ -214,8 +214,11 @@ def dib(nfp_branch_name): # parse args from json file parse_json(sys.argv[1]) elements = conf['dib']['elements'] - elem = 'haproxy' - if elem in elements: + if 'haproxy' in elements: + # Enable default site in apache2 for local repo + sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/ + sudo service apache2 restart + sleep 5 if(update_haproxy_repo()): exit() @@ -227,3 +230,9 @@ def dib(nfp_branch_name): # run Disk Image Builder to create VM image dib(nfp_branch_name) + + if 'haproxy' in elements: + # Disable the default site in apache2 + sudo rm /etc/apache2/sites-enabled/000-default.conf + sudo service apache2 restart + sleep 5 From 80933ade3e6995dba5a5ccb5aa53f22d553afc65 Mon Sep 17 00:00:00 2001 From: mak Date: Sun, 24 Jul 2016 23:23:00 +0530 Subject: [PATCH 143/157] separated enterprise code from orchestrator for sharing --- gbpservice/nfp/core/controller.py | 15 ++- gbpservice/nfp/core/event.py | 32 ++++- gbpservice/nfp/core/worker.py | 2 +- .../drivers/orchestration_driver.py | 120 +----------------- .../orchestrator/drivers/sharing_driver.py | 64 ++++++++++ .../modules/device_orchestrator.py | 34 +---- .../modules/service_orchestrator.py | 43 +------ .../nfp/orchestrator/modules/sharing.py | 104 +++++++++++++++ 8 files changed, 208 insertions(+), 206 deletions(-) create mode 100644 gbpservice/nfp/orchestrator/drivers/sharing_driver.py create mode 100644 gbpservice/nfp/orchestrator/modules/sharing.py diff --git a/gbpservice/nfp/core/controller.py b/gbpservice/nfp/core/controller.py index b891762d3e..c951d4d9bf 100644 --- a/gbpservice/nfp/core/controller.py +++ b/gbpservice/nfp/core/controller.py @@ -72,11 +72,13 @@ def _make_new_event(self, event): def get_event_handlers(self): return self._event_handlers - def register_events(self, event_descs): + def register_events(self, event_descs, module='', priority=0): """Register event handlers with core. """ # REVISIT (mak): change name to register_event_handlers() ? for event_desc in event_descs: - self._event_handlers.register(event_desc.id, event_desc.handler) + self._event_handlers.register( + event_desc.id, event_desc.handler, + module=module, priority=priority) def register_rpc_agents(self, agents): """Register rpc handlers with core. """ @@ -112,17 +114,18 @@ def post_event_graph(self, event): event.desc.pid = os.getpid() return event - def post_event(self, event): + def post_event(self, event, target=None): """Post an event. As a base class, it only does the descriptor preparation. NfpController class implements the required functionality. """ - handler = self._event_handlers.get_event_handler(event.id) + handler = self._event_handlers.get_event_handler(event.id, module=target) assert handler, "No handler registered for event %s" % (event.id) event.desc.type = nfp_event.SCHEDULE_EVENT event.desc.flag = nfp_event.EVENT_NEW event.desc.pid = os.getpid() + event.desc.target = target return event # REVISIT (mak): spacing=0, caller must explicitly specify @@ -374,7 +377,7 @@ def post_event_graph(self, event, graph_nodes): LOG.debug(message) self._manager.process_events([event]) - def post_event(self, event): + def post_event(self, event, target=None): """Post a new event into the system. If distributor(main) process posts an event, it @@ -387,7 +390,7 @@ def post_event(self, event): Returns: None """ - event = super(NfpController, self).post_event(event) + event = super(NfpController, self).post_event(event, target=target) message = "(event - %s) - New event" % (event.identify()) LOG.debug(message) if self.PROCESS_TYPE == "worker": diff --git a/gbpservice/nfp/core/event.py b/gbpservice/nfp/core/event.py index 6df8ae084c..ef82fa826b 100644 --- a/gbpservice/nfp/core/event.py +++ b/gbpservice/nfp/core/event.py @@ -186,6 +186,8 @@ def __init__(self, **kwargs): self.worker = kwargs.get('worker') # Polling descriptor of event self.poll_desc = kwargs.get('poll_desc') + # Target module of this event + self.target = None def from_desc(self, desc): self.type = desc.type @@ -283,7 +285,7 @@ def _log_meta(self, event_id, event_handler=None): else: return "(event_id - %s) - (event_handler - None)" % (event_id) - def register(self, event_id, event_handler): + def register(self, event_id, event_handler, module='', priority=0): """Registers a handler for event_id. Also fetches the decorated poll handlers if any @@ -304,20 +306,38 @@ def register(self, event_id, event_handler): spacing = 0 try: - self._event_desc_table[event_id].append( - (event_handler, poll_handler, spacing)) + try: + self._event_desc_table[event_id]['modules'][module].append( + (event_handler, poll_handler, spacing)] + except KeyError: + self._event_desc_table[event_id]['modules'][module] = [ + (event_handler, poll_handler, spacing)] + try: + self._event_desc_table[event_id]['priority'][priority].append( + (event_handler, poll_handler, spacing)] + except KeyError: + self._event_desc_table[event_id]['priority'][priority] = [ + (event_handler, poll_handler, spacing)] except KeyError: - self._event_desc_table[event_id] = [ + self._event_desc_table[event_id] = {'modules':{}, 'priority':{}} + self._event_desc_table[event_id]['modules'][module] = [ + (event_handler, poll_handler, spacing)] + self._event_desc_table[event_id]['priority'][priority] = [ (event_handler, poll_handler, spacing)] message = "%s - Registered handler" % ( self._log_meta(event_id, event_handler)) LOG.debug(message) - def get_event_handler(self, event_id): + def get_event_handler(self, event_id, module=None): """Get the handler for the event_id. """ eh = None try: - eh = self._event_desc_table[event_id][0][0] + if module: + eh = self._event_desc_table[event_id]['modules'][module][0][0] + else: + priorities = self._event_desc_table[event_id]['priority'].keys() + priority = max(priorities) + eh = self._event_desc_table[event_id]['priority'][priority][0][0] finally: message = "%s - Returning event handler" % ( self._log_meta(event_id, eh)) diff --git a/gbpservice/nfp/core/worker.py b/gbpservice/nfp/core/worker.py index e2da1efca2..b9e7e4d993 100644 --- a/gbpservice/nfp/core/worker.py +++ b/gbpservice/nfp/core/worker.py @@ -102,7 +102,7 @@ def _process_event(self, event): """ if event.desc.type == nfp_event.SCHEDULE_EVENT: self._send_event_ack(event) - eh = self.event_handlers.get_event_handler(event.id) + eh = self.event_handlers.get_event_handler(event.id, module=event.desc.target) self.dispatch(eh.handle_event, event) elif event.desc.type == nfp_event.POLL_EVENT: self.dispatch(self._handle_poll_event, event) diff --git a/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py b/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py index 171b88ac41..c883d27666 100644 --- a/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py +++ b/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py @@ -56,10 +56,9 @@ class OrchestrationDriver(object): is launched for each Network Service Instance """ - def __init__(self, config, supports_device_sharing=True, + def __init__(self, config, supports_hotplug=True, max_interfaces=10): self.service_vendor = 'general' - self.supports_device_sharing = supports_device_sharing self.supports_hotplug = supports_hotplug self.maximum_interfaces = max_interfaces self.identity_handler = openstack_driver.KeystoneClient(config) @@ -143,9 +142,6 @@ def _decrement_stats_counter(self, metric, by=1): " '%(metric)s' by %(by)d") % {'metric': metric, 'by': by}) - def _is_device_sharing_supported(self): - return self.supports_device_sharing - def _create_management_interface(self, token, admin_tenant_id, device_data, network_handler): @@ -393,120 +389,6 @@ def _get_device_service_types_map(self, token, devices, network_handler): device_service_types_map[device['id']].add(service_type) return device_service_types_map - def get_network_function_device_sharing_info(self, device_data): - """ Get filters for NFD sharing - - :param device_data: NFD data - :type device_data: dict - - :returns: None -- when device sharing is not supported - :returns: dict -- It has the following scheme - { - 'filters': { - 'key': 'value', - ... - } - } - - :raises: exceptions.IncompleteData - """ - - if ( - any(key not in device_data - for key in ['tenant_id', - 'service_details']) or - - type(device_data['service_details']) is not dict or - - any(key not in device_data['service_details'] - for key in ['service_vendor']) - ): - raise exceptions.IncompleteData() - - if not self._is_device_sharing_supported(): - return None - - return { - 'filters': { - 'tenant_id': [device_data['tenant_id']], - 'service_vendor': [device_data['service_details'][ - 'service_vendor']], - 'status': [nfp_constants.ACTIVE] - } - } - - @_set_network_handler - def select_network_function_device(self, devices, device_data, - network_handler=None): - """ Select a NFD which is eligible for sharing - - :param devices: NFDs - :type devices: list - :param device_data: NFD data - :type device_data: dict - - :returns: None -- when device sharing is not supported, or - when no device is eligible for sharing - :return: dict -- NFD which is eligible for sharing - - :raises: exceptions.IncompleteData - """ - - if ( - any(key not in device_data - for key in ['ports']) or - - type(device_data['ports']) is not list or - - any(key not in port - for port in device_data['ports'] - for key in ['id', - 'port_classification', - 'port_model']) or - - type(devices) is not list or - - any(key not in device - for device in devices - for key in ['interfaces_in_use']) - ): - raise exceptions.IncompleteData() - - token = self._get_token(device_data.get('token')) - if not token: - return None - image_name = self._get_image_name(device_data) - if image_name: - self._update_vendor_data(device_data, - device_data.get('token')) - if not self._is_device_sharing_supported(): - return None - - hotplug_ports_count = 1 # for provider interface (default) - if any(port['port_classification'] == nfp_constants.CONSUMER - for port in device_data['ports']): - hotplug_ports_count = 2 - - device_service_types_map = ( - self._get_device_service_types_map(token, devices, - network_handler)) - service_type = device_data['service_details']['service_type'] - for device in devices: - if ( - (device['interfaces_in_use'] + hotplug_ports_count) <= - self.maximum_interfaces - ): - if (service_type.lower() == nfp_constants.VPN.lower() and - service_type in device_service_types_map[ - device['id']]): - # Restrict multiple VPN services to share same device - # If nfd request service type is VPN and current filtered - # device already has VPN service instantiated, ignore this - # device and checks for next one - continue - return device - return None - def get_image_id(self, nova, token, admin_tenant_id, image_name): try: image_id = nova.get_image_id(token, admin_tenant_id, image_name) diff --git a/gbpservice/nfp/orchestrator/drivers/sharing_driver.py b/gbpservice/nfp/orchestrator/drivers/sharing_driver.py new file mode 100644 index 0000000000..157fb47876 --- /dev/null +++ b/gbpservice/nfp/orchestrator/drivers/sharing_driver.py @@ -0,0 +1,64 @@ +from gbpservice.nfp.orchestrator.drivers import orchestration_driver + +class SharingDriver(OrchestrationDriver): + def select_network_function_device(self, devices, device_data): + """ Select a NFD which is eligible for sharing + + :param devices: NFDs + :type devices: list + :param device_data: NFD data + :type device_data: dict + + :returns: None -- when device sharing is not supported, or + when no device is eligible for sharing + :return: dict -- NFD which is eligible for sharing + + :raises: exceptions.IncompleteData + """ + + if ( + any(key not in device_data + for key in ['ports']) or + + type(device_data['ports']) is not list or + + any(key not in port + for port in device_data['ports'] + for key in ['id', + 'port_classification', + 'port_model']) or + + type(devices) is not list or + + any(key not in device + for device in devices + for key in ['interfaces_in_use']) + ): + raise exceptions.IncompleteData() + + token = device_data['token'] + hotplug_ports_count = 1 # for provider interface (default) + if any(port['port_classification'] == nfp_constants.CONSUMER + for port in device_data['ports']): + hotplug_ports_count = 2 + + device_service_types_map = ( + self._get_device_service_types_map(token, devices, + network_handler)) + service_type = device_data['service_details']['service_type'] + for device in devices: + if ( + (device['interfaces_in_use'] + hotplug_ports_count) <= + self.maximum_interfaces + ): + if (service_type.lower() == nfp_constants.VPN.lower() and + service_type in device_service_types_map[ + device['id']]): + # Restrict multiple VPN services to share same device + # If nfd request service type is VPN and current filtered + # device already has VPN service instantiated, ignore this + # device and checks for next one + continue + return device + return None + diff --git a/gbpservice/nfp/orchestrator/modules/device_orchestrator.py b/gbpservice/nfp/orchestrator/modules/device_orchestrator.py index ace9849fae..e8f5064fce 100644 --- a/gbpservice/nfp/orchestrator/modules/device_orchestrator.py +++ b/gbpservice/nfp/orchestrator/modules/device_orchestrator.py @@ -65,7 +65,7 @@ def events_init(controller, config, device_orchestrator): for event in events: events_to_register.append( Event(id=event, handler=device_orchestrator)) - controller.register_events(events_to_register) + controller.register_events(events_to_register, module='device_orchestrator') def nfp_module_init(controller, config): @@ -495,18 +495,6 @@ def _decrement_device_interface_count(self, device): def _get_orchestration_driver(self, service_vendor): return self.orchestration_driver - def _get_device_to_reuse(self, device_data, dev_sharing_info): - device_filters = dev_sharing_info['filters'] - orchestration_driver = self._get_orchestration_driver( - device_data['service_details']['service_vendor']) - - devices = self._get_network_function_devices(device_filters) - - device = orchestration_driver.select_network_function_device( - devices, - device_data) - return device - def _get_device_data(self, nfd_request): device_data = {} @@ -629,26 +617,6 @@ def create_network_function_device(self, event): device_data = self._prepare_device_data_from_nfp_context(nfp_context) - # dev_sharing_info = ( - # orchestration_driver.get_network_function_device_sharing_info( - # device_data)) - - # if dev_sharing_info: - # device = self._get_device_to_reuse(device_data, dev_sharing_info) - # if device: - # device = self._update_device_data(device, device_data) - - # # To handle case, when device sharing is supported but device not - # # exists to share, so create a new device. - # if dev_sharing_info and device: - # # Device is already active, no need to change status - # device['network_function_device_id'] = device['id'] - # self._create_event(event_id='DEVICE_HEALTHY', - # event_data=device, - # is_internal_event=True) - # LOG.info(_LI("Sharing existing device: %s(device)s for reuse"), - # {'device': device}) - # REVISIT(TODO): Removing sharing for cisco live demo if 0: pass else: diff --git a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py index abd179fc60..2aec0500e7 100644 --- a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py +++ b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py @@ -80,7 +80,7 @@ def events_init(controller, config, service_orchestrator): for event in events: events_to_register.append( Event(id=event, handler=service_orchestrator)) - controller.register_events(events_to_register) + controller.register_events(events_to_register, module='service_orchestrator') def nfp_module_init(controller, config): @@ -854,23 +854,6 @@ def delete_user_config(self, event): event_data=request_data, is_poll_event=True, original_event=event) - def _get_network_function_instance_for_multi_service_sharing(self, - port_info): - network_function_instances = ( - self.db_handler.get_network_function_instances(self.db_session, - filters={})) - provider_port_id = None - for port in port_info: - if port['port_classification'] == 'provider': - provider_port_id = port['id'] - break - for network_function_instance in network_function_instances: - if (provider_port_id in network_function_instance['port_info'] and - network_function_instance['network_function_device_id'] - is not None): - return network_function_instance - return None - def create_network_function_instance(self, event): nfp_context = event.data @@ -893,11 +876,7 @@ def create_network_function_instance(self, event): # REVISIT(ashu): Only pick few chars from id name = '%s_%s' % (network_function['name'], network_function['id']) - network_function_instance = ( - self._get_network_function_instance_for_multi_service_sharing( - port_info)) - if network_function_instance: - port_info = [] + create_nfi_request = { 'name': name, 'tenant_id': network_function['tenant_id'], @@ -910,24 +889,6 @@ def create_network_function_instance(self, event): } nfi_db = self.db_handler.create_network_function_instance( self.db_session, create_nfi_request) - if network_function_instance: - port_info = [] - for port_id in network_function_instance['port_info']: - port_info.append(self.db_handler.get_port_info(self.db_session, - port_id)) - nfi = { - 'port_info': port_info - } - nfi_db = self.db_handler.update_network_function_instance( - self.db_session, nfi_db['id'], nfi) - nfd_data = {} - nfd_data['network_function_instance_id'] = nfi_db['id'] - nfd_data['network_function_device_id'] = ( - network_function_instance['network_function_device_id']) - self._create_event('DEVICE_ACTIVE', - event_data=nfd_data) - - return # Sending LogMeta Details to visibility self._report_logging_info(network_function, nfi_db, diff --git a/gbpservice/nfp/orchestrator/modules/sharing.py b/gbpservice/nfp/orchestrator/modules/sharing.py new file mode 100644 index 0000000000..1176a2a30e --- /dev/null +++ b/gbpservice/nfp/orchestrator/modules/sharing.py @@ -0,0 +1,104 @@ +from gbpservice.nfp.core import event as nfp_event +from gbpservice.nfp.core.event import Event +from gbpservice.nfp.core import module as nfp_api + +from gbpservice.nfp.orchestrator.modules import device_orchestrator +from gbpservice.nfp.orchestrator.drivers import sharing_driver + +import sys +import time +import traceback + +from gbpservice.nfp.core import log as nfp_logging +LOG = nfp_logging.getLogger(__name__) + + +def events_init(controller, config, orchestrator): + events = ['CREATE_NETWORK_FUNCTION_DEVICE'] + events_to_register = [] + for event in events: + events_to_register.append( + Event(id=event, handler=orchestrator)) + controller.register_events(events_to_register, module='sharing', priority=1) + + +def nfp_module_init(controller, config): + events_init(controller, config, Sharing(controller, config)) + LOG.debug("Service Sharing: module_init") + + +class Sharing(nfp_api.NfpEventHandler): + def __init__(self, controller, config): + self._controller = controller + self.config = config + self.device_orchestrator = device_orchestrator.DeviceOrchestrator(controller, config) + self.sharing_driver = sharing_driver.SharingDriver(config) + + def handle_event(self, event): + if event.id == "CREATE_NETWORK_FUNCTION_DEVICE": + self.create_network_function_device(event) + else: + LOG.error(_LE("Invalid event: %(event_id)s for " + "event data %(event_data)s"), + {'event_id': event.id, 'event_data': event.data}) + + def _get_device_to_reuse(self, device_data): + device_filters = { + 'tenant_id': [device_data['tenant_id']], + 'service_vendor': [device_data['service_details'][ + 'service_vendor']], + 'status': [nfp_constants.ACTIVE] + } + devices = self.device_orchestrator._get_network_function_devices(device_filters) + device = self.sharing_driver.select_network_function_device(devices, device_data) + return device + + def create_network_function_device(self, event): + nfp_context = event.data + LOG.info(_LI("Orchestrator's sharing module received " + " create network function " + "device request with data %(data)s"), + {'data': nfd_request}) + device_data = self.device_orchestrator._prepare_device_data_from_nfp_context(nfp_context) + + device = self._get_device_to_reuse(device_data) + if device: + device.update(device_data) + # Existing device to be shared + # Trigger an event for Service Orchestrator + device['network_function_device_id'] = device['id'] + # Create an event to NSO, to give device_id + device_created_data = { + 'network_function_instance_id': ( + nfp_context['network_function_instance']['id']), + 'network_function_device_id': device['id'] + } + self.device_orchestrator._create_event(event_id='DEVICE_CREATED', + event_data=device_created_data) + + + # Since the device is already UP, create a GRAPH so that + # further processing continues in device orchestrator + nf_id = nfp_context['network_function']['id'] + du_event = self._controller.new_event(id="DEVICE_UP", + key=nf_id, + data=nfp_context, + graph=True) + + plug_int_event = self._controller.new_event(id="PLUG_INTERFACES", + key=nf_id, + data=nfp_context, + graph=True) + + graph = nfp_event.EventGraph(du_event) + graph.add_node(plug_int_event, du_event) + + graph_event = self._controller.new_event(id="HEALTH_MONITOR_GRAPH", + graph=graph) + graph_nodes = [du_event, hc_event, plug_int_event] + self._controller.post_event_graph(graph_event, graph_nodes) + else: + # Device does not exist. + # Post this event back to device orchestrator + # It will handle as it was handling in non sharing case + self._controller.post_event(event, target='device_orchestrator') From b6bac64b34b2012218257d5aed68a72ed51aeaa6 Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Mon, 25 Jul 2016 10:32:27 +0530 Subject: [PATCH 144/157] Fix in apache2 configuration for image build --- devstack/Readme-NFP-install.txt | 17 +++++++++++------ .../contrib/diskimage-create/build_image.py | 17 +++++++++++------ .../diskimage-create/vyos/vyos_image_create.py | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/devstack/Readme-NFP-install.txt b/devstack/Readme-NFP-install.txt index 9eb1a20bfb..991fbb4e57 100644 --- a/devstack/Readme-NFP-install.txt +++ b/devstack/Readme-NFP-install.txt @@ -61,24 +61,29 @@ Build service images: Steps to get the scripts to build images # git clone -b mitaka_21st_march_base --single-branch https://github.com/oneconvergence/group-based-policy.git /home/stack/gbp_mitaka_21st_march_base +Steps to setup the diskimage build + # sudo -H -E pip install -r /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage-create/requirements.txt + # sudo apt-get install -y --force-yes qemu-utils + # sudo apt-get install -y --force-yes dpkg-dev + Steps to build VyOS service image: - # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/ + # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage-create/vyos/ # sudo python vyos_image_create.py vyos_conf.json Image location: - # /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/output/vyos.qcow2 + # /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage-create/vyos/output/vyos.qcow2 Steps to build Haproxy service image: - # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/ + # cd /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage-create/ # sudo python build_image.py haproxy_conf.json Image location: - # /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/output/haproxy.qcow2 + # /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage-create/output/haproxy.qcow2 Upload service images: ===================== Steps to upload VyOS service image: - # glance image-create --name vyos --disk-format qcow2 --container-format bare --visibility public --file /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/vyos/output/vyos.qcow2 + # glance image-create --name vyos --disk-format qcow2 --container-format bare --visibility public --file /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage-create/vyos/output/vyos.qcow2 Steps to upload Haproxy service image: - # glance image-create --name haproxy --disk-format qcow2 --container-format bare --visibility public --file /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage_create/output/haproxy.qcow2 + # glance image-create --name haproxy --disk-format qcow2 --container-format bare --visibility public --file /home/stack/gbp_mitaka_21st_march_base/gbpservice/tests/contrib/diskimage-create/output/haproxy.qcow2 diff --git a/gbpservice/tests/contrib/diskimage-create/build_image.py b/gbpservice/tests/contrib/diskimage-create/build_image.py index 8ba71b3920..bc67efbb4f 100755 --- a/gbpservice/tests/contrib/diskimage-create/build_image.py +++ b/gbpservice/tests/contrib/diskimage-create/build_image.py @@ -216,9 +216,12 @@ def dib(nfp_branch_name): elements = conf['dib']['elements'] if 'haproxy' in elements: # Enable default site in apache2 for local repo - sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/ - sudo service apache2 restart - sleep 5 + cmd = ("sudo cp" + " /etc/apache2/sites-available/000-default.conf" + " /etc/apache2/sites-enabled/") + os.system(cmd) + cmd = ("sudo service apache2 restart") + os.system(cmd) if(update_haproxy_repo()): exit() @@ -233,6 +236,8 @@ def dib(nfp_branch_name): if 'haproxy' in elements: # Disable the default site in apache2 - sudo rm /etc/apache2/sites-enabled/000-default.conf - sudo service apache2 restart - sleep 5 + cmd = ("sudo rm" + " /etc/apache2/sites-enabled/000-default.conf") + os.system(cmd) + cmd = ("sudo service apache2 restart") + os.system(cmd) diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py index 5fd3ca9488..742a844d1e 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py @@ -182,7 +182,21 @@ def get_vyos_iso(): print "ERROR: Unable to get vyos-1.1.7-amd64.iso file" exit() + # Enable default site in apache2 for local repo + cmd = ("sudo cp" + " /etc/apache2/sites-available/000-default.conf" + " /etc/apache2/sites-enabled/") + os.system(cmd) + cmd = ("sudo service apache2 restart") + os.system(cmd) if(update_vyos_repo()): exit() packer_build() + + # Disable the default site in apache2 + cmd = ("sudo rm" + " /etc/apache2/sites-enabled/000-default.conf") + os.system(cmd) + cmd = ("sudo service apache2 restart") + os.system(cmd) From fffdc3f56a39dd7119fc8f98aa30227e8afcc06f Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 25 Jul 2016 10:58:27 +0530 Subject: [PATCH 145/157] enhanced and fixed db migration --- .../versions/nfp_enterprise_db.py | 8 ++++++++ gbpservice/nfp/scripts/mode_shift.sh | 20 +++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py b/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py index 0c8fac3193..720740c516 100644 --- a/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py @@ -13,6 +13,14 @@ # under the License. # +"""nfp_enterprise_db + +Revision ID: +Revises: +Create Date: 2016-07-25 07:28:39.063889 + +""" + # revision identifiers, used by Alembic. revision = '' down_revision = '' diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index 6e76b7b954..ab2d458f8b 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -72,8 +72,10 @@ function copy_files { ssh -o "StrictHostKeyChecking no" -i configurator_vm root@$configurator_ip\ docker exec configurator\ cp -r /usr/local/lib/python2.7/dist-packages/gbpservice/contrib/nfp/configurator/config /etc/nfp_config +} - # Update the DB model +function update_db { + # Updates the DB model db_name=nfp_enterprise_db gbp-db-manage --config-file /etc/neutron/neutron.conf revision -m "$db_name" @@ -83,12 +85,17 @@ function copy_files { down_revision=$(sed -n '/revision = /p'\ $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$db_name.py |\ awk 'NR==2{print $3}') - - sed -i "s/revision = *.*/revision = $revision/"\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py - sed -i "s/down_revision = *.*/down_revision = $down_revision/"\ + + sed -i -e "s/revision = *.*/revision = $revision/" \ + -e "s/down_revision = *.*/down_revision = $down_revision/" \ + -e "s/Revision ID:*.*/Revision ID: "$(echo $revision | tr -d "'")"/" \ + -e "s/Revises:*.*/Revises: "$(echo $down_revision | tr -d "'")"/"\ $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py - + + # The sleep here is necessary as we need to give db migration script + # some time for processing the new revision file. + sleep 5 + sudo cp\ $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py\ $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$db_name.py @@ -392,6 +399,7 @@ function prepare_for_mode_shift { setup_ssh_key echo "Copy files and configure" copy_files + update_db echo "Configuring nova" nfp_configure_nova From 4db616f8b501504c9384d955f05c629024d4e3ed Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Mon, 25 Jul 2016 11:00:10 +0530 Subject: [PATCH 146/157] few changes --- gbpservice/nfp/orchestrator/modules/sharing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gbpservice/nfp/orchestrator/modules/sharing.py b/gbpservice/nfp/orchestrator/modules/sharing.py index 1176a2a30e..ce3df4a8fe 100644 --- a/gbpservice/nfp/orchestrator/modules/sharing.py +++ b/gbpservice/nfp/orchestrator/modules/sharing.py @@ -93,9 +93,9 @@ def create_network_function_device(self, event): graph = nfp_event.EventGraph(du_event) graph.add_node(plug_int_event, du_event) - graph_event = self._controller.new_event(id="HEALTH_MONITOR_GRAPH", + graph_event = self._controller.new_event(id="DEVICE_SHARE_GRAPH", graph=graph) - graph_nodes = [du_event, hc_event, plug_int_event] + graph_nodes = [du_event, plug_int_event] self._controller.post_event_graph(graph_event, graph_nodes) else: # Device does not exist. From f91fe2b8e4aff683394f8c49c70824bc2bc0619e Mon Sep 17 00:00:00 2001 From: DhuldevValekar Date: Mon, 25 Jul 2016 12:49:45 +0530 Subject: [PATCH 147/157] Added Advanced mode gate tests --- .../tests/contrib/devstack/local-nfp.conf | 31 +- gbpservice/tests/contrib/devstack/nfp | 419 +++++++++++++----- gbpservice/tests/contrib/functions-gbp | 4 +- 3 files changed, 337 insertions(+), 117 deletions(-) diff --git a/gbpservice/tests/contrib/devstack/local-nfp.conf b/gbpservice/tests/contrib/devstack/local-nfp.conf index 31061547fb..beb3f36ec2 100644 --- a/gbpservice/tests/contrib/devstack/local-nfp.conf +++ b/gbpservice/tests/contrib/devstack/local-nfp.conf @@ -6,6 +6,9 @@ RABBIT_PASSWORD=abc123 SERVICE_PASSWORD=$ADMIN_PASSWORD SERVICE_TOKEN=abc123 +ENABLE_NFP=True +NFP_DEVSTACK_MODE=advanced + Q_SERVICE_PLUGIN_CLASSES=neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,group_policy,ncp @@ -14,10 +17,10 @@ Q_SERVICE_PLUGIN_CLASSES=neutron.services.l3_router.l3_router_plugin.L3RouterPlu GIT_BASE=${GIT_BASE:-git://git.openstack.org} -GBPSERVICE_REPO=${GIT_BASE}/openstack/group-based-policy.git +#GBPSERVICE_REPO=${GIT_BASE}/openstack/group-based-policy.git #GBPSERVICE_BRANCH=master -#GBPSERVICE_REPO=https://review.openstack.org/openstack/group-based-policy -#GBPSERVICE_BRANCH=refs/changes/85/298385/154 +GBPSERVICE_REPO=https://review.openstack.org/openstack/group-based-policy +GBPSERVICE_BRANCH=refs/changes/85/298385/154 GBPCLIENT_REPO=${GIT_BASE}/openstack/python-group-based-policy-client.git GBPCLIENT_BRANCH=master @@ -46,13 +49,33 @@ enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-fwaas +[[ $ENABLE_NFP = True ]] && [[ $NFP_DEVSTACK_MODE = advanced ]] && enable_service neutron-vpnaas enable_service q-lbaas enable_service q-meta enable_service neutron enable_service group-policy disable_service tempest ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng -enable_service orchestrator,proxy,proxy_agent,base_configurator + +if [[ $ENABLE_NFP = True ]]; then + # NFP services + enable_service nfp_orchestrator + enable_service nfp_proxy + enable_service nfp_proxy_agent + [[ $NFP_DEVSTACK_MODE = base ]] && enable_service nfp_base_configurator + [[ $NFP_DEVSTACK_MODE != base ]] && enable_service nfp_config_orchestrator + [[ $NFP_DEVSTACK_MODE = advanced ]] && enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka + +fi + + +ConfiguratorQcow2Image= +VyosQcow2Image= +HaproxyQcow2Image= + + + + LOG_COLOR=False DEST=/opt/stack/new diff --git a/gbpservice/tests/contrib/devstack/nfp b/gbpservice/tests/contrib/devstack/nfp index 61629bc52d..309818917a 100644 --- a/gbpservice/tests/contrib/devstack/nfp +++ b/gbpservice/tests/contrib/devstack/nfp @@ -1,25 +1,32 @@ #!/bin/bash NEW_BASE="$BASE/new" -DISK_IMAGE_DIR=$NEW_BASE/group-based-policy/gbpservice/tests/contrib +DISKIMAGE_CREATE_DIR=$NEW_BASE/group-based-policy/gbpservice/tests/contrib/diskimage_create +DEVSTACK_DIR=$NEW_BASE/devstack +NFPSERVICE_DIR=$NEW_BASE/group-based-policy +NEUTRON_CONF_DIR=/etc/neutron +NEUTRON_CONF=$NEUTRON_CONF_DIR/neutron.conf +NFP_CONF_DIR=/etc/nfp + +ENABLE_NFP=${ENABLE_NFP:-False} + +ConfiguratorQcow2Image=${ConfiguratorQcow2Image:-build} +#VyosQcow2Image=${VyosQcow2Image:-build} +#HaproxyQcow2Image=${HaproxyQcow2Image:-build} + function prepare_nfp_image_builder { #setup_develop $NFPSERVICE_DIR - sudo -H -E pip install -r $DISK_IMAGE_DIR/diskimage-create/requirements.txt + sudo -H -E pip install -r $DISKIMAGE_CREATE_DIR/requirements.txt sudo apt-get install -y --force-yes qemu-utils -} - -function create_nfp_image { - TOP_DIR=$1 - sudo python $DISK_IMAGE_DIR/diskimage-create/disk_image_create.py $DISK_IMAGE_DIR/diskimage-create/conf.json - BUILT_IMAGE_PATH=$(cat /tmp/nfp_image_path) - upload_image file://$BUILT_IMAGE_PATH + sudo apt-get install -y --force-yes dpkg-dev + if [[ $NFP_DEVSTACK_MODE = advanced ]]; then + sudo wget -qO- https://get.docker.com/ | bash + fi - openstack --os-cloud=devstack-admin flavor create --ram 512 --disk 3 --vcpus 1 m1.nfp-tiny } function assign_user_role_credential { - TOP_DIR=$1 - source $TOP_DIR/openrc admin admin + source $DEVSTACK_DIR/openrc admin admin #set -x serviceTenantID=`keystone tenant-list | grep "service" | awk '{print $2}'` serviceRoleID=`keystone role-list | grep "service" | awk '{print $2}'` @@ -28,9 +35,197 @@ function assign_user_role_credential { keystone user-role-add --user neutron --tenant $serviceTenantID --role $adminRoleID } + + +# create_nfp_gbp_resources() - Create various GBP resources +function create_nfp_gbp_resources { + source $DEVSTACK_DIR/openrc neutron service + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + if [[ $NFP_DEVSTACK_MODE = base ]]; then + + IMAGE_NAME="reference_configurator_image" + FLAVOR=m1.nfp-tiny + + gbp service-profile-create\ + --servicetype LOADBALANCER\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=haproxy,device_type=None\ + --vendor NFP\ + base_mode_lb + + gbp service-profile-create\ + --servicetype FIREWALL\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME,flavor=$FLAVOR\ + --vendor NFP\ + base_mode_fw_vm + else + gbp service-profile-create\ + --servicetype LOADBALANCER\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=haproxy,device_type=nova\ + --vendor NFP\ + lb_profile + + gbp service-profile-create\ + --servicetype LOADBALANCERV2\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=haproxy_lbaasv2,device_type=nova,flavor=m1.small\ + --vendor NFP\ + lbv2_profile + + gbp service-profile-create\ + --servicetype FIREWALL\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=vyos,device_type=nova\ + --vendor NFP\ + vyos_fw_profile + + gbp service-profile-create\ + --servicetype VPN\ + --insertion-mode l3\ + --shared True\ + --service-flavor service_vendor=vyos,device_type=nova\ + --vendor NFP\ + vpn_profile + + gbp nsp-create\ + --network-service-params type=ip_pool,name=vip_ip,value=nat_pool\ + svc_mgmt_fip_policy + + + fi + + gbp l3policy-create\ + --ip-version 4\ + --proxy-ip-pool=192.169.0.0/24\ + --ip-pool 120.0.0.0/24\ + --subnet-prefix-length 24\ + service_management + + gbp l2policy-create\ + --l3-policy service_management\ + svc_management_ptg + + gbp group-create\ + svc_management_ptg\ + --service_management True\ + --l2-policy\ + svc_management_ptg + + neutron router-gateway-clear\ + l3p_service_management + + gbp l3policy-update\ + --external-segment ""\ + service_management + +} + +# create_port_for_vm() - Create a port, and get its details +# Args: +# $1 - image_name +# $2 - instance name +function create_port_for_vm { + GROUP="svc_management_ptg" + PortId=$(gbp policy-target-create --policy-target-group $GROUP $2 | grep port_id | awk '{print $4}') + IpAddr_extractor=`neutron port-list --format value | grep $PortId | awk '{print $7}'` + IpAddr_purge_last=${IpAddr_extractor::-1} + IpAddr=${IpAddr_purge_last//\"/} + echo "IpAddr of port($PortId): $IpAddr" + configurator_image_name=$1 + configurator_port_id=$PortId + configurator_ip=$IpAddr +} + +# create_nfp_image() - Create and upload the service images +function create_nfp_image { + source $DEVSTACK_DIR/openrc neutron service + unset OS_USER_DOMAIN_ID + unset OS_PROJECT_DOMAIN_ID + + if [[ $NFP_DEVSTACK_MODE = base ]]; then + RefConfiguratorQcow2ImageName=reference_configurator_image + echo "Building Image: $RefConfiguratorQcow2ImageName" + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/ref_configurator_conf.json + RefConfiguratorQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) + echo "Uploading Image: $RefConfiguratorQcow2ImageName" + glance image-create --name $RefConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $RefConfiguratorQcow2Image + openstack --os-cloud=devstack-admin flavor create --ram 512 --disk 3 --vcpus 1 m1.nfp-tiny + else + ConfiguratorQcow2ImageName=configurator + ConfiguratorInstanceName="configuratorVM_instance" + create_port_for_vm $ConfiguratorQcow2ImageName $ConfiguratorInstanceName + if [[ $ConfiguratorQcow2Image = build ]]; then + echo "Building Image: $ConfiguratorQcow2ImageName" + sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH + ConfiguratorQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) + fi + echo "Uploading Image: $ConfiguratorQcow2ImageName" + glance image-create --name $ConfiguratorQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $ConfiguratorQcow2Image + + VyosQcow2ImageName=vyos + if ! [[ -z $VyosQcow2Image ]]; then + echo "Uploading Image: $VyosQcow2ImageName" + glance image-create --name $VyosQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $VyosQcow2Image + fi + + HaproxyQcow2ImageName=haproxy + if ! [[ -z $HaproxyQcow2Image ]]; then + echo "Uploading Image: $HaproxyQcow2ImageName" + glance image-create --name $HaproxyQcow2ImageName --disk-format qcow2 --container-format bare --visibility public --file $HaproxyQcow2Image + fi + fi +} + +# configure_configurator_user_data() - Configure Configurator user data +function configure_configurator_user_data { + CUR_DIR=$PWD + sudo rm -rf /opt/configurator_user_data + sudo cp -r $NFPSERVICE_DIR/devstack/exercises/nfp_service/user-data/configurator_user_data /opt/. + cd /opt + sudo rm -rf my.key my.key.pub + sudo ssh-keygen -t rsa -N "" -f my.key + value=`sudo cat my.key.pub` + sudo echo $value + sudo sed -i "8 i\ -\ $value" configurator_user_data + sudo sed -i '9d' configurator_user_data + cd $CUR_DIR +} + +# launch_configuratorVM() - Launch the Configurator VM +function launch_configuratorVM { + echo "Collecting ImageId : for $configurator_image_name" + ImageId=`glance image-list | grep $configurator_image_name | awk '{print $2}'` + if [ ! -z "$ImageId" -a "$ImageId" != " " ]; then + echo $ImageId + else + echo "No image found with name $configurator_image_name" + exit + fi + + configure_configurator_user_data + nova boot\ + --flavor m1.medium\ + --user-data /opt/configurator_user_data\ + --image $ImageId\ + --nic port-id=$configurator_port_id\ + $ConfiguratorInstanceName + sleep 10 +} + + +# namespace_delete() - Utility for namespace management function namespace_delete { - TOP_DIR=$1 - source $TOP_DIR/openrc neutron service + source $DEVSTACK_DIR/openrc neutron service + #Deletion namespace NFP_P=`sudo ip netns | grep "nfp-proxy"` if [ ${#NFP_P} -ne 0 ]; then @@ -52,23 +247,20 @@ function namespace_delete { echo "ovs port ptr1 is removed" fi - echo "nfp-proxy cleaning success.... " + echo "nfp-proxy cleaning success." } +# namespace_create() - Utility for namespace management function namespace_create { - TOP_DIR=$1 - #doing it in namespace_delete, so no need to do it again - #source $1/openrc neutron service SERVICE_MGMT_NET="l2p_svc_management_ptg" - cidr="/24" echo "Creating new namespace nfp-proxy...." #new namespace with name proxy NFP_P=`sudo ip netns add nfp-proxy` if [ ${#NFP_P} -eq 0 ]; then - echo "New namepace nfp-proxt create" + echo "New namepace nfp-proxy created" else - echo "nfp-proxy creation failed" + echo "New namespace nfp-proxy creation failed" exit 0 fi @@ -86,7 +278,7 @@ function namespace_create { sudo ip link set pt0 netns nfp-proxy #create new neutron port in service mgmt network - new_ip=`neutron port-create --name nfp-proxy_port $SERVICE_MGMT_NET | grep "fixed_ips" | awk '{print $7}' | sed 's/^\"\(.*\)\"}$/\1/'` + new_ip=`neutron port-create $SERVICE_MGMT_NET | grep "fixed_ips" | awk '{print $7}' | sed 's/^\"\(.*\)\"}$/\1/'` if [ ${#new_ip} -lt 5 ]; then echo "new_ip =$new_ip" echo "Neutron port creation failed (check source) " @@ -96,7 +288,7 @@ function namespace_create { fi new_ip_cidr+="$new_ip/24" sleep 2 - + 396,1 79% #get the ip address of new port eg : 11.0.0.6 and asign to namespace sudo ip netns exec nfp-proxy ip addr add $new_ip_cidr dev pt0 @@ -112,7 +304,7 @@ function namespace_create { #get port id from router nampace port=`sudo ip netns exec $nm_space ip a | grep "tap" | tail -n 1 | awk '{print $7}'` - #get tag_id form port in ovs-bridge + #get tag_id form port in ovs-bridge tag_id=`sudo ovs-vsctl list port $port | grep "tag" | tail -n 1 | awk '{print $3}'` sudo ovs-vsctl set port pt1 tag=$tag_id @@ -122,111 +314,116 @@ function namespace_create { sudo ip netns exec nfp-proxy ip link set lo up sudo ip link set pt1 up - PING=`sudo ip netns exec nfp-proxy ping $2 -q -c 2 > /dev/null` - if [ ${#PING} -eq 0 ] - then - echo "nfp-proxy namespcace creation success and reaching to $2" + PING=`sudo ip netns exec nfp-proxy ping $configurator_ip -q -c 2 > /dev/null` + if [ ${#PING} -eq 0 ]; then + echo "nfp-proxy namespcace creation success and reaching to $configurator_ip" else - echo "Fails reaching to $2" + echo "Fails reaching to $configurator_ip" fi - sudo ip netns exec nfp-proxy /usr/bin/nfp_proxy --config-file=/etc/nfp_proxy.ini } -function create_nfp_gbp_resources { - TOP_DIR=$1 - source $TOP_DIR/openrc neutron service - IMAGE_PATH=$(cat /tmp/nfp_image_path) - IMAGE_NAME=`basename "$IMAGE_PATH"` - IMAGE_NAME_FLAT="${IMAGE_NAME%.*}" - FLAVOR=m1.nfp-tiny - - gbp network-service-policy-create --network-service-params type=ip_pool,name=vip_ip,value=nat_pool svc_mgmt_fip_policy - gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=None --vendor NFP base_mode_lb - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=None --vendor NFP base_mode_fw - gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME_FLAT,flavor=$FLAVOR --vendor NFP base_mode_fw_vm - gbp group-create svc_management_ptg --service_management True -} - -function delete_nfp_gbp_resources { - TOP_DIR=$1 - source $TOP_DIR/openrc neutron service - - neutron port-delete nfp-proxy_port - - gbp ptg-show svc_management_ptg -f value -c policy_targets - gbp ptg-show svc_management_ptg -f value -c policy_targets | xargs -I {} gbp pt-show {} - nova list - - gbp group-delete svc_management_ptg - gbp service-profile-delete base_mode_fw_vm - gbp service-profile-delete base_mode_fw - gbp service-profile-delete base_mode_lb - gbp network-service-policy-delete svc_mgmt_fip_policy -} - -function get_router_namespace { - TOP_DIR=$1 - source $TOP_DIR/openrc neutron service - - GROUP="svc_management_ptg" - echo "GroupName: $GROUP" - - l2p_id=`gbp ptg-show svc_management_ptg | grep l2_policy_id | awk '{print $4}'` - l3p_id=`gbp l2p-show $l2p_id | grep l3_policy_id | awk '{print $4}'` - RouterId=`gbp l3p-show $l3p_id | grep routers | awk '{print $4}'` -} - function copy_nfp_files_and_start_process { - TOP_DIR=$1 - cd $NEW_BASE/group-based-policy/gbpservice/nfp - sudo cp -r bin/nfp /usr/bin/ + cd $NFPSERVICE_DIR/gbpservice/nfp + sudo cp -r bin/nfp /usr/bin/ sudo chmod +x /usr/bin/nfp sudo rm -rf /etc/nfp_* - sudo cp -r bin/nfp_orchestrator.ini /etc/ - sudo cp -r bin/nfp_proxy_agent.ini /etc/ - sudo cp -r bin/nfp_proxy.ini /etc/nfp_proxy.ini - sudo cp -r bin/nfp_proxy /usr/bin/ + sudo cp -r bin/nfp_orchestrator.ini /etc/ + sudo cp -r bin/nfp_proxy_agent.ini /etc/ + [[ $NFP_DEVSTACK_MODE = advanced ]] && sudo cp -r bin/nfp_config_orch.ini /etc/ + sudo cp -r bin/nfp_proxy.ini /etc/nfp_proxy.ini + sudo cp -r bin/nfp_proxy /usr/bin/ + + if [[ $NFP_DEVSTACK_MODE = base ]]; then + configurator_ip=127.0.0.1 + configurator_port=8080 + else + configurator_ip=$configurator_ip + configurator_port=8070 + fi + echo "Configuring proxy.ini .... with rest_server_address as $configurator_ip:$configurator_port" + sudo sed -i "s/rest_server_address=*.*/rest_server_address=$configurator_ip/g" /etc/nfp_proxy.ini + sudo sed -i "s/rest_server_port= *.*/rest_server_port=$configurator_port/g" /etc/nfp_proxy.ini - IpAddr=127.0.0.1 - echo "Configuring proxy.ini .... with rest_server_address as $IpAddr" - sudo sed -i "s/rest_server_address=*.*/rest_server_address=$IpAddr/g" /etc/nfp_proxy.ini - sudo sed -i "s/rest_server_port= *.*/rest_server_port=8080/g" /etc/nfp_proxy.ini - ipnetns_router=`sudo ip netns |grep $RouterId` + sed -i 's#source.*#source '$DEVSTACK_DIR'/openrc demo demo#g' $NFPSERVICE_DIR/devstack/exercises/nfp_service/*.sh + source $DEVSTACK_DIR/functions-common - source $TOP_DIR/functions-common + echo "Starting nfp_orchestrator under screen named nfp_orchestrator" + run_process nfp_orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log" + sleep 4 - echo "Starting orchestrator >>>> under screen named : orchestrator" - run_process orchestrator "sudo /usr/bin/nfp --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log" - sleep 1 + echo "Starting nfp_proxy_agent under screen named nfp_proxy_agent" + run_process nfp_proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log" + sleep 4 - echo "Starting proxy_agent >>>> under screen named : proxy_agent" - run_process proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log" + echo "Starting nfp_proxy inside namespace named nfp-proxy, under screen named nfp_proxy" + run_process nfp_proxy "source $NFPSERVICE_DIR/devstack/lib/nfp; namespace_delete; namespace_create" + sleep 10 + if [[ $NFP_DEVSTACK_MODE = advanced ]]; then + echo "Starting nfp_config_orchestrator under screen named nfp_config_orchestrator" + run_process nfp_config_orchestrator "sudo /usr/bin/nfp --config-file /etc/nfp_config_orch.ini --config-file /etc/neutron/neutron.conf --log-file $DEST/logs/nfp_config_orchestrator.log" + else + cd pecan/api + sudo python setup.py develop + echo "Starting nfp_base_configurator under screen named nfp_base_configurator" + run_process nfp_base_configurator "cd $NFPSERVICE_DIR/gbpservice/nfp/pecan/api; sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" + fi sleep 1 - echo "Starting proxy server under Namespace : nfp-proxy namespace >>>> under screen named : proxy" - run_process proxy "source $NEW_BASE/devstack/lib/nfp;namespace_delete $TOP_DIR;namespace_create $TOP_DIR $IpAddr" - sleep 10 + echo "Upgrading DB to HEAD" + source $DEVSTACK_DIR/openrc neutron service + gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head + sleep 2 - cd pecan/api - sudo python setup.py develop - echo "Starting base_configurator >>>> under screen named : base_configurator" - run_process base_configurator "cd $NEW_BASE/group-based-policy/gbpservice/nfp/pecan/api;sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base" - sleep 1 + echo "NFP configuration done." +} - echo "Running gbp-db-manage" +function configure_nfp_loadbalancer { + echo "Configuring NFP Loadbalancer plugin driver" + sudo\ + sed\ + -i\ + '/^service_provider.*HaproxyOnHostPluginDriver:default/'\ +'s'/\ +':default'/\ +'\n'\ +'service_provider = LOADBALANCER:loadbalancer:gbpservice.nfp.service_plugins.loadbalancer.drivers.nfp_lbaas_plugin_driver.HaproxyOnVMPluginDriver:default'/\ + /etc/neutron/neutron_lbaas.conf +} - source $TOP_DIR/openrc neutron service +function configure_nfp_firewall { + echo "Configuring NFP Firewall plugin" + sudo\ + sed\ + -i\ + '/^service_plugins/'\ +'s'/\ +'neutron_fwaas.services.firewall.fwaas_plugin.FirewallPlugin'/\ +'gbpservice.nfp.service_plugins.firewall.nfp_fwaas_plugin.NFPFirewallPlugin'/\ + /etc/neutron/neutron.conf +} - gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head - sleep 2 - echo "Configuration success ... " +function configure_nfp_vpn { + echo "Configuring NFP VPN plugin driver" + sudo\ + sed\ + -i\ + '/^service_provider.*IPsecVPNDriver:default/'\ +'s'/\ +':default'/\ +'\n'\ +'service_provider = VPN:vpn:gbpservice.nfp.service_plugins.vpn.drivers.nfp_vpnaas_driver.NFPIPsecVPNDriver:default'/\ + /etc/neutron/neutron_vpnaas.conf } + + function nfp_setup { - prepare_nfp_image_builder - create_nfp_image $1 - assign_user_role_credential $1 - create_nfp_gbp_resources $1 - get_router_namespace $1 - copy_nfp_files_and_start_process $1 + if [[ $ENABLE_NFP = True ]]; then + prepare_nfp_image_builder + assign_user_role_credential + create_nfp_gbp_resources + create_nfp_image + [[ $NFP_DEVSTACK_MODE = advanced ]] && launch_configuratorVM + copy_nfp_files_and_start_process + fi } diff --git a/gbpservice/tests/contrib/functions-gbp b/gbpservice/tests/contrib/functions-gbp index 2eda412cb8..714d299ad5 100644 --- a/gbpservice/tests/contrib/functions-gbp +++ b/gbpservice/tests/contrib/functions-gbp @@ -27,11 +27,11 @@ function prepare_gbp_devstack { function prepare_nfp_devstack { cd $TOP_DIR sudo cp $CONTRIB_DIR/devstack/local-nfp.conf $TOP_DIR/local.conf - sudo rm -rf $TOP_DIR/exercises/*.sh - sudo cp $CONTRIB_DIR/devstack/exercises-nfp/*.sh $TOP_DIR/exercises/ sudo cp -r $CONTRIB_DIR/devstack/nfp-templates $TOP_DIR sudo cp $CONTRIB_DIR/devstack/nfp $TOP_DIR/lib/ sed -i 's/source $TOP_DIR\/lib\/dstat/source $TOP_DIR\/lib\/dstat\nsource $TOP_DIR\/lib\/nfp/g' stack.sh + sed -i "s/install_gbpservice/install_gbpservice\n[[ $NFP_DEVSTACK_MODE = advanced ]] && configure_nfp_loadbalancer\n[[ $NFP_DEVSTACK_MODE = advanced ]] && configure_nfp_vpn\n/g" stack.sh + sed -i "s/start_neutron_service_and_check/[[ $NFP_DEVSTACK_MODE = advanced ]] && configure_nfp_firewall\n start_neutron_service_and_check/g" stack.sh sed -i 's/# Restore\/close logging file descriptors/nfp_setup $TOP_DIR\n# Restore\/close logging file descriptors/g' stack.sh source $TOP_DIR/functions source $TOP_DIR/functions-common From 05ff4a4dbc0da30bc9a3ddc4d7af34180fcdfe23 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 25 Jul 2016 16:00:32 +0530 Subject: [PATCH 148/157] Docker build uses cached containers which can potentially lead to stale code base --- devstack/lib/nfp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index 88bc95157d..a826b47b6b 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -254,6 +254,11 @@ function create_nfp_image { ConfiguratorInstanceName="configuratorVM_instance" create_port_for_vm $ConfiguratorQcow2ImageName $ConfiguratorInstanceName if [[ $ConfiguratorQcow2Image = build ]]; then + # REVISIT(DEEPAK): Needs to optimize this. + echo "Cleaning up cached containers which may result in stale configurator code base" + sudo docker rm $(sudo docker ps -a -q) + sudo docker rmi $(sudo docker images -q) + echo "Building Image: $ConfiguratorQcow2ImageName" sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH ConfiguratorQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) From 3898e4325ab9ca8392a629900ce05b818580a8d1 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 25 Jul 2016 17:48:18 +0530 Subject: [PATCH 149/157] optimized docker cache logic --- devstack/lib/nfp | 5 ----- gbpservice/contrib/nfp/configurator/Dockerfile | 3 +++ .../tests/contrib/diskimage-create/disk_image_create.py | 4 +++- .../contrib/diskimage-create/visibility_disk_image_create.py | 4 +++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/devstack/lib/nfp b/devstack/lib/nfp index a826b47b6b..88bc95157d 100644 --- a/devstack/lib/nfp +++ b/devstack/lib/nfp @@ -254,11 +254,6 @@ function create_nfp_image { ConfiguratorInstanceName="configuratorVM_instance" create_port_for_vm $ConfiguratorQcow2ImageName $ConfiguratorInstanceName if [[ $ConfiguratorQcow2Image = build ]]; then - # REVISIT(DEEPAK): Needs to optimize this. - echo "Cleaning up cached containers which may result in stale configurator code base" - sudo docker rm $(sudo docker ps -a -q) - sudo docker rmi $(sudo docker images -q) - echo "Building Image: $ConfiguratorQcow2ImageName" sudo python $DISKIMAGE_CREATE_DIR/disk_image_create.py $DISKIMAGE_CREATE_DIR/configurator_conf.json $GBPSERVICE_BRANCH ConfiguratorQcow2Image=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path) diff --git a/gbpservice/contrib/nfp/configurator/Dockerfile b/gbpservice/contrib/nfp/configurator/Dockerfile index b3cd198d88..f4892c1554 100644 --- a/gbpservice/contrib/nfp/configurator/Dockerfile +++ b/gbpservice/contrib/nfp/configurator/Dockerfile @@ -43,6 +43,9 @@ RUN cur_dir=$PWD RUN cd /pan-python && sudo ./setup.py install RUN cd $cur_dir +# Cache buster +ARG CACHE_DATE=2016-07-25:15:20:10 + RUN git clone -b stable/mitaka --single-branch https://github.com/openstack/neutron-lib.git neutron_lib RUN cp -r /neutron_lib/neutron_lib /usr/local/lib/python2.7/dist-packages/ RUN git clone -b stable/mitaka --single-branch https://github.com/openstack/neutron.git neutron diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py index d3fe131a7b..0944403807 100755 --- a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py @@ -44,7 +44,9 @@ def create_configurator_docker(nfp_branch_name): # create a docker image os.chdir(configurator_dir) set_nfp_git_branch(nfp_branch_name, configurator_dir) - docker_args = ['docker', 'build', '-t', 'configurator-docker', '.'] + docker_args = ['docker', 'build', '--build-arg', + 'CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S)', + '-t', 'configurator-docker', '.'] ret = subprocess.call(docker_args) if(ret): print("Failed to build docker image [configurator-docker]") diff --git a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py index 31d508af71..f15d4fa060 100755 --- a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py @@ -84,7 +84,9 @@ def create_configurator_docker(nfp_branch_name): # create a docker image os.chdir(configurator_dir) set_nfp_git_branch(nfp_branch_name, configurator_dir) - docker_args = ['docker', 'build', '-t', 'configurator-docker', '.'] + docker_args = ['docker', 'build', '--build-arg', + 'CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S)', + '-t', 'configurator-docker', '.'] ret = subprocess.call(docker_args) if(ret): print "Failed to build docker image [configurator-docker]" From 306475225492c25778bae63ae18154b39676c556 Mon Sep 17 00:00:00 2001 From: dpaks Date: Mon, 25 Jul 2016 20:57:58 +0530 Subject: [PATCH 150/157] cache buster --- gbpservice/contrib/nfp/configurator/Dockerfile | 2 +- .../tests/contrib/diskimage-create/disk_image_create.py | 4 +--- .../contrib/diskimage-create/visibility_disk_image_create.py | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/gbpservice/contrib/nfp/configurator/Dockerfile b/gbpservice/contrib/nfp/configurator/Dockerfile index f4892c1554..64724e32c1 100644 --- a/gbpservice/contrib/nfp/configurator/Dockerfile +++ b/gbpservice/contrib/nfp/configurator/Dockerfile @@ -44,7 +44,7 @@ RUN cd /pan-python && sudo ./setup.py install RUN cd $cur_dir # Cache buster -ARG CACHE_DATE=2016-07-25:15:20:10 +ADD https://www.random.org/strings/?num=10&len=8&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new cache-buster RUN git clone -b stable/mitaka --single-branch https://github.com/openstack/neutron-lib.git neutron_lib RUN cp -r /neutron_lib/neutron_lib /usr/local/lib/python2.7/dist-packages/ diff --git a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py index 0944403807..d3fe131a7b 100755 --- a/gbpservice/tests/contrib/diskimage-create/disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/disk_image_create.py @@ -44,9 +44,7 @@ def create_configurator_docker(nfp_branch_name): # create a docker image os.chdir(configurator_dir) set_nfp_git_branch(nfp_branch_name, configurator_dir) - docker_args = ['docker', 'build', '--build-arg', - 'CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S)', - '-t', 'configurator-docker', '.'] + docker_args = ['docker', 'build', '-t', 'configurator-docker', '.'] ret = subprocess.call(docker_args) if(ret): print("Failed to build docker image [configurator-docker]") diff --git a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py index f15d4fa060..31d508af71 100755 --- a/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/visibility_disk_image_create.py @@ -84,9 +84,7 @@ def create_configurator_docker(nfp_branch_name): # create a docker image os.chdir(configurator_dir) set_nfp_git_branch(nfp_branch_name, configurator_dir) - docker_args = ['docker', 'build', '--build-arg', - 'CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S)', - '-t', 'configurator-docker', '.'] + docker_args = ['docker', 'build', '-t', 'configurator-docker', '.'] ret = subprocess.call(docker_args) if(ret): print "Failed to build docker image [configurator-docker]" From 0f39171fc7926ff35e2ba6e4ffad7d66d2a206f9 Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Mon, 25 Jul 2016 21:16:52 +0530 Subject: [PATCH 151/157] fixed bugs and tested,modified CREATE_NETWORK_FUNCTION_DEVICE to be serialized on servicechain_node, bug: creating multiple service_chain parallely not orking creating multiple vm ,need to fix that --- gbpservice/nfp/core/event.py | 8 ++-- .../drivers/orchestration_driver.py | 2 - .../orchestrator/drivers/sharing_driver.py | 32 +++++++++++-- .../modules/device_orchestrator.py | 9 +++- .../modules/service_orchestrator.py | 13 +++-- .../nfp/orchestrator/modules/sharing.py | 47 ++++++++++++------- 6 files changed, 81 insertions(+), 30 deletions(-) diff --git a/gbpservice/nfp/core/event.py b/gbpservice/nfp/core/event.py index ef82fa826b..6278fedbf9 100644 --- a/gbpservice/nfp/core/event.py +++ b/gbpservice/nfp/core/event.py @@ -308,13 +308,13 @@ def register(self, event_id, event_handler, module='', priority=0): try: try: self._event_desc_table[event_id]['modules'][module].append( - (event_handler, poll_handler, spacing)] + (event_handler, poll_handler, spacing)) except KeyError: self._event_desc_table[event_id]['modules'][module] = [ (event_handler, poll_handler, spacing)] try: self._event_desc_table[event_id]['priority'][priority].append( - (event_handler, poll_handler, spacing)] + (event_handler, poll_handler, spacing)) except KeyError: self._event_desc_table[event_id]['priority'][priority] = [ (event_handler, poll_handler, spacing)] @@ -348,7 +348,9 @@ def get_poll_handler(self, event_id): """Get the poll handler for event_id. """ ph = None try: - ph = self._event_desc_table[event_id][0][1] + priorities = self._event_desc_table[event_id]['priority'].keys() + priority = max(priorities) + ph = self._event_desc_table[event_id]['priority'][priority][0][1] finally: message = "%s - Returning poll handler" % ( self._log_meta(event_id, ph)) diff --git a/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py b/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py index c883d27666..dbd2eab138 100644 --- a/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py +++ b/gbpservice/nfp/orchestrator/drivers/orchestration_driver.py @@ -293,8 +293,6 @@ def _get_vendor_data_fast(self, token, {'image_name': image_name, 'error': e}) return None vendor_data = self._verify_vendor_data(image_name, metadata) - if not vendor_data: - return None return vendor_data def _update_self_with_vendor_data(self, vendor_data, attr): diff --git a/gbpservice/nfp/orchestrator/drivers/sharing_driver.py b/gbpservice/nfp/orchestrator/drivers/sharing_driver.py index 157fb47876..623532d9cc 100644 --- a/gbpservice/nfp/orchestrator/drivers/sharing_driver.py +++ b/gbpservice/nfp/orchestrator/drivers/sharing_driver.py @@ -1,7 +1,13 @@ +from gbpservice.nfp.common import constants as nfp_constants +from gbpservice.nfp.common import exceptions from gbpservice.nfp.orchestrator.drivers import orchestration_driver -class SharingDriver(OrchestrationDriver): - def select_network_function_device(self, devices, device_data): + +class SharingDriver(orchestration_driver.OrchestrationDriver): + + @orchestration_driver._set_network_handler + def select_network_function_device(self, devices, + device_data, network_handler=None): """ Select a NFD which is eligible for sharing :param devices: NFDs @@ -59,6 +65,26 @@ def select_network_function_device(self, devices, device_data): # device already has VPN service instantiated, ignore this # device and checks for next one continue + admin_tenant_id = device_data['admin_tenant_id'] + image_name = super(SharingDriver, self)._get_image_name( + device_data) + vendor_data = super(SharingDriver, self)._get_vendor_data_fast( + token, + admin_tenant_id, + image_name, + device_data) + device['vendor_data'] = vendor_data + return device return None - + + @orchestration_driver._set_network_handler + def get_managment_info(self, device_data, network_handler=None): + port_id = network_handler.get_port_id(device_data['token'], + device_data['mgmt_port_id'][ + 'id']) + managemt_info = super( + SharingDriver, self).get_neutron_port_details(network_handler, + device_data['token'], + port_id) + return managemt_info diff --git a/gbpservice/nfp/orchestrator/modules/device_orchestrator.py b/gbpservice/nfp/orchestrator/modules/device_orchestrator.py index e8f5064fce..1c2b980537 100644 --- a/gbpservice/nfp/orchestrator/modules/device_orchestrator.py +++ b/gbpservice/nfp/orchestrator/modules/device_orchestrator.py @@ -661,7 +661,7 @@ def create_network_function_device(self, event): nfp_context['network_function_instance']['id']), 'network_function_device_id': device['id'] } - + nfp_context['event_desc'] = event.desc.to_dict() self._create_event(event_id='DEVICE_SPAWNING', event_data=nfp_context, is_poll_event=True, @@ -722,6 +722,11 @@ def check_device_is_up(self, event): # [REVISIT(mak)] to handle a very corner case where # PLUG_INTERFACES completes later than HEALTHMONITOR. # till proper fix is identified. + nfd_event = self._controller.new_event(id='CREATE_NETWORK_FUNCTION_DEVICE', + key=nfp_context['network_function']['id'], + binding_key=nfp_context['service_chain_node']['id'], + desc_dict=nfp_context['event_desc']) + self._controller.event_complete(nfd_event) provider = nfp_context['provider']['ptg'] consumer = nfp_context['consumer']['ptg'] network_function_device = nfp_context['network_function_device'] @@ -1235,7 +1240,7 @@ def _prepare_failure_case_device_data(self, nfp_context): def handle_plug_interface_failed(self, event): nfp_context = event.data device = self._prepare_failure_case_device_data(nfp_context) - status = nfp_constants.ERROR + status = nfp_constants.ACTIVE desc = "Failed to plug interfaces" self._update_network_function_device_db(device, status, desc) self._create_event(event_id='DEVICE_CREATE_FAILED', diff --git a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py index 2aec0500e7..72b3cf6324 100644 --- a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py +++ b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py @@ -897,9 +897,16 @@ def create_network_function_instance(self, event): nfp_context['network_function_instance'] = nfi_db - LOG.info(_LI("[Event:CreateService]")) - self._create_event('CREATE_NETWORK_FUNCTION_DEVICE', - event_data=nfp_context) + LOG.info(_LI("[Event:CreateService]")), + binding_key = nfp_context['service_chain_node']['id'] + + ev = self._controller.new_event( + id='CREATE_NETWORK_FUNCTION_DEVICE', + data=nfp_context, + binding_key=binding_key, + key=network_function['id'], + serialize=True) + self._controller.post_event(ev) def handle_device_created(self, event): request_data = event.data diff --git a/gbpservice/nfp/orchestrator/modules/sharing.py b/gbpservice/nfp/orchestrator/modules/sharing.py index ce3df4a8fe..5e15b5729f 100644 --- a/gbpservice/nfp/orchestrator/modules/sharing.py +++ b/gbpservice/nfp/orchestrator/modules/sharing.py @@ -1,14 +1,13 @@ +from neutron._i18n import _LE +from neutron._i18n import _LI from gbpservice.nfp.core import event as nfp_event from gbpservice.nfp.core.event import Event from gbpservice.nfp.core import module as nfp_api from gbpservice.nfp.orchestrator.modules import device_orchestrator +from gbpservice.nfp.common import constants as nfp_constants from gbpservice.nfp.orchestrator.drivers import sharing_driver -import sys -import time -import traceback - from gbpservice.nfp.core import log as nfp_logging LOG = nfp_logging.getLogger(__name__) @@ -19,7 +18,8 @@ def events_init(controller, config, orchestrator): for event in events: events_to_register.append( Event(id=event, handler=orchestrator)) - controller.register_events(events_to_register, module='sharing', priority=1) + controller.register_events( + events_to_register, module='sharing', priority=1) def nfp_module_init(controller, config): @@ -28,10 +28,12 @@ def nfp_module_init(controller, config): class Sharing(nfp_api.NfpEventHandler): + def __init__(self, controller, config): self._controller = controller self.config = config - self.device_orchestrator = device_orchestrator.DeviceOrchestrator(controller, config) + self.device_orchestrator = device_orchestrator.DeviceOrchestrator( + controller, config) self.sharing_driver = sharing_driver.SharingDriver(config) def handle_event(self, event): @@ -39,8 +41,8 @@ def handle_event(self, event): self.create_network_function_device(event) else: LOG.error(_LE("Invalid event: %(event_id)s for " - "event data %(event_data)s"), - {'event_id': event.id, 'event_data': event.data}) + "event data %(event_data)s"), + {'event_id': event.id, 'event_data': event.data}) def _get_device_to_reuse(self, device_data): device_filters = { @@ -49,18 +51,21 @@ def _get_device_to_reuse(self, device_data): 'service_vendor']], 'status': [nfp_constants.ACTIVE] } - devices = self.device_orchestrator._get_network_function_devices(device_filters) - device = self.sharing_driver.select_network_function_device(devices, device_data) + devices = self.device_orchestrator._get_network_function_devices( + device_filters) + device = self.sharing_driver.select_network_function_device( + devices, device_data) return device - + def create_network_function_device(self, event): nfp_context = event.data LOG.info(_LI("Orchestrator's sharing module received " " create network function " "device request with data %(data)s"), - {'data': nfd_request}) - device_data = self.device_orchestrator._prepare_device_data_from_nfp_context(nfp_context) - + {'data': nfp_context}) + device_data = ( + self.device_orchestrator._prepare_device_data_from_nfp_context( + nfp_context)) device = self._get_device_to_reuse(device_data) if device: device.update(device_data) @@ -73,9 +78,16 @@ def create_network_function_device(self, event): nfp_context['network_function_instance']['id']), 'network_function_device_id': device['id'] } - self.device_orchestrator._create_event(event_id='DEVICE_CREATED', - event_data=device_created_data) - + self.device_orchestrator._create_event( + event_id='DEVICE_CREATED', + event_data=device_created_data) + nfp_context['network_function_device'] = device + nfp_context['vendor_data'] = device['vendor_data'] + management_info = self.sharing_driver.get_managment_info(device) + management = nfp_context['management'] + management['port'] = management_info['neutron_port'] + management['port']['ip_address'] = management_info['ip_address'] + management['subnet'] = management_info['neutron_subnet'] # Since the device is already UP, create a GRAPH so that # further processing continues in device orchestrator @@ -97,6 +109,7 @@ def create_network_function_device(self, event): graph=graph) graph_nodes = [du_event, plug_int_event] self._controller.post_event_graph(graph_event, graph_nodes) + self._controller.event_complete(event) else: # Device does not exist. # Post this event back to device orchestrator From 63b5eb4d5185f8df1c49ac3ea58eff0dc3189f41 Mon Sep 17 00:00:00 2001 From: DhuldevValekar Date: Tue, 26 Jul 2016 10:42:57 +0530 Subject: [PATCH 152/157] Added Advanced mode gate tests --- gbpservice/tests/contrib/devstack/local-nfp.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gbpservice/tests/contrib/devstack/local-nfp.conf b/gbpservice/tests/contrib/devstack/local-nfp.conf index beb3f36ec2..0a1dca2f84 100644 --- a/gbpservice/tests/contrib/devstack/local-nfp.conf +++ b/gbpservice/tests/contrib/devstack/local-nfp.conf @@ -7,7 +7,7 @@ SERVICE_PASSWORD=$ADMIN_PASSWORD SERVICE_TOKEN=abc123 ENABLE_NFP=True -NFP_DEVSTACK_MODE=advanced +NFP_DEVSTACK_MODE=base Q_SERVICE_PLUGIN_CLASSES=neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,group_policy,ncp @@ -20,7 +20,7 @@ GIT_BASE=${GIT_BASE:-git://git.openstack.org} #GBPSERVICE_REPO=${GIT_BASE}/openstack/group-based-policy.git #GBPSERVICE_BRANCH=master GBPSERVICE_REPO=https://review.openstack.org/openstack/group-based-policy -GBPSERVICE_BRANCH=refs/changes/85/298385/154 +GBPSERVICE_BRANCH=refs/changes/05/335405/72 GBPCLIENT_REPO=${GIT_BASE}/openstack/python-group-based-policy-client.git GBPCLIENT_BRANCH=master @@ -63,7 +63,7 @@ if [[ $ENABLE_NFP = True ]]; then enable_service nfp_proxy enable_service nfp_proxy_agent [[ $NFP_DEVSTACK_MODE = base ]] && enable_service nfp_base_configurator - [[ $NFP_DEVSTACK_MODE != base ]] && enable_service nfp_config_orchestrator + [[ $NFP_DEVSTACK_MODE = advanced ]] && enable_service nfp_config_orchestrator [[ $NFP_DEVSTACK_MODE = advanced ]] && enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas stable/mitaka fi From 46893dd29a84571f3cee182b63735728abdac4cf Mon Sep 17 00:00:00 2001 From: Rajendra Machani Date: Tue, 26 Jul 2016 12:31:33 +0530 Subject: [PATCH 153/157] Removed last_built_image_path reference --- gbpservice/tests/contrib/diskimage-create/build_image.py | 2 -- .../tests/contrib/diskimage-create/vyos/vyos_image_create.py | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/gbpservice/tests/contrib/diskimage-create/build_image.py b/gbpservice/tests/contrib/diskimage-create/build_image.py index bc67efbb4f..6f9b178933 100755 --- a/gbpservice/tests/contrib/diskimage-create/build_image.py +++ b/gbpservice/tests/contrib/diskimage-create/build_image.py @@ -190,8 +190,6 @@ def dib(nfp_branch_name): if not ret: image_path = "%s/output/%s.qcow2" % (cur_dir, image_name) print("Image location: %s" % image_path) - with open("%s/output/last_built_image_path" % cur_dir, "w") as f: - f.write(image_path) if __name__ == "__main__": diff --git a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py index 742a844d1e..45b4c0668d 100644 --- a/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py +++ b/gbpservice/tests/contrib/diskimage-create/vyos/vyos_image_create.py @@ -84,12 +84,10 @@ def packer_build(): image_path = "%s/output/%s.qcow2" % (cur_dir, "vyos") print("Image location: %s" % image_path) - with open("%s/../output/last_built_image_path" % cur_dir, "w") as f: - f.write(image_path) - f.close() return + def check_packer_tool(): if(os.path.isfile("/usr/local/bin/packer")): return 0 From 9cbe05e5b8703ca07025c3730ebb6b71f2fb572f Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Tue, 26 Jul 2016 12:59:12 +0530 Subject: [PATCH 154/157] corrected creating multiple service chain with same node parallely.pending: creating multiple service chain sharing same vm --- .../modules/device_orchestrator.py | 31 +++++++++++-------- .../nfp/orchestrator/modules/sharing.py | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/gbpservice/nfp/orchestrator/modules/device_orchestrator.py b/gbpservice/nfp/orchestrator/modules/device_orchestrator.py index 1c2b980537..2624252f5e 100644 --- a/gbpservice/nfp/orchestrator/modules/device_orchestrator.py +++ b/gbpservice/nfp/orchestrator/modules/device_orchestrator.py @@ -65,7 +65,8 @@ def events_init(controller, config, device_orchestrator): for event in events: events_to_register.append( Event(id=event, handler=device_orchestrator)) - controller.register_events(events_to_register, module='device_orchestrator') + controller.register_events(events_to_register, + module='device_orchestrator') def nfp_module_init(controller, config): @@ -722,11 +723,6 @@ def check_device_is_up(self, event): # [REVISIT(mak)] to handle a very corner case where # PLUG_INTERFACES completes later than HEALTHMONITOR. # till proper fix is identified. - nfd_event = self._controller.new_event(id='CREATE_NETWORK_FUNCTION_DEVICE', - key=nfp_context['network_function']['id'], - binding_key=nfp_context['service_chain_node']['id'], - desc_dict=nfp_context['event_desc']) - self._controller.event_complete(nfd_event) provider = nfp_context['provider']['ptg'] consumer = nfp_context['consumer']['ptg'] network_function_device = nfp_context['network_function_device'] @@ -807,6 +803,22 @@ def device_up(self, event): for result in results: if result.result.lower() != 'success': return self._controller.event_complete(event, result='FAILED') + network_function_device = nfp_context['network_function_device'] + self._update_network_function_device_db( + network_function_device, nfp_constants.ACTIVE) + LOG.info(_LI( + "Device Configuration completed for device: %(device_id)s" + "Updated DB status to ACTIVE, Incremented device " + "reference count for %(device)s"), + {'device_id': network_function_device['id'], + 'device': network_function_device}) + + nfd_event = self._controller.new_event( + id='CREATE_NETWORK_FUNCTION_DEVICE', + key=nfp_context['network_function']['id'], + binding_key=nfp_context['service_chain_node']['id'], + desc_dict=nfp_context.pop('event_desc')) + self._controller.event_complete(nfd_event) self._post_configure_device_graph(nfp_context) self._controller.event_complete(event) @@ -1089,13 +1101,6 @@ def device_configuration_complete(self, event, result='SUCCESS'): if result.lower() == 'success': self._increment_device_ref_count(device) - self._update_network_function_device_db( - device, nfp_constants.ACTIVE) - LOG.info(_LI( - "Device Configuration completed for device: %(device_id)s" - "Updated DB status to ACTIVE, Incremented device " - "reference count for %(device)s"), - {'device_id': device['id'], 'device': device}) # Invoke event_complete for original event which is # CREATE_DEVICE_CONFIGURATION diff --git a/gbpservice/nfp/orchestrator/modules/sharing.py b/gbpservice/nfp/orchestrator/modules/sharing.py index 5e15b5729f..b10399306e 100644 --- a/gbpservice/nfp/orchestrator/modules/sharing.py +++ b/gbpservice/nfp/orchestrator/modules/sharing.py @@ -92,6 +92,7 @@ def create_network_function_device(self, event): # Since the device is already UP, create a GRAPH so that # further processing continues in device orchestrator nf_id = nfp_context['network_function']['id'] + nfp_context['event_desc'] = event.desc.to_dict() du_event = self._controller.new_event(id="DEVICE_UP", key=nf_id, data=nfp_context, @@ -109,7 +110,6 @@ def create_network_function_device(self, event): graph=graph) graph_nodes = [du_event, plug_int_event] self._controller.post_event_graph(graph_event, graph_nodes) - self._controller.event_complete(event) else: # Device does not exist. # Post this event back to device orchestrator From a9bc711b1928b9cb5a6a87e47b58a8aa19fd3f96 Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Tue, 26 Jul 2016 13:34:52 +0530 Subject: [PATCH 155/157] fixed bug for plug_interface count exceeding max value --- gbpservice/nfp/orchestrator/drivers/sharing_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/nfp/orchestrator/drivers/sharing_driver.py b/gbpservice/nfp/orchestrator/drivers/sharing_driver.py index 623532d9cc..2fb561710b 100644 --- a/gbpservice/nfp/orchestrator/drivers/sharing_driver.py +++ b/gbpservice/nfp/orchestrator/drivers/sharing_driver.py @@ -74,7 +74,7 @@ def select_network_function_device(self, devices, image_name, device_data) device['vendor_data'] = vendor_data - + device['interfaces_in_use'] += hotplug_ports_count return device return None From f2cde4323286c7e7de938e292c565648d9ec4e17 Mon Sep 17 00:00:00 2001 From: mak-454 Date: Wed, 27 Jul 2016 18:52:13 +0530 Subject: [PATCH 156/157] corrected a comment on target variable --- gbpservice/nfp/core/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gbpservice/nfp/core/event.py b/gbpservice/nfp/core/event.py index 6278fedbf9..d19bb7d204 100644 --- a/gbpservice/nfp/core/event.py +++ b/gbpservice/nfp/core/event.py @@ -186,7 +186,7 @@ def __init__(self, **kwargs): self.worker = kwargs.get('worker') # Polling descriptor of event self.poll_desc = kwargs.get('poll_desc') - # Target module of this event + # Target module to which this event must be delivered self.target = None def from_desc(self, desc): From f9a17c49f53e98afb29be7eadad10bc40e792b47 Mon Sep 17 00:00:00 2001 From: Akash Deep Date: Thu, 28 Jul 2016 14:39:39 +0530 Subject: [PATCH 157/157] merge changes of 21st march to it --- .../contrib/nfp/bin/nfp_configurator.ini | 1 + .../firewall/nfp_fwaas_plugin.py | 83 ++++++++++++++----- .../drivers/nfp_lbaas_plugin_driver.py | 18 +++- .../drivers/nfp_lbaasv2_plugin_driver.py | 5 +- .../vpn/drivers/nfp_vpnaas_driver.py | 31 +++---- .../versions/54ee8e8d205a_nfp_db.py | 7 +- .../unit/nfp/orchestrator/test_heat_driver.py | 25 +++++- .../config_drivers/heat_driver.py | 3 +- .../nfp_enterprise_db.py | 0 .../modules/service_orchestrator.py | 4 +- gbpservice/nfp/scripts/README.txt | 20 ++++- gbpservice/nfp/scripts/mode_shift.sh | 4 +- gbpservice/tests/contrib/functions-gbp | 2 + 13 files changed, 144 insertions(+), 59 deletions(-) rename gbpservice/{neutron/db/migration/alembic_migrations/versions => nfp/orchestrator/db/enterprise_migration}/nfp_enterprise_db.py (100%) diff --git a/gbpservice/contrib/nfp/bin/nfp_configurator.ini b/gbpservice/contrib/nfp/bin/nfp_configurator.ini index 6efbc4db26..a11a79d513 100644 --- a/gbpservice/contrib/nfp/bin/nfp_configurator.ini +++ b/gbpservice/contrib/nfp/bin/nfp_configurator.ini @@ -20,3 +20,4 @@ periodic_interval=2 log_forward_ip_address= log_forward_port=514 log_level=debug + diff --git a/gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin.py b/gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin.py index 11a882ed74..b2adf780ea 100644 --- a/gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin.py +++ b/gbpservice/contrib/nfp/service_plugins/firewall/nfp_fwaas_plugin.py @@ -1,27 +1,38 @@ -from neutron.api.v2 import attributes as attr +# 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 keystoneclient import exceptions as k_exceptions +from keystoneclient.v2_0 import client as keyclient + +from gbpservice.contrib.nfp.config_orchestrator.common import topics +from gbpservice.common import utils +import netaddr from neutron import context as neutron_context +from neutron.api.v2 import attributes as attr from neutron.common import constants as l3_constants -from neutron import manager -#from neutron.common import common as n_topics from neutron.common import exceptions as n_exc -from neutron.db import models_v2 from neutron.db import l3_db -from neutron.db.l3_db import ( - RouterPort, EXTERNAL_GW_INFO, DEVICE_OWNER_ROUTER_INTF) -from neutron.plugins.common import constants as n_const -import netaddr -from oslo_config import cfg -from oslo_utils import uuidutils -from sqlalchemy import orm +from neutron.db.l3_db import DEVICE_OWNER_ROUTER_INTF +from neutron.db.l3_db import EXTERNAL_GW_INFO +from neutron.db.l3_db import RouterPort +from neutron.db import models_v2 +from neutron.extensions import l3 -from gbpservice.contrib.nfp.config_orchestrator.common import topics import neutron_fwaas.extensions from neutron_fwaas.services.firewall import fwaas_plugin as ref_fw_plugin - -from neutron_fwaas.db.firewall import ( - firewall_router_insertion_db as ref_fw_router_ins_db) -from neutron_fwaas.db.firewall import firewall_db as n_firewall +from oslo_config import cfg +from oslo_utils import excutils +from sqlalchemy import orm class NFPFirewallPlugin(ref_fw_plugin.FirewallPlugin): @@ -92,6 +103,9 @@ def _is_net_reachable_from_net(self, context, tenant_id, from_net_id, @param to_net_id: the destination network for the search @return: True or False whether a path exists """ + original_context = context + context = elevate_context(context) + tenant_id = context.tenant_id def nexthop_nets_query(nets, visited): """query networks connected to devices on nets but not visited.""" Port = models_v2.Port @@ -107,11 +121,14 @@ def nexthop_nets_query(nets, visited): nets = set([from_net_id]) while nets: if to_net_id in nets: + context = original_context return True visited |= nets nets = set((tup[0] for tup in nexthop_nets_query(nets, visited))) + context = original_context return False + def _find_net_for_nexthop(self, context, tenant_id, router_id, nexthop): """Find the network to which the nexthop belongs. @@ -123,7 +140,7 @@ def _find_net_for_nexthop(self, context, tenant_id, router_id, nexthop): @return: the network id of the nexthop or None if not found """ interfaces = context.session.query(models_v2.Port).filter_by( - # tenant_id=tenant_id, + tenant_id=tenant_id, device_id=router_id, device_owner=DEVICE_OWNER_ROUTER_INTF) for interface in interfaces: @@ -133,6 +150,7 @@ def _find_net_for_nexthop(self, context, tenant_id, router_id, nexthop): if netaddr.all_matching_cidrs(nexthop, cidrs): return interface['network_id'] + def _find_routers_via_routes_for_floatingip(self, context, internal_port, internal_subnet_id, external_network_id): @@ -153,6 +171,8 @@ def _find_routers_via_routes_for_floatingip(self, context, internal_port, @param external_network_id: the network of the floatingip @return: a sorted list of matching routers """ + original_context = context + context = elevate_context(context) internal_ip_address = [ ip['ip_address'] for ip in internal_port['fixed_ips'] if ip['subnet_id'] == internal_subnet_id @@ -168,7 +188,7 @@ def _find_routers_via_routes_for_floatingip(self, context, internal_port, gw_info = router.get(EXTERNAL_GW_INFO) if not gw_info or gw_info['network_id'] != external_network_id: continue - # find a matching route + # find a matching route if 'routes' not in router: continue cidr_nexthops = {} @@ -184,20 +204,39 @@ def _find_routers_via_routes_for_floatingip(self, context, internal_port, continue # validate that there exists a path to "internal_port" for nexthop in cidr_nexthops[smallest_cidr]: - net_id = self._find_net_for_nexthop(context, tenant_id, + net_id = self._find_net_for_nexthop(context, context.tenant_id, router['id'], nexthop) if net_id and self._is_net_reachable_from_net( context, - tenant_id, + context.tenant_id, net_id, internal_port['network_id']): prefix_routers.append( (smallest_cidr.prefixlen, router['id'])) break - - + context = original_context return [p_r[1] for p_r in sorted(prefix_routers, reverse=True)] +def elevate_context(context): + context = context.elevated() + context.tenant_id = _resource_owner_tenant_id() + return context + + +def _resource_owner_tenant_id(): + user, pwd, tenant, auth_url = utils.get_keystone_creds() + keystoneclient = keyclient.Client(username=user, password=pwd, + auth_url=auth_url) + try: + tenant = keystoneclient.tenants.find(name=tenant) + return tenant.id + except k_exceptions.NotFound: + with excutils.save_and_reraise_exception(reraise=True): + LOG.error(_LE('No tenant with name %s exists.'), tenant) + except k_exceptions.NoUniqueMatch: + with excutils.save_and_reraise_exception(reraise=True): + LOG.error(_LE('Multiple tenants matches found for %s'), tenant) + def _get_router_for_floatingip(self, context, internal_port, internal_subnet_id, diff --git a/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py b/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py index d53bfe4b49..7d1c6fd9d1 100644 --- a/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py +++ b/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaas_plugin_driver.py @@ -1,7 +1,18 @@ +# 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 gbpservice.contrib.nfp.config_orchestrator.common import topics -from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy import ( - haproxy_lb_driver -) +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v1.haproxy\ + import haproxy_lb_driver from neutron_lbaas.services.loadbalancer.drivers.common import ( agent_driver_base as adb ) @@ -16,4 +27,3 @@ def __init__(self, plugin): adb.q_const.AGENT_TYPE_LOADBALANCER = 'NFP Loadbalancer agent' super(HaproxyOnVMPluginDriver, self).__init__(plugin) - diff --git a/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py b/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py index fa96b52fac..aa6b50cb98 100644 --- a/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py +++ b/gbpservice/contrib/nfp/service_plugins/loadbalancer/drivers/nfp_lbaasv2_plugin_driver.py @@ -11,9 +11,8 @@ # under the License. from gbpservice.contrib.nfp.config_orchestrator.common import topics -from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy import ( - haproxy_driver -) +from gbpservice.contrib.nfp.configurator.drivers.loadbalancer.v2.haproxy\ + import haproxy_driver from neutron_lbaas.drivers.common import agent_driver_base as adb diff --git a/gbpservice/contrib/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py b/gbpservice/contrib/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py index 9f64d55cfe..323a5bde47 100644 --- a/gbpservice/contrib/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py +++ b/gbpservice/contrib/nfp/service_plugins/vpn/drivers/nfp_vpnaas_driver.py @@ -14,20 +14,19 @@ import time from gbpservice.contrib.nfp.config_orchestrator.common import topics -from neutron_lib import exceptions +from gbpservice.nfp.core import log as nfp_logging from neutron.common import rpc as n_rpc from neutron.db import agents_db from neutron.db import agentschedulers_db from neutron import manager -from neutron_vpnaas.services.vpn.plugin import VPNPlugin +from neutron_lib import exceptions from neutron_vpnaas.services.vpn.plugin import VPNDriverPlugin +from neutron_vpnaas.services.vpn.plugin import VPNPlugin from neutron_vpnaas.services.vpn.service_drivers import base_ipsec -from oslo_log import log as logging import oslo_messaging -LOG = logging.getLogger(__name__) - +LOG = nfp_logging.getLogger(__name__) BASE_VPN_VERSION = '1.0' AGENT_TYPE_VPN = 'NFP Vpn agent' ACTIVE = 'ACTIVE' @@ -93,7 +92,7 @@ def _is_agent_hosting_vpnservice(self, agent): def _get_agent_hosting_vpnservice(self, admin_context, vpnservice_id): filters = {'agent_type': [AGENT_TYPE_VPN]} agents = manager.NeutronManager.get_plugin().get_agents( - admin_context, filters=filters) + admin_context, filters=filters) try: for agent in agents: @@ -109,10 +108,11 @@ def _get_agent_hosting_vpnservice(self, admin_context, vpnservice_id): if not agent['alive']: continue return agent - except: + except Exception: raise VPNAgentNotFound() - LOG.error(_('No active vpn agent found. Configuration will fail.')) + msg = ('No active vpn agent found. Configuration will fail.') + LOG.error(msg) raise VPNAgentHostingServiceNotFound(vpnservice_id=vpnservice_id) def _agent_notification(self, context, method, vpnservice_id, @@ -124,10 +124,12 @@ def _agent_notification(self, context, method, vpnservice_id, vpn_agent = self._get_agent_hosting_vpnservice( admin_context, vpnservice_id) - LOG.debug(_('Notify agent at %(topic)s.%(host)s the message ' - '%(method)s %(args)s'), { - 'topic': self.topic, 'host': vpn_agent['host'], - 'method': method, 'args': kwargs}) + msg = (('Notify agent at %(topic)s.%(host)s the message ' + '%(method)s %(args)s') + % {'topic': self.topic, + 'host': vpn_agent['host'], + 'method': method, 'args': kwargs}) + LOG.debug(msg) cctxt = self.client.prepare(server=vpn_agent['host'], version=version) @@ -141,8 +143,9 @@ def vpnservice_updated(self, context, vpnservice_id, **kwargs): self._agent_notification( context, 'vpnservice_updated', vpnservice_id, **kwargs) - except: - LOG.error(_('Notifying agent failed')) + except Exception: + msg = ('Notifying agent failed') + LOG.error(msg) class NFPIPsecVPNDriver(base_ipsec.BaseIPsecVPNDriver): diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py b/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py index 4184baab65..74f6023837 100644 --- a/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py +++ b/gbpservice/neutron/db/migration/alembic_migrations/versions/54ee8e8d205a_nfp_db.py @@ -13,15 +13,16 @@ # under the License. # -"""nfp_db +""" nfp_db + Revision ID: 54ee8e8d205a -Revises: 3791adbf0045 +Revises: 31b399f08b1c """ # revision identifiers, used by Alembic. revision = '54ee8e8d205a' -down_revision = '3791adbf0045' +down_revision = '31b399f08b1c' from alembic import op diff --git a/gbpservice/neutron/tests/unit/nfp/orchestrator/test_heat_driver.py b/gbpservice/neutron/tests/unit/nfp/orchestrator/test_heat_driver.py index 6ee96f25a1..4ed9785cba 100644 --- a/gbpservice/neutron/tests/unit/nfp/orchestrator/test_heat_driver.py +++ b/gbpservice/neutron/tests/unit/nfp/orchestrator/test_heat_driver.py @@ -19,8 +19,9 @@ from gbpclient.v2_0 import client as gbp_client from gbpservice.neutron.tests.unit.nfp.orchestrator import mock_dicts -from gbpservice.nfp.orchestrator.config_drivers\ - import heat_client as heat_client +from gbpservice.nfp.core import log as nfp_logging +from gbpservice.nfp.orchestrator.config_drivers import ( + heat_client as heat_client) from gbpservice.nfp.orchestrator.config_drivers import heat_driver from neutronclient.v2_0 import client as neutron_client @@ -118,9 +119,11 @@ def test_get_heat_client(self, mock_obj): keystone_client.auth_token = True self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) - resource_owner_tenant_id = '8ae6701128994ab281dde6b92207bb19' + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) + tenant_id = '8ae6701128994ab281dde6b92207bb19' heat_client_obj = self.heat_driver_obj._get_heat_client( - resource_owner_tenant_id, tenant_id=None) + tenant_id) self.assertIsNotNone(heat_client_obj) @mock.patch.object(identity_client, "Client") @@ -315,6 +318,8 @@ def test_delete_config(self, mock_obj, heat_get_mock_obj, heat_get_mock_obj.return_value = MockStackObject('DELETE_COMPLETE') self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) instance = mock_obj.return_value instance.auth_token = True @@ -329,6 +334,8 @@ def test_is_config_complete(self, mock_obj, heat_get_mock_obj): tenant_id = '8ae6701128994ab281dde6b92207bb19' self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) self.heat_driver_obj.loadbalancer_post_stack_create = mock.Mock( return_value=None) heat_get_mock_obj.return_value = MockStackObject( @@ -348,6 +355,8 @@ def test_is_config_delete_complete(self, identity_mock_obj, tenant_id = '8ae6701128994ab281dde6b92207bb19' self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) heat_get_mock_obj.return_value = MockStackObject( 'DELETE_COMPLETE') identity_mock_obj.return_value.auth_token = "1234" @@ -487,6 +496,8 @@ def test_update( 'CREATE_COMPLETE') self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) auth_token = 'dasddasda' resource_owner_tenant_id = '8ae6701128994ab281dde6b92207bb19' provider = self.mock_dict.provider_ptg @@ -537,6 +548,8 @@ def test_handle_consumer_ptg_operations( 'CREATE_COMPLETE') self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) service_details = {} service_details['service_profile'] = self.mock_dict.service_profile @@ -576,6 +589,8 @@ def test_handle_policy_target_operations( 'CREATE_COMPLETE') self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) service_details = {} service_details['service_profile'] = self.mock_dict.lb_service_profile @@ -616,6 +631,8 @@ def test_apply_config( 'CREATE_COMPLETE') self.heat_driver_obj._assign_admin_user_to_project = mock.Mock( return_value=None) + nfp_logging.get_logging_context = mock.Mock( + return_value={'auth_token': '7fd6701128994ab281ccb6b92207bb15'}) service_details = {} service_details['service_profile'] = self.mock_dict.service_profile diff --git a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py index 242f4d7fcd..09dd2000bf 100644 --- a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py +++ b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py @@ -249,8 +249,7 @@ def loadbalancer_post_stack_create(self, network_function_details): def _post_stack_create(self, nfp_context): service_details = self.get_service_details_from_nfp_context( nfp_context) - service_details = service_details['service_details'] - service_type = service_details['service_type'] + service_type = service_details['service_details']['service_type'] if service_type in [pconst.LOADBALANCER]: logging_context = nfp_logging.get_logging_context() diff --git a/gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py b/gbpservice/nfp/orchestrator/db/enterprise_migration/nfp_enterprise_db.py similarity index 100% rename from gbpservice/neutron/db/migration/alembic_migrations/versions/nfp_enterprise_db.py rename to gbpservice/nfp/orchestrator/db/enterprise_migration/nfp_enterprise_db.py diff --git a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py index 72b3cf6324..c19efc1519 100644 --- a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py +++ b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py @@ -1409,7 +1409,7 @@ def handle_user_config_applied(self, event): def handle_config_applied(self, event): nfp_context = event.data['nfp_context'] base_mode = nfp_context['base_mode'] - network_function_id = nfp_context['network_function']['id'] + network_function_id = event.data['network_function_id'] if base_mode: network_function = { 'status': nfp_constants.ACTIVE, @@ -1424,7 +1424,7 @@ def handle_config_applied(self, event): network_function_id}) else: network_function_instance_id = ( - nfp_context['network_function_instance']['id']) + event.data['network_function_instance_id']) if network_function_instance_id: nfi = { 'status': nfp_constants.ACTIVE, diff --git a/gbpservice/nfp/scripts/README.txt b/gbpservice/nfp/scripts/README.txt index 918d9c320f..6e180b4e2d 100644 --- a/gbpservice/nfp/scripts/README.txt +++ b/gbpservice/nfp/scripts/README.txt @@ -1,18 +1,32 @@ -Steps to shift the advanced mode to enterprise mode: -=================================================== + +Steps to shift from NFP to NSD: +=============================== + +Pre-requisite: +-------------- +NFP should be installed on the setup by following instructions from +gbpservice/devstack/Readme-NFP-install.txt + +Steps: +------ (1) Get the enterprise source # ENTERPRISE_BRANCH=mitaka_21st_march_base # git clone -b $ENTERPRISE_BRANCH --single-branch https://github.com/oneconvergence/group-based-policy.git /home/stack/gbp_$ENTERPRISE_BRANCH (2) Configure the /home/stack/gbp_$ENTERPRISE_BRANCH/gbpservice/nfp/config/mode_shift.conf + Specify the path where the devstack git code is cloned. # DEVSTACK_SRC_DIR= - For shifting to enterprise, + Specify the following details of visibility # VISIBILITY_GIT_BRANCH=master # GIT_ACCESS_USERNAME= # GIT_ACCESS_PASSWORD= # DOCKER_IMAGES_URL=http://192.168.100.50/docker_images/ + + Specification of the following image location is optional. If specified, + these images will be uploaded to Openstack glance. Otherwise, user has + to manually upload these image. # AsavQcow2Image= # PaloAltoQcow2Image= diff --git a/gbpservice/nfp/scripts/mode_shift.sh b/gbpservice/nfp/scripts/mode_shift.sh index ab2d458f8b..1c924bfec2 100644 --- a/gbpservice/nfp/scripts/mode_shift.sh +++ b/gbpservice/nfp/scripts/mode_shift.sh @@ -90,14 +90,14 @@ function update_db { -e "s/down_revision = *.*/down_revision = $down_revision/" \ -e "s/Revision ID:*.*/Revision ID: "$(echo $revision | tr -d "'")"/" \ -e "s/Revises:*.*/Revises: "$(echo $down_revision | tr -d "'")"/"\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp/orchestrator/db/enterprise_migration/$db_name.py # The sleep here is necessary as we need to give db migration script # some time for processing the new revision file. sleep 5 sudo cp\ - $ENTERPRISE_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/$db_name.py\ + $ENTERPRISE_NFPSERVICE_DIR/gbpservice/nfp/orchestrator/db/enterprise_migration/$db_name.py\ $INSTALLED_NFPSERVICE_DIR/gbpservice/neutron/db/migration/alembic_migrations/versions/*$db_name.py gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head diff --git a/gbpservice/tests/contrib/functions-gbp b/gbpservice/tests/contrib/functions-gbp index 714d299ad5..49ca1cc36b 100644 --- a/gbpservice/tests/contrib/functions-gbp +++ b/gbpservice/tests/contrib/functions-gbp @@ -27,6 +27,8 @@ function prepare_gbp_devstack { function prepare_nfp_devstack { cd $TOP_DIR sudo cp $CONTRIB_DIR/devstack/local-nfp.conf $TOP_DIR/local.conf + sudo rm -rf $TOP_DIR/exercises/*.sh + sudo cp $CONTRIB_DIR/devstack/exercises-nfp/*.sh $TOP_DIR/exercises/ sudo cp -r $CONTRIB_DIR/devstack/nfp-templates $TOP_DIR sudo cp $CONTRIB_DIR/devstack/nfp $TOP_DIR/lib/ sed -i 's/source $TOP_DIR\/lib\/dstat/source $TOP_DIR\/lib\/dstat\nsource $TOP_DIR\/lib\/nfp/g' stack.sh