updating master according to f26
This commit is contained in:
parent
3a96bad543
commit
c4e5ae2f3b
26 changed files with 1375 additions and 19 deletions
45
Dockerfile
45
Dockerfile
|
|
@ -1,26 +1,49 @@
|
|||
FROM registry.fedoraproject.org/fedora:26
|
||||
FROM baseruntime/baseruntime:latest
|
||||
|
||||
ENV NAME=mongodb \
|
||||
ARCH=x86_64 \
|
||||
VERSION=0 \
|
||||
RELEASE=1 \
|
||||
MONGODB_VERSION="3.4.3"
|
||||
|
||||
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."
|
||||
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"
|
||||
|
||||
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
|
||||
#removed mongo-tools from $INSTALL_PKGS
|
||||
|
||||
ENV MONGODB_VERSION=3.2 \
|
||||
# Set paths to avoid hard-coding them in scripts.
|
||||
HOME=/var/lib/mongodb \
|
||||
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
|
||||
# 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
|
||||
|
|
|
|||
11
mongodb.yaml
11
mongodb.yaml
|
|
@ -18,10 +18,8 @@ data:
|
|||
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
|
||||
|
|
@ -35,9 +33,11 @@ data:
|
|||
default:
|
||||
rpms:
|
||||
- mongodb
|
||||
- mongodb-server
|
||||
api:
|
||||
rpms:
|
||||
- mongodb
|
||||
- mongodb-server
|
||||
components:
|
||||
rpms:
|
||||
mongodb:
|
||||
|
|
@ -57,6 +57,7 @@ data:
|
|||
ref: f26
|
||||
buildorder: 7
|
||||
mozjs45:
|
||||
rationale: MongoDB dependency.
|
||||
ref: f26
|
||||
buildorder: 1
|
||||
rationale: MongoDB dependency.
|
||||
ref: f26
|
||||
buildorder: 1
|
||||
|
||||
|
|
|
|||
120
root/help.1
Normal file
120
root/help.1
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
.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
Normal file
92
root/help.md
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
% 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.
|
||||
32
tests/Dockerfile
Normal file
32
tests/Dockerfile
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
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
|
||||
22
tests/README.md
Normal file
22
tests/README.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
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
|
||||
|
|
@ -22,7 +22,7 @@ testdependecies:
|
|||
- mongodb
|
||||
module:
|
||||
docker:
|
||||
start: "docker run -d -e MONGODB_USER=user -e MONGODB_PASSWORD=pas -e MONGODB_DATABASE=db -e MONGODB_ADMIN_PASSWORD=admin -p 27017:27017"
|
||||
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."
|
||||
|
|
|
|||
95
tests/db.py
Normal file
95
tests/db.py
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
#!/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()
|
||||
92
tests/files/usr/bin/cgroup-limits
Executable file
92
tests/files/usr/bin/cgroup-limits
Executable file
|
|
@ -0,0 +1,92 @@
|
|||
#!/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))
|
||||
2
tests/files/usr/bin/container-entrypoint
Executable file
2
tests/files/usr/bin/container-entrypoint
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
exec "$@"
|
||||
57
tests/files/usr/bin/run-mongod
Executable file
57
tests/files/usr/bin/run-mongod
Executable file
|
|
@ -0,0 +1,57 @@
|
|||
#!/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
|
||||
55
tests/files/usr/bin/run-mongod-pet
Executable file
55
tests/files/usr/bin/run-mongod-pet
Executable file
|
|
@ -0,0 +1,55 @@
|
|||
#!/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
|
||||
55
tests/files/usr/bin/run-mongod-replication
Executable file
55
tests/files/usr/bin/run-mongod-replication
Executable file
|
|
@ -0,0 +1,55 @@
|
|||
#!/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
|
||||
6
tests/files/usr/libexec/fix-permissions
Executable file
6
tests/files/usr/libexec/fix-permissions
Executable file
|
|
@ -0,0 +1,6 @@
|
|||
#!/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 {} +
|
||||
90
tests/files/usr/share/container-scripts/mongodb/README.md
Normal file
90
tests/files/usr/share/container-scripts/mongodb/README.md
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
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.
|
||||
|
||||
260
tests/files/usr/share/container-scripts/mongodb/common.sh
Normal file
260
tests/files/usr/share/container-scripts/mongodb/common.sh
Normal file
|
|
@ -0,0 +1,260 @@
|
|||
#!/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')" "$*"
|
||||
}
|
||||
86
tests/files/usr/share/container-scripts/mongodb/init-replset.sh
Executable file
86
tests/files/usr/share/container-scripts/mongodb/init-replset.sh
Executable file
|
|
@ -0,0 +1,86 @@
|
|||
#!/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
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
##
|
||||
## 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
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# This will make scl collection binaries work out of box.
|
||||
unset BASH_ENV PROMPT_COMMAND ENV
|
||||
source scl_source enable ${ENABLED_COLLECTIONS}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
#!/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
tests/help.md
Normal file
0
tests/help.md
Normal file
59
tests/mongodb.yaml
Normal file
59
tests/mongodb.yaml
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
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
|
||||
tracker: https://taiga.fedorainfracloud.org/project/modularity
|
||||
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
|
||||
|
||||
56
tests/rpmvalidator.py
Normal file
56
tests/rpmvalidator.py
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
#!/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)
|
||||
61
tests/sanity.py
Normal file
61
tests/sanity.py
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
#!/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()
|
||||
BIN
tests/sanity1.pyc
Normal file
BIN
tests/sanity1.pyc
Normal file
Binary file not shown.
0
tests/sources
Normal file
0
tests/sources
Normal file
Loading…
Add table
Add a link
Reference in a new issue