summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cm-container/Dockerfile-template21
-rw-r--r--cm-container/README.md22
-rw-r--r--cm-container/pom.xml3
-rw-r--r--cm-container/reset_admin.py54
-rw-r--r--cm-container/scripts/configure-tls.sh31
-rwxr-xr-xcm-container/scripts/get-plugins.sh16
-rwxr-xr-xcm-container/scripts/load-plugins.sh5
-rwxr-xr-xcm-container/scripts/set-admin-password.sh3
8 files changed, 47 insertions, 108 deletions
diff --git a/cm-container/Dockerfile-template b/cm-container/Dockerfile-template
index b5ce5ab..c794cff 100644
--- a/cm-container/Dockerfile-template
+++ b/cm-container/Dockerfile-template
@@ -1,6 +1,6 @@
# ============LICENSE_START=======================================================
# Copyright (c) 2018-2020 AT&T Intellectual Property. All rights reserved.
-# Copyright (c) 2020 J. F. Lucas. All rights reserved.
+# Copyright (c) 2020-2021 J. F. Lucas. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -14,23 +14,20 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# ============LICENSE_END=========================================================
-FROM cloudifyplatform/community-cloudify-manager-aio:20.03.03
+FROM cloudifyplatform/community-cloudify-manager-aio:20.12.15
ENV PLUGIN_REPO {{ ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_plugins_releases }}
-# Store plugin files locally
+# Install openssh-clients to ssh-keygen, used by the sshkeyshare plugin
+RUN yum install -y openssh-clients
+
RUN mkdir scripts
COPY scripts/* scripts/
-COPY reset_admin.py /opt/manager/
-# Load plugins, set up TLS configuration, load Cloudify type file
-RUN chmod +x /opt/manager/reset_admin.py \
- && chmod +x scripts/*.sh \
- && scripts/get-plugins.sh ${PLUGIN_REPO} \
- && /scripts/configure-tls.sh \
- && mkdir /opt/manager/resources/spec/cloudify/4.5.5 \
- && curl -Ss -L -f https://www.getcloudify.org/spec/cloudify/4.5.5/types.yaml > /opt/manager/resources/spec/cloudify/4.5.5/types.yaml \
- && chown -R cfyuser:cfyuser /opt/manager/resources/spec/cloudify/4.5.5
+# Load plugins and set up TLS configuration
+ RUN chmod +x scripts/*.sh \
+ && scripts/get-plugins.sh ${PLUGIN_REPO} \
+ && /scripts/configure-tls.sh
# Create mount point for CM config file
RUN mkdir -p /opt/onap && chown cfyuser:cfyuser /opt/onap
diff --git a/cm-container/README.md b/cm-container/README.md
index 03b9634..b929e21 100644
--- a/cm-container/README.md
+++ b/cm-container/README.md
@@ -1,13 +1,17 @@
-# Cloudify Manager Container Builder
+# Cloudify Manager Image Builder
## Purpose
The artifacts in this directory build a Docker image based on the
-public image from Cloudify (`cloudifyplatform/community`). The
-image has the Cloudify Manager software from the base image
-and adds our types files. It configures
-the import resolver to use our local type files instead
-of fetching them over the Internet. It sets up the `/opt/onap` mount point
-for our config files. It also sets up the certificate, key and other
-configuration for using TLS.
+public image from Cloudify (`cloudifyplatform/community`). The image
+build process, driven by the Dockerfile:
+ - retrieves the Cloudify plugins and type files needed to deploy DCAE components.
+ - edits the Cloudify configuration file (`/etc/cloudify/config.yaml`) to
+set up Cloudify Manager to use TLS on its HTTP interfaces.
+ - sets up the `/opt/onap` mount point for configuration file.
+ - installs scripts that run when the container is started. These scripts:
+ - set up persistent storage for the container
+ - make the credentials for accessing the Kubernetes API available to Cloudify Manager
+ - set the administrative password to a value generated during the Helm deployment process
+ - upload the plugins and type files to the Cloudify Manager once it is running
## Running the Container
The container is intended to be launched via a Helm chart as part
@@ -60,8 +64,6 @@ which then brings up the many other processes needed for a working instance of C
## The `setup-secret.sh` script
When Kubernetes starts a container, it mounts a directory containing the credentials that the container needs to access the Kubernetes API on the local Kubernetes cluster. The mountpoint is `/var/run/secrets/kubernetes.io/serviceaccount`. Something about the way that Cloudify Manager is started (possibly because `/sbin/init` is run) causes this mountpoint to be hidden. `setup-secret.sh` will recreate the directory if it's not present and symbolically link it to a copy of the credentials mounted at `/secret` in the container file system. This gives Cloudify Manager the credentials that the Kubernetes plugin needs to deploy Kubernetes-based DCAE components.
-`setup-secret.sh` needs to run after '/sbin/init'. The Dockerfile installs it in the `rc.local` script that runs at startup.
-
## Cleaning up Kubernetes components deployed by Cloudify Manager
Using the `helm undeploy` (or `helm delete`) command will destroy the Kubernetes components deployed via helm. In an ONAP deployment
driven by OOM, this includes destroying Cloudify Manager. helm will *not* delete Kubernetes components deployed by Cloudify Manager.
diff --git a/cm-container/pom.xml b/cm-container/pom.xml
index e676be6..b128ec3 100644
--- a/cm-container/pom.xml
+++ b/cm-container/pom.xml
@@ -2,6 +2,7 @@
<!--
================================================================================
Copyright (c) 2018-2020 AT&T Intellectual Property. All rights reserved.
+Copyright (c) 2021 J. F. Lucas. All rights reserved.
================================================================================
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -27,7 +28,7 @@ limitations under the License.
<groupId>org.onap.dcaegen2.deployments</groupId>
<artifactId>cm-container</artifactId>
<name>dcaegen2-deployments-cm-container</name>
- <version>3.4.2</version>
+ <version>4.0.0</version>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/cm-container/reset_admin.py b/cm-container/reset_admin.py
deleted file mode 100644
index 2253341..0000000
--- a/cm-container/reset_admin.py
+++ /dev/null
@@ -1,54 +0,0 @@
-########
-# Copyright (c) 2018 Cloudify Platform Ltd. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# 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.
-
-#!/usr/bin/env python
-
-import subprocess
-import json
-import argparse
-from flask_security.utils import encrypt_password
-from manager_rest.flask_utils import setup_flask_app
-
-
-def db_update_password(password):
- password = encrypt_new_password(password)
- password = password.replace('$', '\$')
- sql_command = "\"update users set password='" + password + "' where username='admin'\""
- cmd = "sudo -u postgres psql cloudify_db -c " + sql_command
- subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
-
-
-def get_salt():
- with open('/opt/manager/rest-security.conf') as f:
- rest_security = json.load(f)
-
- return rest_security['hash_salt']
-
-
-def encrypt_new_password(password):
- app = setup_flask_app(hash_salt=get_salt())
- with app.app_context():
- password = encrypt_password(password)
- return password
-
-
-if __name__ == '__main__':
-
- parser = argparse.ArgumentParser(description=('Reset admin password in DB according to rest-security.conf'))
- parser.add_argument('-p', '--password', required=True, help='New admin password')
- args = parser.parse_args()
-
- db_update_password(args.password)
- print 'Password updated in DB!\n'
diff --git a/cm-container/scripts/configure-tls.sh b/cm-container/scripts/configure-tls.sh
index a4b817b..d7c9cc8 100644
--- a/cm-container/scripts/configure-tls.sh
+++ b/cm-container/scripts/configure-tls.sh
@@ -3,6 +3,7 @@
# org.onap.dcae
# ================================================================================
# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2020-2021 J. F. Lucas. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,26 +18,14 @@
# limitations under the License.
# ============LICENSE_END=========================================================
#
-# Set up configuration files so that CM uses TLS on its external API
-# Change the nginx configuration -- this is what actually makes it work
-SSLCONFPATTERN="^include \"/etc/nginx/conf.d/http-external-rest-server.cloudify\""
-SSLCONFREPLACE="include \"/etc/nginx/conf.d/https-external-rest-server.cloudify\""
-sed -i -e "s#${SSLCONFPATTERN}#${SSLCONFREPLACE}#" /etc/nginx/conf.d/cloudify.conf
-
-# Set certificate and key locations
-sed -i -e "s# ssl_certificate .*;# ssl_certificate /opt/onap/certs/cert.pem;#" /etc/nginx/conf.d/https-external-rest-server.cloudify
-sed -i -e "s# ssl_certificate_key .*;# ssl_certificate_key /opt/onap/certs/key.pem;#" /etc/nginx/conf.d/https-external-rest-server.cloudify
-
-# Change the cloudify config file, just to be safe
-# Someone might run cfy_manager configure on the CM container for some reason
-# and we don't want them to overwrite the TLS configuration
-# (Running cfy_manager configure is a bad idea, though, because it often fails.)
+# Set tls to "enabled"
sed -i -e "s#^ ssl_enabled: false# ssl_enabled: true#" /etc/cloudify/config.yaml
-
-# The Cloudify command line tool ('cfy') needs to be configured for TLS as well
-# (The readiness check script uses 'cfy status')
-sed -i -e "s#^rest_port: 80#rest_port: 443#" /root/.cloudify/profiles/localhost/context
-sed -i -e "s/^rest_protocol: http$/rest_protocol: https/" /root/.cloudify/profiles/localhost/context
-sed -i -e "s#^rest_certificate: !!python/unicode '/etc/cloudify/ssl/cloudify_external_cert.pem'#rest_certificate: !!python/unicode '/opt/onap/certs/cacert.pem'#" /root/.cloudify/profiles/localhost/context
-sed -i -e "s#^manager_ip: !!python/unicode 'localhost'#manager_ip: !!python/unicode 'dcae-cloudify-manager'#" /root/.cloudify/profiles/localhost/context
+# Set up paths for our certificates
+sed -i -e "s|external_cert_path: .*$|external_cert_path: '/opt/onap/certs/cert.pem'|" /etc/cloudify/config.yaml
+sed -i -e "s|external_key_path: .*$|external_key_path: '/opt/onap/certs/key.pem'|" /etc/cloudify/config.yaml
+sed -i -e "s|external_ca_cert_path: .*$|external_ca_cert_path: '/opt/onap/certs/cacert.pem'|" /etc/cloudify/config.yaml
+# Set the host name for the local profile
+# Otherwise, the CM startup process will use 'localhost' and will fail
+# because the TLS certificate does not have 'localhost' as a CN or SAN
+sed -i -e 's/ cli_local_profile_host_name: .*$/ cli_local_profile_host_name: dcae-cloudify-manager/' /etc/cloudify/config.yaml
diff --git a/cm-container/scripts/get-plugins.sh b/cm-container/scripts/get-plugins.sh
index 5d11254..5162832 100755
--- a/cm-container/scripts/get-plugins.sh
+++ b/cm-container/scripts/get-plugins.sh
@@ -1,6 +1,7 @@
#!/bin/bash
# ============LICENSE_START=======================================================
# Copyright (c) 2018-2020 AT&T Intellectual Property. All rights reserved.
+# Copyright (d) 2020-2021 J. F. Lucas. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -29,14 +30,13 @@ DEST=${DEST:-/opt/plugins}
# /path/to/plugin/wagon|/path/to/type/file
PLUGINS=\
"\
-/dcaepolicyplugin/2.4.0/dcaepolicyplugin-2.4.0-py27-none-linux_x86_64.wgn|/dcaepolicyplugin/2.4.0/dcaepolicyplugin_types.yaml \
-/relationshipplugin/1.1.0/relationshipplugin-1.1.0-py27-none-linux_x86_64.wgn|/relationshipplugin/1.1.0/relationshipplugin_types.yaml \
-/k8splugin/3.5.1/k8splugin-3.5.1-py27-none-linux_x86_64.wgn|/k8splugin/3.5.1/k8splugin_types.yaml \
-/clamppolicyplugin/1.1.0/clamppolicyplugin-1.1.0-py27-none-linux_x86_64.wgn|/clamppolicyplugin/1.1.0/clamppolicyplugin_types.yaml \
-/dmaap/1.5.0/dmaap-1.5.0-py27-none-linux_x86_64.wgn|/dmaap/1.5.0/dmaap_types.yaml \
-/helm/4.2.0/helm-4.2.0-py27-none-linux_x86_64.wgn|/helm/4.2.0/helm_types.yaml \
-/pgaas/1.3.0/pgaas-1.3.0-py27-none-linux_x86_64.wgn|/pgaas/1.3.0/pgaas_types.yaml \
-/sshkeyshare/1.2.0/sshkeyshare-1.2.0-py27-none-linux_x86_64.wgn|/sshkeyshare/1.2.0/sshkeyshare_types.yaml
+/dcaepolicyplugin/2.4.0/dcaepolicyplugin-2.4.0-py36-none-linux_x86_64.wgn|/dcaepolicyplugin/2.4.0/dcaepolicyplugin_types.yaml \
+/relationshipplugin/1.1.0/relationshipplugin-1.1.0-py36-none-linux_x86_64.wgn|/relationshipplugin/1.1.0/relationshipplugin_types.yaml \
+/k8splugin/3.5.1/k8splugin-3.5.1-py36-none-linux_x86_64.wgn|/k8splugin/3.5.1/k8splugin_types.yaml \
+/clamppolicyplugin/1.1.0/clamppolicyplugin-1.1.0-py36-none-linux_x86_64.wgn|/clamppolicyplugin/1.1.0/clamppolicyplugin_types.yaml \
+/dmaap/1.5.0/dmaap-1.5.0-py36-none-linux_x86_64.wgn|/dmaap/1.5.0/dmaap_types.yaml \
+/pgaas/1.3.0/pgaas-1.3.0-py36-none-linux_x86_64.wgn|/pgaas/1.3.0/pgaas_types.yaml \
+/sshkeyshare/1.2.0/sshkeyshare-1.2.0-py36-none-linux_x86_64.wgn|/sshkeyshare/1.2.0/sshkeyshare_types.yaml
"
mkdir -p ${DEST}
diff --git a/cm-container/scripts/load-plugins.sh b/cm-container/scripts/load-plugins.sh
index c93f3d9..4ac3c6d 100755
--- a/cm-container/scripts/load-plugins.sh
+++ b/cm-container/scripts/load-plugins.sh
@@ -1,6 +1,7 @@
#!/bin/bash
# ============LICENSE_START=======================================================
# Copyright (c) 2019-2020 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2020-2021 J. F. Lucas. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -77,7 +78,6 @@ function install_plugin {
set -ex
-
# Wait for Cloudify Manager to come up
while ! /scripts/cloudify-ready.sh
do
@@ -85,6 +85,9 @@ do
sleep 15
done
+# Set nullglob to handle the case of an empty plugin directory
+shopt -s nullglob
+
if [[ ! -f ${PLUGINS_LOADED} ]]
then
diff --git a/cm-container/scripts/set-admin-password.sh b/cm-container/scripts/set-admin-password.sh
index d8c4121..04bd375 100755
--- a/cm-container/scripts/set-admin-password.sh
+++ b/cm-container/scripts/set-admin-password.sh
@@ -1,6 +1,7 @@
#!/bin/bash
# ============LICENSE_START=======================================================
# Copyright (c) 2020 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2020-2021 J. F. Lucas. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -35,7 +36,7 @@ CMPASS=${CMPASS:-admin}
echo "Set Cloudify's admin password"
cd /opt/manager
-cfy_manager --reset_admin_password $CMPASS || ./env/bin/python reset_admin.py -p $CMPASS
+cfy_manager reset-admin-password $CMPASS
echo "Set the password used by the cfy client"
cfy profile set -p $CMPASS