From 34653067c1802aa66d88eda81f0f935d207c6c56 Mon Sep 17 00:00:00 2001
From: Ryan Faircloth <35384120+rfaircloth-splunk@users.noreply.github.com>
Date: Sun, 30 Jun 2019 18:11:22 -0400
Subject: [PATCH] Release to master with stable CI (#4)
Improve CI process by waiting for container ready
---
.circleci/config.yml | 243 +++++++++-------
.env.template | 10 +
.gitignore | 13 +-
.idea/misc.xml | 5 +-
.idea/modules.xml | 8 -
.idea/sc4s.iml | 2 +-
.idea/vcs.xml | 9 -
.idea/workspace.xml | 612 -----------------------------------------
docker-compose.yml | 36 ++-
requirements.txt | 2 +
test-with-compose.sh | 26 ++
tests/Dockerfile | 6 +-
tests/requirements.txt | 1 +
tests/test_poc.py | 53 ++--
14 files changed, 257 insertions(+), 769 deletions(-)
create mode 100644 .env.template
delete mode 100644 .idea/modules.xml
delete mode 100644 .idea/vcs.xml
delete mode 100644 .idea/workspace.xml
create mode 100644 requirements.txt
create mode 100755 test-with-compose.sh
diff --git a/.circleci/config.yml b/.circleci/config.yml
index a616137..d6d5b9b 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,101 +1,150 @@
- version: 2
- jobs:
- build:
- environment:
- IMAGE_NAME: rfaircloth/scs
- docker:
- - image: circleci/buildpack-deps:stretch
- steps:
- - checkout
- - run: git submodule sync
- - run: git submodule update --init --recursive
- - setup_remote_docker:
- docker_layer_caching: true
- - run:
- name: Docker Login
- command: docker login -u $DOCKER_USER -p $DOCKER_PASS
- - run:
- name: Build Docker image
- command: pushd package; docker build -f Dockerfile --build-arg RH_ORG=$RH_ORG --build-arg RH_ACTIVATION=$RH_ACTIVATION -t $IMAGE_NAME:build .
- - run:
- name: Tag Docker image
- command: docker tag $IMAGE_NAME:build $IMAGE_NAME:$CIRCLE_SHA1
- - run:
- name: Push Docker image
- command: docker push $IMAGE_NAME:$CIRCLE_SHA1
- dgoss:
- environment:
- IMAGE_NAME: rfaircloth/scs
- GOSS_VER: v0.3.7
- GOSS_OPTS: "--max-concurrent=1 --format junit"
- GOSS_FILES_STRATEGY: cp
+version: 2.1
+jobs:
+ build:
+ environment:
+ IMAGE_NAME: rfaircloth/scs
+ docker:
+ - image: circleci/buildpack-deps:stretch
+ steps:
+ - checkout
+ - run: git submodule sync
+ - run: git submodule update --init --recursive
+ - setup_remote_docker:
+ docker_layer_caching: true
+ - run:
+ name: Docker Login
+ command: docker login -u $DOCKER_USER -p $DOCKER_PASS
+ - run:
+ name: Build Docker image
+ command: pushd package; docker build -f Dockerfile --build-arg RH_ORG=$RH_ORG --build-arg RH_ACTIVATION=$RH_ACTIVATION -t $IMAGE_NAME:build .
+ - run:
+ name: Tag Docker image
+ command: docker tag $IMAGE_NAME:build $IMAGE_NAME:$CIRCLE_SHA1
+ - run:
+ name: Push Docker image
+ command: docker push $IMAGE_NAME:$CIRCLE_SHA1
+ dgoss:
+ environment:
+ IMAGE_NAME: rfaircloth/scs
+ GOSS_VER: v0.3.7
+ GOSS_OPTS: "--max-concurrent=1 --format junit"
+ GOSS_FILES_STRATEGY: cp
- docker:
- - image: circleci/buildpack-deps:stretch
- steps:
- - checkout
- - setup_remote_docker:
- docker_layer_caching: true
- - run:
- name: Docker Login
- command: docker login -u $DOCKER_USER -p $DOCKER_PASS
- - run:
- name: Docker pull
- command: docker pull $IMAGE_NAME:$CIRCLE_SHA1
- - run:
- name: Install goss
- command: |
- # rather than give internet scripts SU rights, we install to local user bin and add to path
- curl -fsSL https://goss.rocks/install | GOSS_VER=v0.3.7 sudo sh
- goss -version
- - run:
- name: Test Docker
- command: |
- mkdir -p ~/project/test-results
- # Don't forget path!
- export PATH=$PATH:~/bin
- pushd package
- GOSS_FMT_OPTIONS="perfdata verbose" GOSS_FILES_STRATEGY=cp GOSS_OPTS="--max-concurrent=1 --format junit" dgoss run -t $IMAGE_NAME:$CIRCLE_SHA1 3>&1 1>&2 2>&3 > /tmp/goss.tmp || true ; cat /tmp/goss.tmp | grep -v "<"
- popd
- cat /tmp/goss.tmp | grep "[<\>]" > ~/project/test-results/goss.xml
- - store_test_results:
- path: test-results
- publish:
- environment:
- IMAGE_NAME: rfaircloth/scs
- docker:
- - image: circleci/buildpack-deps:stretch
- steps:
- - setup_remote_docker:
- docker_layer_caching: true
- - run:
- name: Docker Login
- command: docker login -u $DOCKER_USER -p $DOCKER_PASS
- - run:
- name: Docker pull
- command: docker pull $IMAGE_NAME:$CIRCLE_SHA1
- - run:
- name: Docker tag image
- command: docker tag $IMAGE_NAME:$CIRCLE_SHA1 $IMAGE_NAME:$CIRCLE_BRANCH
- - run:
- name: Docker push tag
- command: docker push $IMAGE_NAME:$CIRCLE_BRANCH
+ docker:
+ - image: circleci/buildpack-deps:stretch
+ steps:
+ - checkout
+ - setup_remote_docker:
+ docker_layer_caching: true
+ - run:
+ name: Docker Login
+ command: docker login -u $DOCKER_USER -p $DOCKER_PASS
+ - run:
+ name: Docker pull
+ command: docker pull $IMAGE_NAME:$CIRCLE_SHA1
+ - run:
+ name: Install goss
+ command: |
+ # rather than give internet scripts SU rights, we install to local user bin and add to path
+ curl -fsSL https://goss.rocks/install | GOSS_VER=v0.3.7 sudo sh
+ goss -version
+ - run:
+ name: Test Docker
+ command: |
+ mkdir -p ~/project/test-results
+ # Don't forget path!
+ export PATH=$PATH:~/bin
+ pushd package
+ GOSS_FMT_OPTIONS="perfdata verbose" GOSS_FILES_STRATEGY=cp GOSS_OPTS="--max-concurrent=1 --format junit" dgoss run -t $IMAGE_NAME:$CIRCLE_SHA1 3>&1 1>&2 2>&3 > /tmp/goss.tmp || true ; cat /tmp/goss.tmp | grep -v "<"
+ popd
+ cat /tmp/goss.tmp | grep "[<\>]" > ~/project/test-results/goss.xml
+ - store_test_results:
+ path: test-results
+ test-unit:
+ docker:
+ - image: circleci/buildpack-deps:stretch
+ steps:
+ - setup_remote_docker:
+ docker_layer_caching: true
+ - checkout
+ - run: git submodule sync
+ - run: git submodule update --init --recursive
+ - run:
+ name: Docker Login
+ command: docker login -u $DOCKER_USER -p $DOCKER_PASS
+ - run:
+ name: Docker pull
+ command: docker-compose pull
+ - run:
+ name: Setup test volume
+ command: |
+ mkdir test-results
+ docker volume create sc4s-tests
+ docker volume create sc4s-results
+ docker container create --name dummy \
+ -v sc4s-tests:/work/tests \
+ -v sc4s-results:/work/test-results \
+ registry.access.redhat.com/ubi7/ubi
+ docker cp tests/ dummy:/work/tests/
+ docker rm dummy
+ - run:
+ name: Docker Compose build
+ command: |
+ docker-compose build \
+ --build-arg RH_ACTIVATION=$RH_ACTIVATION \
+ --build-arg RH_ORG=$RH_ORG
+ - run:
+ name: Docker Compose up
+ command: docker-compose up --abort-on-container-exit
+ - run:
+ name: Collect test results from Docker Compose
+ command: |
+ docker container create --name dummy \
+ -v sc4s-tests:/work/tests \
+ -v sc4s-results:/work/test-results \
+ registry.access.redhat.com/ubi7/ubi
+ docker cp dummy:/work/test-results/functional test-results
+ docker rm dummy
+ when: always
+ - store_test_results:
+ path: test-results
+ publish:
+ environment:
+ IMAGE_NAME: rfaircloth/scs
+ docker:
+ - image: circleci/buildpack-deps:stretch
+ steps:
+ - setup_remote_docker:
+ docker_layer_caching: true
+ - run:
+ name: Docker Login
+ command: docker login -u $DOCKER_USER -p $DOCKER_PASS
+ - run:
+ name: Docker pull
+ command: docker pull $IMAGE_NAME:$CIRCLE_SHA1
+ - run:
+ name: Docker tag image
+ command: docker tag $IMAGE_NAME:$CIRCLE_SHA1 $IMAGE_NAME:$CIRCLE_BRANCH
+ - run:
+ name: Docker push tag
+ command: docker push $IMAGE_NAME:$CIRCLE_BRANCH
- workflows:
- version: 2
- build-publish:
- jobs:
- - build
- - dgoss:
- requires:
- - build
- - publish:
- requires:
- - dgoss
- filters:
- branches:
- only:
- - master
- - develop
+workflows:
+ build-publish:
+ jobs:
+ - build
+ - dgoss:
+ requires:
+ - build
+ - test-unit
+ - publish:
+ requires:
+ - dgoss
+ - test-unit
+ filters:
+ branches:
+ only:
+ - master
+ - develop
diff --git a/.env.template b/.env.template
new file mode 100644
index 0000000..dd14966
--- /dev/null
+++ b/.env.template
@@ -0,0 +1,10 @@
+RH_ORG=xxxx
+RH_ACTIVATION=xxxxx
+SPLUNK_HEC_TOKEN=a778f63a-5dff-4e3c-a72c-a03183659e94
+SPLUNK_PASSWORD=Changed@11
+SPLUNK_START_ARGS=--accept-license
+SPLUNK_HEC_URL=https://splunk:8088/services/collector/event
+SPLUNK_HEC_STATSURL=https://splunk:8088/services/collector/event
+SPLUNK_CONNECT_METHOD=hec
+SPLUNK_DEFAULT_INDEX=main
+SPLUNK_METRICS_INDEX=metrics
diff --git a/.gitignore b/.gitignore
index 527731f..36345c7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -150,7 +150,6 @@ dmypy.json
*.bak
*.gho
*.ori
-*.orig
*.tmp
### Windows template
@@ -202,7 +201,6 @@ export_presets.cfg
*.bz2
*.xz
*.lzma
-*.cab
# Packing-only formats
*.iso
@@ -212,15 +210,10 @@ export_presets.cfg
*.dmg
*.xpi
*.gem
-*.egg
*.deb
*.rpm
-*.msi
-*.msm
-*.msp
### Patch template
-*.orig
*.rej
### macOS template
@@ -256,7 +249,6 @@ Temporary Items
*.exe
*.exe~
*.dll
-*.so
*.dylib
# Test binary, built with `go test -c`
@@ -271,7 +263,6 @@ Temporary Items
### VirtualEnv template
# Virtualenv
# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
-.Python
[Bb]in
[Ii]nclude
[Ll]ib
@@ -279,7 +270,6 @@ Temporary Items
[Ll]ocal
[Ss]cripts
pyvenv.cfg
-.venv
pip-selfcheck.json
### PuTTY template
@@ -305,3 +295,6 @@ tags
# Persistent undo
[._]*.un~
+/test-results
+/.idea/workspace.xml
+/.idea/tasks.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3f7f406..87f2df8 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,8 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index aa62d56..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/sc4s.iml b/.idea/sc4s.iml
index 251be75..bda388e 100644
--- a/.idea/sc4s.iml
+++ b/.idea/sc4s.iml
@@ -4,7 +4,7 @@
-
+
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 53b20c8..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 44b7535..0000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,612 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pip
- yum
- java
- goss.y
- goss
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1561601135562
-
-
- 1561601135562
-
-
-
-
-
-
- 1561725354114
-
-
-
- 1561725354114
-
-
- 1561727911945
-
-
-
- 1561727911945
-
-
- 1561728088283
-
-
-
- 1561728088283
-
-
- 1561732858768
-
-
-
- 1561732858768
-
-
- 1561742879170
-
-
-
- 1561742879170
-
-
- 1561749672876
-
-
-
- 1561749672877
-
-
- 1561756254127
-
-
-
- 1561756254127
-
-
- 1561756480339
-
-
-
- 1561756480339
-
-
- 1561756707590
-
-
-
- 1561756707590
-
-
- 1561756813319
-
-
-
- 1561756813319
-
-
- 1561757391279
-
-
-
- 1561757391279
-
-
- 1561757671153
-
-
-
- 1561757671153
-
-
- 1561761791106
-
-
-
- 1561761791106
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- file://$PROJECT_DIR$/tests/test_poc.py
- 84
-
-
-
- file://$PROJECT_DIR$/tests/test_poc.py
- 33
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index bacc2d6..829b864 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,8 +5,19 @@ services:
links:
- splunk
- sc4s
+ volumes:
+ - sc4s-tests:/work/tests
+ - sc4s-results:/work/test-results
+ environment:
+ - SPLUNK_PASSWORD
+
sc4s:
- build: ./package
+# image: rfaircloth/scs:latest
+ build:
+ context: ./package
+ args:
+ RH_ORG: $RH_ORG
+ RH_ACTIVATION: $RH_ACTIVATION
hostname: sc4s
ports:
- "514"
@@ -19,12 +30,12 @@ services:
links:
- splunk
environment:
- - SPLUNK_HEC_URL=https://splunk:8088/services/collector/event
- - SPLUNK_HEC_STATSURL=https://splunk:8088/services/collector/event
- - SPLUNK_HEC_TOKEN=a778f63a-5dff-4e3c-a72c-a03183659e94
- - SPLUNK_CONNECT_METHOD=hec
- - SPLUNK_DEFAULT_INDEX=main
- - SPLUNK_METRICS_INDEX=metrics
+ - SPLUNK_HEC_URL
+ - SPLUNK_HEC_STATSURL
+ - SPLUNK_HEC_TOKEN
+ - SPLUNK_CONNECT_METHOD
+ - SPLUNK_DEFAULT_INDEX
+ - SPLUNK_METRICS_INDEX
# logging:
# driver: splunk
# options:
@@ -41,9 +52,9 @@ services:
- "8088:8088"
- "8089:8089"
environment:
- - SPLUNK_HEC_TOKEN=a778f63a-5dff-4e3c-a72c-a03183659e94
- - SPLUNK_PASSWORD=Changed@11
- - SPLUNK_START_ARGS=--accept-license
+ - SPLUNK_HEC_TOKEN
+ - SPLUNK_PASSWORD
+ - SPLUNK_START_ARGS
# logging:
# driver: splunk
# options:
@@ -52,3 +63,8 @@ services:
# splunk-index: main
# splunk-insecureskipverify: true
# splunk-verify-connection: false
+volumes:
+ sc4s-tests:
+ external: true
+ sc4s-results:
+ external: true
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..7b11f5e
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+-r ./tests/requirements.txt
+
diff --git a/test-with-compose.sh b/test-with-compose.sh
new file mode 100755
index 0000000..f426220
--- /dev/null
+++ b/test-with-compose.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+mkdir test-results
+docker volume create sc4s-tests
+docker volume create sc4s-results
+
+docker container create --name dummy \
+ -v sc4s-tests:/work/tests \
+ -v sc4s-results:/work/test-results \
+ registry.access.redhat.com/ubi7/ubi
+docker cp tests/ dummy:/work/tests/
+docker rm dummy
+
+docker-compose build --build-arg RH_ACTIVATION=$RH_ACTIVATION --build-arg RH_ORG=$RH_ORG
+docker-compose up --abort-on-container-exit --exit-code-from test
+
+docker container create --name dummy \
+ -v sc4s-tests:/work/tests \
+ -v sc4s-results:/work/test-results \
+ registry.access.redhat.com/ubi7/ubi
+
+docker cp dummy:/work/test-results/functional test-results
+docker rm dummy
+EXIT=$0
+
+
diff --git a/tests/Dockerfile b/tests/Dockerfile
index 695362a..36fa35e 100644
--- a/tests/Dockerfile
+++ b/tests/Dockerfile
@@ -3,5 +3,7 @@ FROM python:3.7
COPY requirements.txt /
RUN pip3 install -r /requirements.txt
-RUN mkdir /work
-CMD python pytest
+RUN mkdir -p /work/tests
+RUN mkdir -p /work/test-results/functional
+#WORKDIR /work
+CMD cd /work;python -m pytest --junitxml=/work/test-results/functional/functional.xml
diff --git a/tests/requirements.txt b/tests/requirements.txt
index f5e5e97..199f49b 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -2,3 +2,4 @@ pytest
jinja2
jinja2-time
http://dev.splunk.com/goto/sdk-python
+flake8
diff --git a/tests/test_poc.py b/tests/test_poc.py
index cafce3e..e04aa01 100644
--- a/tests/test_poc.py
+++ b/tests/test_poc.py
@@ -1,40 +1,57 @@
-from jinja2 import Environment
-import urllib.request
-
import random
-
import socket
-
-import sys
-from time import sleep
-import splunklib.results as results
-import splunklib.client as client
+import urllib.request
from time import sleep
+
import pytest
+import splunklib.client as client
+from jinja2 import Environment
env = Environment(extensions=['jinja2_time.TimeExtension'])
+
@pytest.fixture
def setup_wordlist():
-
word_url = "http://svnweb.freebsd.org/csrg/share/dict/words?view=co&content-type=text/plain"
response = urllib.request.urlopen(word_url)
long_txt = response.read().decode()
return long_txt.splitlines()
+
@pytest.fixture
def setup_splunk():
- return client.connect(username="admin", password="Changed@11", host="splunk", port="8089")
+ tried = 0
+ while True:
+ try:
+ c = client.connect(username="admin", password="Changed@11", host="splunk", port="8089")
+ break
+ except ConnectionRefusedError:
+ tried += 1
+ if tried > 90:
+ raise
+ sleep(1)
+ return c
+
def sendsingle(message):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('sc4s', 514)
- sock.connect(server_address)
+ tried = 0
+ while True:
+ try:
+ sock.connect(server_address)
+ break
+ except socket:
+ tried += 1
+ if tried > 90:
+ raise
+ sleep(1)
sock.sendall(str.encode(message))
sock.close()
-def splunk_single(service,search):
+
+def splunk_single(service, search):
kwargs_normalsearch = {"exec_mode": "normal"}
tried = 0
while True:
@@ -57,7 +74,7 @@ def splunk_single(service,search):
# Get the results and display them
resultCount = stats["resultCount"]
eventCount = stats["eventCount"]
- if resultCount > 0 or tried>15:
+ if resultCount > 0 or tried > 15:
break
else:
tried += 1
@@ -65,7 +82,7 @@ def splunk_single(service,search):
return resultCount, eventCount
-def test_defaultroute(record_property,setup_wordlist,setup_splunk):
+def test_defaultroute(record_property, setup_wordlist, setup_splunk):
host = "{}-{}".format(random.choice(setup_wordlist), random.choice(setup_wordlist))
mt = env.from_string("{{ mark }} {% now 'utc', '%b %d %H:%M:%S' %}.000z {{ host }} sc4s_default[0]: test\n")
@@ -73,15 +90,13 @@ def test_defaultroute(record_property,setup_wordlist,setup_splunk):
sendsingle(message)
- st= env.from_string("search \"{{ host }}\" | head 2")
+ st = env.from_string("search \"{{ host }}\" | head 2")
search = st.render(host=host)
- resultCount, eventCount = splunk_single(setup_splunk,search)
+ resultCount, eventCount = splunk_single(setup_splunk, search)
record_property("host", host)
record_property("resultCount", resultCount)
record_property("message", message)
assert resultCount == 1
-
-