From 83bdd289312dc44d7d21712b22242c5056c9d8ff Mon Sep 17 00:00:00 2001 From: Nikolay Mahotkin Date: Wed, 30 Mar 2016 15:54:29 +0300 Subject: [PATCH] Adding F5 based LBaaS murano app * Adding F5 BIG IP LTM driver source code * Adding a script for fast building murano package Change-Id: Ic6c05378eed1490545fce9bba3ead768003aac50 --- murano-apps/F5-based-LBaaS/.gitignore | 1 + murano-apps/F5-based-LBaaS/build_package.sh | 36 ++ .../package/Classes/F5BigIPLTM.yaml | 64 +++ .../package/Resources/DeployF5Driver.template | 18 + .../Resources/scripts/deployF5Driver.sh | 13 + .../scripts/f5-lbaas-append.conf.sample | 4 + .../scripts/f5_lbaas_driver-0.0.1/AUTHORS | 1 + .../scripts/f5_lbaas_driver-0.0.1/ChangeLog | 8 + .../scripts/f5_lbaas_driver-0.0.1/PKG-INFO | 13 + .../scripts/f5_lbaas_driver-0.0.1/README.md | 2 + .../f5_lbaas_driver.egg-info/PKG-INFO | 13 + .../f5_lbaas_driver.egg-info/SOURCES.txt | 16 + .../dependency_links.txt | 1 + .../f5_lbaas_driver.egg-info/entry_points.txt | 3 + .../f5_lbaas_driver.egg-info/not-zip-safe | 1 + .../f5_lbaas_driver.egg-info/pbr.json | 1 + .../f5_lbaas_driver.egg-info/requires.txt | 3 + .../f5_lbaas_driver.egg-info/top_level.txt | 1 + .../f5_lbaas_driver/__init__.py | 0 .../f5_lbaas_driver/f5ltm.py | 376 ++++++++++++++++++ .../f5_lbaas_driver-0.0.1/requirements.txt | 3 + .../scripts/f5_lbaas_driver-0.0.1/setup.cfg | 31 ++ .../scripts/f5_lbaas_driver-0.0.1/setup.py | 30 ++ murano-apps/F5-based-LBaaS/package/UI/ui.yaml | 104 +++++ murano-apps/F5-based-LBaaS/package/logo.png | Bin 0 -> 7815 bytes .../F5-based-LBaaS/package/manifest.yaml | 24 ++ 26 files changed, 767 insertions(+) create mode 100644 murano-apps/F5-based-LBaaS/.gitignore create mode 100755 murano-apps/F5-based-LBaaS/build_package.sh create mode 100644 murano-apps/F5-based-LBaaS/package/Classes/F5BigIPLTM.yaml create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/DeployF5Driver.template create mode 100755 murano-apps/F5-based-LBaaS/package/Resources/scripts/deployF5Driver.sh create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5-lbaas-append.conf.sample create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/AUTHORS create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/ChangeLog create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/PKG-INFO create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/README.md create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/PKG-INFO create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/SOURCES.txt create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/dependency_links.txt create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/entry_points.txt create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/not-zip-safe create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/pbr.json create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/requires.txt create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/top_level.txt create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver/__init__.py create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver/f5ltm.py create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/requirements.txt create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.cfg create mode 100644 murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.py create mode 100644 murano-apps/F5-based-LBaaS/package/UI/ui.yaml create mode 100644 murano-apps/F5-based-LBaaS/package/logo.png create mode 100644 murano-apps/F5-based-LBaaS/package/manifest.yaml diff --git a/murano-apps/F5-based-LBaaS/.gitignore b/murano-apps/F5-based-LBaaS/.gitignore new file mode 100644 index 0000000..3bc1cb3 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/.gitignore @@ -0,0 +1 @@ +F5_based_LBaaS.zip diff --git a/murano-apps/F5-based-LBaaS/build_package.sh b/murano-apps/F5-based-LBaaS/build_package.sh new file mode 100755 index 0000000..1b57a2c --- /dev/null +++ b/murano-apps/F5-based-LBaaS/build_package.sh @@ -0,0 +1,36 @@ +# Stop the script if an error occurs. +set -e + +function cleanup { + cd $SCRIPTPATH + rm -rf tmp +} + +# In case if script is running not where it is located. +cd $(dirname $0) +SCRIPTPATH=`pwd` + +# Cleanup tmp dir on script exit. +trap 'cleanup' EXIT + +mkdir tmp + +pushd package + cp -v -r Classes Resources UI manifest.yaml logo.png ../tmp/ +popd + +archive_name=f5-lbaas-driver.tar.gz +f5_directory_name=f5_lbaas_driver-0.0.1 + +# Pack python tarball. +pushd tmp/Resources/scripts + tar -czvf $archive_name $f5_directory_name/* + base64 $archive_name > $archive_name.bs64 + rm -rf $f5_directory_name + rm -rf $archive_name +popd + +# Make murano package. +pushd tmp + zip -r ../F5_based_LBaaS.zip . +popd diff --git a/murano-apps/F5-based-LBaaS/package/Classes/F5BigIPLTM.yaml b/murano-apps/F5-based-LBaaS/package/Classes/F5BigIPLTM.yaml new file mode 100644 index 0000000..856247d --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Classes/F5BigIPLTM.yaml @@ -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. + +Namespaces: + =: io.murano.apps.lbaas + std: io.murano + sys: io.murano.system + + +Name: F5BigIPLTM + +Extends: LBaaS + +Properties: + host: + Contract: $.string().notNull() + + username: + Contract: $.string().notNull() + + password: + Contract: $.string().notNull() + +Methods: + .init: + Body: + - $.implementation: f5ltm + + installLBaaS: + Arguments: + - implementation: + Contract: $.string().notNull() + Body: + - $lbaas: $.super($.installLBaaS($implementation)) + + - $resources: new(sys:Resources) + - $template: $resources.yaml('DeployF5Driver.template') + - $.environment.reporter.report($this, 'Installing F5 driver for LBaaS...') + - $.instance.agent.call($template, $resources) + - $.environment.reporter.report($this, 'F5 driver is installed.') + + - Return: $lbaas + + getOptionalConfig: + Body: + - Return: + - section: lbaas_f5 + key: host + value: $.host + - section: lbaas_f5 + key: username + value: $.username + - section: lbaas_f5 + key: password + value: $.password diff --git a/murano-apps/F5-based-LBaaS/package/Resources/DeployF5Driver.template b/murano-apps/F5-based-LBaaS/package/Resources/DeployF5Driver.template new file mode 100644 index 0000000..54a1894 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/DeployF5Driver.template @@ -0,0 +1,18 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Deploy F5 Driver + +Body: | + return F5DriverDeploy().stdout + +Scripts: + F5DriverDeploy: + Type: Application + Version: 1.0.0 + EntryPoint: deployF5Driver.sh + Files: + - + - f5-lbaas-append.conf.sample + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/deployF5Driver.sh b/murano-apps/F5-based-LBaaS/package/Resources/scripts/deployF5Driver.sh new file mode 100755 index 0000000..913f67e --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/deployF5Driver.sh @@ -0,0 +1,13 @@ +# Fail script if an error occurs. +set -e +# TODO(nmakhotkin): It should be removed in the future after fixing the bug: +# TODO(nmakhotkin): https://bugs.launchpad.net/murano/+bug/1561522 +# TODO(nmakhotkin): Here should be used pure tar.gz archive instead of base64-encoded. +base64 --decode f5-lbaas-driver.tar.gz.bs64 > f5-lbaas-driver.tar.gz + +# Installing LBaaS API. +sudo pip install f5-lbaas-driver.tar.gz + +# Adding a new config section to main config. +cat f5-lbaas-append.conf.sample >> /etc/lbaas/lbaas.conf + diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5-lbaas-append.conf.sample b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5-lbaas-append.conf.sample new file mode 100644 index 0000000..caf22b7 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5-lbaas-append.conf.sample @@ -0,0 +1,4 @@ +[lbaas_f5] +host = host +username = user +password = password \ No newline at end of file diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/AUTHORS b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/AUTHORS new file mode 100644 index 0000000..d3a46a0 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/AUTHORS @@ -0,0 +1 @@ +Nikolay Mahotkin diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/ChangeLog b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/ChangeLog new file mode 100644 index 0000000..f189edb --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/ChangeLog @@ -0,0 +1,8 @@ +CHANGES +======= + +* Fixing issues +* Restrict requirements.txt +* Added AUTHORS and ChangeLog +* Initial version of F5 BIG LTM driver for LBaaS API +* Initial commit diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/PKG-INFO b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/PKG-INFO new file mode 100644 index 0000000..8b2e1f3 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/PKG-INFO @@ -0,0 +1,13 @@ +Metadata-Version: 1.0 +Name: f5_lbaas_driver +Version: 0.0.1.dev4 +Summary: LBaaS Project +Home-page: UNKNOWN +Author: Mirantis Inc. +Author-email: nmakhotkin@mirantis.com +License: Apache License, Version 2.0 +Description: # f5-lbaas-driver + F5 BIG IP LTM implementation for lbaas-api + + +Platform: UNKNOWN diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/README.md b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/README.md new file mode 100644 index 0000000..cd27467 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/README.md @@ -0,0 +1,2 @@ +# f5-lbaas-driver +F5 BIG IP LTM implementation for lbaas-api diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/PKG-INFO b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/PKG-INFO new file mode 100644 index 0000000..8fe0347 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/PKG-INFO @@ -0,0 +1,13 @@ +Metadata-Version: 1.0 +Name: f5-lbaas-driver +Version: 0.0.1.dev4 +Summary: LBaaS Project +Home-page: UNKNOWN +Author: Mirantis Inc. +Author-email: nmakhotkin@mirantis.com +License: Apache License, Version 2.0 +Description: # f5-lbaas-driver + F5 BIG IP LTM implementation for lbaas-api + + +Platform: UNKNOWN diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/SOURCES.txt b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/SOURCES.txt new file mode 100644 index 0000000..10913f3 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/SOURCES.txt @@ -0,0 +1,16 @@ +AUTHORS +ChangeLog +README.md +requirements.txt +setup.cfg +setup.py +f5_lbaas_driver/__init__.py +f5_lbaas_driver/f5ltm.py +f5_lbaas_driver.egg-info/PKG-INFO +f5_lbaas_driver.egg-info/SOURCES.txt +f5_lbaas_driver.egg-info/dependency_links.txt +f5_lbaas_driver.egg-info/entry_points.txt +f5_lbaas_driver.egg-info/not-zip-safe +f5_lbaas_driver.egg-info/pbr.json +f5_lbaas_driver.egg-info/requires.txt +f5_lbaas_driver.egg-info/top_level.txt \ No newline at end of file diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/dependency_links.txt b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/entry_points.txt b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/entry_points.txt new file mode 100644 index 0000000..2151fe4 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/entry_points.txt @@ -0,0 +1,3 @@ +[lbaas.drivers] +f5ltm = f5_lbaas_driver.f5ltm:F5Driver + diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/not-zip-safe b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/pbr.json b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/pbr.json new file mode 100644 index 0000000..49fff46 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/pbr.json @@ -0,0 +1 @@ +{"is_release": false, "git_version": "5e3cafd"} \ No newline at end of file diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/requires.txt b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/requires.txt new file mode 100644 index 0000000..0fbb4ba --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/requires.txt @@ -0,0 +1,3 @@ +f5-sdk>=0.1 +requests!=2.9.0,>=2.8.1 +oslo.config>=3.7.0 diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/top_level.txt b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/top_level.txt new file mode 100644 index 0000000..92f9629 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver.egg-info/top_level.txt @@ -0,0 +1 @@ +f5_lbaas_driver diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver/__init__.py b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver/f5ltm.py b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver/f5ltm.py new file mode 100644 index 0000000..cbac26e --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/f5_lbaas_driver/f5ltm.py @@ -0,0 +1,376 @@ +# Copyright 2016 - Mirantis, Inc. +# +# 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 + +from f5 import bigip +from oslo_config import cfg +from oslo_log import log as logging +import requests + +from lbaas import config +from lbaas.drivers import base + +bigip_opts = [ + cfg.StrOpt('host', help='BIG IP host.'), + cfg.StrOpt('username', help='BIG IP username'), + cfg.StrOpt('password', help='BIG IP password') +] +CONF = cfg.CONF +CONF.register_opts(bigip_opts, group='lbaas_f5') +LOG = logging.getLogger(__name__) + +config.read_config() + + +class F5Driver(base.LoadBalancerDriver): + def __init__(self): + self.bigip = bigip.BigIP( + CONF.lbaas_f5.host, + CONF.lbaas_f5.username, + CONF.lbaas_f5.password + ).ltm + + @staticmethod + def _install_cert(path, name): + requests.post( + url='https://%s/mgmt/tm/sys/crypto/cert' % CONF.lbaas_f5.host, + data=json.dumps( + { + "fromLocalFile": path, + "name": name, + "command": "install" + } + ), + verify=False, + auth=(CONF.lbaas_f5.username, CONF.lbaas_f5.password), + headers={ + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + ) + + @staticmethod + def _install_key(path, name): + requests.post( + url='https://%s/mgmt/tm/sys/crypto/key' + % CONF.lbaas_f5.host, + data=json.dumps( + { + "fromLocalFile": path, + "name": name, + "command": "install" + } + ), + verify=False, + auth=(CONF.lbaas_f5.username, CONF.lbaas_f5.password), + headers={ + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + ) + + def _create_or_update_ssl_profile(self, name, key_name, cert_name, + options, ciphers): + profile_resp = requests.get( + url='https://%s/mgmt/tm/ltm/profile/client-ssl/%s' + % (CONF.lbaas_f5.host, name), + auth=(CONF.lbaas_f5.username, CONF.lbaas_f5.password), + verify=False + ) + + if profile_resp.status_code == 404: + return self._create_ssl_profile( + name, + key_name, + cert_name, + options, + ciphers + ) + else: + return self._update_ssl_profile( + name, + key_name, + cert_name, + options, + ciphers + ) + + @staticmethod + def _create_ssl_profile(name, key_name, cert_name, + options=None, ciphers=None): + url = ( + 'https://%s/mgmt/tm/ltm/profile/client-ssl' % CONF.lbaas_f5.host + ) + + data = { + "name": name, + "cert": cert_name, + "key": key_name + } + + if options: + data['options'] = options + + if ciphers: + data['ciphers'] = ciphers + + resp = requests.post( + url=url, + data=json.dumps(data), + verify=False, + auth=(CONF.lbaas_f5.username, CONF.lbaas_f5.password), + headers={ + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + ) + + return resp.json() + + @staticmethod + def _update_ssl_profile(name, key_name, cert_name, + options=None, ciphers=None): + url = ( + 'https://%s/mgmt/tm/ltm/profile/client-ssl/%s' + % (CONF.lbaas_f5.host, name) + ) + + data = { + "cert": cert_name, + "key": key_name + } + + if options: + data['options'] = options + + if ciphers: + data['ciphers'] = ciphers + + resp = requests.put( + url=url, + data=json.dumps(data), + verify=False, + auth=(CONF.lbaas_f5.username, CONF.lbaas_f5.password), + headers={ + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + ) + + return resp.json() + + def _assign_ssl_profile(self, ssl_info): + if not ssl_info: + return + + # In this case, need to install the cert, + # the key and the new SSL profile. + path = ssl_info['path'] + options = ssl_info.get('options', '') + ciphers = ssl_info.get('ciphers', '') + + name = path.split('/')[-1].split('.')[0] + + # Install the cert and the key. + self._install_cert(path, name) + self._install_key(path, name) + + # Create a client SSL profile. + return self._create_or_update_ssl_profile( + name, + "%s.key" % name, + "%s.crt" % name, + options, + ciphers + ) + + @staticmethod + def _find_member_by_description(pool, mem_description): + all_members = pool.members_s.get_collection() + + for mem in all_members: + # Search by name. + if mem.description == mem_description: + return mem + + def create_listener(self, listener): + ssl_profile = self._assign_ssl_profile(listener.ssl_info) + + if not listener.algorithm: + listener.algorithm = 'round-robin' + + if not listener.address: + listener.address = '0.0.0.0' + + # Create a new pool associated with current virtual server. + # Assign default ICMP monitor. + self.bigip.pools.pool.create( + name='pool-%s' % listener.name, + loadBalancingMode=listener.algorithm, + monitor='gateway_icmp' + ) + + kwargs = { + 'name': 'virtual-%s' % listener.name, + 'pool': 'pool-%s' % listener.name, + 'destination': '%s:%s' % ( + listener.address, + listener.protocol_port + ), + 'ipProtocol': listener.protocol + } + + if ssl_profile: + kwargs['profiles'] = [{ + 'context': 'clientside', + 'name': ssl_profile['name'] + }] + + # Create a new virtual server. + self.bigip.virtuals.virtual.create(**kwargs) + + return listener + + def delete_listener(self, listener): + pool = self.bigip.pools.pool.load(name='pool-%s' % listener.name) + virtual = self.bigip.virtuals.virtual.load( + name='virtual-%s' % listener.name + ) + + virtual.delete() + pool.delete() + + def apply_changes(self): + pass + + def delete_member(self, member): + # Delete pool member. + pool = self.bigip.pools.pool.load( + name='pool-%s' % member.listener.name, + ) + + # Get parent node. + node = self._get_node_by_address(member.address) + + # Find given member in current pool. + mem = self._find_member_by_description( + pool, + '%s' % member.name + ) + + mem.delete() + + # Try to delete parent node. + try: + node.delete() + except Exception as e: + # In case if parent node is still used by any other pool member. + LOG.warning(e) + + def _get_node_by_address(self, address): + nodes = self.bigip.nodes.get_collection() + + filtered = list(filter(lambda x: x.address == address, nodes)) + + return None if not filtered else filtered[0] + + def create_member(self, member): + # Try to get parent node if it already exists. + node = self._get_node_by_address(member.address) + + if not node: + # Create a new node. + node = self.bigip.nodes.node.create( + # params + name='%s' % member.address, + address=member.address, + monitor="default", + partition='Common' + ) + + pool = self.bigip.pools.pool.load( + name='pool-%s' % member.listener.name, + ) + + # Create a new member in current pool. + pool.members_s.members.create( + name='%s:%s' % (node.name, member.protocol_port), + partition='Common', + description=member.name + ) + + return member + + def update_listener(self, listener): + ssl_profile = self._assign_ssl_profile(listener.ssl_info) + + if not listener.algorithm: + listener.algorithm = 'round-robin' + + # Get the pool associated with current virtual server. + pool = self.bigip.pools.pool.load( + name='pool-%s' % listener.name, + ) + + virtual = self.bigip.virtuals.virtual.load( + name='virtual-%s' % listener.name + ) + + # potential values that could be changed: + # pool: algorithm, + # virtual: address, protocol_port, protocol, + # address, protocol, protocol_port, algorithm, options, ssl_info. + + destination = '%s:%s' % (listener.address, listener.protocol_port) + update_virtual = ( + destination not in virtual.destination or + virtual.ipProtocol != listener.protocol or + ssl_profile + ) + update_pool = pool.loadBalancingMode != listener.algorithm + + if update_virtual: + # Update the virtual server. + kwargs = { + 'destination': '%s:%s' % ( + listener.address, + listener.protocol_port + ), + 'ipProtocol': listener.protocol + } + + if ssl_profile: + kwargs['profiles'] = [{ + 'context': 'clientside', + 'name': ssl_profile['name'] + }] + + virtual.update(**kwargs) + + if update_pool: + # Update the pool. + pool.update( + loadBalancingMode=listener.algorithm + ) + + return listener + + def update_member(self, member): + # Replace member on another one. + self.delete_member(member) + + self.create_member(member) + + return member diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/requirements.txt b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/requirements.txt new file mode 100644 index 0000000..c075308 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/requirements.txt @@ -0,0 +1,3 @@ +f5-sdk>=0.1 +requests!=2.9.0,>=2.8.1 # Apache-2.0 +oslo.config>=3.7.0 # Apache-2.0 diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.cfg b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.cfg new file mode 100644 index 0000000..13a1105 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.cfg @@ -0,0 +1,31 @@ +[metadata] +name = f5_lbaas_driver +summary = LBaaS Project +description-file = + README.md +license = Apache License, Version 2.0 +classifiers = + Programming Language :: Python + Programming Language :: Python :: 2 + Programming Language :: Python :: 2.7 + Environment :: OpenStack + Intended Audience :: Information Technology + Intended Audience :: System Administrators + #License :: OSI Approved :: Apache Software License + Operating System :: POSIX :: Linux +author = Mirantis Inc. +author-email = nmakhotkin@mirantis.com + +[files] +packages = + f5_lbaas_driver + +[entry_points] +lbaas.drivers = + f5ltm = f5_lbaas_driver.f5ltm:F5Driver + +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + diff --git a/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.py b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.py new file mode 100644 index 0000000..0f35626 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/Resources/scripts/f5_lbaas_driver-0.0.1/setup.py @@ -0,0 +1,30 @@ +# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT +import setuptools + +# In python < 2.7.4, a lazy loading of package `pbr` will break +# setuptools if some other modules registered functions in `atexit`. +# solution from: http://bugs.python.org/issue15881#msg170215 +try: + import multiprocessing # noqa +except ImportError: + pass + +setuptools.setup( + setup_requires=['pbr>=1.8'], + pbr=True +) diff --git a/murano-apps/F5-based-LBaaS/package/UI/ui.yaml b/murano-apps/F5-based-LBaaS/package/UI/ui.yaml new file mode 100644 index 0000000..65fbc84 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/UI/ui.yaml @@ -0,0 +1,104 @@ +Version: 2 + +Application: + ?: + type: io.murano.apps.lbaas.F5BigIPLTM + name: $.appConfiguration.name + host: $.bigIPconfiguration.host + username: $.bigIPconfiguration.username + password: $.bigIPconfiguration.password + instance: + ?: + type: io.murano.resources.LinuxMuranoInstance + name: generateHostname($.instanceConfiguration.unitNamingPattern, 1) + flavor: $.instanceConfiguration.flavor + image: $.instanceConfiguration.osImage + keyname: $.instanceConfiguration.keyPair + availabilityZone: $.instanceConfiguration.availabilityZone + assignFloatingIp: $.appConfiguration.assignFloatingIP + +Forms: + - bigIPconfiguration: + fields: + - name: username + type: string + label: BIG IP username + initial: 'admin' + - name: password + type: string + label: BIG IP password + initial: 'admin' + - name: host + type: string + label: BIG IP host + + - appConfiguration: + fields: + - name: name + type: string + label: Application Name + initial: 'F5 BIG IP based LBaaS' + description: >- + Enter a desired name for the application. Just A-Z, a-z, 0-9, dash and + underline are allowed + - name: assignFloatingIP + type: boolean + label: Assign Floating IP + description: >- + Select to true to assign floating IP automatically + initial: true + required: false + widgetMedia: + css: {all: ['muranodashboard/css/checkbox.css']} + + - instanceConfiguration: + fields: + - name: title + type: string + required: false + hidden: true + description: Specify some instance parameters on which the application would be created + - name: flavor + type: flavor + label: Instance flavor + description: >- + Select registered in Openstack flavor. Consider that application performance + depends on this parameter. + required: false + - name: osImage + type: image + imageType: linux + label: Instance image + description: >- + Select valid image for the application. Image should already be prepared and + registered in glance. + - name: keyPair + type: keypair + label: Key Pair + description: >- + Select the Key Pair to control access to instances. You can login to + instances using this KeyPair after the deployment of application. + required: false + - name: availabilityZone + type: azone + label: Availability zone + description: Select availability zone where application would be installed. + required: false + - name: network + type: network + label: Network + description: Select a network to join. 'Auto' corresponds to a default environment's network. + required: false + murano_networks: translate + - name: unitNamingPattern + type: string + label: Instance Naming Pattern + required: false + maxLength: 64 + regexpValidator: '^[a-zA-z][-_\w]*$' + errorMessages: + invalid: Just letters, numbers, underscores and hyphens are allowed. + helpText: Just letters, numbers, underscores and hyphens are allowed. + description: >- + Specify a string, that will be used in instance hostname. + Just A-Z, a-z, 0-9, dash and underline are allowed. diff --git a/murano-apps/F5-based-LBaaS/package/logo.png b/murano-apps/F5-based-LBaaS/package/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec2c650d0311291c92bfdbab0ccf387100273de GIT binary patch literal 7815 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 O8Bmf}l`EGq4g4RldkSCx literal 0 HcmV?d00001 diff --git a/murano-apps/F5-based-LBaaS/package/manifest.yaml b/murano-apps/F5-based-LBaaS/package/manifest.yaml new file mode 100644 index 0000000..5f7e051 --- /dev/null +++ b/murano-apps/F5-based-LBaaS/package/manifest.yaml @@ -0,0 +1,24 @@ +# 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. + +Format: 1.0 +Type: Application +FullName: io.murano.apps.lbaas.F5BigIPLTM +Name: F5 BIG IP LTM based LBaaS +Description: | + F5 BIG IP Local Traffic manager. +Author: 'Mirantis, Inc' +Tags: [HTTP, TCP, Load Balancing as a Service, F5, BIG IP, Local traffic] +Classes: + io.murano.apps.lbaas.F5BigIPLTM: F5BigIPLTM.yaml +Require: + io.murano.apps.lbaas.LBaaS: