diff --git a/murano-apps/haproxy-based-lbaas/Classes/HAProxy.yaml b/murano-apps/haproxy-based-lbaas/Classes/HAProxy.yaml new file mode 100644 index 0000000..8b7a8e2 --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/Classes/HAProxy.yaml @@ -0,0 +1,53 @@ +# 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: HAProxy + +Extends: =:LoadBalancer + +Properties: + + name: + Contract: $.string().notNull() + + implementation: + Contract: $.string() + Default: haproxy + +Methods: + installLoadBalancer: + Body: + - $resources: new(sys:Resources) + - $template: $resources.yaml('DeployHAProxy.template') + - $.environment.reporter.report($this, 'Installing HAProxy') + - $.instance.agent.call($template, $resources) + - $.environment.reporter.report($this, 'HAProxy is installed.') + + installLBaaS: + Body: + - $resources: new(sys:Resources) + - $template: $resources.yaml('DeployLBaaS.template').bind(dict( + impl => $.implementation + )) + - $.environment.reporter.report($this, 'Installing LBaaS...') + - $.instance.agent.call($template, $resources) + - $.environment.reporter.report($this, 'LBaaS is installed and started.') + - Return: + port: 8993 + path: /v1 + diff --git a/murano-apps/haproxy-based-lbaas/Classes/LoadBalancer.yaml b/murano-apps/haproxy-based-lbaas/Classes/LoadBalancer.yaml new file mode 100644 index 0000000..513cfe9 --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/Classes/LoadBalancer.yaml @@ -0,0 +1,75 @@ +# 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 + res: io.murano.resources + sys: io.murano.system + + +Name: LoadBalancer + +Extends: std:Application + +Properties: + + name: + Contract: $.string().notNull() + + instance: + Contract: $.class(res:Instance).notNull() + + implementation: + Contract: $.string() + Default: null + Usage: Runtime + + environment: + Contract: $.class(std:Environment) + Usage: Runtime + +Methods: + initialize: + Body: + - $.environment: $.find(std:Environment).require() + + deploy: + Body: + - If: $.getAttr(deployed, false) + Then: + Return: 0 + + - $.environment.reporter.report($this, 'Creating security groups...') + - $securityGroupIngress: + - ToPort: 65535 + FromPort: 1 + IpProtocol: tcp + External: true + - $.environment.securityGroupManager.addGroupIngress($securityGroupIngress) + - $.environment.reporter.report($this, 'Creating instance for load balancer...') + - $.instance.deploy() + - $.environment.reporter.report($this, 'Instance is created.') + - $resources: new(sys:Resources) + - $.installLoadBalancer() + - $lbaas: $.installLBaaS() + - If: $.instance.assignFloatingIp + Then: + - $host: $.instance.floatingIpAddress + Else: + - $host: $.instance.ipAddresses[0] + - $.environment.reporter.report($this, format('LBaaS is available at http://{0}:{1}{2}', $host, $lbaas.port, $lbaas.path)) + - $.setAttr(deployed, true) + + installLoadBalancer: + + installLBaaS: diff --git a/murano-apps/haproxy-based-lbaas/Resources/DeployHAProxy.template b/murano-apps/haproxy-based-lbaas/Resources/DeployHAProxy.template new file mode 100644 index 0000000..9dbf873 --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/Resources/DeployHAProxy.template @@ -0,0 +1,16 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Deploy HAProxy + +Body: | + return HAProxyDeploy().stdout + +Scripts: + HAProxyDeploy: + Type: Application + Version: 1.0.0 + EntryPoint: deployHAProxy.sh + Files: [] + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/haproxy-based-lbaas/Resources/DeployLBaaS.template b/murano-apps/haproxy-based-lbaas/Resources/DeployLBaaS.template new file mode 100644 index 0000000..8819d37 --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/Resources/DeployLBaaS.template @@ -0,0 +1,19 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Deploy LBaaS + +Parameters: + impl: $impl + +Body: | + return LBaasDeploy('{0}'.format(args.impl)).stdout + +Scripts: + LBaasDeploy: + Type: Application + Version: 1.0.0 + EntryPoint: deployLBaaS.sh + Files: [] + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/haproxy-based-lbaas/Resources/scripts/deployHAProxy.sh b/murano-apps/haproxy-based-lbaas/Resources/scripts/deployHAProxy.sh new file mode 100755 index 0000000..0c5f3a5 --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/Resources/scripts/deployHAProxy.sh @@ -0,0 +1,13 @@ +sudo add-apt-repository ppa:vbernat/haproxy-1.5 -y + +sudo apt-get update +sudo apt-get install -y haproxy + +# Enabling HAProxy. +sudo sed -i 's/^ENABLED=.*/ENABLED=1/' /etc/default/haproxy + +sudo chown -R $USER:$USER /etc/haproxy + +# Starting HAProxy. +#sudo service haproxy restart + diff --git a/murano-apps/haproxy-based-lbaas/Resources/scripts/deployLBaaS.sh b/murano-apps/haproxy-based-lbaas/Resources/scripts/deployLBaaS.sh new file mode 100644 index 0000000..05b66ec --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/Resources/scripts/deployLBaaS.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +impl=$1 + +sudo apt-get update + +sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password root' +sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password root' + +sudo apt-get install -y python-dev python-pip git; + +sudo apt-get install -y -q mysql-server libmysqlclient-dev + +# Installing LBaaS API. +git clone https://github.com/nmakhotkin/lbaas_api.git + +cd lbaas_api + +sudo pip install . +sudo pip install mysql-python + +# Configure LBaaS. +cp etc/lbaas.conf.sample etc/lbaas.conf + +sudo chmod -R a+rw /var/log + +# Configure lbaas logging. +sed -i 's/#verbose = false/verbose = true/g' etc/lbaas.conf +sed -i 's/#default_log_levels/default_log_levels/g' etc/lbaas.conf +sed -i 's/#log_file = /log_file = \/var\/log\/lbaas.log/g' etc/lbaas.conf + +# Configure lbaas impl. +sed -i "s/#impl = haproxy/impl = $impl/g" etc/lbaas.conf + +# Configure database connection. +mysql --user=root --password=root -e "CREATE DATABASE lbaas;" +mysql --user=root --password=root -e "GRANT ALL ON lbaas.* TO 'root'@'localhost';" + +sed -i 's/#connection = /connection = mysql:\/\/root:root@localhost:3306\/lbaas/g' etc/lbaas.conf +sed -i 's/#max_overflow = /max_overflow = -1/g' etc/lbaas.conf +sed -i 's/#max_pool_size = /max_pool_size = 1000/g' etc/lbaas.conf + +# Upgrade database. +lbaas-db-manage --config-file etc/lbaas.conf upgrade head + +# Moving config to another place. +sudo mkdir /etc/lbaas +sudo chown -R $USER:$USER /etc/lbaas +sudo chown /var/log/lbaas.log + +mv etc/lbaas.conf /etc/lbaas/lbaas.conf + +cd ~ + +# Start lbaas. +lbaas-server --config-file /etc/lbaas/lbaas.conf >> lbaas.log 2>&1 & diff --git a/murano-apps/haproxy-based-lbaas/UI/ui.yaml b/murano-apps/haproxy-based-lbaas/UI/ui.yaml new file mode 100644 index 0000000..23b06b0 --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/UI/ui.yaml @@ -0,0 +1,98 @@ +Version: 2 + +Application: + ?: + type: io.murano.apps.lbaas.HAProxy + name: $.appConfiguration.name + implementation: $.appConfiguration.LBaasImpl + 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: + - appConfiguration: + fields: + - name: name + type: string + label: Application Name + initial: 'HAProxy based LBaaS' + description: >- + Enter a desired name for the application. Just A-Z, a-z, 0-9, dash and + underline are allowed + - name: LBaasImpl + label: Load Balancer implementation. + type: string + description: >- + Specify Load balancer implementation for this current LBaaS. Only 'haproxy' is available now. + initial: haproxy + regexpValidator: '^haproxy$' + errorMessages: + invalid: Only 'haproxy' is available now. + required: true + - name: assignFloatingIP + type: boolean + label: Assign Floating IP + description: >- + Select to true to assign floating IP automatically + initial: false + 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/haproxy-based-lbaas/logo.png b/murano-apps/haproxy-based-lbaas/logo.png new file mode 100644 index 0000000..46e9e04 Binary files /dev/null and b/murano-apps/haproxy-based-lbaas/logo.png differ diff --git a/murano-apps/haproxy-based-lbaas/manifest.yaml b/murano-apps/haproxy-based-lbaas/manifest.yaml new file mode 100644 index 0000000..f224b6f --- /dev/null +++ b/murano-apps/haproxy-based-lbaas/manifest.yaml @@ -0,0 +1,25 @@ +# 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.HAProxy +Name: HAProxy based LBaaS +Description: | + HAProxy is a free, very fast and reliable solution offering high + availability, load balancing, and proxying for TCP and HTTP-based + applications. +Author: 'Mirantis, Inc' +Tags: [HTTP, TCP, Load Balancing as a Service, HAProxy] +Classes: + io.murano.apps.lbaas.HAProxy: HAProxy.yaml + io.murano.apps.lbaas.LoadBalancer: LoadBalancer.yaml