Skip to content

Commit 19bd6ed

Browse files
committed
Added basic tests
Signed-off-by: Aravinda Vishwanathapura <[email protected]>
1 parent ac4b08e commit 19bd6ed

10 files changed

+186
-2
lines changed

.github/workflows/on-pr-submit.yml

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Run on every PR
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
paths-ignore:
8+
- 'docs/**'
9+
- 'extras/**'
10+
- '**.md'
11+
- '**.adoc'
12+
13+
jobs:
14+
# TODO: Add unit test as well here
15+
tests:
16+
name: Gluster Metrics Exporter Tests
17+
runs-on: ubuntu-latest
18+
steps:
19+
- uses: actions/checkout@v2
20+
- name: Install Crystal
21+
run: |
22+
curl -fsSL https://crystal-lang.org/install.sh | sudo bash
23+
- name: Format Check
24+
run: make fmt-check
25+
- name: Lint
26+
run: make lint
27+
- name: Install Binnacle
28+
run: |
29+
curl -L https://github.com/kadalu/binnacle/releases/latest/download/binnacle -o binnacle
30+
chmod +x ./binnacle
31+
sudo mv ./binnacle /usr/local/bin/binnacle
32+
binnacle --version
33+
- name: Build Storage node container
34+
run: |
35+
cd tests && ./build-container.sh
36+
- name: Setup Test environment
37+
run: binnacle -v tests/setup.t
38+
- name: Build and Install Gluster Metrics Exporter to nodes/containers
39+
run: binnacle -v tests/install.t
40+
- name: Run all Tests
41+
run: binnacle -v tests/all

extra/gluster-metrics-exporter.service

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ After=network.target
44

55
[Service]
66
PIDFile=/var/run/gluster/metrics-exporter.pid
7-
ExecStart=/usr/bin/gluster-metrics-exporter
7+
ExecStart=/usr/sbin/gluster-metrics-exporter
88

99
[Install]
1010
WantedBy=multi-user.target

src/config.cr

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module GlusterMetricsExporter
1010
gluster_executable_path = "/usr/sbin/gluster",
1111
disable_all_metrics = false,
1212
log_level = "info",
13-
log_dir = "/var/log/glusterfs-metrics",
13+
log_dir = "/var/log/gluster-metrics-exporter",
1414
log_file = "exporter.log",
1515
gluster_log_dir = "/var/log/glusterfs",
1616
glusterd_dir = "/var/lib/glusterd",

src/gluster-metrics-exporter.cr

+31
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require "log"
2+
13
require "crometheus"
24
require "kemal"
35

@@ -6,6 +8,29 @@ require "./args"
68
require "./metrics/*"
79

810
module GlusterMetricsExporter
11+
class ExporterAPILogHandler < Kemal::BaseLogHandler
12+
def initialize
13+
end
14+
15+
def call(context : HTTP::Server::Context)
16+
elapsed_time = Time.measure { call_next(context) }
17+
elapsed_text = elapsed_text(elapsed_time)
18+
Log.info &.emit("#{context.request.method} #{context.request.resource}", status_code: "#{context.response.status_code}", duration: "#{elapsed_text}")
19+
context
20+
end
21+
22+
def write(message : String)
23+
Log.info { message.strip }
24+
end
25+
26+
private def elapsed_text(elapsed)
27+
millis = elapsed.total_milliseconds
28+
return "#{millis.round(2)}ms" if millis >= 1
29+
30+
"#{(millis * 1000).round(2)}µs"
31+
end
32+
end
33+
934
# A handler to be called before calling Crometheus handler
1035
class MetricsRunHandler < Kemal::Handler
1136
def call(env)
@@ -42,8 +67,14 @@ module GlusterMetricsExporter
4267
def self.run
4368
parse_args
4469

70+
Dir.mkdir_p @@config.log_dir
71+
logfile = Path[@@config.log_dir].join(@@config.log_file)
72+
# TODO: Handle Log level from CLI arg
73+
Log.setup(:info, Log::IOBackend.new(File.new(logfile, "a+")))
74+
4575
Crometheus.default_registry.path = @@config.metrics_path
4676
Kemal.config.port = @@config.port
77+
Kemal.config.logger = ExporterAPILogHandler.new
4778
Kemal.run
4879
end
4980
end

tests/Dockerfile

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
FROM ubuntu:20.04
2+
3+
ENV DEBIAN_FRONTEND=noninteractive
4+
5+
RUN apt-get update -yq && \
6+
apt-get install -y --no-install-recommends python3 libtirpc3 init \
7+
vim python3-pip ssh rsync lvm2 less emacs software-properties-common \
8+
sudo curl wget git build-essential automake autoconf automake libtool \
9+
flex bison libssl-dev pkg-config uuid-dev acl-dev zlib1g-dev \
10+
libxml2-dev libxml2-utils liburcu-dev xfsprogs gdb attr \
11+
libgoogle-perftools-dev zfsutils-linux screen libsqlite3-dev sqlite3 \
12+
glusterfs-server
13+
14+
RUN echo "root:kadalu" | chpasswd
15+
16+
RUN sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config \
17+
&& sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' \
18+
/etc/ssh/sshd_config && \
19+
sed -i.save -e "s#udev_sync = 1#udev_sync = 0#" \
20+
-e "s#udev_rules = 1#udev_rules = 0#" \
21+
-e "s#use_lvmetad = 1#use_lvmetad = 0#" \
22+
-e "s#obtain_device_list_from_udev = 1#obtain_device_list_from_udev = 0#" \
23+
/etc/lvm/lvm.conf && \
24+
systemctl mask getty.target
25+
26+
RUN curl -fsSL https://crystal-lang.org/install.sh | sudo bash
27+
28+
cmd ["/usr/sbin/init"]

tests/all/volume_metrics.t

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# -*- mode: ruby -*-
2+
load "#{File.dirname(__FILE__)}/../reset.t"
3+
4+
USE_REMOTE_PLUGIN "docker"
5+
6+
nodes = ["gserver1", "gserver2", "gserver3"]
7+
8+
nodes.each do |node|
9+
USE_NODE node
10+
11+
TEST "systemctl start glusterd"
12+
puts TEST "systemctl status glusterd"
13+
TEST "systemctl start gluster-metrics-exporter"
14+
puts TEST "systemctl status gluster-metrics-exporter"
15+
16+
TEST "mkdir -p /exports/vol1"
17+
end
18+
19+
USE_NODE nodes[0]
20+
TEST "gluster peer probe #{nodes[1]}"
21+
TEST "gluster peer probe #{nodes[2]}"
22+
TEST "gluster volume create vol1 replica 3 #{nodes[0]}:/exports/vol1/s1 #{nodes[1]}:/exports/vol1/s2 #{nodes[2]}:/exports/vol1/s3 force"
23+
TEST "gluster volume start vol1"
24+
puts TEST "curl http://localhost:9713/metrics"
25+
puts TEST "curl http://localhost:9713/metrics.json"
26+
27+
nodes.each do |node|
28+
USE_NODE node
29+
puts TEST "cat /var/log/gluster-metrics-exporter/exporter.log"
30+
end

tests/build-container.sh

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/sh
2+
docker build . --tag kadalu/gluster-node -f Dockerfile

tests/install.t

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# -*- mode: ruby -*-
2+
3+
USE_REMOTE_PLUGIN "docker"
4+
nodes = ["gserver1", "gserver2", "gserver3"]
5+
6+
# Static build Kadalu Storage Manager
7+
TEST "docker run --rm -i -v $PWD:/workspace -w /workspace crystallang/crystal:1.2.0-alpine /bin/sh -c \"apk add --update --no-cache --force-overwrite sqlite-dev sqlite-static && shards install && shards build --static\""
8+
9+
# Install the Static binary to all containers/nodes
10+
# and copy the service files
11+
nodes.each do |node|
12+
TEST "docker cp ./bin/gluster-metrics-exporter #{node}:/usr/sbin/gluster-metrics-exporter"
13+
TEST "docker cp extra/gluster-metrics-exporter.service #{node}:/lib/systemd/system/"
14+
end
15+
16+
# Sanity test
17+
USE_NODE nodes[0]
18+
puts TEST "gluster-metrics-exporter --version"

tests/reset.t

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# -*- mode: ruby -*-
2+
3+
USE_REMOTE_PLUGIN "docker"
4+
nodes = ["gserver1", "gserver2", "gserver3"]
5+
6+
nodes.each do |node|
7+
USE_NODE node
8+
RUN "systemctl stop glusterd"
9+
RUN "systemctl disable glusterd"
10+
RUN "systemctl stop gluster-metrics-exporter"
11+
RUN "systemctl disable gluster-metrics-exporter"
12+
RUN "rm -rf /var/lib/glusterd"
13+
RUN "rm -rf /var/log/gluster"
14+
RUN "rm -rf /var/log/gluster-metrics-exporter"
15+
end

tests/setup.t

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -*- mode: ruby -*-
2+
USE_REMOTE_PLUGIN "docker"
3+
nodes = ["gserver1", "gserver2", "gserver3"]
4+
5+
# Start three or N storage nodes(Containers)
6+
USE_NODE "local"
7+
nodes.each do |node|
8+
USE_NODE "local"
9+
RUN "docker stop #{node}"
10+
RUN "docker rm #{node}"
11+
end
12+
13+
RUN "docker network rm g1"
14+
TEST "docker network create g1"
15+
16+
nodes.each do |node|
17+
USE_NODE "local"
18+
TEST "docker run -d -v /sys/fs/cgroup/:/sys/fs/cgroup:ro --privileged --name #{node} --hostname #{node} --network g1 kadalu/gluster-node"
19+
end

0 commit comments

Comments
 (0)