From 793d37727def872b380f9f6144c4542e0fc480f5 Mon Sep 17 00:00:00 2001 From: iuliana Date: Thu, 9 Sep 2021 11:43:10 +0100 Subject: [PATCH] Added 3 tier app with scripts. Nginx still needs more configuring. --- README.md | 2 + catalog/catalog.bom | 8 +- catalog/common-types/mysql5.bom | 167 ++++++++++++++++ catalog/common-types/nginx.bom | 86 +++++++++ catalog/common-types/tomcat9.bom | 182 ++++++++++++++++++ .../three-tier-webapp/three-tier-webapp.bom | 22 ++- pom.xml | 2 +- resources/icons/mysql.png | Bin 0 -> 8459 bytes resources/icons/nginx.jpeg | Bin 0 -> 4546 bytes resources/icons/tomcat9.png | Bin 0 -> 30956 bytes .../three-tier-webapp.tests.bom | 2 +- 11 files changed, 459 insertions(+), 12 deletions(-) create mode 100644 catalog/common-types/mysql5.bom create mode 100644 catalog/common-types/nginx.bom create mode 100644 catalog/common-types/tomcat9.bom create mode 100644 resources/icons/mysql.png create mode 100644 resources/icons/nginx.jpeg create mode 100644 resources/icons/tomcat9.png diff --git a/README.md b/README.md index a230432..a50f70b 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,5 @@ This is the core [Apache Brooklyn](http://brooklyn.apache.org/) integration for deployment and in-life management of a three tier webapp. See the [Apache Brooklyn documentation](http://brooklyn.apache.org/v/latest/start/policies.html) for further details of this blueprint. + +**IMPORTANT:** Suitable for deployment on [Ubuntu 20.04](https://releases.ubuntu.com/20.04/). diff --git a/catalog/catalog.bom b/catalog/catalog.bom index 3429b3c..ad077cb 100644 --- a/catalog/catalog.bom +++ b/catalog/catalog.bom @@ -1,3 +1,9 @@ brooklyn.catalog: + bundle: io.brooklyn.three-tier-webapp.brooklyn-three-tier-webapp + name: Brooklyn Three Tier App Types + version: 1.1.0-SNAPSHOT # version of this blueprint. items: - - classpath://three-tier-webapp/three-tier-webapp.bom \ No newline at end of file + - classpath://common-types/tomcat9.bom + - classpath://common-types/mysql5.bom + - classpath://common-types/nginx.bom + - classpath://three-tier-webapp/three-tier-webapp.bom \ No newline at end of file diff --git a/catalog/common-types/mysql5.bom b/catalog/common-types/mysql5.bom new file mode 100644 index 0000000..ab02da9 --- /dev/null +++ b/catalog/common-types/mysql5.bom @@ -0,0 +1,167 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# +brooklyn.catalog: + version: 1.0.0-SNAPSHOT + publish: + name: &mysql5Name MySQL 5 Server + description: &mysql5Description This is the MySQL 5 blueprint type. + license_code: Apache-2.0 + + items: + - id: org.apache.brooklyn.entity.database.mysql5 + name: *mysql5Name + iconUrl: classpath://icons/mysql.png + item: + name: *mysql5Name + type: org.apache.brooklyn.entity.software.base.VanillaSoftwareProcess + + brooklyn.parameters: + - name: creation.script.sql.url + label: SQL creation script URL + description: | + If supplied, the server will download a creation SQL script from this URL and + initialize the DB with it. + To have the orchestration server download it, or to use a classpath URL with a bundled resource, + use files.customize writing from that URL to creation-script.sql instead of this. + type: string + default: "" + - name: mysql.url + type: string + label: Database pack URL + default: "https://artifactory.cloudsoftcorp.com/artifactory/libs-release-local/io/cloudsoft/packs/mysql5/1.0.0/mysql5-1.0.0-tar.gz" + description: | + Publicly accessible URL of MySQL to install. + If this is not supplied, callers should typically set files.customize to install, + including multiple archives bundled with the blueprint. + - name: install.command + pinned: false + - name: customize.command + pinned: false + - name: launch.command + pinned: false + - name: checkRunning.command + pinned: false + - name: stop.command + pinned: false + + brooklyn.config: + dontRequireTtyForSudo: true + start.timeout: 20m + sshMonitoring.enabled: false + mysql.port: 3306 + + shell.env: + CREATION_SCRIPT_URL: $brooklyn:config("creation.script.sql.url") + DB_URL: $brooklyn:config("mysql.url") + + install.command: | + MYSQL_CFG=/etc/mysql/mysql.conf.d/ + sudo test -d "$MYSQL_CFG" && MYSQL_EXISTS="0" + + if [ "$MYSQL_EXISTS" ]; then + echo "MySQL already installed." + else + echo "Installing MySQL." + while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/{lock,lock-frontend} >/dev/null 2>&1; do + echo 'Waiting for release of dpkg/apt locks...'; + sleep 5 + done + + which curl || sudo apt --assume-yes install curl + + ## Install the MySQL server + if [ ! -z "${DB_URL}" ] ; then + curl -L -k -f -o mysql.tar.gz "${DB_URL}" + fi + tar xf mysql.tar.gz + PREV=`pwd` + cd mysql + while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/{lock,lock-frontend} >/dev/null 2>&1; do + echo 'Waiting for release of dpkg/apt locks...'; + sleep 5 + done + sudo ./dbmanager.sh install + cd $PREV + + sudo systemctl stop mysql + + cat >/tmp/zz-bind-address.cnf < /dev/null 2>&1 + if [ $? != 0 ] ; then + echo "MySQL is running when configure is called. Skipping configuration assuming it has already been done. If this is not correct then stop the DB before invoking this." + else + echo "Configuring MySQL..." + # When MySQL is up `systemctl status mysql` returns `Active: active (running)` + sudo systemctl start mysql + + if [ ! -z "${CREATION_SCRIPT_URL}" ] ; then + echo "Fetching and running creation script from ${CREATION_SCRIPT_URL}..." + curl -L -k -f -o creation-script-from-url.sql ${CREATION_SCRIPT_URL} + sudo mysql -u root < creation-script-from-url.sql + fi + fi + + launch.command: | + sudo systemctl status mysql | grep 'running' > /dev/null 2>&1 + if [ $? == 0 ]; then + echo "MySQL is up. All is well with the world." + else + echo "MySQL is down. Starting it..." + sudo systemctl start mysql + fi + + stop.command: | + sudo systemctl status mysql | grep 'running' > /dev/null 2>&1 + if [ $? == 0 ]; then + echo "MySQL is up. Shutting it down..." + sudo systemctl stop mysql + else + echo "MySQL is already down." + fi + + checkRunning.command: + sudo /etc/init.d/mysql status | grep -i -e 'active' -e 'uptime' + + brooklyn.initializers: + - type: org.apache.brooklyn.core.sensor.StaticSensor + brooklyn.config: + name: datastore.driver + static.value: "com.mysql.jdbc.Driver" + + brooklyn.enrichers: + - type: org.apache.brooklyn.enricher.stock.Transformer + brooklyn.config: + enricher.sourceSensor: $brooklyn:sensor("host.name") + enricher.targetSensor: $brooklyn:sensor("datastore.url") + enricher.targetValue: + $brooklyn:formatString: + - "mysql://%s:%s" + - $brooklyn:attributeWhenReady("host.name") + - $brooklyn:config("mysql.port") diff --git a/catalog/common-types/nginx.bom b/catalog/common-types/nginx.bom new file mode 100644 index 0000000..c00fecc --- /dev/null +++ b/catalog/common-types/nginx.bom @@ -0,0 +1,86 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# +brooklyn.catalog: + version: 1.1.0-SNAPSHOT # BROOKLYN_THREE_TIER_WEBAPP_VERSION + publish: + name: &nginXName NginX + description: &nginXDescription A single Nginx server. Provides HTTP and reverse proxy services. + license_code: Apache-2.0 + + items: + - id: org.apache.brooklyn.entity.proxy.nginx + name: *nginXName + iconUrl: classpath://icons/nginx.jpeg + item: + name: *nginXName + type: org.apache.brooklyn.entity.software.base.VanillaSoftwareProcess + + brooklyn.parameters: + - name: app.port + label: NginX Port + description: | + If supplied, the server will download a creation SQL script from this URL and + initialize the DB with it. + To have the orchestration server download it, or to use a classpath URL with a bundled resource, + use files.customize writing from that URL to creation-script.sql instead of this. + type: string + default: 8080 + - name: nginx.sticky + description: Whether to use sticky sessions (no sure where this is used) + type: boolean + default: true + + brooklyn.config: + dontRequireTtyForSudo: true + start.timeout: 20m + sshMonitoring.enabled: false + app.port: 8080 + + shell.env: + APP_PORT: $brooklyn:config("app.port") + + install.command: | + sudo apt -y update + sudo apt -y install nginx + + customize.command: | + echo customize + + #sudo systemctl enable postgresql.service + + launch.command: | + sudo systemctl start nginx + + stop.command: | + sudo systemctl stop nginx + + checkRunning.command: + sudo systemctl status nginx | grep -i -e 'active' -e 'online' + + brooklyn.enrichers: + - type: org.apache.brooklyn.enricher.stock.Transformer + brooklyn.config: + enricher.sourceSensor: $brooklyn:sensor("host.name") + enricher.targetSensor: $brooklyn:sensor("main.uri") + enricher.targetValue: + $brooklyn:formatString: + - "http://%s:%s" + - $brooklyn:attributeWhenReady("host.name") + - $brooklyn:config("app.port") + diff --git a/catalog/common-types/tomcat9.bom b/catalog/common-types/tomcat9.bom new file mode 100644 index 0000000..a704563 --- /dev/null +++ b/catalog/common-types/tomcat9.bom @@ -0,0 +1,182 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# +brooklyn.catalog: + # BROOKLYN_THREE_TIER_WEBAPP_VERSION + publish: + name: &tomcat9Name Apache Tomcat 9 Server + description: &tomcat9Description This is the Apache Tomcat 9 blueprint type. + license_code: Apache-2.0 + + items: + - id: org.apache.brooklyn.entity.webapp.tomcat9 + name: *tomcat9Name + iconUrl: classpath://icons/tomcat9.png + item: + name: *tomcat9Name + type: org.apache.brooklyn.entity.software.base.VanillaSoftwareProcess + + brooklyn.parameters: + - name: root.war + type: string + label: WAR URL + default: "" + description: | + Publicly accessible URL of WAR to install as the root application. + If this is not supplied, callers should typically set files.customize to install, + including multiple WARs and WARs bundled with the blueprint. + pinned: true + - name: tomcat.gz + type: string + label: WAR URL + default: https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.52/bin/apache-tomcat-9.0.52.tar.gz + description: | + Publicly accessible URL of Apache Tomcat to install. + If this is not supplied, callers should typically set files.customize to install, + including multiple archives bundled with the blueprint. + pinned: true + - name: catalina.properties + label: Java system properties + type: java.util.Map + default: {} + + - name: install.command + pinned: false + - name: customize.command + pinned: false + - name: launch.command + pinned: false + - name: checkRunning.command + pinned: false + - name: stop.command + pinned: false + + brooklyn.config: + dontRequireTtyForSudo: true + start.timeout: 20m + sshMonitoring.enabled: false + app.port: 8080 + + shell.env: + APP_PORT: $brooklyn:config("app.port") + ROOT_WAR: $brooklyn:config("root.war") + TOMCAT_GZ: $brooklyn:config("tomcat.gz") + CATALINA_PROPERTIES: $brooklyn:config("catalina.properties") + + install.command: | + CATALINA=/usr/local/tomcat + sudo test -d "$CATALINA" && CATALINA_EXISTS="0" + + if [ "$CATALINA_EXISTS" ]; then + echo "Tomcat already installed." + else + echo "Installing Tomcat..." + while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do + echo Waiting for other instances of apt to complete... + sleep 5 + done + + which curl || sudo apt --assume-yes install curl + + # Install java if needed + if ( which java ) ; then + echo "Java already installed." + else + echo "Trying to install java." + # occasionally AWS comes up without this repo + sudo add-apt-repository -y ppa:openjdk-r/ppa || echo could not add repo, will continue trying java install anyway + sudo apt-get update || echo could not apt-get update, will continue trying java install anyway + + sudo apt --assume-yes install openjdk-8-jdk-headless + sudo apt --assume-yes install openjdk-8-jre-headless + fi + + # Install Apache Tomcat + cd ${INSTALL_DIR} + sudo mkdir /usr/local/tomcat + if [ ! -z "${TOMCAT_GZ}" ] ; then + echo "Downloading TOMCAT from ${TOMCAT_GZ}" + curl -L -k -f -o tomcat.tar.gz "${TOMCAT_GZ}" + fi + sudo tar xf tomcat.tar.gz -C /usr/local/tomcat --strip-components=1 + sudo chmod 750 /usr/local/tomcat/bin + sudo sed --in-place 's#io.brooklyn.three-tier-webapp brooklyn-three-tier-webapp - 1.0.2-SNAPSHOT + 1.1.0-SNAPSHOT bundle diff --git a/resources/icons/mysql.png b/resources/icons/mysql.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0992667a18714711814042a5c32346d35dfa8a GIT binary patch literal 8459 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 literal 0 HcmV?d00001 diff --git a/resources/icons/tomcat9.png b/resources/icons/tomcat9.png new file mode 100644 index 0000000000000000000000000000000000000000..dad39e5da573b32d2e873f5694fd6f7ff9b14ad5 GIT binary patch literal 30956 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

gkx{rU4R&&%n7|ws5M9tJDJF9{ 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