Compare commits
No commits in common. "master" and "4.0" have entirely different histories.
42 changed files with 0 additions and 2359 deletions
55
Dockerfile
55
Dockerfile
|
|
@ -1,55 +0,0 @@
|
||||||
FROM baseruntime/baseruntime:latest
|
|
||||||
|
|
||||||
ENV NAME=mongodb \
|
|
||||||
ARCH=x86_64 \
|
|
||||||
VERSION=0 \
|
|
||||||
RELEASE=1 \
|
|
||||||
MONGODB_VERSION="3.4.3"
|
|
||||||
|
|
||||||
LABEL MAINTAINER "Matus Kocka" <mkocka@redhat.com>
|
|
||||||
LABEL summary="MongoDB, NoSQL database." \
|
|
||||||
name="$FGC/$NAME" \
|
|
||||||
version="$VERSION" \
|
|
||||||
release="$RELEASE.$DISTTAG" \
|
|
||||||
architecture="$ARCH" \
|
|
||||||
description="MongoDB is a scalable, high-performance, open source NoSQL database." \
|
|
||||||
vendor="Fedora Project" \
|
|
||||||
com.redhat.component="$NAME" \
|
|
||||||
usage="docker run -e MONGODB_USER=<user_name> -e MONGODB_PASSWORD=<password> -e MONGODB_DATABASE=<db_name> -e MONGODB_ADMIN_PASSWORD=<admin_password> -p 27017:27017 mongodb" \
|
|
||||||
org.fedoraproject.component="mongodb" \
|
|
||||||
authoritative-source-url="registry.fedoraproject.org" \
|
|
||||||
io.k8s.description="MongoDB is a scalable, high-performance, open source NoSQL database." \
|
|
||||||
io.k8s.display-name="MongoDB 3.4.3" \
|
|
||||||
io.openshift.tags="mongodb, db, database, nosql" \
|
|
||||||
io.openshift.expose-services="27017"
|
|
||||||
|
|
||||||
#removed mongo-tools from $INSTALL_PKGS
|
|
||||||
|
|
||||||
RUN INSTALL_PKGS="bind-utils gettext iproute rsync tar findutils python3" && \
|
|
||||||
microdnf --nodocs install -y mongodb mongodb-server && \
|
|
||||||
microdnf --nodocs install -y $INSTALL_PKGS && \
|
|
||||||
microdnf clean all
|
|
||||||
|
|
||||||
# Set paths to avoid hard-coding them in scripts.
|
|
||||||
ENV HOME=/var/lib/mongodb \
|
|
||||||
CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/mongodb
|
|
||||||
|
|
||||||
ADD files /
|
|
||||||
|
|
||||||
# Add help file
|
|
||||||
COPY root /
|
|
||||||
|
|
||||||
EXPOSE 27017
|
|
||||||
|
|
||||||
CMD ["/usr/bin/run-mongod"]
|
|
||||||
|
|
||||||
# Container setup from scl
|
|
||||||
RUN : > /etc/mongod.conf && \
|
|
||||||
mkdir -p ${HOME}/data && \
|
|
||||||
# Set owner 'mongodb:0' and 'g+rw(x)' permission - to avoid problems running container with arbitrary UID
|
|
||||||
/usr/libexec/fix-permissions /etc/mongod.conf ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template \
|
|
||||||
${HOME}
|
|
||||||
|
|
||||||
VOLUME ["/var/lib/mongodb/data"]
|
|
||||||
|
|
||||||
USER 184
|
|
||||||
15
Makefile
15
Makefile
|
|
@ -1,15 +0,0 @@
|
||||||
IMAGE_NAME = mongodb
|
|
||||||
|
|
||||||
MODULEMDURL=file://mongodb.yaml
|
|
||||||
|
|
||||||
default: run
|
|
||||||
|
|
||||||
build:
|
|
||||||
docker build --tag=$(IMAGE_NAME) .
|
|
||||||
|
|
||||||
run: build
|
|
||||||
docker run -d $(IMAGE_NAME)
|
|
||||||
|
|
||||||
test: build
|
|
||||||
cd tests; MODULE=docker MODULEMD=$(MODULEMDURL) URL="docker=$(IMAGE_NAME)" make all
|
|
||||||
# cd tests; MODULE=rpm MODULEMD=$(MODULEMDURL) URL="docker=$(IMAGE_NAME)" make all
|
|
||||||
24
README.md
24
README.md
|
|
@ -1,24 +0,0 @@
|
||||||
# MongoDB
|
|
||||||
|
|
||||||
[**Package DB** (owner)](https://admin.fedoraproject.org/pkgdb/package/modules/mongodb/) |
|
|
||||||
[**F26 modulemd** (source)](http://pkgs.fedoraproject.org/cgit/modules/mongodb.git/tree/mongodb.yaml?h=f26) |
|
|
||||||
[**PDC** (result)](https://pdc.fedoraproject.org/rest_api/v1/unreleasedvariants/?active=True&variant_name=mongodb)
|
|
||||||
|
|
||||||
Mongo from humongous is a high-performance, open source, schema-free document-oriented database. MongoDB is written in C++ and offers the following features. Collection oriented storage, easy storage of object/JSON-style data. Dynamic queries. Full index support, including on inner objects and embedded arrays. Query profiling. Replication and fail-over support. Efficient storage of binary data including large objects (e.g. photos and videos). Auto-sharding for cloud-level scalability (currently in early alpha). Commercial Support Available. A key goal of MongoDB is to bridge the gap between key/value stores (which are fast and highly scalable) and traditional RDBMS systems (which are deep in functionality).
|
|
||||||
|
|
||||||
## Current state
|
|
||||||
|
|
||||||
| State | Description |
|
|
||||||
|-------|-------------|
|
|
||||||
| ✓ YES | **Build passes** in the infra (all build deps are ok) |
|
|
||||||
| ✓ YES | **Installs** on the Base Runtime (all runtime deps are ok) |
|
|
||||||
| ✗ NO | **No bootstrap** - uses only proper modules |
|
|
||||||
| ✓ YES | General **tests are in dist-git** |
|
|
||||||
| ✓ YES | General **tests pass** |
|
|
||||||
| ✗ NO | Meets the **Fedora Module Packaging Guidelines** |
|
|
||||||
|
|
||||||
### Notes
|
|
||||||
|
|
||||||
See [**README**](https://github.com/container-images/mongodb) on github for more details.
|
|
||||||
|
|
||||||
See [**hub.docker**](https://hub.docker.com/r/modularitycontainers/mongodb/) for Dockerimage.
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
"""
|
|
||||||
Script for parsing cgroup information
|
|
||||||
|
|
||||||
This script will read some limits from the cgroup system and parse
|
|
||||||
them, printing out "VARIABLE=VALUE" on each line for every limit that is
|
|
||||||
successfully read. Output of this script can be directly fed into
|
|
||||||
bash's export command. Recommended usage from a bash script:
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
export_vars=$(cgroup-limits) ; export $export_vars
|
|
||||||
|
|
||||||
Variables currently supported:
|
|
||||||
MAX_MEMORY_LIMIT_IN_BYTES
|
|
||||||
Maximum possible limit MEMORY_LIMIT_IN_BYTES can have. This is
|
|
||||||
currently constant value of 9223372036854775807.
|
|
||||||
MEMORY_LIMIT_IN_BYTES
|
|
||||||
Maximum amount of user memory in bytes. If this value is set
|
|
||||||
to the same value as MAX_MEMORY_LIMIT_IN_BYTES, it means that
|
|
||||||
there is no limit set. The value is taken from
|
|
||||||
/sys/fs/cgroup/memory/memory.limit_in_bytes
|
|
||||||
NUMBER_OF_CORES
|
|
||||||
Number of detected CPU cores that can be used. This value is
|
|
||||||
calculated from /sys/fs/cgroup/cpuset/cpuset.cpus
|
|
||||||
NO_MEMORY_LIMIT
|
|
||||||
Set to "true" if MEMORY_LIMIT_IN_BYTES is so high that the caller
|
|
||||||
can act as if no memory limit was set. Undefined otherwise.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def _read_file(path):
|
|
||||||
try:
|
|
||||||
with open(path, 'r') as f:
|
|
||||||
return f.read().strip()
|
|
||||||
except IOError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def get_memory_limit():
|
|
||||||
"""
|
|
||||||
Read memory limit, in bytes.
|
|
||||||
"""
|
|
||||||
|
|
||||||
limit = _read_file('/sys/fs/cgroup/memory/memory.limit_in_bytes')
|
|
||||||
if limit is None or not limit.isdigit():
|
|
||||||
print("Warning: Can't detect memory limit from cgroups",
|
|
||||||
file=sys.stderr)
|
|
||||||
return None
|
|
||||||
return int(limit)
|
|
||||||
|
|
||||||
|
|
||||||
def get_number_of_cores():
|
|
||||||
"""
|
|
||||||
Read number of CPU cores.
|
|
||||||
"""
|
|
||||||
|
|
||||||
core_count = 0
|
|
||||||
|
|
||||||
line = _read_file('/sys/fs/cgroup/cpuset/cpuset.cpus')
|
|
||||||
if line is None:
|
|
||||||
print("Warning: Can't detect number of CPU cores from cgroups",
|
|
||||||
file=sys.stderr)
|
|
||||||
return None
|
|
||||||
|
|
||||||
for group in line.split(','):
|
|
||||||
core_ids = list(map(int, group.split('-')))
|
|
||||||
if len(core_ids) == 2:
|
|
||||||
core_count += core_ids[1] - core_ids[0] + 1
|
|
||||||
else:
|
|
||||||
core_count += 1
|
|
||||||
|
|
||||||
return core_count
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
env_vars = {
|
|
||||||
"MAX_MEMORY_LIMIT_IN_BYTES": 9223372036854775807,
|
|
||||||
"MEMORY_LIMIT_IN_BYTES": get_memory_limit(),
|
|
||||||
"NUMBER_OF_CORES": get_number_of_cores()
|
|
||||||
}
|
|
||||||
|
|
||||||
env_vars = {k: v for k, v in env_vars.items() if v is not None}
|
|
||||||
|
|
||||||
if env_vars.get("MEMORY_LIMIT_IN_BYTES", 0) >= 92233720368547:
|
|
||||||
env_vars["NO_MEMORY_LIMIT"] = "true"
|
|
||||||
|
|
||||||
for key, value in env_vars.items():
|
|
||||||
print("{0}={1}".format(key, value))
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
exec "$@"
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source ${CONTAINER_SCRIPTS_PATH}/common.sh
|
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
echo "=> Shutting down MongoDB server ..."
|
|
||||||
pkill -INT mongod || :
|
|
||||||
wait_for_mongo_down
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
trap 'cleanup' SIGINT SIGTERM
|
|
||||||
|
|
||||||
check_env_vars
|
|
||||||
|
|
||||||
setup_wiredtiger_cache ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template
|
|
||||||
|
|
||||||
# If user provides own config file use it and do not generate new one
|
|
||||||
if [ ! -s $MONGODB_CONFIG_PATH ]; then
|
|
||||||
# Generate config file for MongoDB
|
|
||||||
envsubst < ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template > $MONGODB_CONFIG_PATH
|
|
||||||
fi
|
|
||||||
|
|
||||||
mongo_common_args="-f $MONGODB_CONFIG_PATH"
|
|
||||||
|
|
||||||
setup_default_datadir
|
|
||||||
|
|
||||||
# Must bring up MongoDB on localhost only until it has an admin password set.
|
|
||||||
mongod $mongo_common_args --bind_ip 127.0.0.1 &
|
|
||||||
wait_for_mongo_up
|
|
||||||
js_command="db.system.users.count({'user':'admin', 'db':'admin'})"
|
|
||||||
if [ "$(mongo admin --quiet --eval "$js_command")" == "1" ]; then
|
|
||||||
echo "=> Admin user is already created. Resetting password ..."
|
|
||||||
mongo_reset_admin
|
|
||||||
else
|
|
||||||
mongo_create_admin
|
|
||||||
fi
|
|
||||||
if [[ -v CREATE_USER ]]; then
|
|
||||||
js_command="db.system.users.count({'user':'${MONGODB_USER}', 'db':'${MONGODB_DATABASE}'})"
|
|
||||||
if [ "$(mongo admin --quiet --eval "$js_command")" == "1" ]; then
|
|
||||||
echo "=> MONGODB_USER user is already created. Resetting password ..."
|
|
||||||
mongo_reset_user
|
|
||||||
else
|
|
||||||
mongo_create_user
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# Restart the MongoDB daemon to bind on all interfaces
|
|
||||||
mongod $mongo_common_args --shutdown
|
|
||||||
wait_for_mongo_down
|
|
||||||
|
|
||||||
# Make sure env variables don't propagate to mongod process.
|
|
||||||
unset MONGODB_USER MONGODB_PASSWORD MONGODB_DATABASE MONGODB_ADMIN_PASSWORD
|
|
||||||
exec mongod $mongo_common_args --auth
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Run mongod in a StatefulSet-based replica set. See
|
|
||||||
# https://github.com/sclorg/mongodb-container/blob/master/examples/petset/README.md
|
|
||||||
# for a description of how this is intended to work.
|
|
||||||
#
|
|
||||||
# Note:
|
|
||||||
# - It does not attempt to remove the host from the replica set configuration
|
|
||||||
# when it is terminating. That is by design, because, in a StatefulSet, when a
|
|
||||||
# pod/container terminates and is restarted by OpenShift, it will always have
|
|
||||||
# the same hostname. Removing hosts from the configuration affects replica set
|
|
||||||
# elections and can impact the replica set stability.
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source ${CONTAINER_SCRIPTS_PATH}/common.sh
|
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
echo "=> Shutting down MongoDB server ..."
|
|
||||||
pkill -INT mongod || :
|
|
||||||
wait_for_mongo_down
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
trap 'cleanup' SIGINT SIGTERM
|
|
||||||
|
|
||||||
REPLICATION=1 check_env_vars
|
|
||||||
|
|
||||||
setup_wiredtiger_cache ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template
|
|
||||||
|
|
||||||
# If user provides own config file use it and do not generate new one
|
|
||||||
if [ ! -s "${MONGODB_CONFIG_PATH}" ]; then
|
|
||||||
# Generate config file for MongoDB
|
|
||||||
envsubst < "${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template" > "${MONGODB_CONFIG_PATH}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mongo_common_args="-f ${MONGODB_CONFIG_PATH}"
|
|
||||||
|
|
||||||
# Attention: setup_keyfile may modify value of mongo_common_args!
|
|
||||||
setup_keyfile
|
|
||||||
setup_default_datadir
|
|
||||||
|
|
||||||
${CONTAINER_SCRIPTS_PATH}/init-replset.sh &
|
|
||||||
|
|
||||||
# TODO: capture exit code of `init-petset-replset.sh` and exit with an error if
|
|
||||||
# the initialization failed, so that the container will be restarted and the
|
|
||||||
# user can gain more visibility that there is a problem in a way other than just
|
|
||||||
# inspecting log messages.
|
|
||||||
|
|
||||||
# Make sure env variables don't propagate to mongod process.
|
|
||||||
unset MONGODB_USER MONGODB_PASSWORD MONGODB_DATABASE MONGODB_ADMIN_PASSWORD
|
|
||||||
mongod ${mongo_common_args} --replSet "${MONGODB_REPLICA_NAME}" &
|
|
||||||
wait
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Run mongod in a StatefulSet-based replica set. See
|
|
||||||
# https://github.com/sclorg/mongodb-container/blob/master/examples/petset/README.md
|
|
||||||
# for a description of how this is intended to work.
|
|
||||||
#
|
|
||||||
# Note:
|
|
||||||
# - It does not attempt to remove the host from the replica set configuration
|
|
||||||
# when it is terminating. That is by design, because, in a StatefulSet, when a
|
|
||||||
# pod/container terminates and is restarted by OpenShift, it will always have
|
|
||||||
# the same hostname. Removing hosts from the configuration affects replica set
|
|
||||||
# elections and can impact the replica set stability.
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source ${CONTAINER_SCRIPTS_PATH}/common.sh
|
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
echo "=> Shutting down MongoDB server ..."
|
|
||||||
pkill -INT mongod || :
|
|
||||||
wait_for_mongo_down
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
trap 'cleanup' SIGINT SIGTERM
|
|
||||||
|
|
||||||
REPLICATION=1 check_env_vars
|
|
||||||
|
|
||||||
setup_wiredtiger_cache ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template
|
|
||||||
|
|
||||||
# If user provides own config file use it and do not generate new one
|
|
||||||
if [ ! -s "${MONGODB_CONFIG_PATH}" ]; then
|
|
||||||
# Generate config file for MongoDB
|
|
||||||
envsubst < "${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template" > "${MONGODB_CONFIG_PATH}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mongo_common_args="-f ${MONGODB_CONFIG_PATH}"
|
|
||||||
|
|
||||||
# Attention: setup_keyfile may modify value of mongo_common_args!
|
|
||||||
setup_keyfile
|
|
||||||
setup_default_datadir
|
|
||||||
|
|
||||||
${CONTAINER_SCRIPTS_PATH}/init-replset.sh &
|
|
||||||
|
|
||||||
# TODO: capture exit code of `init-petset-replset.sh` and exit with an error if
|
|
||||||
# the initialization failed, so that the container will be restarted and the
|
|
||||||
# user can gain more visibility that there is a problem in a way other than just
|
|
||||||
# inspecting log messages.
|
|
||||||
|
|
||||||
# Make sure env variables don't propagate to mongod process.
|
|
||||||
unset MONGODB_USER MONGODB_PASSWORD MONGODB_DATABASE MONGODB_ADMIN_PASSWORD
|
|
||||||
mongod ${mongo_common_args} --replSet "${MONGODB_REPLICA_NAME}" &
|
|
||||||
wait
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# Fix permissions on the given directory to allow group read/write of
|
|
||||||
# regular files and execute of directories.
|
|
||||||
find $@ -exec chown mongodb:0 {} \;
|
|
||||||
find $@ -exec chmod g+rw {} \;
|
|
||||||
find $@ -type d -exec chmod g+x {} +
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
MongoDB Docker image
|
|
||||||
====================
|
|
||||||
|
|
||||||
This repository contains Dockerfiles for MongoDB images for general usage and OpenShift.
|
|
||||||
Users can choose between RHEL and CentOS based images.
|
|
||||||
|
|
||||||
Environment variables
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
The image recognizes the following environment variables that you can set during
|
|
||||||
initialization by passing `-e VAR=VALUE` to the Docker run command.
|
|
||||||
|
|
||||||
| Variable name | Description |
|
|
||||||
| :------------------------ | ----------------------------------------- |
|
|
||||||
| `MONGODB_ADMIN_PASSWORD` | Password for the admin user |
|
|
||||||
|
|
||||||
Optionally you can provide settings for user with 'readWrite' role.
|
|
||||||
|
|
||||||
| Variable name | Description |
|
|
||||||
| :------------------------ | ----------------------------------------- |
|
|
||||||
| `MONGODB_USER` | User name for MONGODB account to be created |
|
|
||||||
| `MONGODB_PASSWORD` | Password for the user account |
|
|
||||||
| `MONGODB_DATABASE` | Database name |
|
|
||||||
|
|
||||||
|
|
||||||
The following environment variables influence the MongoDB configuration file. They are all optional.
|
|
||||||
|
|
||||||
| Variable name | Description | Default
|
|
||||||
| :-------------------- | ------------------------------------------------------------------------- | ----------------
|
|
||||||
| `MONGODB_QUIET` | Runs MongoDB in a quiet mode that attempts to limit the amount of output. | true
|
|
||||||
|
|
||||||
|
|
||||||
You can also set the following mount points by passing the `-v /host:/container` flag to Docker.
|
|
||||||
|
|
||||||
| Volume mount point | Description |
|
|
||||||
| :-------------------------- | ---------------------- |
|
|
||||||
| `/var/lib/mongodb/data` | MongoDB data directory |
|
|
||||||
|
|
||||||
**Notice: When mouting a directory from the host into the container, ensure that the mounted
|
|
||||||
directory has the appropriate permissions and that the owner and group of the directory
|
|
||||||
matches the user UID or name which is running inside the container.**
|
|
||||||
|
|
||||||
|
|
||||||
Usage
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
For this, we will assume that you are using the `centos/mongodb-32-centos7` image.
|
|
||||||
If you want to set only the mandatory environment variables and store the database
|
|
||||||
in the `/home/user/database` directory on the host filesystem, execute the following command:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ docker run -d -e MONGODB_USER=<user> -e MONGODB_PASSWORD=<password> -e MONGODB_DATABASE=<database> -e MONGODB_ADMIN_PASSWORD=<admin_password> -v /home/user/database:/var/lib/mongodb/data centos/mongodb-32-centos7
|
|
||||||
```
|
|
||||||
|
|
||||||
If you are initializing the database and it's the first time you are using the
|
|
||||||
specified shared volume, the database will be created with two users: `admin` and `MONGODB_USER`. After that the MongoDB daemon
|
|
||||||
will be started. If you are re-attaching the volume to another container, the
|
|
||||||
creation of the database user and admin user will be skipped and only the
|
|
||||||
MongoDB daemon will be started.
|
|
||||||
|
|
||||||
Custom configuration file
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
It is allowed to use custom configuration file for mongod server. Providing a custom configuration file supercedes the individual configuration environment variable values.
|
|
||||||
|
|
||||||
To use custom configuration file in container it has to be mounted into `/etc/mongod.conf`. For example to use configuration file stored in `/home/user` directory use this option for `docker run` command: `-v /home/user/mongod.conf:/etc/mongod.conf:Z`.
|
|
||||||
|
|
||||||
**Notice: Custom config file does not affect name of replica set. It has to be set in `MONGODB_REPLICA_NAME` environment variable.**
|
|
||||||
|
|
||||||
MongoDB admin user
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
The admin user name is set to `admin` and you have to to specify the password by
|
|
||||||
setting the `MONGODB_ADMIN_PASSWORD` environment variable. This process is done
|
|
||||||
upon database initialization.
|
|
||||||
|
|
||||||
|
|
||||||
Changing passwords
|
|
||||||
------------------
|
|
||||||
|
|
||||||
Since passwords are part of the image configuration, the only supported method
|
|
||||||
to change passwords for the database user (`MONGODB_USER`) and admin user is by
|
|
||||||
changing the environment variables `MONGODB_PASSWORD` and
|
|
||||||
`MONGODB_ADMIN_PASSWORD`, respectively.
|
|
||||||
|
|
||||||
Changing database passwords directly in MongoDB will cause a mismatch between
|
|
||||||
the values stored in the variables and the actual passwords. Whenever a database
|
|
||||||
container starts it will reset the passwords to the values stored in the
|
|
||||||
environment variables.
|
|
||||||
|
|
||||||
|
|
@ -1,260 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# Data directory where MongoDB database files live. The data subdirectory is here
|
|
||||||
# because mongodb.conf lives in /var/lib/mongodb/ and we don't want a volume to
|
|
||||||
# override it.
|
|
||||||
export MONGODB_DATADIR=/var/lib/mongodb/data
|
|
||||||
export CONTAINER_PORT=27017
|
|
||||||
# Configuration settings.
|
|
||||||
export MONGODB_QUIET=${MONGODB_QUIET:-true}
|
|
||||||
|
|
||||||
MONGODB_CONFIG_PATH=/etc/mongod.conf
|
|
||||||
MONGODB_KEYFILE_PATH="${HOME}/keyfile"
|
|
||||||
|
|
||||||
# Constants used for waiting
|
|
||||||
readonly MAX_ATTEMPTS=60
|
|
||||||
readonly SLEEP_TIME=1
|
|
||||||
|
|
||||||
# wait_for_mongo_up waits until the mongo server accepts incomming connections
|
|
||||||
function wait_for_mongo_up() {
|
|
||||||
_wait_for_mongo 1 "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait_for_mongo_down waits until the mongo server is down
|
|
||||||
function wait_for_mongo_down() {
|
|
||||||
_wait_for_mongo 0 "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait_for_mongo waits until the mongo server is up/down
|
|
||||||
# $1 - 0 or 1 - to specify for what to wait (0 - down, 1 - up)
|
|
||||||
# $2 - host where to connect (localhost by default)
|
|
||||||
function _wait_for_mongo() {
|
|
||||||
local operation=${1:-1}
|
|
||||||
local message="up"
|
|
||||||
if [[ ${operation} -eq 0 ]]; then
|
|
||||||
message="down"
|
|
||||||
fi
|
|
||||||
|
|
||||||
local mongo_cmd="mongo admin --host ${2:-localhost} "
|
|
||||||
|
|
||||||
local i
|
|
||||||
for i in $(seq $MAX_ATTEMPTS); do
|
|
||||||
echo "=> ${2:-} Waiting for MongoDB daemon ${message}"
|
|
||||||
if ([[ ${operation} -eq 1 ]] && ${mongo_cmd} --eval "quit()" &>/dev/null) || ([[ ${operation} -eq 0 ]] && ! ${mongo_cmd} --eval "quit()" &>/dev/null); then
|
|
||||||
echo "=> MongoDB daemon is ${message}"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
sleep ${SLEEP_TIME}
|
|
||||||
done
|
|
||||||
echo "=> Giving up: MongoDB daemon is not ${message}!"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# endpoints returns list of IP addresses with other instances of MongoDB
|
|
||||||
# To get list of endpoints, you need to have headless Service named 'mongodb'.
|
|
||||||
# NOTE: This won't work with standalone Docker container.
|
|
||||||
function endpoints() {
|
|
||||||
service_name=${MONGODB_SERVICE_NAME:-mongodb}
|
|
||||||
dig ${service_name} A +search +short 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# replset_addr return the address of the current replSet
|
|
||||||
function replset_addr() {
|
|
||||||
local current_endpoints
|
|
||||||
current_endpoints="$(endpoints)"
|
|
||||||
if [ -z "${current_endpoints}" ]; then
|
|
||||||
info "Cannot get address of replica set: no nodes are listed in service!"
|
|
||||||
info "CAUSE: DNS lookup for '${MONGODB_SERVICE_NAME:-mongodb}' returned no results."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo "${MONGODB_REPLICA_NAME}/${current_endpoints//[[:space:]]/,}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_create_admin creates the MongoDB admin user with password: MONGODB_ADMIN_PASSWORD
|
|
||||||
# $1 - login parameters for mongo (optional)
|
|
||||||
# $2 - host where to connect (localhost by default)
|
|
||||||
function mongo_create_admin() {
|
|
||||||
if [[ -z "${MONGODB_ADMIN_PASSWORD:-}" ]]; then
|
|
||||||
echo >&2 "=> MONGODB_ADMIN_PASSWORD is not set. Authentication can not be set up."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set admin password
|
|
||||||
local js_command="db.createUser({user: 'admin', pwd: '${MONGODB_ADMIN_PASSWORD}', roles: ['dbAdminAnyDatabase', 'userAdminAnyDatabase' , 'readWriteAnyDatabase','clusterAdmin' ]});"
|
|
||||||
if ! mongo admin ${1:-} --host ${2:-"localhost"} --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to create MongoDB admin user."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_create_user creates the MongoDB database user: MONGODB_USER,
|
|
||||||
# with password: MONGDOB_PASSWORD, inside database: MONGODB_DATABASE
|
|
||||||
# $1 - login parameters for mongo (optional)
|
|
||||||
# $2 - host where to connect (localhost by default)
|
|
||||||
function mongo_create_user() {
|
|
||||||
# Ensure input variables exists
|
|
||||||
if [[ -z "${MONGODB_USER:-}" ]]; then
|
|
||||||
echo >&2 "=> MONGODB_USER is not set. Failed to create MongoDB user"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [[ -z "${MONGODB_PASSWORD:-}" ]]; then
|
|
||||||
echo "=> MONGODB_PASSWORD is not set. Failed to create MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit >&2 1
|
|
||||||
fi
|
|
||||||
if [[ -z "${MONGODB_DATABASE:-}" ]]; then
|
|
||||||
echo >&2 "=> MONGODB_DATABASE is not set. Failed to create MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create database user
|
|
||||||
local js_command="db.getSiblingDB('${MONGODB_DATABASE}').createUser({user: '${MONGODB_USER}', pwd: '${MONGODB_PASSWORD}', roles: [ 'readWrite' ]});"
|
|
||||||
if ! mongo admin ${1:-} --host ${2:-"localhost"} --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to create MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_reset_user sets the MongoDB MONGODB_USER's password to match MONGODB_PASSWORD
|
|
||||||
function mongo_reset_user() {
|
|
||||||
if [[ -n "${MONGODB_USER:-}" && -n "${MONGODB_PASSWORD:-}" && -n "${MONGODB_DATABASE:-}" ]]; then
|
|
||||||
local js_command="db.changeUserPassword('${MONGODB_USER}', '${MONGODB_PASSWORD}')"
|
|
||||||
if ! mongo ${MONGODB_DATABASE} --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to reset password of MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_reset_admin sets the MongoDB admin password to match MONGODB_ADMIN_PASSWORD
|
|
||||||
function mongo_reset_admin() {
|
|
||||||
if [[ -n "${MONGODB_ADMIN_PASSWORD:-}" ]]; then
|
|
||||||
local js_command="db.changeUserPassword('admin', '${MONGODB_ADMIN_PASSWORD}')"
|
|
||||||
if ! mongo admin --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to reset password of MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# setup_keyfile fixes the bug in mounting the Kubernetes 'Secret' volume that
|
|
||||||
# mounts the secret files with 'too open' permissions.
|
|
||||||
# add --keyFile argument to mongo_common_args
|
|
||||||
function setup_keyfile() {
|
|
||||||
# If user specify keyFile in config file do not use generated keyFile
|
|
||||||
if grep -q "^\s*keyFile" ${MONGODB_CONFIG_PATH}; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
if [ -z "${MONGODB_KEYFILE_VALUE-}" ]; then
|
|
||||||
echo >&2 "ERROR: You have to provide the 'keyfile' value in MONGODB_KEYFILE_VALUE"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
local keyfile_dir
|
|
||||||
keyfile_dir="$(dirname "$MONGODB_KEYFILE_PATH")"
|
|
||||||
if [ ! -w "$keyfile_dir" ]; then
|
|
||||||
echo >&2 "ERROR: Couldn't create ${MONGODB_KEYFILE_PATH}"
|
|
||||||
echo >&2 "CAUSE: current user doesn't have permissions for writing to ${keyfile_dir} directory"
|
|
||||||
echo >&2 "DETAILS: current user id = $(id -u), user groups: $(id -G)"
|
|
||||||
echo >&2 "DETAILS: directory permissions: $(stat -c '%A owned by %u:%g' "${keyfile_dir}")"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo ${MONGODB_KEYFILE_VALUE} > ${MONGODB_KEYFILE_PATH}
|
|
||||||
chmod 0600 ${MONGODB_KEYFILE_PATH}
|
|
||||||
mongo_common_args+=" --keyFile ${MONGODB_KEYFILE_PATH}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# setup_default_datadir checks permissions of mounded directory into default
|
|
||||||
# data directory MONGODB_DATADIR
|
|
||||||
function setup_default_datadir() {
|
|
||||||
if [ ! -w "$MONGODB_DATADIR" ]; then
|
|
||||||
echo >&2 "ERROR: Couldn't write into ${MONGODB_DATADIR}"
|
|
||||||
echo >&2 "CAUSE: current user doesn't have permissions for writing to ${MONGODB_DATADIR} directory"
|
|
||||||
echo >&2 "DETAILS: current user id = $(id -u), user groups: $(id -G)"
|
|
||||||
echo >&2 "DETAILS: directory permissions: $(stat -c '%A owned by %u:%g, SELinux: %C' "${MONGODB_DATADIR}")"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# setup_wiredtiger_cache checks amount of available RAM (it has to use cgroups in container)
|
|
||||||
# and if there are any memory restrictions set storage.wiredTiger.engineConfig.cacheSizeGB
|
|
||||||
# in MONGODB_CONFIG_PATH to upstream default size
|
|
||||||
# it is intended to update mongodb.conf.template, with custom config file it might create conflict
|
|
||||||
function setup_wiredtiger_cache() {
|
|
||||||
local config_file
|
|
||||||
config_file=${1:-$MONGODB_CONFIG_PATH}
|
|
||||||
|
|
||||||
declare $(cgroup-limits)
|
|
||||||
if [[ ! -v MEMORY_LIMIT_IN_BYTES || "${NO_MEMORY_LIMIT:-}" == "true" ]]; then
|
|
||||||
return 0;
|
|
||||||
fi
|
|
||||||
|
|
||||||
cache_size=$(python -c "min=1; limit=int(($MEMORY_LIMIT_IN_BYTES / pow(2,30) - 1) * 0.6); print( min if limit < min else limit)")
|
|
||||||
echo "storage.wiredTiger.engineConfig.cacheSizeGB: ${cache_size}" >> ${config_file}
|
|
||||||
|
|
||||||
info "wiredTiger cacheSizeGB set to ${cache_size}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# check_env_vars checks environmental variables
|
|
||||||
# if variables to create non-admin user are provided, sets CREATE_USER=1
|
|
||||||
# if REPLICATION variable is set, checks also replication variables
|
|
||||||
function check_env_vars() {
|
|
||||||
local readonly database_regex='^[^/\. "$]*$'
|
|
||||||
|
|
||||||
[[ -v MONGODB_ADMIN_PASSWORD ]] || usage "MONGODB_ADMIN_PASSWORD has to be set."
|
|
||||||
|
|
||||||
if [[ -v MONGODB_USER || -v MONGODB_PASSWORD || -v MONGODB_DATABASE ]]; then
|
|
||||||
[[ -v MONGODB_USER && -v MONGODB_PASSWORD && -v MONGODB_DATABASE ]] || usage "You have to set all or none of variables: MONGODB_USER, MONGODB_PASSWORD, MONGODB_DATABASE"
|
|
||||||
|
|
||||||
[[ "${MONGODB_DATABASE}" =~ $database_regex ]] || usage "Database name must match regex: $database_regex"
|
|
||||||
[ ${#MONGODB_DATABASE} -le 63 ] || usage "Database name too long (maximum 63 characters)"
|
|
||||||
|
|
||||||
export CREATE_USER=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -v REPLICATION ]]; then
|
|
||||||
[[ -v MONGODB_KEYFILE_VALUE && -v MONGODB_REPLICA_NAME ]] || usage "MONGODB_KEYFILE_VALUE and MONGODB_REPLICA_NAME have to be set"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# usage prints info about required enviromental variables
|
|
||||||
# if $1 is passed, prints error message containing $1
|
|
||||||
# if REPLICATION variable is set, prints also info about replication variables
|
|
||||||
function usage() {
|
|
||||||
if [ $# == 1 ]; then
|
|
||||||
echo >&2 "error: $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "
|
|
||||||
You must specify the following environment variables:
|
|
||||||
MONGODB_ADMIN_PASSWORD
|
|
||||||
Optionally you can provide settings for a user with 'readWrite' role:
|
|
||||||
(Note you MUST specify all three of these settings)
|
|
||||||
MONGODB_USER
|
|
||||||
MONGODB_PASSWORD
|
|
||||||
MONGODB_DATABASE
|
|
||||||
Optional settings:
|
|
||||||
MONGODB_QUIET (default: true)"
|
|
||||||
|
|
||||||
if [[ -v REPLICATION ]]; then
|
|
||||||
echo "
|
|
||||||
For replication you must also specify the following environment variables:
|
|
||||||
MONGODB_KEYFILE_VALUE
|
|
||||||
MONGODB_REPLICA_NAME
|
|
||||||
Optional settings:
|
|
||||||
MONGODB_SERVICE_NAME (default: mongodb)
|
|
||||||
"
|
|
||||||
fi
|
|
||||||
echo "
|
|
||||||
For more information see /usr/share/container-scripts/mongodb/README.md
|
|
||||||
within the container or visit https://github.com/sclorgk/mongodb-container/."
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# info prints a message prefixed by date and time.
|
|
||||||
function info() {
|
|
||||||
printf "=> [%s] %s\n" "$(date +'%a %b %d %T')" "$*"
|
|
||||||
}
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source "${CONTAINER_SCRIPTS_PATH}/common.sh"
|
|
||||||
|
|
||||||
# This is a full hostname that will be added to replica set
|
|
||||||
# (for example, "replica-2.mongodb.myproject.svc.cluster.local")
|
|
||||||
readonly MEMBER_HOST="$(hostname -f)"
|
|
||||||
|
|
||||||
# Initializes the replica set configuration.
|
|
||||||
#
|
|
||||||
# Arguments:
|
|
||||||
# - $1: host address[:port]
|
|
||||||
#
|
|
||||||
# Uses the following global variables:
|
|
||||||
# - MONGODB_REPLICA_NAME
|
|
||||||
# - MONGODB_ADMIN_PASSWORD
|
|
||||||
function initiate() {
|
|
||||||
local host="$1"
|
|
||||||
|
|
||||||
local config="{_id: '${MONGODB_REPLICA_NAME}', members: [{_id: 0, host: '${host}'}]}"
|
|
||||||
|
|
||||||
info "Initiating MongoDB replica using: ${config}"
|
|
||||||
mongo --eval "quit(rs.initiate(${config}).ok ? 0 : 1)" --quiet
|
|
||||||
|
|
||||||
info "Waiting for PRIMARY status ..."
|
|
||||||
mongo --eval "while (!rs.isMaster().ismaster) { sleep(100); }" --quiet
|
|
||||||
|
|
||||||
info "Creating MongoDB users ..."
|
|
||||||
mongo_create_admin
|
|
||||||
[[ -v CREATE_USER ]] && mongo_create_user "-u admin -p ${MONGODB_ADMIN_PASSWORD}"
|
|
||||||
|
|
||||||
info "Successfully initialized replica set"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Adds a host to the replica set configuration.
|
|
||||||
#
|
|
||||||
# Arguments:
|
|
||||||
# - $1: host address[:port]
|
|
||||||
#
|
|
||||||
# Global variables:
|
|
||||||
# - MONGODB_REPLICA_NAME
|
|
||||||
# - MONGODB_ADMIN_PASSWORD
|
|
||||||
function add_member() {
|
|
||||||
local host="$1"
|
|
||||||
info "Adding ${host} to replica set ..."
|
|
||||||
|
|
||||||
if ! mongo admin -u admin -p "${MONGODB_ADMIN_PASSWORD}" --host "$(replset_addr)" --eval "while (!rs.add('${host}').ok) { sleep(100); }" --quiet; then
|
|
||||||
info "ERROR: couldn't add host to replica set!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
info "Waiting for PRIMARY/SECONDARY status ..."
|
|
||||||
mongo --eval "while (!rs.isMaster().ismaster && !rs.isMaster().secondary) { sleep(100); }" --quiet
|
|
||||||
|
|
||||||
info "Successfully joined replica set"
|
|
||||||
}
|
|
||||||
|
|
||||||
info "Waiting for local MongoDB to accept connections ..."
|
|
||||||
wait_for_mongo_up &>/dev/null
|
|
||||||
|
|
||||||
if [[ $(mongo --eval 'db.isMaster().setName' --quiet) == "${MONGODB_REPLICA_NAME}" ]]; then
|
|
||||||
info "Replica set '${MONGODB_REPLICA_NAME}' already exists, skipping initialization"
|
|
||||||
>/tmp/initialized
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# StatefulSet pods are named with a predictable name, following the pattern:
|
|
||||||
# $(statefulset name)-$(zero-based index)
|
|
||||||
# MEMBER_ID is computed by removing the prefix matching "*-", i.e.:
|
|
||||||
# "mongodb-0" -> "0"
|
|
||||||
# "mongodb-1" -> "1"
|
|
||||||
# "mongodb-2" -> "2"
|
|
||||||
readonly MEMBER_ID="${HOSTNAME##*-}"
|
|
||||||
|
|
||||||
# Initialize replica set only if we're the first member
|
|
||||||
if [ "${MEMBER_ID}" = '0' ]; then
|
|
||||||
initiate "${MEMBER_HOST}"
|
|
||||||
else
|
|
||||||
add_member "${MEMBER_HOST}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
>/tmp/initialized
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
##
|
|
||||||
## For list of options visit:
|
|
||||||
## https://docs.mongodb.org/manual/reference/configuration-options/
|
|
||||||
##
|
|
||||||
|
|
||||||
# systemLog Options - How to do logging
|
|
||||||
systemLog:
|
|
||||||
# Runs the mongod in a quiet mode that attempts to limit the amount of output
|
|
||||||
quiet: ${MONGODB_QUIET}
|
|
||||||
|
|
||||||
|
|
||||||
# net Options - Network interfaces settings
|
|
||||||
net:
|
|
||||||
# Specify port number (27017 by default)
|
|
||||||
port: ${CONTAINER_PORT}
|
|
||||||
|
|
||||||
|
|
||||||
# storage Options - How and Where to store data
|
|
||||||
storage:
|
|
||||||
# Directory for datafiles (defaults to /data/db/)
|
|
||||||
dbPath: ${MONGODB_DATADIR}
|
|
||||||
|
|
||||||
|
|
||||||
# replication Options - Configures replication
|
|
||||||
replication:
|
|
||||||
# Specifies a maximum size in megabytes for the replication operation log (i.e. the oplog,
|
|
||||||
# 5% of disk space by default)
|
|
||||||
oplogSizeMB: 64
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# This will make scl collection binaries work out of box.
|
|
||||||
unset BASH_ENV PROMPT_COMMAND ENV
|
|
||||||
source scl_source enable ${ENABLED_COLLECTIONS}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# insert_and_wait_for_replication insert data in host and wait all replset members
|
|
||||||
# applied recent oplog entry
|
|
||||||
function insert_and_wait_for_replication() {
|
|
||||||
local host
|
|
||||||
host=$1
|
|
||||||
local data
|
|
||||||
data=$2
|
|
||||||
|
|
||||||
# Storing document into replset and wait replication to finish
|
|
||||||
local script
|
|
||||||
script="db.getSiblingDB('test_db').data.insert(${data});
|
|
||||||
for (var i = 0; i < 60; i++) {
|
|
||||||
var status=rs.status();
|
|
||||||
var optime=status.members[0].optime;
|
|
||||||
var ok=true;
|
|
||||||
for(var j=1; j < status.members.length; j++) {
|
|
||||||
if(tojson(optime) != tojson(status.members[j].optime)) {
|
|
||||||
ok=false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if(ok == true) {
|
|
||||||
print('INFO: All members of replicaset are synchronized');
|
|
||||||
quit(0);
|
|
||||||
}
|
|
||||||
sleep(1000);
|
|
||||||
}
|
|
||||||
print('ERROR: Members of replicaset are not synchronized');
|
|
||||||
printjson(rs.status());
|
|
||||||
quit(1);"
|
|
||||||
|
|
||||||
mongo admin --host "${host}" -u admin -p "${MONGODB_ADMIN_PASSWORD}" --eval "${script}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait_replicaset_members waits till replset has specified number of members
|
|
||||||
function wait_replicaset_members() {
|
|
||||||
local host
|
|
||||||
host=$1
|
|
||||||
local count
|
|
||||||
count=$2
|
|
||||||
|
|
||||||
local script
|
|
||||||
script="for (var i = 0; i < 60; i++) {
|
|
||||||
var ret = rs.status().members.length;
|
|
||||||
if (ret == ${count}) {
|
|
||||||
print('INFO: Replicaset has expected number of members');
|
|
||||||
quit(0);
|
|
||||||
}
|
|
||||||
sleep(1000);
|
|
||||||
}
|
|
||||||
print('ERROR: Wrong count of members in replicaset');
|
|
||||||
printjson(rs.status());
|
|
||||||
quit(1);"
|
|
||||||
|
|
||||||
mongo admin --host "${host}" -u admin -p "${MONGODB_ADMIN_PASSWORD}" --eval "${script}"
|
|
||||||
}
|
|
||||||
0
help.md
0
help.md
78
mongodb.yaml
78
mongodb.yaml
|
|
@ -1,78 +0,0 @@
|
||||||
---
|
|
||||||
document: modulemd
|
|
||||||
version: 1
|
|
||||||
data:
|
|
||||||
summary: MongoDB Module
|
|
||||||
description: Mongo from humongous is a high-performance, open source, schema-free
|
|
||||||
document-oriented database. MongoDB is written in C++ and offers the following features.
|
|
||||||
Collection oriented storage, easy storage of object/JSON-style data.
|
|
||||||
Dynamic queries.
|
|
||||||
Full index support, including on inner objects and embedded arrays.
|
|
||||||
Query profiling.
|
|
||||||
Replication and fail-over support.
|
|
||||||
Efficient storage of binary data including large objects (e.g. photos and videos).
|
|
||||||
Auto-sharding for cloud-level scalability (currently in early alpha).
|
|
||||||
Commercial Support Available.
|
|
||||||
A key goal of MongoDB is to bridge the gap between key/value stores (which are fast and highly scalable)
|
|
||||||
and traditional RDBMS systems (which are deep in functionality).
|
|
||||||
license:
|
|
||||||
module: [MIT]
|
|
||||||
dependencies:
|
|
||||||
buildrequires:
|
|
||||||
bootstrap: master
|
|
||||||
boost: master
|
|
||||||
requires:
|
|
||||||
platform: master
|
|
||||||
perl: master
|
|
||||||
boost: master
|
|
||||||
references:
|
|
||||||
community: https://docs.pagure.org/modularity/
|
|
||||||
documentation: https://github.com/container-images/mongodb/
|
|
||||||
tracker: https://github.com/modularity-modules/mongodb
|
|
||||||
profiles:
|
|
||||||
default:
|
|
||||||
rpms:
|
|
||||||
- mongodb
|
|
||||||
- mongodb-server
|
|
||||||
server:
|
|
||||||
rpms:
|
|
||||||
- mongodb-server
|
|
||||||
client:
|
|
||||||
rpms:
|
|
||||||
- mongodb
|
|
||||||
api:
|
|
||||||
rpms:
|
|
||||||
- mongodb
|
|
||||||
- mongodb-server
|
|
||||||
filter:
|
|
||||||
rpms:
|
|
||||||
- pprof
|
|
||||||
- gperftools-devel
|
|
||||||
- gperftools
|
|
||||||
components:
|
|
||||||
rpms:
|
|
||||||
mongodb:
|
|
||||||
rationale: MongoDB package.
|
|
||||||
# mongodb-3.4.6-3.fc27
|
|
||||||
ref: a655c1f4dd559a5bd0f0142330770f23c2c0d0c9
|
|
||||||
buildorder: 2
|
|
||||||
python-pymongo:
|
|
||||||
rationale: MongoDB dependecy for running testsuite.
|
|
||||||
ref: f27
|
|
||||||
buildorder: 3
|
|
||||||
yaml-cpp:
|
|
||||||
rationale: MongoDB dependency.
|
|
||||||
ref: f27
|
|
||||||
buildorder: 0
|
|
||||||
mozjs45:
|
|
||||||
rationale: MongoDB dependency (not used on x64_64,s390x,aarch64 and ppc64le).
|
|
||||||
ref: f27
|
|
||||||
buildorder: 0
|
|
||||||
gperftools:
|
|
||||||
rationale: MongoDB dependency (should go to separate module).
|
|
||||||
ref: f27
|
|
||||||
buildorder: 0
|
|
||||||
python-pymongo:
|
|
||||||
rationale: MongoDB dependecy (F26 branch does not require mongodb for tests).
|
|
||||||
ref: f26
|
|
||||||
buildorder: 0
|
|
||||||
120
root/help.1
120
root/help.1
|
|
@ -1,120 +0,0 @@
|
||||||
.TH "mongodb" "1" "" "Rado Pitonak \<rpitonak@redhat.com\>" "DATE 25.05.2017" ""
|
|
||||||
|
|
||||||
|
|
||||||
.SH NAME
|
|
||||||
.PP
|
|
||||||
mongodb \- scalable, high\-performance, open source NoSQL database.
|
|
||||||
|
|
||||||
|
|
||||||
.SH USAGE
|
|
||||||
.PP
|
|
||||||
To pull the MongoDB container use:
|
|
||||||
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
|
|
||||||
.nf
|
|
||||||
docker pull modularitycontainers/mongodb
|
|
||||||
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
|
|
||||||
.PP
|
|
||||||
If you want to set only the mandatory environment variables and store the database
|
|
||||||
in the \fB\fC/home/user/database\fR directory on the host filesystem, execute the following command:
|
|
||||||
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
|
|
||||||
.nf
|
|
||||||
docker run \-d \-e MONGODB\_USER=<user> \-e MONGODB\_PASSWORD=<password> \-e MONGODB\_DATABASE=<database> \-e MONGODB\_ADMIN\_PASSWORD=<admin\_password> \-v /home/user/database:/var/lib/mongodb/data modularitycontainers/mongodb
|
|
||||||
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
|
|
||||||
.PP
|
|
||||||
If you are initializing the database and it's the first time you are using the
|
|
||||||
specified shared volume, the database will be created with two users: \fB\fCadmin\fR and \fB\fCMONGODB\_USER\fR. After that the MongoDB daemon
|
|
||||||
will be started. If you are re\-attaching the volume to another container, the
|
|
||||||
creation of the database user and admin user will be skipped and only the
|
|
||||||
MongoDB daemon will be started.
|
|
||||||
|
|
||||||
|
|
||||||
.SH ENVIROMENT VARIABLES
|
|
||||||
.PP
|
|
||||||
The image recognizes the following environment variables that you can set during
|
|
||||||
initialization by passing \fB\fC\-e VAR=VALUE\fR to the Docker run command.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
\fB\fCMONGODB\_ADMIN\_PASSWORD\fR
|
|
||||||
Password for the admin user
|
|
||||||
|
|
||||||
.PP
|
|
||||||
Optionally you can provide settings for user with 'readWrite' role.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
\fB\fCMONGODB\_USER\fR
|
|
||||||
User name for MONGODB account to be created
|
|
||||||
\fB\fCMONGODB\_PASSWORD\fR
|
|
||||||
.br
|
|
||||||
Password for the user account
|
|
||||||
.br
|
|
||||||
\fB\fCMONGODB\_DATABASE\fR
|
|
||||||
.br
|
|
||||||
Database name
|
|
||||||
|
|
||||||
.PP
|
|
||||||
The following environment variables influence the MongoDB configuration file. They are all optional.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
\fB\fCMONGODB\_QUIET\fR
|
|
||||||
.br
|
|
||||||
Runs MongoDB in a quiet mode that attempts to limit the amount of output.
|
|
||||||
Default: true
|
|
||||||
|
|
||||||
|
|
||||||
.SH VOLUMES
|
|
||||||
.PP
|
|
||||||
You can also set the following mount points by passing the \fB\fC\-v /host:/container\fR flag to Docker.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
\fB\fCVolume mount point\fR
|
|
||||||
\fB\fC/var/lib/mongodb/data\fR\- MongoDB data directory
|
|
||||||
|
|
||||||
.PP
|
|
||||||
\fBNotice: When mouting a directory from the host into the container, ensure that the mounted
|
|
||||||
directory has the appropriate permissions and that the owner and group of the directory
|
|
||||||
matches the user UID or name which is running inside the container.\fP
|
|
||||||
|
|
||||||
|
|
||||||
.SH CONFIGURATION
|
|
||||||
.PP
|
|
||||||
It is allowed to use custom configuration file for mongod server. Providing a custom configuration file supercedes the individual configuration environment variable values.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
To use custom configuration file in container it has to be mounted into \fB\fC/etc/mongod.conf\fR. For example to use configuration file stored in \fB\fC/home/user\fR directory use this option for \fB\fCdocker run\fR command: \fB\fC\-v /home/user/mongod.conf:/etc/mongod.conf:Z\fR.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
\fBNotice: Custom config file does not affect name of replica set. It has to be set in \fB\fCMONGODB\_REPLICA\_NAME\fR environment variable.\fP
|
|
||||||
|
|
||||||
|
|
||||||
.SH ADMIN USER
|
|
||||||
.PP
|
|
||||||
The admin user name is set to \fB\fCadmin\fR and you have to to specify the password by
|
|
||||||
setting the \fB\fCMONGODB\_ADMIN\_PASSWORD\fR environment variable. This process is done
|
|
||||||
upon database initialization.
|
|
||||||
|
|
||||||
|
|
||||||
.SH CHANGING PASSWORD
|
|
||||||
.PP
|
|
||||||
Since passwords are part of the image configuration, the only supported method
|
|
||||||
to change passwords for the database user (\fB\fCMONGODB\_USER\fR) and admin user is by
|
|
||||||
changing the environment variables \fB\fCMONGODB\_PASSWORD\fR and
|
|
||||||
\fB\fCMONGODB\_ADMIN\_PASSWORD\fR, respectively.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
Changing database passwords directly in MongoDB will cause a mismatch between
|
|
||||||
the values stored in the variables and the actual passwords. Whenever a database
|
|
||||||
container starts it will reset the passwords to the values stored in the
|
|
||||||
environment variables.
|
|
||||||
|
|
||||||
92
root/help.md
92
root/help.md
|
|
@ -1,92 +0,0 @@
|
||||||
% mongodb(1)
|
|
||||||
% Rado Pitonak \<rpitonak@redhat.com\>
|
|
||||||
% DATE 25.05.2017
|
|
||||||
|
|
||||||
# NAME
|
|
||||||
|
|
||||||
mongodb - scalable, high-performance, open source NoSQL database.
|
|
||||||
|
|
||||||
|
|
||||||
# USAGE
|
|
||||||
|
|
||||||
To pull the MongoDB container use:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker pull modularitycontainers/mongodb
|
|
||||||
```
|
|
||||||
|
|
||||||
If you want to set only the mandatory environment variables and store the database
|
|
||||||
in the `/home/user/database` directory on the host filesystem, execute the following command:
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
docker run -d -e MONGODB_USER=<user> -e MONGODB_PASSWORD=<password> -e MONGODB_DATABASE=<database> -e MONGODB_ADMIN_PASSWORD=<admin_password> -v /home/user/database:/var/lib/mongodb/data modularitycontainers/mongodb
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
If you are initializing the database and it's the first time you are using the
|
|
||||||
specified shared volume, the database will be created with two users: `admin` and `MONGODB_USER`. After that the MongoDB daemon
|
|
||||||
will be started. If you are re-attaching the volume to another container, the
|
|
||||||
creation of the database user and admin user will be skipped and only the
|
|
||||||
MongoDB daemon will be started.
|
|
||||||
|
|
||||||
# ENVIROMENT VARIABLES
|
|
||||||
|
|
||||||
The image recognizes the following environment variables that you can set during
|
|
||||||
initialization by passing `-e VAR=VALUE` to the Docker run command.
|
|
||||||
|
|
||||||
`MONGODB_ADMIN_PASSWORD`
|
|
||||||
Password for the admin user
|
|
||||||
|
|
||||||
Optionally you can provide settings for user with 'readWrite' role.
|
|
||||||
|
|
||||||
`MONGODB_USER`
|
|
||||||
User name for MONGODB account to be created
|
|
||||||
`MONGODB_PASSWORD`
|
|
||||||
Password for the user account
|
|
||||||
`MONGODB_DATABASE`
|
|
||||||
Database name
|
|
||||||
|
|
||||||
|
|
||||||
The following environment variables influence the MongoDB configuration file. They are all optional.
|
|
||||||
|
|
||||||
`MONGODB_QUIET`
|
|
||||||
Runs MongoDB in a quiet mode that attempts to limit the amount of output.
|
|
||||||
Default: true
|
|
||||||
|
|
||||||
# VOLUMES
|
|
||||||
|
|
||||||
You can also set the following mount points by passing the `-v /host:/container` flag to Docker.
|
|
||||||
|
|
||||||
`Volume mount point`
|
|
||||||
`/var/lib/mongodb/data`- MongoDB data directory
|
|
||||||
|
|
||||||
**Notice: When mouting a directory from the host into the container, ensure that the mounted
|
|
||||||
directory has the appropriate permissions and that the owner and group of the directory
|
|
||||||
matches the user UID or name which is running inside the container.**
|
|
||||||
|
|
||||||
# CONFIGURATION
|
|
||||||
|
|
||||||
It is allowed to use custom configuration file for mongod server. Providing a custom configuration file supercedes the individual configuration environment variable values.
|
|
||||||
|
|
||||||
To use custom configuration file in container it has to be mounted into `/etc/mongod.conf`. For example to use configuration file stored in `/home/user` directory use this option for `docker run` command: `-v /home/user/mongod.conf:/etc/mongod.conf:Z`.
|
|
||||||
|
|
||||||
**Notice: Custom config file does not affect name of replica set. It has to be set in `MONGODB_REPLICA_NAME` environment variable.**
|
|
||||||
|
|
||||||
# ADMIN USER
|
|
||||||
|
|
||||||
The admin user name is set to `admin` and you have to to specify the password by
|
|
||||||
setting the `MONGODB_ADMIN_PASSWORD` environment variable. This process is done
|
|
||||||
upon database initialization.
|
|
||||||
|
|
||||||
# CHANGING PASSWORD
|
|
||||||
|
|
||||||
Since passwords are part of the image configuration, the only supported method
|
|
||||||
to change passwords for the database user (`MONGODB_USER`) and admin user is by
|
|
||||||
changing the environment variables `MONGODB_PASSWORD` and
|
|
||||||
`MONGODB_ADMIN_PASSWORD`, respectively.
|
|
||||||
|
|
||||||
Changing database passwords directly in MongoDB will cause a mismatch between
|
|
||||||
the values stored in the variables and the actual passwords. Whenever a database
|
|
||||||
container starts it will reset the passwords to the values stored in the
|
|
||||||
environment variables.
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
FROM registry.fedoraproject.org/fedora:26
|
|
||||||
|
|
||||||
ENV NAME=mongodb ARCH=x86_64
|
|
||||||
LABEL MAINTAINER "Matus Kocka" <mkocka@redhat.com>
|
|
||||||
LABEL summary="MongoDB is a scalable, high-performance, open source NoSQL database."
|
|
||||||
|
|
||||||
RUN INSTALL_PKGS="bind-utils gettext iproute rsync tar findutils python3 mongodb mongodb-server mongo-tools" && \
|
|
||||||
dnf install -y --setopt=tsflags=nodocs $INSTALL_PKGS && \
|
|
||||||
rpm -V $INSTALL_PKGS && \
|
|
||||||
dnf clean all
|
|
||||||
|
|
||||||
ENV MONGODB_VERSION=3.2 \
|
|
||||||
# Set paths to avoid hard-coding them in scripts.
|
|
||||||
HOME=/var/lib/mongodb \
|
|
||||||
CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/mongodb
|
|
||||||
|
|
||||||
ADD files /
|
|
||||||
|
|
||||||
EXPOSE 27017
|
|
||||||
|
|
||||||
CMD ["/usr/bin/run-mongod"]
|
|
||||||
|
|
||||||
# Container setup from scl
|
|
||||||
RUN : > /etc/mongod.conf && \
|
|
||||||
mkdir -p ${HOME}/data && \
|
|
||||||
# Set owner 'mongodb:0' and 'g+rw(x)' permission - to avoid problems running container with arbitrary UID
|
|
||||||
/usr/libexec/fix-permissions /etc/mongod.conf ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template \
|
|
||||||
${HOME}
|
|
||||||
|
|
||||||
VOLUME ["/var/lib/mongodb/data"]
|
|
||||||
|
|
||||||
USER 184
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
MODULE_LINT=/usr/share/moduleframework/tools/modulelint.py
|
|
||||||
CMD=python -m avocado run --filter-by-tags=-WIP $(MODULE_LINT) *.py
|
|
||||||
|
|
||||||
#
|
|
||||||
all:
|
|
||||||
$(CMD)
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
mongodb dependencies
|
|
||||||
====================
|
|
||||||
|
|
||||||
build dependencies calculated by brt_dep_solver
|
|
||||||
-----------------------------------------------
|
|
||||||
asio
|
|
||||||
boost
|
|
||||||
gcc
|
|
||||||
gperftools
|
|
||||||
icu
|
|
||||||
libstemmer
|
|
||||||
python-pymongo
|
|
||||||
scons
|
|
||||||
snappy
|
|
||||||
valgrind
|
|
||||||
yaml-cpp
|
|
||||||
yaml-cpp03
|
|
||||||
|
|
||||||
runtime dependencies calculated by brt_dep_solver
|
|
||||||
-------------------------------------------------
|
|
||||||
boost
|
|
||||||
yaml-cpp
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
document: modularity-testing
|
|
||||||
version: 1
|
|
||||||
name: mongodb
|
|
||||||
modulemd-url:
|
|
||||||
service:
|
|
||||||
port: 27017
|
|
||||||
packages:
|
|
||||||
rpms:
|
|
||||||
- mongodb
|
|
||||||
- bind-utils
|
|
||||||
- gettext
|
|
||||||
- iproute
|
|
||||||
- rsync
|
|
||||||
- tar
|
|
||||||
- findutils
|
|
||||||
- python3
|
|
||||||
- mongodb
|
|
||||||
- mongodb-server
|
|
||||||
- mongo-tools
|
|
||||||
testdependecies:
|
|
||||||
rpms:
|
|
||||||
- mongodb
|
|
||||||
module:
|
|
||||||
docker:
|
|
||||||
start: "docker run -it -e MONGODB_USER=user -e MONGODB_PASSWORD=pas -e MONGODB_DATABASE=db -e MONGODB_ADMIN_PASSWORD=admin -p 27017:27017"
|
|
||||||
labels:
|
|
||||||
description: "MongoDB is a scalable, high-performance, open source NoSQL database."
|
|
||||||
io.k8s.description: "MongoDB is a scalable, high-performance, open source NoSQL database."
|
|
||||||
source: https://github.com/container-images/mongodb.git
|
|
||||||
container:
|
|
||||||
rpm:
|
|
||||||
start:
|
|
||||||
stop:
|
|
||||||
status:
|
|
||||||
repos:
|
|
||||||
- http://mirror.vutbr.cz/fedora/releases/26/Everything/x86_64/os/
|
|
||||||
95
tests/db.py
95
tests/db.py
|
|
@ -1,95 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# This Modularity Testing Framework helps you to write tests for modules
|
|
||||||
# Copyright (C) 2017 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# he Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Authors: Rado Pitonak <rpitonak@redhat.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
from avocado import main
|
|
||||||
from avocado.core import exceptions
|
|
||||||
from moduleframework import module_framework
|
|
||||||
import time
|
|
||||||
|
|
||||||
|
|
||||||
class DBCheck(module_framework.AvocadoTest):
|
|
||||||
"""
|
|
||||||
:avocado: enable
|
|
||||||
"""
|
|
||||||
|
|
||||||
MONGO_CMD = 'mongo "$MONGODB_DATABASE" -u "$MONGODB_USER" -p "$MONGODB_PASSWORD"'
|
|
||||||
|
|
||||||
# authentication options for admin user
|
|
||||||
# https://docs.mongodb.com/manual/reference/program/mongo/#mongo-shell-authentication-options
|
|
||||||
MONGO_ADMIN_CMD = 'mongo "$MONGODB_DATABASE" -u "admin" -p "$MONGODB_ADMIN_PASSWORD" --authenticationDatabase admin --authenticationMechanism SCRAM-SHA-1'
|
|
||||||
|
|
||||||
def testConnectToDB(self):
|
|
||||||
"""
|
|
||||||
Test connection to database
|
|
||||||
"""
|
|
||||||
|
|
||||||
query = "db.getSiblingDB('test_database');"
|
|
||||||
|
|
||||||
self.start()
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, query))
|
|
||||||
|
|
||||||
def testUserPrivileges(self):
|
|
||||||
"""
|
|
||||||
Testing user privileges.
|
|
||||||
"""
|
|
||||||
|
|
||||||
self.start()
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
# mongo db queries stored in dictionary, written in order which they are called
|
|
||||||
queries = {"insert1": "db.testData.insert({ y : 1 });",
|
|
||||||
"insert2": "db.testData.insert({ z : 2 });",
|
|
||||||
"print_json": "db.testData.find().forEach(printjson);",
|
|
||||||
"count": "db.testData.count();",
|
|
||||||
"data_drop": "db.testData.drop();",
|
|
||||||
"db_drop": "db.dropDatabase();"}
|
|
||||||
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, queries["insert1"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, queries["insert2"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, queries["print_json"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, queries["count"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, queries["data_drop"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, queries["db_drop"]))
|
|
||||||
|
|
||||||
def testAdminPrivileges(self):
|
|
||||||
"""
|
|
||||||
Testing privileges for admin user
|
|
||||||
"""
|
|
||||||
self.start()
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
# mongo db queries stored in dictionary, written in order which they are called
|
|
||||||
queries = {"dropUser": "db=db.getSiblingDB('${MONGODB_DATABASE}');db.dropUser('${MONGODB_USER}');",
|
|
||||||
"createUser1": "db=db.getSiblingDB('${MONGODB_DATABASE}'); db.createUser({user:'${MONGODB_USER}',pwd:'${MONGODB_PASSWORD}',roles:['readWrite','userAdmin','dbAdmin']});",
|
|
||||||
"insert": "db=db.getSiblingDB('${MONGODB_DATABASE}');db.testData.insert({x:0});",
|
|
||||||
"createUser2": "db.createUser({user:'test_user2',pwd:'test_password2',roles:['readWrite']});"}
|
|
||||||
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_ADMIN_CMD, queries["dropUser"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_ADMIN_CMD, queries["createUser1"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_ADMIN_CMD, queries["insert"]))
|
|
||||||
self.run('{} --eval "{}"'.format(self.MONGO_CMD, queries["createUser2"]))
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
"""
|
|
||||||
Script for parsing cgroup information
|
|
||||||
|
|
||||||
This script will read some limits from the cgroup system and parse
|
|
||||||
them, printing out "VARIABLE=VALUE" on each line for every limit that is
|
|
||||||
successfully read. Output of this script can be directly fed into
|
|
||||||
bash's export command. Recommended usage from a bash script:
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
export_vars=$(cgroup-limits) ; export $export_vars
|
|
||||||
|
|
||||||
Variables currently supported:
|
|
||||||
MAX_MEMORY_LIMIT_IN_BYTES
|
|
||||||
Maximum possible limit MEMORY_LIMIT_IN_BYTES can have. This is
|
|
||||||
currently constant value of 9223372036854775807.
|
|
||||||
MEMORY_LIMIT_IN_BYTES
|
|
||||||
Maximum amount of user memory in bytes. If this value is set
|
|
||||||
to the same value as MAX_MEMORY_LIMIT_IN_BYTES, it means that
|
|
||||||
there is no limit set. The value is taken from
|
|
||||||
/sys/fs/cgroup/memory/memory.limit_in_bytes
|
|
||||||
NUMBER_OF_CORES
|
|
||||||
Number of detected CPU cores that can be used. This value is
|
|
||||||
calculated from /sys/fs/cgroup/cpuset/cpuset.cpus
|
|
||||||
NO_MEMORY_LIMIT
|
|
||||||
Set to "true" if MEMORY_LIMIT_IN_BYTES is so high that the caller
|
|
||||||
can act as if no memory limit was set. Undefined otherwise.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def _read_file(path):
|
|
||||||
try:
|
|
||||||
with open(path, 'r') as f:
|
|
||||||
return f.read().strip()
|
|
||||||
except IOError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def get_memory_limit():
|
|
||||||
"""
|
|
||||||
Read memory limit, in bytes.
|
|
||||||
"""
|
|
||||||
|
|
||||||
limit = _read_file('/sys/fs/cgroup/memory/memory.limit_in_bytes')
|
|
||||||
if limit is None or not limit.isdigit():
|
|
||||||
print("Warning: Can't detect memory limit from cgroups",
|
|
||||||
file=sys.stderr)
|
|
||||||
return None
|
|
||||||
return int(limit)
|
|
||||||
|
|
||||||
|
|
||||||
def get_number_of_cores():
|
|
||||||
"""
|
|
||||||
Read number of CPU cores.
|
|
||||||
"""
|
|
||||||
|
|
||||||
core_count = 0
|
|
||||||
|
|
||||||
line = _read_file('/sys/fs/cgroup/cpuset/cpuset.cpus')
|
|
||||||
if line is None:
|
|
||||||
print("Warning: Can't detect number of CPU cores from cgroups",
|
|
||||||
file=sys.stderr)
|
|
||||||
return None
|
|
||||||
|
|
||||||
for group in line.split(','):
|
|
||||||
core_ids = list(map(int, group.split('-')))
|
|
||||||
if len(core_ids) == 2:
|
|
||||||
core_count += core_ids[1] - core_ids[0] + 1
|
|
||||||
else:
|
|
||||||
core_count += 1
|
|
||||||
|
|
||||||
return core_count
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
env_vars = {
|
|
||||||
"MAX_MEMORY_LIMIT_IN_BYTES": 9223372036854775807,
|
|
||||||
"MEMORY_LIMIT_IN_BYTES": get_memory_limit(),
|
|
||||||
"NUMBER_OF_CORES": get_number_of_cores()
|
|
||||||
}
|
|
||||||
|
|
||||||
env_vars = {k: v for k, v in env_vars.items() if v is not None}
|
|
||||||
|
|
||||||
if env_vars.get("MEMORY_LIMIT_IN_BYTES", 0) >= 92233720368547:
|
|
||||||
env_vars["NO_MEMORY_LIMIT"] = "true"
|
|
||||||
|
|
||||||
for key, value in env_vars.items():
|
|
||||||
print("{0}={1}".format(key, value))
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
exec "$@"
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source ${CONTAINER_SCRIPTS_PATH}/common.sh
|
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
echo "=> Shutting down MongoDB server ..."
|
|
||||||
pkill -INT mongod || :
|
|
||||||
wait_for_mongo_down
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
trap 'cleanup' SIGINT SIGTERM
|
|
||||||
|
|
||||||
check_env_vars
|
|
||||||
|
|
||||||
setup_wiredtiger_cache ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template
|
|
||||||
|
|
||||||
# If user provides own config file use it and do not generate new one
|
|
||||||
if [ ! -s $MONGODB_CONFIG_PATH ]; then
|
|
||||||
# Generate config file for MongoDB
|
|
||||||
envsubst < ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template > $MONGODB_CONFIG_PATH
|
|
||||||
fi
|
|
||||||
|
|
||||||
mongo_common_args="-f $MONGODB_CONFIG_PATH"
|
|
||||||
|
|
||||||
setup_default_datadir
|
|
||||||
|
|
||||||
# Must bring up MongoDB on localhost only until it has an admin password set.
|
|
||||||
mongod $mongo_common_args --bind_ip 127.0.0.1 &
|
|
||||||
wait_for_mongo_up
|
|
||||||
js_command="db.system.users.count({'user':'admin', 'db':'admin'})"
|
|
||||||
if [ "$(mongo admin --quiet --eval "$js_command")" == "1" ]; then
|
|
||||||
echo "=> Admin user is already created. Resetting password ..."
|
|
||||||
mongo_reset_admin
|
|
||||||
else
|
|
||||||
mongo_create_admin
|
|
||||||
fi
|
|
||||||
if [[ -v CREATE_USER ]]; then
|
|
||||||
js_command="db.system.users.count({'user':'${MONGODB_USER}', 'db':'${MONGODB_DATABASE}'})"
|
|
||||||
if [ "$(mongo admin --quiet --eval "$js_command")" == "1" ]; then
|
|
||||||
echo "=> MONGODB_USER user is already created. Resetting password ..."
|
|
||||||
mongo_reset_user
|
|
||||||
else
|
|
||||||
mongo_create_user
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# Restart the MongoDB daemon to bind on all interfaces
|
|
||||||
mongod $mongo_common_args --shutdown
|
|
||||||
wait_for_mongo_down
|
|
||||||
|
|
||||||
# Make sure env variables don't propagate to mongod process.
|
|
||||||
unset MONGODB_USER MONGODB_PASSWORD MONGODB_DATABASE MONGODB_ADMIN_PASSWORD
|
|
||||||
exec mongod $mongo_common_args --auth
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Run mongod in a StatefulSet-based replica set. See
|
|
||||||
# https://github.com/sclorg/mongodb-container/blob/master/examples/petset/README.md
|
|
||||||
# for a description of how this is intended to work.
|
|
||||||
#
|
|
||||||
# Note:
|
|
||||||
# - It does not attempt to remove the host from the replica set configuration
|
|
||||||
# when it is terminating. That is by design, because, in a StatefulSet, when a
|
|
||||||
# pod/container terminates and is restarted by OpenShift, it will always have
|
|
||||||
# the same hostname. Removing hosts from the configuration affects replica set
|
|
||||||
# elections and can impact the replica set stability.
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source ${CONTAINER_SCRIPTS_PATH}/common.sh
|
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
echo "=> Shutting down MongoDB server ..."
|
|
||||||
pkill -INT mongod || :
|
|
||||||
wait_for_mongo_down
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
trap 'cleanup' SIGINT SIGTERM
|
|
||||||
|
|
||||||
REPLICATION=1 check_env_vars
|
|
||||||
|
|
||||||
setup_wiredtiger_cache ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template
|
|
||||||
|
|
||||||
# If user provides own config file use it and do not generate new one
|
|
||||||
if [ ! -s "${MONGODB_CONFIG_PATH}" ]; then
|
|
||||||
# Generate config file for MongoDB
|
|
||||||
envsubst < "${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template" > "${MONGODB_CONFIG_PATH}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mongo_common_args="-f ${MONGODB_CONFIG_PATH}"
|
|
||||||
|
|
||||||
# Attention: setup_keyfile may modify value of mongo_common_args!
|
|
||||||
setup_keyfile
|
|
||||||
setup_default_datadir
|
|
||||||
|
|
||||||
${CONTAINER_SCRIPTS_PATH}/init-replset.sh &
|
|
||||||
|
|
||||||
# TODO: capture exit code of `init-petset-replset.sh` and exit with an error if
|
|
||||||
# the initialization failed, so that the container will be restarted and the
|
|
||||||
# user can gain more visibility that there is a problem in a way other than just
|
|
||||||
# inspecting log messages.
|
|
||||||
|
|
||||||
# Make sure env variables don't propagate to mongod process.
|
|
||||||
unset MONGODB_USER MONGODB_PASSWORD MONGODB_DATABASE MONGODB_ADMIN_PASSWORD
|
|
||||||
mongod ${mongo_common_args} --replSet "${MONGODB_REPLICA_NAME}" &
|
|
||||||
wait
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Run mongod in a StatefulSet-based replica set. See
|
|
||||||
# https://github.com/sclorg/mongodb-container/blob/master/examples/petset/README.md
|
|
||||||
# for a description of how this is intended to work.
|
|
||||||
#
|
|
||||||
# Note:
|
|
||||||
# - It does not attempt to remove the host from the replica set configuration
|
|
||||||
# when it is terminating. That is by design, because, in a StatefulSet, when a
|
|
||||||
# pod/container terminates and is restarted by OpenShift, it will always have
|
|
||||||
# the same hostname. Removing hosts from the configuration affects replica set
|
|
||||||
# elections and can impact the replica set stability.
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source ${CONTAINER_SCRIPTS_PATH}/common.sh
|
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
echo "=> Shutting down MongoDB server ..."
|
|
||||||
pkill -INT mongod || :
|
|
||||||
wait_for_mongo_down
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
trap 'cleanup' SIGINT SIGTERM
|
|
||||||
|
|
||||||
REPLICATION=1 check_env_vars
|
|
||||||
|
|
||||||
setup_wiredtiger_cache ${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template
|
|
||||||
|
|
||||||
# If user provides own config file use it and do not generate new one
|
|
||||||
if [ ! -s "${MONGODB_CONFIG_PATH}" ]; then
|
|
||||||
# Generate config file for MongoDB
|
|
||||||
envsubst < "${CONTAINER_SCRIPTS_PATH}/mongodb.conf.template" > "${MONGODB_CONFIG_PATH}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mongo_common_args="-f ${MONGODB_CONFIG_PATH}"
|
|
||||||
|
|
||||||
# Attention: setup_keyfile may modify value of mongo_common_args!
|
|
||||||
setup_keyfile
|
|
||||||
setup_default_datadir
|
|
||||||
|
|
||||||
${CONTAINER_SCRIPTS_PATH}/init-replset.sh &
|
|
||||||
|
|
||||||
# TODO: capture exit code of `init-petset-replset.sh` and exit with an error if
|
|
||||||
# the initialization failed, so that the container will be restarted and the
|
|
||||||
# user can gain more visibility that there is a problem in a way other than just
|
|
||||||
# inspecting log messages.
|
|
||||||
|
|
||||||
# Make sure env variables don't propagate to mongod process.
|
|
||||||
unset MONGODB_USER MONGODB_PASSWORD MONGODB_DATABASE MONGODB_ADMIN_PASSWORD
|
|
||||||
mongod ${mongo_common_args} --replSet "${MONGODB_REPLICA_NAME}" &
|
|
||||||
wait
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# Fix permissions on the given directory to allow group read/write of
|
|
||||||
# regular files and execute of directories.
|
|
||||||
find $@ -exec chown mongodb:0 {} \;
|
|
||||||
find $@ -exec chmod g+rw {} \;
|
|
||||||
find $@ -type d -exec chmod g+x {} +
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
MongoDB Docker image
|
|
||||||
====================
|
|
||||||
|
|
||||||
This repository contains Dockerfiles for MongoDB images for general usage and OpenShift.
|
|
||||||
Users can choose between RHEL and CentOS based images.
|
|
||||||
|
|
||||||
Environment variables
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
The image recognizes the following environment variables that you can set during
|
|
||||||
initialization by passing `-e VAR=VALUE` to the Docker run command.
|
|
||||||
|
|
||||||
| Variable name | Description |
|
|
||||||
| :------------------------ | ----------------------------------------- |
|
|
||||||
| `MONGODB_ADMIN_PASSWORD` | Password for the admin user |
|
|
||||||
|
|
||||||
Optionally you can provide settings for user with 'readWrite' role.
|
|
||||||
|
|
||||||
| Variable name | Description |
|
|
||||||
| :------------------------ | ----------------------------------------- |
|
|
||||||
| `MONGODB_USER` | User name for MONGODB account to be created |
|
|
||||||
| `MONGODB_PASSWORD` | Password for the user account |
|
|
||||||
| `MONGODB_DATABASE` | Database name |
|
|
||||||
|
|
||||||
|
|
||||||
The following environment variables influence the MongoDB configuration file. They are all optional.
|
|
||||||
|
|
||||||
| Variable name | Description | Default
|
|
||||||
| :-------------------- | ------------------------------------------------------------------------- | ----------------
|
|
||||||
| `MONGODB_QUIET` | Runs MongoDB in a quiet mode that attempts to limit the amount of output. | true
|
|
||||||
|
|
||||||
|
|
||||||
You can also set the following mount points by passing the `-v /host:/container` flag to Docker.
|
|
||||||
|
|
||||||
| Volume mount point | Description |
|
|
||||||
| :-------------------------- | ---------------------- |
|
|
||||||
| `/var/lib/mongodb/data` | MongoDB data directory |
|
|
||||||
|
|
||||||
**Notice: When mouting a directory from the host into the container, ensure that the mounted
|
|
||||||
directory has the appropriate permissions and that the owner and group of the directory
|
|
||||||
matches the user UID or name which is running inside the container.**
|
|
||||||
|
|
||||||
|
|
||||||
Usage
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
For this, we will assume that you are using the `centos/mongodb-32-centos7` image.
|
|
||||||
If you want to set only the mandatory environment variables and store the database
|
|
||||||
in the `/home/user/database` directory on the host filesystem, execute the following command:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ docker run -d -e MONGODB_USER=<user> -e MONGODB_PASSWORD=<password> -e MONGODB_DATABASE=<database> -e MONGODB_ADMIN_PASSWORD=<admin_password> -v /home/user/database:/var/lib/mongodb/data centos/mongodb-32-centos7
|
|
||||||
```
|
|
||||||
|
|
||||||
If you are initializing the database and it's the first time you are using the
|
|
||||||
specified shared volume, the database will be created with two users: `admin` and `MONGODB_USER`. After that the MongoDB daemon
|
|
||||||
will be started. If you are re-attaching the volume to another container, the
|
|
||||||
creation of the database user and admin user will be skipped and only the
|
|
||||||
MongoDB daemon will be started.
|
|
||||||
|
|
||||||
Custom configuration file
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
It is allowed to use custom configuration file for mongod server. Providing a custom configuration file supercedes the individual configuration environment variable values.
|
|
||||||
|
|
||||||
To use custom configuration file in container it has to be mounted into `/etc/mongod.conf`. For example to use configuration file stored in `/home/user` directory use this option for `docker run` command: `-v /home/user/mongod.conf:/etc/mongod.conf:Z`.
|
|
||||||
|
|
||||||
**Notice: Custom config file does not affect name of replica set. It has to be set in `MONGODB_REPLICA_NAME` environment variable.**
|
|
||||||
|
|
||||||
MongoDB admin user
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
The admin user name is set to `admin` and you have to to specify the password by
|
|
||||||
setting the `MONGODB_ADMIN_PASSWORD` environment variable. This process is done
|
|
||||||
upon database initialization.
|
|
||||||
|
|
||||||
|
|
||||||
Changing passwords
|
|
||||||
------------------
|
|
||||||
|
|
||||||
Since passwords are part of the image configuration, the only supported method
|
|
||||||
to change passwords for the database user (`MONGODB_USER`) and admin user is by
|
|
||||||
changing the environment variables `MONGODB_PASSWORD` and
|
|
||||||
`MONGODB_ADMIN_PASSWORD`, respectively.
|
|
||||||
|
|
||||||
Changing database passwords directly in MongoDB will cause a mismatch between
|
|
||||||
the values stored in the variables and the actual passwords. Whenever a database
|
|
||||||
container starts it will reset the passwords to the values stored in the
|
|
||||||
environment variables.
|
|
||||||
|
|
||||||
|
|
@ -1,260 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# Data directory where MongoDB database files live. The data subdirectory is here
|
|
||||||
# because mongodb.conf lives in /var/lib/mongodb/ and we don't want a volume to
|
|
||||||
# override it.
|
|
||||||
export MONGODB_DATADIR=/var/lib/mongodb/data
|
|
||||||
export CONTAINER_PORT=27017
|
|
||||||
# Configuration settings.
|
|
||||||
export MONGODB_QUIET=${MONGODB_QUIET:-true}
|
|
||||||
|
|
||||||
MONGODB_CONFIG_PATH=/etc/mongod.conf
|
|
||||||
MONGODB_KEYFILE_PATH="${HOME}/keyfile"
|
|
||||||
|
|
||||||
# Constants used for waiting
|
|
||||||
readonly MAX_ATTEMPTS=60
|
|
||||||
readonly SLEEP_TIME=1
|
|
||||||
|
|
||||||
# wait_for_mongo_up waits until the mongo server accepts incomming connections
|
|
||||||
function wait_for_mongo_up() {
|
|
||||||
_wait_for_mongo 1 "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait_for_mongo_down waits until the mongo server is down
|
|
||||||
function wait_for_mongo_down() {
|
|
||||||
_wait_for_mongo 0 "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait_for_mongo waits until the mongo server is up/down
|
|
||||||
# $1 - 0 or 1 - to specify for what to wait (0 - down, 1 - up)
|
|
||||||
# $2 - host where to connect (localhost by default)
|
|
||||||
function _wait_for_mongo() {
|
|
||||||
local operation=${1:-1}
|
|
||||||
local message="up"
|
|
||||||
if [[ ${operation} -eq 0 ]]; then
|
|
||||||
message="down"
|
|
||||||
fi
|
|
||||||
|
|
||||||
local mongo_cmd="mongo admin --host ${2:-localhost} "
|
|
||||||
|
|
||||||
local i
|
|
||||||
for i in $(seq $MAX_ATTEMPTS); do
|
|
||||||
echo "=> ${2:-} Waiting for MongoDB daemon ${message}"
|
|
||||||
if ([[ ${operation} -eq 1 ]] && ${mongo_cmd} --eval "quit()" &>/dev/null) || ([[ ${operation} -eq 0 ]] && ! ${mongo_cmd} --eval "quit()" &>/dev/null); then
|
|
||||||
echo "=> MongoDB daemon is ${message}"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
sleep ${SLEEP_TIME}
|
|
||||||
done
|
|
||||||
echo "=> Giving up: MongoDB daemon is not ${message}!"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# endpoints returns list of IP addresses with other instances of MongoDB
|
|
||||||
# To get list of endpoints, you need to have headless Service named 'mongodb'.
|
|
||||||
# NOTE: This won't work with standalone Docker container.
|
|
||||||
function endpoints() {
|
|
||||||
service_name=${MONGODB_SERVICE_NAME:-mongodb}
|
|
||||||
dig ${service_name} A +search +short 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# replset_addr return the address of the current replSet
|
|
||||||
function replset_addr() {
|
|
||||||
local current_endpoints
|
|
||||||
current_endpoints="$(endpoints)"
|
|
||||||
if [ -z "${current_endpoints}" ]; then
|
|
||||||
info "Cannot get address of replica set: no nodes are listed in service!"
|
|
||||||
info "CAUSE: DNS lookup for '${MONGODB_SERVICE_NAME:-mongodb}' returned no results."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo "${MONGODB_REPLICA_NAME}/${current_endpoints//[[:space:]]/,}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_create_admin creates the MongoDB admin user with password: MONGODB_ADMIN_PASSWORD
|
|
||||||
# $1 - login parameters for mongo (optional)
|
|
||||||
# $2 - host where to connect (localhost by default)
|
|
||||||
function mongo_create_admin() {
|
|
||||||
if [[ -z "${MONGODB_ADMIN_PASSWORD:-}" ]]; then
|
|
||||||
echo >&2 "=> MONGODB_ADMIN_PASSWORD is not set. Authentication can not be set up."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set admin password
|
|
||||||
local js_command="db.createUser({user: 'admin', pwd: '${MONGODB_ADMIN_PASSWORD}', roles: ['dbAdminAnyDatabase', 'userAdminAnyDatabase' , 'readWriteAnyDatabase','clusterAdmin' ]});"
|
|
||||||
if ! mongo admin ${1:-} --host ${2:-"localhost"} --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to create MongoDB admin user."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_create_user creates the MongoDB database user: MONGODB_USER,
|
|
||||||
# with password: MONGDOB_PASSWORD, inside database: MONGODB_DATABASE
|
|
||||||
# $1 - login parameters for mongo (optional)
|
|
||||||
# $2 - host where to connect (localhost by default)
|
|
||||||
function mongo_create_user() {
|
|
||||||
# Ensure input variables exists
|
|
||||||
if [[ -z "${MONGODB_USER:-}" ]]; then
|
|
||||||
echo >&2 "=> MONGODB_USER is not set. Failed to create MongoDB user"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [[ -z "${MONGODB_PASSWORD:-}" ]]; then
|
|
||||||
echo "=> MONGODB_PASSWORD is not set. Failed to create MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit >&2 1
|
|
||||||
fi
|
|
||||||
if [[ -z "${MONGODB_DATABASE:-}" ]]; then
|
|
||||||
echo >&2 "=> MONGODB_DATABASE is not set. Failed to create MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create database user
|
|
||||||
local js_command="db.getSiblingDB('${MONGODB_DATABASE}').createUser({user: '${MONGODB_USER}', pwd: '${MONGODB_PASSWORD}', roles: [ 'readWrite' ]});"
|
|
||||||
if ! mongo admin ${1:-} --host ${2:-"localhost"} --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to create MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_reset_user sets the MongoDB MONGODB_USER's password to match MONGODB_PASSWORD
|
|
||||||
function mongo_reset_user() {
|
|
||||||
if [[ -n "${MONGODB_USER:-}" && -n "${MONGODB_PASSWORD:-}" && -n "${MONGODB_DATABASE:-}" ]]; then
|
|
||||||
local js_command="db.changeUserPassword('${MONGODB_USER}', '${MONGODB_PASSWORD}')"
|
|
||||||
if ! mongo ${MONGODB_DATABASE} --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to reset password of MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# mongo_reset_admin sets the MongoDB admin password to match MONGODB_ADMIN_PASSWORD
|
|
||||||
function mongo_reset_admin() {
|
|
||||||
if [[ -n "${MONGODB_ADMIN_PASSWORD:-}" ]]; then
|
|
||||||
local js_command="db.changeUserPassword('admin', '${MONGODB_ADMIN_PASSWORD}')"
|
|
||||||
if ! mongo admin --eval "${js_command}"; then
|
|
||||||
echo >&2 "=> Failed to reset password of MongoDB user: ${MONGODB_USER}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# setup_keyfile fixes the bug in mounting the Kubernetes 'Secret' volume that
|
|
||||||
# mounts the secret files with 'too open' permissions.
|
|
||||||
# add --keyFile argument to mongo_common_args
|
|
||||||
function setup_keyfile() {
|
|
||||||
# If user specify keyFile in config file do not use generated keyFile
|
|
||||||
if grep -q "^\s*keyFile" ${MONGODB_CONFIG_PATH}; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
if [ -z "${MONGODB_KEYFILE_VALUE-}" ]; then
|
|
||||||
echo >&2 "ERROR: You have to provide the 'keyfile' value in MONGODB_KEYFILE_VALUE"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
local keyfile_dir
|
|
||||||
keyfile_dir="$(dirname "$MONGODB_KEYFILE_PATH")"
|
|
||||||
if [ ! -w "$keyfile_dir" ]; then
|
|
||||||
echo >&2 "ERROR: Couldn't create ${MONGODB_KEYFILE_PATH}"
|
|
||||||
echo >&2 "CAUSE: current user doesn't have permissions for writing to ${keyfile_dir} directory"
|
|
||||||
echo >&2 "DETAILS: current user id = $(id -u), user groups: $(id -G)"
|
|
||||||
echo >&2 "DETAILS: directory permissions: $(stat -c '%A owned by %u:%g' "${keyfile_dir}")"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo ${MONGODB_KEYFILE_VALUE} > ${MONGODB_KEYFILE_PATH}
|
|
||||||
chmod 0600 ${MONGODB_KEYFILE_PATH}
|
|
||||||
mongo_common_args+=" --keyFile ${MONGODB_KEYFILE_PATH}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# setup_default_datadir checks permissions of mounded directory into default
|
|
||||||
# data directory MONGODB_DATADIR
|
|
||||||
function setup_default_datadir() {
|
|
||||||
if [ ! -w "$MONGODB_DATADIR" ]; then
|
|
||||||
echo >&2 "ERROR: Couldn't write into ${MONGODB_DATADIR}"
|
|
||||||
echo >&2 "CAUSE: current user doesn't have permissions for writing to ${MONGODB_DATADIR} directory"
|
|
||||||
echo >&2 "DETAILS: current user id = $(id -u), user groups: $(id -G)"
|
|
||||||
echo >&2 "DETAILS: directory permissions: $(stat -c '%A owned by %u:%g, SELinux: %C' "${MONGODB_DATADIR}")"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# setup_wiredtiger_cache checks amount of available RAM (it has to use cgroups in container)
|
|
||||||
# and if there are any memory restrictions set storage.wiredTiger.engineConfig.cacheSizeGB
|
|
||||||
# in MONGODB_CONFIG_PATH to upstream default size
|
|
||||||
# it is intended to update mongodb.conf.template, with custom config file it might create conflict
|
|
||||||
function setup_wiredtiger_cache() {
|
|
||||||
local config_file
|
|
||||||
config_file=${1:-$MONGODB_CONFIG_PATH}
|
|
||||||
|
|
||||||
declare $(cgroup-limits)
|
|
||||||
if [[ ! -v MEMORY_LIMIT_IN_BYTES || "${NO_MEMORY_LIMIT:-}" == "true" ]]; then
|
|
||||||
return 0;
|
|
||||||
fi
|
|
||||||
|
|
||||||
cache_size=$(python -c "min=1; limit=int(($MEMORY_LIMIT_IN_BYTES / pow(2,30) - 1) * 0.6); print( min if limit < min else limit)")
|
|
||||||
echo "storage.wiredTiger.engineConfig.cacheSizeGB: ${cache_size}" >> ${config_file}
|
|
||||||
|
|
||||||
info "wiredTiger cacheSizeGB set to ${cache_size}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# check_env_vars checks environmental variables
|
|
||||||
# if variables to create non-admin user are provided, sets CREATE_USER=1
|
|
||||||
# if REPLICATION variable is set, checks also replication variables
|
|
||||||
function check_env_vars() {
|
|
||||||
local readonly database_regex='^[^/\. "$]*$'
|
|
||||||
|
|
||||||
[[ -v MONGODB_ADMIN_PASSWORD ]] || usage "MONGODB_ADMIN_PASSWORD has to be set."
|
|
||||||
|
|
||||||
if [[ -v MONGODB_USER || -v MONGODB_PASSWORD || -v MONGODB_DATABASE ]]; then
|
|
||||||
[[ -v MONGODB_USER && -v MONGODB_PASSWORD && -v MONGODB_DATABASE ]] || usage "You have to set all or none of variables: MONGODB_USER, MONGODB_PASSWORD, MONGODB_DATABASE"
|
|
||||||
|
|
||||||
[[ "${MONGODB_DATABASE}" =~ $database_regex ]] || usage "Database name must match regex: $database_regex"
|
|
||||||
[ ${#MONGODB_DATABASE} -le 63 ] || usage "Database name too long (maximum 63 characters)"
|
|
||||||
|
|
||||||
export CREATE_USER=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -v REPLICATION ]]; then
|
|
||||||
[[ -v MONGODB_KEYFILE_VALUE && -v MONGODB_REPLICA_NAME ]] || usage "MONGODB_KEYFILE_VALUE and MONGODB_REPLICA_NAME have to be set"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# usage prints info about required enviromental variables
|
|
||||||
# if $1 is passed, prints error message containing $1
|
|
||||||
# if REPLICATION variable is set, prints also info about replication variables
|
|
||||||
function usage() {
|
|
||||||
if [ $# == 1 ]; then
|
|
||||||
echo >&2 "error: $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "
|
|
||||||
You must specify the following environment variables:
|
|
||||||
MONGODB_ADMIN_PASSWORD
|
|
||||||
Optionally you can provide settings for a user with 'readWrite' role:
|
|
||||||
(Note you MUST specify all three of these settings)
|
|
||||||
MONGODB_USER
|
|
||||||
MONGODB_PASSWORD
|
|
||||||
MONGODB_DATABASE
|
|
||||||
Optional settings:
|
|
||||||
MONGODB_QUIET (default: true)"
|
|
||||||
|
|
||||||
if [[ -v REPLICATION ]]; then
|
|
||||||
echo "
|
|
||||||
For replication you must also specify the following environment variables:
|
|
||||||
MONGODB_KEYFILE_VALUE
|
|
||||||
MONGODB_REPLICA_NAME
|
|
||||||
Optional settings:
|
|
||||||
MONGODB_SERVICE_NAME (default: mongodb)
|
|
||||||
"
|
|
||||||
fi
|
|
||||||
echo "
|
|
||||||
For more information see /usr/share/container-scripts/mongodb/README.md
|
|
||||||
within the container or visit https://github.com/sclorgk/mongodb-container/."
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# info prints a message prefixed by date and time.
|
|
||||||
function info() {
|
|
||||||
printf "=> [%s] %s\n" "$(date +'%a %b %d %T')" "$*"
|
|
||||||
}
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source "${CONTAINER_SCRIPTS_PATH}/common.sh"
|
|
||||||
|
|
||||||
# This is a full hostname that will be added to replica set
|
|
||||||
# (for example, "replica-2.mongodb.myproject.svc.cluster.local")
|
|
||||||
readonly MEMBER_HOST="$(hostname -f)"
|
|
||||||
|
|
||||||
# Initializes the replica set configuration.
|
|
||||||
#
|
|
||||||
# Arguments:
|
|
||||||
# - $1: host address[:port]
|
|
||||||
#
|
|
||||||
# Uses the following global variables:
|
|
||||||
# - MONGODB_REPLICA_NAME
|
|
||||||
# - MONGODB_ADMIN_PASSWORD
|
|
||||||
function initiate() {
|
|
||||||
local host="$1"
|
|
||||||
|
|
||||||
local config="{_id: '${MONGODB_REPLICA_NAME}', members: [{_id: 0, host: '${host}'}]}"
|
|
||||||
|
|
||||||
info "Initiating MongoDB replica using: ${config}"
|
|
||||||
mongo --eval "quit(rs.initiate(${config}).ok ? 0 : 1)" --quiet
|
|
||||||
|
|
||||||
info "Waiting for PRIMARY status ..."
|
|
||||||
mongo --eval "while (!rs.isMaster().ismaster) { sleep(100); }" --quiet
|
|
||||||
|
|
||||||
info "Creating MongoDB users ..."
|
|
||||||
mongo_create_admin
|
|
||||||
[[ -v CREATE_USER ]] && mongo_create_user "-u admin -p ${MONGODB_ADMIN_PASSWORD}"
|
|
||||||
|
|
||||||
info "Successfully initialized replica set"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Adds a host to the replica set configuration.
|
|
||||||
#
|
|
||||||
# Arguments:
|
|
||||||
# - $1: host address[:port]
|
|
||||||
#
|
|
||||||
# Global variables:
|
|
||||||
# - MONGODB_REPLICA_NAME
|
|
||||||
# - MONGODB_ADMIN_PASSWORD
|
|
||||||
function add_member() {
|
|
||||||
local host="$1"
|
|
||||||
info "Adding ${host} to replica set ..."
|
|
||||||
|
|
||||||
if ! mongo admin -u admin -p "${MONGODB_ADMIN_PASSWORD}" --host "$(replset_addr)" --eval "while (!rs.add('${host}').ok) { sleep(100); }" --quiet; then
|
|
||||||
info "ERROR: couldn't add host to replica set!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
info "Waiting for PRIMARY/SECONDARY status ..."
|
|
||||||
mongo --eval "while (!rs.isMaster().ismaster && !rs.isMaster().secondary) { sleep(100); }" --quiet
|
|
||||||
|
|
||||||
info "Successfully joined replica set"
|
|
||||||
}
|
|
||||||
|
|
||||||
info "Waiting for local MongoDB to accept connections ..."
|
|
||||||
wait_for_mongo_up &>/dev/null
|
|
||||||
|
|
||||||
if [[ $(mongo --eval 'db.isMaster().setName' --quiet) == "${MONGODB_REPLICA_NAME}" ]]; then
|
|
||||||
info "Replica set '${MONGODB_REPLICA_NAME}' already exists, skipping initialization"
|
|
||||||
>/tmp/initialized
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# StatefulSet pods are named with a predictable name, following the pattern:
|
|
||||||
# $(statefulset name)-$(zero-based index)
|
|
||||||
# MEMBER_ID is computed by removing the prefix matching "*-", i.e.:
|
|
||||||
# "mongodb-0" -> "0"
|
|
||||||
# "mongodb-1" -> "1"
|
|
||||||
# "mongodb-2" -> "2"
|
|
||||||
readonly MEMBER_ID="${HOSTNAME##*-}"
|
|
||||||
|
|
||||||
# Initialize replica set only if we're the first member
|
|
||||||
if [ "${MEMBER_ID}" = '0' ]; then
|
|
||||||
initiate "${MEMBER_HOST}"
|
|
||||||
else
|
|
||||||
add_member "${MEMBER_HOST}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
>/tmp/initialized
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
##
|
|
||||||
## For list of options visit:
|
|
||||||
## https://docs.mongodb.org/manual/reference/configuration-options/
|
|
||||||
##
|
|
||||||
|
|
||||||
# systemLog Options - How to do logging
|
|
||||||
systemLog:
|
|
||||||
# Runs the mongod in a quiet mode that attempts to limit the amount of output
|
|
||||||
quiet: ${MONGODB_QUIET}
|
|
||||||
|
|
||||||
|
|
||||||
# net Options - Network interfaces settings
|
|
||||||
net:
|
|
||||||
# Specify port number (27017 by default)
|
|
||||||
port: ${CONTAINER_PORT}
|
|
||||||
|
|
||||||
|
|
||||||
# storage Options - How and Where to store data
|
|
||||||
storage:
|
|
||||||
# Directory for datafiles (defaults to /data/db/)
|
|
||||||
dbPath: ${MONGODB_DATADIR}
|
|
||||||
|
|
||||||
|
|
||||||
# replication Options - Configures replication
|
|
||||||
replication:
|
|
||||||
# Specifies a maximum size in megabytes for the replication operation log (i.e. the oplog,
|
|
||||||
# 5% of disk space by default)
|
|
||||||
oplogSizeMB: 64
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# This will make scl collection binaries work out of box.
|
|
||||||
unset BASH_ENV PROMPT_COMMAND ENV
|
|
||||||
source scl_source enable ${ENABLED_COLLECTIONS}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# insert_and_wait_for_replication insert data in host and wait all replset members
|
|
||||||
# applied recent oplog entry
|
|
||||||
function insert_and_wait_for_replication() {
|
|
||||||
local host
|
|
||||||
host=$1
|
|
||||||
local data
|
|
||||||
data=$2
|
|
||||||
|
|
||||||
# Storing document into replset and wait replication to finish
|
|
||||||
local script
|
|
||||||
script="db.getSiblingDB('test_db').data.insert(${data});
|
|
||||||
for (var i = 0; i < 60; i++) {
|
|
||||||
var status=rs.status();
|
|
||||||
var optime=status.members[0].optime;
|
|
||||||
var ok=true;
|
|
||||||
for(var j=1; j < status.members.length; j++) {
|
|
||||||
if(tojson(optime) != tojson(status.members[j].optime)) {
|
|
||||||
ok=false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if(ok == true) {
|
|
||||||
print('INFO: All members of replicaset are synchronized');
|
|
||||||
quit(0);
|
|
||||||
}
|
|
||||||
sleep(1000);
|
|
||||||
}
|
|
||||||
print('ERROR: Members of replicaset are not synchronized');
|
|
||||||
printjson(rs.status());
|
|
||||||
quit(1);"
|
|
||||||
|
|
||||||
mongo admin --host "${host}" -u admin -p "${MONGODB_ADMIN_PASSWORD}" --eval "${script}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait_replicaset_members waits till replset has specified number of members
|
|
||||||
function wait_replicaset_members() {
|
|
||||||
local host
|
|
||||||
host=$1
|
|
||||||
local count
|
|
||||||
count=$2
|
|
||||||
|
|
||||||
local script
|
|
||||||
script="for (var i = 0; i < 60; i++) {
|
|
||||||
var ret = rs.status().members.length;
|
|
||||||
if (ret == ${count}) {
|
|
||||||
print('INFO: Replicaset has expected number of members');
|
|
||||||
quit(0);
|
|
||||||
}
|
|
||||||
sleep(1000);
|
|
||||||
}
|
|
||||||
print('ERROR: Wrong count of members in replicaset');
|
|
||||||
printjson(rs.status());
|
|
||||||
quit(1);"
|
|
||||||
|
|
||||||
mongo admin --host "${host}" -u admin -p "${MONGODB_ADMIN_PASSWORD}" --eval "${script}"
|
|
||||||
}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
document: modulemd
|
|
||||||
version: 1
|
|
||||||
data:
|
|
||||||
summary: MongoDB Module
|
|
||||||
description: Mongo from humongous is a high-performance, open source, schema-free
|
|
||||||
document-oriented database. MongoDB is written in C++ and offers the following features.
|
|
||||||
Collection oriented storage, easy storage of object/JSON-style data.
|
|
||||||
Dynamic queries.
|
|
||||||
Full index support, including on inner objects and embedded arrays.
|
|
||||||
Query profiling.
|
|
||||||
Replication and fail-over support.
|
|
||||||
Efficient storage of binary data including large objects (e.g. photos and videos).
|
|
||||||
Auto-sharding for cloud-level scalability (currently in early alpha).
|
|
||||||
Commercial Support Available.
|
|
||||||
A key goal of MongoDB is to bridge the gap between key/value stores (which are fast and highly scalable)
|
|
||||||
and traditional RDBMS systems (which are deep in functionality).
|
|
||||||
license:
|
|
||||||
module: [ AGPLv3 and zlib and ASL 2.0 ]
|
|
||||||
dependencies:
|
|
||||||
buildrequires:
|
|
||||||
# base-runtime: f26
|
|
||||||
bootstrap: f26
|
|
||||||
common-build-dependencies: f26
|
|
||||||
shared-userspace: f26
|
|
||||||
perl: f26
|
|
||||||
requires:
|
|
||||||
base-runtime: f26
|
|
||||||
perl: f26
|
|
||||||
shared-userspace: f26
|
|
||||||
references:
|
|
||||||
community: https://fedoraproject.org/wiki/Modularity
|
|
||||||
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
|
|
||||||
profiles:
|
|
||||||
default:
|
|
||||||
rpms:
|
|
||||||
- mongodb
|
|
||||||
api:
|
|
||||||
rpms:
|
|
||||||
- mongodb
|
|
||||||
components:
|
|
||||||
rpms:
|
|
||||||
mongodb:
|
|
||||||
rationale: MongoDB package.
|
|
||||||
ref: f26
|
|
||||||
buildorder: 10
|
|
||||||
python-pymongo:
|
|
||||||
rationale: MongoDB dependecy.
|
|
||||||
ref: f26
|
|
||||||
buildorder: 8
|
|
||||||
yaml-cpp:
|
|
||||||
rationale: MongoDB dependency.
|
|
||||||
ref: f26
|
|
||||||
buildorder: 9
|
|
||||||
asio:
|
|
||||||
rationale: MongoDB dependency.
|
|
||||||
ref: f26
|
|
||||||
buildorder: 7
|
|
||||||
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# This Modularity Testing Framework helps you to write tests for modules
|
|
||||||
# Copyright (C) 2017 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# he Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Authors: Jan Scotka <jscotka@redhat.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
from avocado import main
|
|
||||||
from moduleframework import module_framework
|
|
||||||
|
|
||||||
|
|
||||||
class ExampleRpmValidation(module_framework.AvocadoTest):
|
|
||||||
"""
|
|
||||||
:avocado: enable
|
|
||||||
"""
|
|
||||||
fhs_base_paths = [
|
|
||||||
'/bin',
|
|
||||||
'/boot',
|
|
||||||
'/dev',
|
|
||||||
'/etc',
|
|
||||||
'/home',
|
|
||||||
'/lib',
|
|
||||||
'/lib64',
|
|
||||||
'/media',
|
|
||||||
'/mnt',
|
|
||||||
'/opt',
|
|
||||||
'/proc',
|
|
||||||
'/root',
|
|
||||||
'/run',
|
|
||||||
'/sbin',
|
|
||||||
'/sys',
|
|
||||||
'/srv',
|
|
||||||
'/tmp',
|
|
||||||
'/usr/bin'
|
|
||||||
]
|
|
||||||
|
|
||||||
def testPaths(self):
|
|
||||||
self.start()
|
|
||||||
for directory in self.fhs_base_paths:
|
|
||||||
self.run("test -d %s" % directory)
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# This Modularity Testing Framework helps you to write tests for modules
|
|
||||||
# Copyright (C) 2017 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# he Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Authors: Rado Pitonak <rpitonak@redhat.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
from avocado import main
|
|
||||||
from avocado.core import exceptions
|
|
||||||
from moduleframework import module_framework
|
|
||||||
|
|
||||||
|
|
||||||
class SanityCheck(module_framework.AvocadoTest):
|
|
||||||
"""
|
|
||||||
:avocado: enable
|
|
||||||
"""
|
|
||||||
|
|
||||||
def test1(self):
|
|
||||||
"""
|
|
||||||
Simple sanity test
|
|
||||||
"""
|
|
||||||
|
|
||||||
self.start()
|
|
||||||
self.run("ls / | grep bin")
|
|
||||||
|
|
||||||
def test2MongoVersion(self):
|
|
||||||
"""
|
|
||||||
Check if MongoDB is installed in correct version
|
|
||||||
"""
|
|
||||||
|
|
||||||
mongo_version = "3.4.3"
|
|
||||||
self.start()
|
|
||||||
self.run("mongod --version | grep " + mongo_version)
|
|
||||||
|
|
||||||
def test3ServiceRunning(self):
|
|
||||||
"""
|
|
||||||
Check if MongoDB is running
|
|
||||||
"""
|
|
||||||
|
|
||||||
self.start()
|
|
||||||
self.run('ls /proc/*/exe -alh | grep mongod')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
import socket
|
|
||||||
from avocado import main
|
|
||||||
from avocado.core import exceptions
|
|
||||||
from moduleframework import module_framework
|
|
||||||
|
|
||||||
|
|
||||||
class SanityCheck1(module_framework.AvocadoTest):
|
|
||||||
"""
|
|
||||||
:avocado: enable
|
|
||||||
"""
|
|
||||||
|
|
||||||
def test1(self):
|
|
||||||
self.start()
|
|
||||||
t1 = self.runHost('mongo --eval "exit 0;"',ignore_status=True)
|
|
||||||
self.assertEqual(t1.exit_status,252)
|
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue