From 2c94971dd03c8ef69e0792211572cfbfcfeed288 Mon Sep 17 00:00:00 2001 From: Anastasia Kuznetsova Date: Thu, 4 Feb 2016 16:24:45 +0300 Subject: [PATCH] Add initial version of CI&CD apps Change-Id: Ic2b4683f6ce4494cd88e2428dc30734f81233be7 --- .gitignore | 40 +++++ .gitreview | 4 + .../Gerrit/package/Classes/Gerrit.yaml | 99 +++++++++++ .../package/Resources/ConnectLDAP.template | 22 +++ .../package/Resources/DeployGerrit.template | 20 +++ .../Gerrit/package/Resources/PutKey.template | 19 +++ .../package/Resources/scripts/connectLDAP.sh | 25 +++ .../package/Resources/scripts/deployGerrit.sh | 22 +++ .../package/Resources/scripts/putKey.sh | 9 + murano-apps/Gerrit/package/UI/ui.yaml | 93 +++++++++++ murano-apps/Gerrit/package/logo.png | Bin 0 -> 17353 bytes murano-apps/Gerrit/package/manifest.yaml | 13 ++ .../Jenkins/package/Classes/Jenkins.yaml | 155 ++++++++++++++++++ .../package/Resources/ConfigureJJB.template | 22 +++ .../package/Resources/ConnectGerrit.template | 21 +++ .../package/Resources/ConnectLDAP.template | 21 +++ .../package/Resources/CreateTestJob.template | 17 ++ .../package/Resources/DeployJenkins.template | 20 +++ .../Jenkins/package/Resources/GetKey.template | 22 +++ .../package/Resources/InstallJJB.template | 17 ++ .../package/Resources/scripts/configureJJB.sh | 18 ++ .../Resources/scripts/connectGerrit.sh | 117 +++++++++++++ .../package/Resources/scripts/connectLDAP.sh | 54 ++++++ .../Resources/scripts/createTestJob.sh | 6 + .../Resources/scripts/deployJenkins.sh | 20 +++ .../package/Resources/scripts/installJJB.sh | 8 + .../Jenkins/package/Resources/scripts/noop.sh | 3 + murano-apps/Jenkins/package/UI/ui.yaml | 91 ++++++++++ murano-apps/Jenkins/package/logo.png | Bin 0 -> 111530 bytes murano-apps/Jenkins/package/manifest.yaml | 12 ++ .../OpenLDAP/package/Classes/OpenLDAP.yaml | 90 ++++++++++ .../ConfigureOpenLDAPDomain.template | 19 +++ .../Resources/ConfigureOpenLDAPUser.template | 21 +++ .../package/Resources/DeployOpenLDAP.template | 19 +++ .../scripts/configureOpenLDAPDomain.sh | 13 ++ .../scripts/configureOpenLDAPUser.sh | 38 +++++ .../Resources/scripts/deployOpenLDAP.sh | 12 ++ murano-apps/OpenLDAP/package/UI/ui.yaml | 104 ++++++++++++ murano-apps/OpenLDAP/package/logo.png | Bin 0 -> 6934 bytes murano-apps/OpenLDAP/package/manifest.yaml | 12 ++ 40 files changed, 1318 insertions(+) create mode 100644 .gitignore create mode 100644 .gitreview create mode 100644 murano-apps/Gerrit/package/Classes/Gerrit.yaml create mode 100644 murano-apps/Gerrit/package/Resources/ConnectLDAP.template create mode 100644 murano-apps/Gerrit/package/Resources/DeployGerrit.template create mode 100644 murano-apps/Gerrit/package/Resources/PutKey.template create mode 100644 murano-apps/Gerrit/package/Resources/scripts/connectLDAP.sh create mode 100644 murano-apps/Gerrit/package/Resources/scripts/deployGerrit.sh create mode 100644 murano-apps/Gerrit/package/Resources/scripts/putKey.sh create mode 100644 murano-apps/Gerrit/package/UI/ui.yaml create mode 100644 murano-apps/Gerrit/package/logo.png create mode 100644 murano-apps/Gerrit/package/manifest.yaml create mode 100644 murano-apps/Jenkins/package/Classes/Jenkins.yaml create mode 100644 murano-apps/Jenkins/package/Resources/ConfigureJJB.template create mode 100644 murano-apps/Jenkins/package/Resources/ConnectGerrit.template create mode 100644 murano-apps/Jenkins/package/Resources/ConnectLDAP.template create mode 100644 murano-apps/Jenkins/package/Resources/CreateTestJob.template create mode 100644 murano-apps/Jenkins/package/Resources/DeployJenkins.template create mode 100644 murano-apps/Jenkins/package/Resources/GetKey.template create mode 100644 murano-apps/Jenkins/package/Resources/InstallJJB.template create mode 100644 murano-apps/Jenkins/package/Resources/scripts/configureJJB.sh create mode 100644 murano-apps/Jenkins/package/Resources/scripts/connectGerrit.sh create mode 100644 murano-apps/Jenkins/package/Resources/scripts/connectLDAP.sh create mode 100644 murano-apps/Jenkins/package/Resources/scripts/createTestJob.sh create mode 100644 murano-apps/Jenkins/package/Resources/scripts/deployJenkins.sh create mode 100644 murano-apps/Jenkins/package/Resources/scripts/installJJB.sh create mode 100644 murano-apps/Jenkins/package/Resources/scripts/noop.sh create mode 100644 murano-apps/Jenkins/package/UI/ui.yaml create mode 100644 murano-apps/Jenkins/package/logo.png create mode 100644 murano-apps/Jenkins/package/manifest.yaml create mode 100644 murano-apps/OpenLDAP/package/Classes/OpenLDAP.yaml create mode 100644 murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPDomain.template create mode 100644 murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPUser.template create mode 100644 murano-apps/OpenLDAP/package/Resources/DeployOpenLDAP.template create mode 100644 murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPDomain.sh create mode 100644 murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPUser.sh create mode 100644 murano-apps/OpenLDAP/package/Resources/scripts/deployOpenLDAP.sh create mode 100644 murano-apps/OpenLDAP/package/UI/ui.yaml create mode 100644 murano-apps/OpenLDAP/package/logo.png create mode 100644 murano-apps/OpenLDAP/package/manifest.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e56810a --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +*.py[cod] +*.sqlite + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +.venv +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 + +# Installer logs +pip-log.txt + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject +.idea +.DS_Store +etc/*.conf +tools/lintstack.head.py +tools/pylint_exceptions + +#Linux swap file +*.swp diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..1337a94 --- /dev/null +++ b/.gitreview @@ -0,0 +1,4 @@ +[gerrit] +host=gerrit.mirantis.com +port=29418 +project=open-paas/open-paas.git diff --git a/murano-apps/Gerrit/package/Classes/Gerrit.yaml b/murano-apps/Gerrit/package/Classes/Gerrit.yaml new file mode 100644 index 0000000..b2531e8 --- /dev/null +++ b/murano-apps/Gerrit/package/Classes/Gerrit.yaml @@ -0,0 +1,99 @@ +Namespaces: + =: io.murano.apps + std: io.murano + res: io.murano.resources + sys: io.murano.system + +Name: Gerrit + +Extends: std:Application + +Properties: + name: + Contract: $.string().notNull() + warUrl: + Contract: $.string().notNull() + ldap: + Contract: $.class(OpenLDAP) + instance: + Contract: $.class(res:Instance).notNull() + +Methods: + initialize: + Body: + - $._environment: $.find(std:Environment).require() + + deploy: + Body: + - If: not $.getAttr(deployed, false) + Then: + - $securityGroupIngress: + - ToPort: 8080 + FromPort: 8080 + IpProtocol: tcp + External: true + - ToPort: 29418 + FromPort: 29418 + IpProtocol: tcp + External: true + - $._environment.securityGroupManager.addGroupIngress($securityGroupIngress) + - $._environment.reporter.report($this, 'Creating VM for Gerrit') + - $.instance.deploy() + - $resources: new(sys:Resources) + - $template: $resources.yaml('DeployGerrit.template').bind(dict( + warUrl => $.warUrl + )) + - $._environment.reporter.report($this, 'Deploying Gerrit') + - $.instance.agent.call($template, $resources) + - If: $.ldap != null + Then: + - $._environment.reporter.report($this, 'Gerrit waits OpenLDAP to be deployed...') + - $.ldap.deploy() + - $.connectLDAP() + + - $._environment.reporter.report($this, 'Gerrit is deployed!') + - $.setAttr(deployed, true) + + connectLDAP: + Body: + - $._environment.reporter.report($this, 'Connecting Gerrit to OpenLDAP server') + - $ldapInstance: $.ldap.instance + - If: $ldapInstance.assignFloatingIp + Then: + - $ldapHost: $ldapInstance.floatingIpAddress + Else: + - $ldapHost: $ldapInstance.ipAddresses[0] + + - $host: "localhost" + - If: $.instance.assignFloatingIp + Then: + - $host: $.instance.floatingIpAddress + Else: + - $host: $.instance.ipAddresses[0] + + - $resources: new(sys:Resources) + - $template: $resources.yaml('ConnectLDAP.template').bind(dict( + openLDAPip => $ldapHost, + host => $host, + domain => $.ldap.domain + )) + - $.instance.agent.call($template, $resources) + - $._environment.reporter.report($this, format('Gerrit is available at {0}:8080', $host)) + + putKey: + Arguments: + - sshKey: + Contract: $.string().notNull() + + Body: + - $._environment.reporter.report($this, 'Put SSH key to Gerrit server') + - $resources: new(sys:Resources) + - $template: $resources.yaml('PutKey.template').bind(dict( + sshKey => $sshKey + )) + - $.instance.agent.call($template, $resources) + + destroy: + Body: + - $.reportDestroyed() + - $.setAttr(deployed, false) diff --git a/murano-apps/Gerrit/package/Resources/ConnectLDAP.template b/murano-apps/Gerrit/package/Resources/ConnectLDAP.template new file mode 100644 index 0000000..fbf38a4 --- /dev/null +++ b/murano-apps/Gerrit/package/Resources/ConnectLDAP.template @@ -0,0 +1,22 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Connect LDAP + +Parameters: + openLDAPip: $openLDAPip + host: $host + domain: $domain + +Body: | + return configure('{0} {1} {2}'.format(args.openLDAPip, args.host, args.domain)).stdout + +Scripts: + configure: + Type: Application + Version: 1.0.0 + EntryPoint: connectLDAP.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false diff --git a/murano-apps/Gerrit/package/Resources/DeployGerrit.template b/murano-apps/Gerrit/package/Resources/DeployGerrit.template new file mode 100644 index 0000000..0fb7267 --- /dev/null +++ b/murano-apps/Gerrit/package/Resources/DeployGerrit.template @@ -0,0 +1,20 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Deploy Gerrit + +Parameters: + warUrl: $warUrl + +Body: | + return deploy('{0}'.format(args.warUrl)).stdout + +Scripts: + deploy: + Type: Application + Version: 1.0.0 + EntryPoint: deployGerrit.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false diff --git a/murano-apps/Gerrit/package/Resources/PutKey.template b/murano-apps/Gerrit/package/Resources/PutKey.template new file mode 100644 index 0000000..79393c2 --- /dev/null +++ b/murano-apps/Gerrit/package/Resources/PutKey.template @@ -0,0 +1,19 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Put sshKey + +Parameters: + sshKey: $sshKey + +Body: | + return configure('{0}'.format(args.sshKey)).stdout + +Scripts: + configure: + Type: Application + Version: 1.0.0 + EntryPoint: putKey.sh + Files: [] + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/Gerrit/package/Resources/scripts/connectLDAP.sh b/murano-apps/Gerrit/package/Resources/scripts/connectLDAP.sh new file mode 100644 index 0000000..22c7c23 --- /dev/null +++ b/murano-apps/Gerrit/package/Resources/scripts/connectLDAP.sh @@ -0,0 +1,25 @@ +#!/bin/bash +OPENLDAP_IP="$1" +HOST="$2" +DOMAIN="$3" + +# parse tld +NAME="`echo "$DOMAIN" | cut -d. -f1`" +TLD="`echo "$DOMAIN" | cut -d. -f2`" + + +# setup gerrit to authenticate from OpenLDAP +sed -e "s/type = OPENID/type = ldap/" -i /home/gerrit/gerrit_testsite/etc/gerrit.config +sed -e "s,canonicalWebUrl.*,canonicalWebUrl = http://${HOST}:8080," -i /home/gerrit/gerrit_testsite/etc/gerrit.config + +cat << EOF >> /home/gerrit/gerrit_testsite/etc/gerrit.config +[ldap] + server = ldap://${OPENLDAP_IP} + accountBase = OU=users,DC=${NAME},DC=${TLD} + username = CN=admin,DC=${NAME},DC=${TLD} + password = openstack + accountFullName = cn +EOF + +# restart gerrit +sudo -u gerrit /home/gerrit/gerrit_testsite/bin/gerrit.sh restart diff --git a/murano-apps/Gerrit/package/Resources/scripts/deployGerrit.sh b/murano-apps/Gerrit/package/Resources/scripts/deployGerrit.sh new file mode 100644 index 0000000..00d4cdb --- /dev/null +++ b/murano-apps/Gerrit/package/Resources/scripts/deployGerrit.sh @@ -0,0 +1,22 @@ +#!/bin/bash +WAR="$1" + +# Update the packages and install git and java +apt-get update +apt-get install -y git openjdk-7-jdk git-review + +# Create a user, gerrit2, to run gerrit +useradd -d/home/gerrit gerrit +mkdir /home/gerrit +chown -R gerrit:gerrit /home/gerrit + +# Allow firewall holes for Gerrit +iptables -I INPUT 1 -p tcp -m tcp --dport 8080 -j ACCEPT -m comment --comment "by murano, Gerrit server access on HTTP on port 8080" +iptables -I INPUT 1 -p tcp -m tcp --dport 29418 -j ACCEPT -m comment --comment "by murano, server Apache server access via sshd on port 29418" + +# Download latest stable code, install and remove war file. +cd /tmp +wget ${WAR} +filename=$(basename ${WAR}) +sudo -u gerrit java -jar /tmp/$filename init --batch -d /home/gerrit/gerrit_testsite +rm /tmp/$filename diff --git a/murano-apps/Gerrit/package/Resources/scripts/putKey.sh b/murano-apps/Gerrit/package/Resources/scripts/putKey.sh new file mode 100644 index 0000000..aacbab1 --- /dev/null +++ b/murano-apps/Gerrit/package/Resources/scripts/putKey.sh @@ -0,0 +1,9 @@ +#!/bin/bash +SSHKEY="$1 $2" + +mkdir /home/gerrit/.ssh +echo $SSHKEY > /home/gerrit/.ssh/authorized_keys +echo $SSHKEY > /home/gerrit/.ssh/jenkins-id_rsa.pub +chmod 700 /home/gerrit/.ssh +chmod 600 /home/gerrit/.ssh/authorized_keys /home/gerrit/.ssh/jenkins-id_rsa.pub +chown -R gerrit:gerrit /home/gerrit/.ssh diff --git a/murano-apps/Gerrit/package/UI/ui.yaml b/murano-apps/Gerrit/package/UI/ui.yaml new file mode 100644 index 0000000..2ed2304 --- /dev/null +++ b/murano-apps/Gerrit/package/UI/ui.yaml @@ -0,0 +1,93 @@ +Version: 2 + +Application: + ?: + type: io.murano.apps.Gerrit + name: $.appConfiguration.name + warUrl: $.appConfiguration.warUrl + ldap: $.appConfiguration.OpenLDAP + 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: Gerrit + 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 + - name: warUrl + type: string + label: URL for war + initial: http://gerrit-releases.storage.googleapis.com/gerrit-2.11.2.war + description: >- + Enter the war version from Gerrit's site + http://gerrit-releases.storage.googleapis.com/index.html + - name: OpenLDAP + type: io.murano.apps.OpenLDAP + required: false + description: >- + Specify OpenLDAP domain for authentication. + - 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. + initial: m1.tiny + required: false + - name: osImage + type: image + imageType: linux + label: Instance image + description: >- + Select a valid image for the application. Image should already be prepared and + registered in glance. + - name: keyPair + type: keypair + label: Key Pair + description: >- + Select a 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 the application would be installed. + required: false + - name: unitNamingPattern + type: string + label: Instance Naming Pattern + required: false + maxLength: 200 + regexpValidator: '^[-_\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/Gerrit/package/logo.png b/murano-apps/Gerrit/package/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7d709ddd1c17f798dd307edfdd9081da33e68383 GIT binary patch literal 17353 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 AZ~y=R literal 0 HcmV?d00001 diff --git a/murano-apps/Gerrit/package/manifest.yaml b/murano-apps/Gerrit/package/manifest.yaml new file mode 100644 index 0000000..f62c7b2 --- /dev/null +++ b/murano-apps/Gerrit/package/manifest.yaml @@ -0,0 +1,13 @@ +Format: 1.0 +Type: Application +FullName: io.murano.apps.Gerrit +Name: Gerrit +Description: | + Gerrit is a web based code review system, facilitating online code reviews + for projects using the Git version control system. +Author: 'Mirantis, Inc' +Tags: [Server, Java, Gerrit, CI] +Classes: + io.murano.apps.Gerrit: Gerrit.yaml +UI: ui.yaml +Logo: logo.png diff --git a/murano-apps/Jenkins/package/Classes/Jenkins.yaml b/murano-apps/Jenkins/package/Classes/Jenkins.yaml new file mode 100644 index 0000000..4fa34d9 --- /dev/null +++ b/murano-apps/Jenkins/package/Classes/Jenkins.yaml @@ -0,0 +1,155 @@ +Namespaces: + =: io.murano.apps + std: io.murano + res: io.murano.resources + sys: io.murano.system + +Name: Jenkins + +Extends: std:Application + +Properties: + name: + Contract: $.string().notNull() + ldap: + Contract: $.class(OpenLDAP) + gerrit: + Contract: $.class(Gerrit) + instance: + Contract: $.class(res:Instance).notNull() + +Methods: + initialize: + Body: + - $._environment: $.find(std:Environment).require() + + deploy: + Body: + - If: not $.getAttr(deployed, false) + Then: + - $._environment.reporter.report($this, 'Creating VM for Jenkins') + - $securityGroupIngress: + - ToPort: 8080 + FromPort: 8080 + IpProtocol: tcp + External: true + - $._environment.securityGroupManager.addGroupIngress($securityGroupIngress) + - $.instance.deploy() + - $resources: new(sys:Resources) + - $template: $resources.yaml('DeployJenkins.template') + - $._environment.reporter.report($this, 'Jenkins deploying') + - $.instance.agent.call($template, $resources) + + - If: $.ldap != null + Then: + - $._environment.reporter.report($this, 'Jenkins waits OpenLDAP to be deployed...') + - $.ldap.deploy() + - $.connectLDAP() + + - If: $.gerrit != null and $.ldap != null + Then: + - $._environment.reporter.report($this, 'Jenkins waits Gerrit to be deployed...') + - $.gerrit.deploy() + - $.connectGerrit() + - $sshKey: $.getKey() + - $.gerrit.putKey($sshKey) + + - $.installJJB() + - $.configureJJB() + - $.createTestJob() + + - If: $.instance.assignFloatingIp + Then: + - $host: $.instance.floatingIpAddress + Else: + - $host: $.instance.ipAddresses[0] + - $._environment.reporter.report($this, 'Jenkins is available at {0}:8080'.format($host)) + - $.setAttr(deployed, true) + + installJJB: + Body: + - $resources: new(sys:Resources) + - $._environment.reporter.report($this, 'Installing Jenkins Job Builder') + - $template: $resources.yaml('InstallJJB.template') + - $.instance.agent.call($template, $resources) + + configureJJB: + Body: + - $resources: new(sys:Resources) + - $._environment.reporter.report($this, 'Configuring Jenkins Job Builder') + + - If: $.ldap != null + Then: + - If: $.ldap.ldapUser != '' and $.ldap.ldapUser != null + Then: + - $user: $.ldap.ldapUser + - $password: $.ldap.ldapPass + Else: + - $user: 'jenkins' + - $password: 'openstack' + Else: + - $user: '' + - $password: '' + + - $template: $resources.yaml('ConfigureJJB.template').bind(dict( + jenkinsip => $.instance.ipAddresses[0], + user => $user, + password => $password + )) + - $.instance.agent.call($template, $resources) + - $._environment.reporter.report($this, 'Jenkins Job Builder is configured!') + + createTestJob: + Body: + - $resources: new(sys:Resources) + - $._environment.reporter.report($this, 'Creating test job via Jenkins Job Builder') + - $template: $resources.yaml('CreateTestJob.template') + - $.instance.agent.call($template, $resources) + + connectLDAP: + Body: + - $.ldap.configureOpenLDAPUser($.ldap.domain, 'jenkins', 'openstack') + - $ldapInstance: $.ldap.instance + - If: $ldapInstance.assignFloatingIp + Then: + - $ldapHost: $ldapInstance.floatingIpAddress + Else: + - $ldapHost: $ldapInstance.ipAddresses[0] + - $resources: new(sys:Resources) + - $._environment.reporter.report($this, 'Connecting Jenkins to OpenLDAP server') + - $template: $resources.yaml('ConnectLDAP.template').bind(dict( + openLDAPip => $ldapHost, + domain => $.ldap.domain + )) + - $.instance.agent.call($template, $resources) + - $._environment.reporter.report($this, 'Jenkins is connected to OpenLDAP server!') + + connectGerrit: + Body: + - $._environment.reporter.report($this, 'Connecting Jenkins with Gerrit') + - $gerritInstance: $.gerrit.instance + - If: $gerritInstance.assignFloatingIp + Then: + - $gerritHost: $gerritInstance.floatingIpAddress + Else: + - $gerritHost: $gerritInstance.ipAddresses[0] + - $resources: new(sys:Resources) + - $template: $resources.yaml('ConnectGerrit.template').bind(dict( + gerritIp => $gerritHost, + domain => $.ldap.domain + )) + - $.instance.agent.call($template, $resources) + - $._environment.reporter.report($this, 'Jenkins is connected with Gerrit!') + + getKey: + Body: + - $._environment.reporter.report($this, 'Get SSH key from Jenkins') + - $resources: new(sys:Resources) + - $template: $resources.yaml('GetKey.template') + - $sshKey: $.instance.agent.call($template, $resources) + - Return: format('{0}', $sshKey) + + destroy: + Body: + - $.reportDestroyed() + - $.setAttr(deployed, false) diff --git a/murano-apps/Jenkins/package/Resources/ConfigureJJB.template b/murano-apps/Jenkins/package/Resources/ConfigureJJB.template new file mode 100644 index 0000000..e5a375b --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/ConfigureJJB.template @@ -0,0 +1,22 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Configure Jenkins Job Builder + +Parameters: + jenkinsip: $jenkinsip + user: $user + password: $password + +Body: | + return configure('{0} {1} {2}'.format(args.jenkinsip, args.user, args.password)).stdout + +Scripts: + configure: + Type: Application + Version: 1.0.0 + EntryPoint: configureJJB.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false \ No newline at end of file diff --git a/murano-apps/Jenkins/package/Resources/ConnectGerrit.template b/murano-apps/Jenkins/package/Resources/ConnectGerrit.template new file mode 100644 index 0000000..3c97add --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/ConnectGerrit.template @@ -0,0 +1,21 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Connect LDAP + +Parameters: + gerritIp: $gerritIp + domain: $domain + +Body: | + return configure('{0} {1}'.format(args.gerritIp, args.domain)).stdout + +Scripts: + configure: + Type: Application + Version: 1.0.0 + EntryPoint: connectGerrit.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false diff --git a/murano-apps/Jenkins/package/Resources/ConnectLDAP.template b/murano-apps/Jenkins/package/Resources/ConnectLDAP.template new file mode 100644 index 0000000..0c1c525 --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/ConnectLDAP.template @@ -0,0 +1,21 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Connect LDAP + +Parameters: + openLDAPip: $openLDAPip + domain: $domain + +Body: | + return configure('{0} {1}'.format(args.openLDAPip, args.domain)).stdout + +Scripts: + configure: + Type: Application + Version: 1.0.0 + EntryPoint: connectLDAP.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false diff --git a/murano-apps/Jenkins/package/Resources/CreateTestJob.template b/murano-apps/Jenkins/package/Resources/CreateTestJob.template new file mode 100644 index 0000000..b4297fe --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/CreateTestJob.template @@ -0,0 +1,17 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Create Test Job using Jenkins Job Builder + +Body: | + return create().stdout + +Scripts: + create: + Type: Application + Version: 1.0.0 + EntryPoint: createTestJob.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false \ No newline at end of file diff --git a/murano-apps/Jenkins/package/Resources/DeployJenkins.template b/murano-apps/Jenkins/package/Resources/DeployJenkins.template new file mode 100644 index 0000000..009e018 --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/DeployJenkins.template @@ -0,0 +1,20 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Deploy Jenkins + +Parameters: + appName: $appName + +Body: | + return deploy(args.appName).stdout + +Scripts: + deploy: + Type: Application + Version: 1.0.0 + EntryPoint: deployJenkins.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false diff --git a/murano-apps/Jenkins/package/Resources/GetKey.template b/murano-apps/Jenkins/package/Resources/GetKey.template new file mode 100644 index 0000000..0e2fae8 --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/GetKey.template @@ -0,0 +1,22 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Get ssh key + +Parameters: + sshKey: $sshKey + +Body: | + key = '' + with open('/var/lib/jenkins/.ssh/jenkins-id_rsa.pub','r') as f: + key = f.read() + return key + +Scripts: + noop: + Type: Application + Version: 1.0.0 + EntryPoint: noop.sh + Files: [] + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/Jenkins/package/Resources/InstallJJB.template b/murano-apps/Jenkins/package/Resources/InstallJJB.template new file mode 100644 index 0000000..310065c --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/InstallJJB.template @@ -0,0 +1,17 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Install Jenkins Job Builder + +Body: | + return deploy().stdout + +Scripts: + deploy: + Type: Application + Version: 1.0.0 + EntryPoint: installJJB.sh + Files: [] + Options: + captureStdout: true + captureStderr: true + verifyExitcode: false \ No newline at end of file diff --git a/murano-apps/Jenkins/package/Resources/scripts/configureJJB.sh b/murano-apps/Jenkins/package/Resources/scripts/configureJJB.sh new file mode 100644 index 0000000..0bfa1d6 --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/scripts/configureJJB.sh @@ -0,0 +1,18 @@ +#!/bin/bash +JENKINS_IP="$1" +USER="$2" +PASSWORD="$3" + +cd ~/jenkins-job-builder +cp etc/jenkins_jobs.ini-sample etc/jenkins_jobs.ini + +sed -i "s/https:\/\/jenkins.example.com/http:\/\/$JENKINS_IP:8080\//g" etc/jenkins_jobs.ini + +if [ -n "$USER" ]; + then + sed -i "s/user=jenkins/user=$USER/g" etc/jenkins_jobs.ini; + sed -i "s/password=1234567890abcdef1234567890abcdef/password=$PASSWORD/g" etc/jenkins_jobs.ini; +fi + + + diff --git a/murano-apps/Jenkins/package/Resources/scripts/connectGerrit.sh b/murano-apps/Jenkins/package/Resources/scripts/connectGerrit.sh new file mode 100644 index 0000000..25c321e --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/scripts/connectGerrit.sh @@ -0,0 +1,117 @@ +#!/bin/bash +GERRIT_IP="$1" +DOMAIN="$2" + +cat << CONFIG >> /var/lib/jenkins/credentials.xml + + + + + + + + + + GLOBAL + 10055155-5c33-4318-8161-96a3ccd270a8 + + jenkins + aE53R1jYUuH1K2BgkbGqfw== + + /var/lib/jenkins/.ssh/jenkins-id_rsa + + + + + + +CONFIG + +cat << CONFIG >> /var/lib/jenkins/gerrit-trigger.xml + + + + + Gerrit + false + + ${GERRIT_IP} + 29418 + + jenkins + jenkins@${DOMAIN} + /var/lib/jenkins/.ssh/jenkins-id_rsa + aE53R1jYUuH1K2BgkbGqfw== + false + false + false + false + gerrit review <CHANGE>,<PATCHSET> --message 'Build Successful <BUILDS_STATS>' --verified <VERIFIED> --code-review <CODE_REVIEW> + gerrit review <CHANGE>,<PATCHSET> --message 'Build Unstable <BUILDS_STATS>' --verified <VERIFIED> --code-review <CODE_REVIEW> + gerrit review <CHANGE>,<PATCHSET> --message 'Build Failed <BUILDS_STATS>' --verified <VERIFIED> --code-review <CODE_REVIEW> + gerrit review <CHANGE>,<PATCHSET> --message 'Build Started <BUILDURL> <STARTED_STATS>' --verified <VERIFIED> --code-review <CODE_REVIEW> + gerrit review <CHANGE>,<PATCHSET> --message 'No Builds Executed <BUILDS_STATS>' --verified <VERIFIED> --code-review <CODE_REVIEW> + http://${GERRIT_IP}:8080/ + 0 + 0 + 1 + 0 + -1 + 0 + 0 + -1 + 0 + 0 + true + true + 3 + 30 + + + Code-Review + Code Review + + + Verified + Verified + + + + false + + false + + 0 + + + + + ALL + + + + + 3 + 1 + 360 + + +CONFIG + +cat << CONFIG >> /var/lib/jenkins/hudson.plugins.git.GitTool.xml + + + + + Default + git + + + + +CONFIG + +# Restart jenkins +service jenkins restart + +# Grab jenkins key from gerrit diff --git a/murano-apps/Jenkins/package/Resources/scripts/connectLDAP.sh b/murano-apps/Jenkins/package/Resources/scripts/connectLDAP.sh new file mode 100644 index 0000000..f0b98ae --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/scripts/connectLDAP.sh @@ -0,0 +1,54 @@ +#!/bin/bash +OPENLDAP_IP="$1" +DOMAIN="$2" + +NAME="`echo "$DOMAIN" | cut -d. -f1`" +TLD="`echo "$DOMAIN" | cut -d. -f2`" + +cat << CONFIG >> /var/lib/jenkins/config.xml + + + + 1.0 + 2 + NORMAL + true + + + ldap://${OPENLDAP_IP} + dc=${NAME},dc=${TLD} + false + + uid={0} + cn=admin,dc=${NAME},dc=${TLD} + b3BlbnN0YWNr + false + + false + + \${JENKINS_HOME}/workspace/\${ITEM_FULLNAME} + \${ITEM_ROOTDIR}/builds + + + + + + 0 + + + + All + false + false + + + + All + 0 + + + + +CONFIG + +service jenkins restart diff --git a/murano-apps/Jenkins/package/Resources/scripts/createTestJob.sh b/murano-apps/Jenkins/package/Resources/scripts/createTestJob.sh new file mode 100644 index 0000000..6c723a7 --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/scripts/createTestJob.sh @@ -0,0 +1,6 @@ +cd ~/jenkins-job-builder + +jenkins-jobs test -o output tests/yamlparser/fixtures/templates002.yaml +cat etc/jenkins_jobs.ini +ping -c 5 `grep 'url' etc/jenkins_jobs.ini | awk '{split($0,a,"/"); split(a[3],a,":"); print a[1]}'` +jenkins-jobs --conf etc/jenkins_jobs.ini update tests/yamlparser/fixtures/templates002.yaml diff --git a/murano-apps/Jenkins/package/Resources/scripts/deployJenkins.sh b/murano-apps/Jenkins/package/Resources/scripts/deployJenkins.sh new file mode 100644 index 0000000..d21e7b9 --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/scripts/deployJenkins.sh @@ -0,0 +1,20 @@ +#!/bin/bash +export DEBIAN_FRONTEND=noninteractive + +# Install prerequisites +wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - +sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list' +apt-get update + +# Jenkins +apt-get -y install jenkins + +# Open firewall for jenkins +iptables -I INPUT 1 -p tcp -m tcp --dport 8080 -j ACCEPT -m comment --comment "by Murano, Jenkins" +service jenkins restart + +# Create an ssh-key that can be used between Gerrit and Jenkins +sudo -u jenkins ssh-keygen -t rsa -N "" -f /var/lib/jenkins/.ssh/jenkins-id_rsa +chmod 400 /var/lib/jenkins/.ssh/jenkins-id_rsa +chmod 600 /var/lib/jenkins/.ssh/jenkins-id_rsa.pub + diff --git a/murano-apps/Jenkins/package/Resources/scripts/installJJB.sh b/murano-apps/Jenkins/package/Resources/scripts/installJJB.sh new file mode 100644 index 0000000..a03d04c --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/scripts/installJJB.sh @@ -0,0 +1,8 @@ +cd ~ +git clone https://git.openstack.org/openstack-infra/jenkins-job-builder +cd jenkins-job-builder + +sudo apt-get install python-tox --assume-yes +tox -e venv -- sudo python setup.py install +tox -e venv -- sudo pip install -r requirements.txt + diff --git a/murano-apps/Jenkins/package/Resources/scripts/noop.sh b/murano-apps/Jenkins/package/Resources/scripts/noop.sh new file mode 100644 index 0000000..cb99fc5 --- /dev/null +++ b/murano-apps/Jenkins/package/Resources/scripts/noop.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Ok" diff --git a/murano-apps/Jenkins/package/UI/ui.yaml b/murano-apps/Jenkins/package/UI/ui.yaml new file mode 100644 index 0000000..d89b7c2 --- /dev/null +++ b/murano-apps/Jenkins/package/UI/ui.yaml @@ -0,0 +1,91 @@ +Version: 2 + +Application: + ?: + type: io.murano.apps.Jenkins + name: $.appConfiguration.name + ldap: $.appConfiguration.OpenLDAP + gerrit: $.appConfiguration.GerritServer + 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: Jenkins + 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 + - name: OpenLDAP + type: io.murano.apps.OpenLDAP + required: false + description: >- + Specify OpenLDAP domain for authentication + - name: GerritServer + type: io.murano.apps.Gerrit + required: false + description: >- + Specify Gerrit server + - 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. + initial: m1.tiny + required: false + - name: osImage + type: image + imageType: linux + label: Instance image + description: >- + Select a valid image for the application. Image should already be prepared and + registered in glance. + - name: keyPair + type: keypair + label: Key Pair + description: >- + Select a 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 the application would be installed. + required: false + - name: unitNamingPattern + type: string + label: Instance Naming Pattern + required: false + maxLength: 200 + regexpValidator: '^[-_\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/Jenkins/package/logo.png b/murano-apps/Jenkins/package/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b851bddb330ee3f68f7290052f5e762105282c85 GIT binary patch literal 111530 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 LQ $.domain)) + - $.instance.agent.call($template, $resources) + - $._environment.reporter.report($this, 'OpenLDAP domain is configured') + - $.setAttr(domainConfigured, true) + + configureOpenLDAPUser: + Arguments: + - domain: + Contract: $.string().notNull() + - ldapUser: + Contract: $.string().notNull() + - ldapPass: + Contract: $.string().notNull() + Body: + - $.configureOpenLDAPDomain() + - $resources: new(sys:Resources) + - $template: $resources.yaml('ConfigureOpenLDAPUser.template').bind(dict( + domain => $domain, + ldapUser => $ldapUser, + ldapPass => $ldapPass + )) + - $.instance.agent.call($template, $resources) + - $._environment.reporter.report($this, 'OpenLDAP user {0} is added'.format($ldapUser)) + + destroy: + Body: + - $.reportDestroyed() + - $.setAttr(deployed, false) diff --git a/murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPDomain.template b/murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPDomain.template new file mode 100644 index 0000000..673d64a --- /dev/null +++ b/murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPDomain.template @@ -0,0 +1,19 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Configure OpenLDAP + +Parameters: + domain: $domain + +Body: | + return configure('{0}'.format(args.domain)).stdout + +Scripts: + configure: + Type: Application + Version: 1.0.0 + EntryPoint: configureOpenLDAPDomain.sh + Files: [] + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPUser.template b/murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPUser.template new file mode 100644 index 0000000..b91e88e --- /dev/null +++ b/murano-apps/OpenLDAP/package/Resources/ConfigureOpenLDAPUser.template @@ -0,0 +1,21 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Configure OpenLDAP + +Parameters: + domain: $domain + ldapUser: $ldapUser + ldapPass: $ldapPass + +Body: | + return configure('{0} {1} {2}'.format(args.domain, args.ldapUser, args.ldapPass)).stdout + +Scripts: + configure: + Type: Application + Version: 1.0.0 + EntryPoint: configureOpenLDAPUser.sh + Files: [] + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/OpenLDAP/package/Resources/DeployOpenLDAP.template b/murano-apps/OpenLDAP/package/Resources/DeployOpenLDAP.template new file mode 100644 index 0000000..888a7d9 --- /dev/null +++ b/murano-apps/OpenLDAP/package/Resources/DeployOpenLDAP.template @@ -0,0 +1,19 @@ +FormatVersion: 2.0.0 +Version: 1.0.0 +Name: Deploy OpenLDAP + +Parameters: + appName: $appName + +Body: | + return deploy(args.appName).stdout + +Scripts: + deploy: + Type: Application + Version: 1.0.0 + EntryPoint: deployOpenLDAP.sh + Files: [] + Options: + captureStdout: true + captureStderr: true diff --git a/murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPDomain.sh b/murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPDomain.sh new file mode 100644 index 0000000..5db1ee0 --- /dev/null +++ b/murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPDomain.sh @@ -0,0 +1,13 @@ +#!/bin/bash +DOMAIN="$1" + +echo "slapd slapd/no_configuration boolean false" | debconf-set-selections +echo "slapd slapd/domain string ${DOMAIN}" | debconf-set-selections +echo "slapd shared/organization string '${DOMAIN}'" | debconf-set-selections +echo "slapd slapd/password1 password openstack" | debconf-set-selections +echo "slapd slapd/password2 password openstack" | debconf-set-selections +echo "slapd slapd/backend select HDB" | debconf-set-selections +echo "slapd slapd/purge_database boolean true" | debconf-set-selections +echo "slapd slapd/allow_ldap_v2 boolean false" | debconf-set-selections +echo "slapd slapd/move_old_database boolean true" | debconf-set-selections +dpkg-reconfigure -f noninteractive slapd diff --git a/murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPUser.sh b/murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPUser.sh new file mode 100644 index 0000000..69249a8 --- /dev/null +++ b/murano-apps/OpenLDAP/package/Resources/scripts/configureOpenLDAPUser.sh @@ -0,0 +1,38 @@ +#!/bin/bash +DOMAIN="$1" +USERNAME="$2" +PASSWORD="$3" + +NAME="`echo "$DOMAIN" | cut -d. -f1`" +TLD="`echo "$DOMAIN" | cut -d. -f2`" + + +# Create group.ldif and user.ldif +cat << GROUP > /tmp/group.ldif +dn: ou=users,dc=${NAME},dc=${TLD} +objectClass: top +objectClass: organizationalUnit +GROUP + +cat << USER > /tmp/user.ldif +dn: uid=${USERNAME},ou=users,dc=${NAME},dc=${TLD} +objectClass: top +objectClass: account +objectClass: posixAccount +objectClass: shadowAccount +cn: ${USERNAME} +uid: ${USERNAME} +uidNumber: 1001 +gidNumber: 1001 +homeDirectory: /home/${USERNAME} +loginShell: /bin/bash +gecos: ${USERNAME}@${DOMAIN} +userPassword: {crypt}x +shadowLastChange: 0 +shadowMax: 0 +shadowWarning: 0 +USER + +ldapadd -x -w openstack -D "cn=admin,dc=${NAME},dc=${TLD}" -f /tmp/group.ldif +ldapadd -x -w openstack -D "cn=admin,dc=${NAME},dc=${TLD}" -f /tmp/user.ldif +ldappasswd -s ${PASSWORD} -D "cn=admin,dc=${NAME},dc=${TLD}" -w openstack -x uid=${USERNAME},ou=users,dc=${NAME},dc=${TLD} diff --git a/murano-apps/OpenLDAP/package/Resources/scripts/deployOpenLDAP.sh b/murano-apps/OpenLDAP/package/Resources/scripts/deployOpenLDAP.sh new file mode 100644 index 0000000..3873667 --- /dev/null +++ b/murano-apps/OpenLDAP/package/Resources/scripts/deployOpenLDAP.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +apt-get update +apt-get install -y debconf + +echo "slapd slapd/root_password password openstack" | debconf-set-selections +echo "slapd slapd/root_password_again password openstack" | debconf-set-selections +DEBIAN_FRONTEND=noninteractive apt-get install -y slapd ldap-utils + +# Open firewall for ldap/ldaps +iptables -I INPUT 1 -p tcp -m tcp --dport 389 -j ACCEPT -m comment --comment "by murano, OpenLDAP server access on port 389" +iptables -I INPUT 1 -p tcp -m tcp --dport 636 -j ACCEPT -m comment --comment "by murano, OpenLDAP server access on port 636" diff --git a/murano-apps/OpenLDAP/package/UI/ui.yaml b/murano-apps/OpenLDAP/package/UI/ui.yaml new file mode 100644 index 0000000..50da7f3 --- /dev/null +++ b/murano-apps/OpenLDAP/package/UI/ui.yaml @@ -0,0 +1,104 @@ +Version: 2 + +Application: + ?: + type: io.murano.apps.OpenLDAP + name: $.appConfiguration.name + domain: $.appConfiguration.domain + ldapUser: $.appConfiguration.ldapUser + ldapPass: $.appConfiguration.ldapPass + 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: OpenLDAP + description: >- + Enter a desired name for the application. Just A-Z, a-z, 0-9, dash + and underline are allowed + - name: domain + type: string + label: Domain + initial: domain.tld + required: false + descriptionTitle: Domain + description: >- + Please, provide domain for the OpenLDAP instance + - name: ldapUser + type: string + label: Username + required: false + descriptionTitle: LDAP User + description: >- + Please, provide username + - name: ldapPass + type: password + label: Password + required: false + descriptionTitle: LDAP Password + description: >- + Please, provide password + - name: assignFloatingIP + type: boolean + label: Assign Floating IP + description: >- + Select to true to assign floating IP automatically + initial: true + required: false + - 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. + initial: m1.tiny + required: false + - name: osImage + type: image + imageType: linux + label: Instance image + description: >- + Select a valid image for the application. Image should already be prepared and + registered in glance. + - name: keyPair + type: keypair + label: Key Pair + description: >- + Select a 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 the application would be installed. + required: false + - name: unitNamingPattern + type: string + label: Instance Naming Pattern + required: false + maxLength: 200 + regexpValidator: '^[-_\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/OpenLDAP/package/logo.png b/murano-apps/OpenLDAP/package/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..411a3324c9ae9c9d140a84328b2668f7648729cc GIT binary patch literal 6934 zcmV+x8|mbUP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D8mmb}K~#8N?cIl4 zTj#w8aQ_$g-tIPSZg-p8-rhDHNs~0rXcF78K}bvqps%m@et$!! zs5M$n}hNscp)egh`z5P88 zNoQw!YgcD`Ur*P-5VVW?+q%0!GT7hNeve??vGF0KAr|+*$jH$6_$W+ID;_x=aj`o&FwjQ}d^<{);AV?W5J#~>A%mHjDR$0=3a$Bsbc9%081xTx z!;*4gb#(=t98Pz2cCw3pTWV}<1a@KYB9#p><~FzwVqbf3w=Os3QjqUy;_7}dzd9T$ zS`%|iW5M6gb7cj+&TmzX5BC6*;G|**MyDp&IWJt}vLVPx3%hXKAR^fz|BEnEbU)%k z;9)55jkWjYgRO&^OfF?t`?i#9L=3tFH(qNAE-lNaM_^>~oUSeWo3NaPz;dIp@` zZT%vx(wp3d$Hj!*+)gg3q!V-rZoJq8S6A4UL@_OA=RCJ=Ru>dm67EOPI7r`5WU_#0N4wSiD@F9?kZM3=b6U-5`5 zcfWnNgs_|2$t4}^hFz)^)zs`5jEzg!InOP}lO|qnh72#Be}oZ4mYa%lO%iXM^N8C^ zyyEwz*E>Vm!>G$0ksvs-?{9CuVRB;kz4ki7Zf+;n)VKt632waB5>zS|<`ke%Jn!lj zPFqw555MQ*X9VspT<5a};O@>1DK-o%HM|(VpZKNfAGUi3g7YoHODw_K<+Fdh`^)m0 ztoiv_!ftmb*VvE*m;`4OQjp1p**WXgfTV}m35`7y_d#;w!RTr;h^yfiH$zxR`miH-HiMRl=Dyt>jQ zxY=4ua8;?890s|3gq^cqWhI7@oR$C^xBcLix-b3SAxLaQbIgdYHYK8bgSgv#KuaA} zZ4CZt{IaS{x?=d^H90YHkZ=0iU%dX>55D)~@BJ6~=?}l>a={T+)Wt6PDr$IW0FdAc z&VVpI{k(TLlf(T;Qq{Ta79X(l*LMj07$U2Tu@5pK;$O9>D%0reW)NI#XzlYZ+__)N zZs-MSc4mf{8ghU1-T(abqYoMz>L0CDL0;|;zw;m9rH{iow8W4E=I{b@4Im)z!1d+~P`=FGm!6tJ5Ytf$ zb9Sm$z4MR1!p~p(5j51-&8tf$llAuYkoNYrhn=1HKVVl_tB!WeX(gQ<9oWY)k@n@G z!NFm5O-(7V80qQmM&n8AK3gNhgP==r(+RFDt7P(Vn3{QBZzep%jReLTJD<^q^T+if z@(w~|m6<4?8+O^)FP%etQ}v^Ztf0B=8nSz-_)vd(<98Z(8SGT8s;aC6I+l+eI#_r6 zHgNXuqbV9zCyvS0g;lz{y5Ok=_I>(qWHd894IlpN-M8NSGw_WKwUTB!{%g$JqK_(yW7T<-JdYg$FS$O}Q zx7bNf7Me>yR}t`<>+9;Eq_~Kky;f+=DP^4FXkqNLzxe5oHSps<|Nf?tTduSiZ1+7Oa&C`_~f$zTt= ziI*vKqzQ%}$%*moRIQ@dOhXjxXw()zyQJOOGr#}U&%w*xl@c6~NF@FJ8tA(e6&7G3 z{P~Y>Ji8C-65KWkqBK_)TzvQYr5Qj_3C}fdFF5({zm#S!$~FuxTvK2eUSE-3+W$O2$@R+iD^G|;OjPs~_Xdy78-X98!;q;F- z1YHwA=NUl&`wP|z>Hql;zfX*hgTMaYAHUuNC*`BW!QbqZyFSBJ|D3-bc&F=!US@VZ zoC=9Bo#T_L2a$QFAGB6M|FG8hd=!8*O*1H7`FVud+&^njsP}D+oxYm<>AUC zC>>w_ih(Y{Z#KcZcj`!fn@7PzS4eL<8Fk zSc3Z3KmUPQ1dlNyM7T7pK5b>`blw5j71WiNlZ~w@6zl)Tzg&W{Nh$GgWK ziyaqAZrkTyI~yEh?jD04A|tfeD7Zkake7AC9Tt}!u^ajtiV`fl{7t|A_i_m?EH0p&df?6ci^uw|F?#|c1@}9WTiYrL`W);QH(edAt)okvw<^gPpzX>@Tl5#q_}ahvd=B96NQbW@S?_+|f&0CL<5O^xp3c zCYYZec`4%vq&1#Ozi$b`Fr%&$a3@bM3>bpapbM3b*D2b$= z^`#f^)WX%Vxe#~M6{0PiV%6dgyJVghk;?FlW#u|I*kLU!Pq6)k*~cL&7Zz_N7eee2 zmq>vl%bfW)(;@I$R2Hy{u9YsqSCn9VP30NmJ>cnS;1|LJ2MYsXv~gCsbwcqG;+w)j z8v=pZ+>m?|pb*iy$+;Ft8k(-p%})SEUmJES50jR%*;GeDpvp*QjB=(En{^X!bBEQU;;rDVjeG~ znB^R%hbO=8JLc;qs9o9#KD_+}J5{TurLx$=&hf|H5D;Y~A0CGk8y|WA*%yK@nVegk zXGcof3DOkpN;~TZk$i{d!YZJNx&&Wcg6d;NnONxSmwXz+i|kWxxnc%+Q; zCc>JKu=lz=C&8)lNn{5xhn#vE?*mQWc!G}><{{&nUvBFK$h>nVso`K;ok>ioIZ4g4 z)-=TQ0Fkk~Av0oOhzj%;7gvGZs8(%Bf>=FB{}i1&aXLfm41=xR>}bmoUS# zOACvD!}&^3GEi9B&=y~h&jU0mv_UFeg0C(?s`ykPvSZ?_XX0Z+R7+?O#Mba3xR8!q zI-(IAdNXSZjP5+B1$J{fT%Eiqbal$rP_N`lA9MLxjv1D~wTC)j_t~dO_e99ZWLcmBva~@>peN}BXK~!;hB7|3S=>}HKd5}p{onYK;en_zqXy>Tm zm%R^ano8NttyR|fAcCd)tO5Tel@S^6jV3rYJ_J5#`Z$oE-UsXW4D5#GW}rz;dmp61iGPZK?)qgn zs#0AIO(i&r!%gj&eZ=@Nj87}V(}B5gV(!Q;z${~%WaULLP(dFMeQEliK&zq{l>++< zv})$FMH545AL6XXkxY=@Mk>6(^{^hhQb6SQK;1gbw7VB-RPyZt@|d$S6oX zOb#yK5lyDT+|TRpUIlieJEyiFL8^||IsWDEhHz)D6%x82cO14R<5rm>WSwBG@y~`|} zm;iR8JE3$5Znm~8LDcBz;Kfvfq$UAT$H%lJ@oNww`i9hikbo?%Z?YaERnI~689Zof z0d|W!p|&zXR8*R4T$3?LYB68?@b=@AV?yo0h*EQAH&hGA;ss=LAuxyQnY8^}IGmH}EuzaU*4{_vg%p^u-5UH`WB>t4$Ka_q zm9}%~65MQUae|el*>?N`#NM3ac$DFFkr$R_3JDG7iH+v5*9C#O%x5J)lxL`U8;`F0 z`(*5axjFW|#O+^OoZ$3~BEZRtI3MRZm~+6*k?Ve*2eH-s*qi*cYP;|v0nr4fX z7npbD)dF(#KqlKU-_5o43HJ84l7O@mmQMS@%5{&G>plp{Jr+@NRFsQGgGbbN3L5}A zhW=^+IUKltqjYS1gseVu@pW6(T7t{-;}cSl&2Q?P3#O;#sp&$JUh9DKQ7nc?^ zJUm1ep1JvITUGzWARxgd`IG|2Hg{X@%=DD|DL%Pym}6(E4}o#Ubag8<-&7Q3atXU$ zA(sRf8sbz))@~Wz50ZgF^?e46ZC-=YLD;pboR=vkVO+8PC%IpwmX;Q!ieXWx6*+6R z*Yz|PB1+7>eGI|QLjR(VQB=zDgp#AgH=awMIq}cn&;a>j+Gnt|v}493BV&W0OK{`G zCa79oR7}fZV(NvyO?hR#+pTU?6eZ@lrPg_oGY+3S1@433Bx7%1LkP_>jlN|XoqwpT z@&bv=I;Qy;BM}vFfZd{2VWhl0yEVh31Az13^3;q1CZ?YF^ccMdB9}>PZj@XpOuJQ8 zObWB&?%%J23F*l7suHMcDGzqH@e47`YjbDa3pnem2ZwDxI3KnLLdy)Js!T&l41H2K zM7u2}kyp%t{q%xEw3!!yjBDrX9PAD`y4IwJkIk; zN|m#Fm?`);9F5O(0l!3R8`Hg>F5LJAGm_kRB>S!t#NV(9D>(%ISq7mc>K#qp;DUc9 zhxuBX9G-uMfnT~lcqHrr_8DlE`Uc_cm|*W{ALtU?c&#Opy*_Na|jV;n;bTI9|D9YuZm;9Bg)){zxTp115vy&No*3t*P22?y;)+T z1;p11A}W~g0}0GwE=q%MD)WUFAWY-|$*z7Hr(>!-) zE^#_(5MFEwICyDH5_^juew8_jwG$+v#YX;_I4$xfWMgo%mid}OqJEy+w}#|{fR;o> zPknNld9T*r<0PCvVPJmZ9dLEg_xC$l{2(gx?m2SQdbg*m0J3iSUv7^9v>2x@?)He# z^KvmH_U0UC8!ljHr0;Y@cIY!}2ETw)VL+Bz4kzzw7|cJKgY6%jrX&;nz$7T2mV#oA z8Iw4kG6Da96K8xs0cTsiOR=^&4_uR)%*i3^_Z$x$fYd7&FL%U1?p^oLtGpu)?}g@> zu(C|NgNz{cilu)Z2auO~2(15Ds(yIxF{p0Lk}D>Gp4JX3@klr565M#LCCGdq^(0Kr zG3P;{&nbv1JsMtN1R>cbJ|YuzN;Cs=h&1yUmn|3_3%!q_v zHBM+0KzyTFXfhwNs;pyb(0LX_R+tj(YyMdrxFABO=NJTLazpbDmDR*FwimJPRSXQZ z!|LjKpA6dxB^?^cVdMW`qTv5IOgp?Qr7BU=yKIt2L`g09c*CSzRX8}Q}x^vKP5h?du}x6K*jCk(2Rr7a_9E57Zy9azJQe-yAMA8yPcHa=;%7%DnBqJ zzTaM6QsrHEQ$((}WF%g(fzG~$yRBuASLq&=XIoq?eAr({?)ToL)zLkcD|%q(9;(l& z{(dp&65Mz_PLTfUrgO0cO$Y_0hu2^o+c3;2tfH z($0(i&@}tQx2UG3aOwhlU0wC#CdN+q={!DRwu+DG!G?9pSyb-GD`V`da%X4+jQ&iMZ=w zUw01-_Vx{l(b5cbceO)LcSmneC+QRS(CXdY5BnuOuUuEp!ya)r;KWaVbeJLT>F?{6 z^ozyf9-^70nIguk=;_i-kx2Te2P2h^p%+M@F-P&z(t`R6Dw&_@#1B}47Ft%$t5kTv zT2(EQmDPnMkza6X)?H9PZqFh;C!oSLuC4yG~m_<>% c5Y@{61H^8Jd>ivfwg3PC07*qoM6N<$g03A^=>Px# literal 0 HcmV?d00001 diff --git a/murano-apps/OpenLDAP/package/manifest.yaml b/murano-apps/OpenLDAP/package/manifest.yaml new file mode 100644 index 0000000..29e344b --- /dev/null +++ b/murano-apps/OpenLDAP/package/manifest.yaml @@ -0,0 +1,12 @@ +Format: 1.0 +Type: Application +FullName: io.murano.apps.OpenLDAP +Name: OpenLDAP +Description: | + OpenLDAP is an open source implementation of the Lightweight Directory Access Protocol. +Author: 'Mirantis, Inc' +Tags: [Server, LDAP] +Classes: + io.murano.apps.OpenLDAP: OpenLDAP.yaml +UI: ui.yaml +Logo: logo.png