pull/1/head
plazmoid 3 years ago
parent a7b4b333a5
commit b247c8640d
  1. 31
      Makefile.toml
  2. 2
      bin/u_agent/build.rs
  3. 2
      bin/u_server/src/u_server.rs
  4. 3
      images/integration-tests/u_db_entrypoint.sh
  5. 46
      integration/docker-compose.yml
  6. 33
      integration/docker_compose.py
  7. 0
      sample.env.private
  8. 19
      scripts/deploy.sh
  9. 11
      scripts/gen_certs.sh
  10. 5
      scripts/start_server.sh

@ -17,11 +17,26 @@ script = "./scripts/build_musl_libs.sh"
command = "${CARGO}"
args = ["clean"]
[tasks.build]
[tasks.cargo_build]
dependencies = ["build_static_libs"]
command = "${CARGO}"
args = ["build", "--target", "${TARGET}", "${@}"]
[tasks.release_tasks]
script = '''
if [[ "${@}" =~ "release" ]]; then
echo "Stripping binaries..."
strip $(ls ./target/${TARGET}/release/u_* -1 | grep -v ".d")
echo "Creating symlink to release dir..."
ln -s ./target/${TARGET}/release ./release || true
fi
'''
[tasks.build]
dependencies = ["cargo_build", "release_tasks"]
command = "true"
args = []
[tasks.run]
script = '''
echo "Only integration tests are supported."
@ -40,12 +55,14 @@ bash integration_tests.sh
[tasks.gen_schema]
script = '''
cd ./integration
docker-compose up -d u_db_gen_schema
echo "Waiting 10 sec..."
sleep 10
docker-compose down
docker run --rm \
--env-file=$PWD/.env \
--env-file=$PWD/.env.private \
-v $PWD:/unki \
-w /unki \
unki/u_db \
/unki/images/integration-tests/u_db_entrypoint.sh || true
'''
[tasks.test]
dependencies = ["unit", "integration"]
dependencies = ["unit", "integration"]

@ -3,6 +3,6 @@ use std::path::PathBuf;
fn main() {
let server_cert = PathBuf::from("../../certs/ca.crt");
if !server_cert.exists() {
panic!("CA certificate doesn't exist. Create it first with certs/gen_certs.sh");
panic!("CA certificate doesn't exist. Create it first with scripts/gen_certs.sh");
}
}

@ -43,7 +43,7 @@ fn init_logger() {
let logfile = OpenOptions::new()
.append(true)
.create(true)
.open(LOGFILE)
.open(PathBuf::from("logs").join(LOGFILE))
.unwrap();
let level = LevelFilter::Info;
let loggers = vec![

@ -3,4 +3,5 @@ set -m
export DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@127.0.0.1/${DB_NAME}
touch /unki/Cargo.toml
/usr/local/bin/docker-entrypoint.sh postgres &
sleep 10 && diesel setup && diesel migration run && fg %1
sleep 10 && diesel setup && diesel migration run
[[ $1 == "svc" ]] && fg %1

@ -10,15 +10,16 @@ services:
networks:
- u_net
volumes:
- ../target/x86_64-unknown-linux-musl/release/u_server:/u_server
- ../release/u_server:/unki/u_server
- ../certs:/unki/certs
- ../logs:/unki/logs
working_dir: /unki
command: /u_server
command: /unki/u_server
depends_on:
u_db:
condition: service_healthy
expose:
- '63714'
ports:
- 63714:63714
env_file:
- ../.env
- ../.env.private
@ -42,7 +43,7 @@ services:
working_dir: /unki
volumes:
- ../migrations:/unki/migrations
command: /unki/u_db_entrypoint.sh
command: /unki/u_db_entrypoint.sh svc
healthcheck:
# test if db's port is open and db is created
test: ss -tlpn | grep 5432 && psql -lqt -U $${DB_USER} | grep -qw $${DB_NAME}
@ -50,37 +51,12 @@ services:
timeout: 5s
retries: 3
u_db_gen_schema:
image: unki/u_db
env_file:
- ../.env
- ../.env.private
working_dir: /unki
volumes:
- ../:/unki/
command: /unki/images/integration-tests/u_db_entrypoint.sh
u_agent_1:
image: unki/u_agent
networks:
- u_net
volumes:
- ../target/x86_64-unknown-linux-musl/release/u_agent:/u_agent
command: /u_agent u_server
env_file:
- ../.env
environment:
RUST_LOG: u_agent=debug
depends_on:
u_server:
condition: service_healthy
u_agent_2:
u_agent:
image: unki/u_agent
networks:
- u_net
volumes:
- ../target/x86_64-unknown-linux-musl/release/u_agent:/u_agent
- ../release/u_agent:/u_agent
command: /u_agent u_server
env_file:
- ../.env
@ -98,15 +74,13 @@ services:
- ~/.cargo/registry:/root/.cargo/registry
- ./:/tests/
- ../certs:/certs
- ../target/x86_64-unknown-linux-musl/release/u_panel:/u_panel
- ../release/u_panel:/u_panel
- ../lib/u_lib:/lib/u_lib
- ../lib/u_api_proc_macro:/lib/u_api_proc_macro
working_dir:
/tests/
depends_on:
u_agent_1:
condition: service_started
u_agent_2:
u_agent:
condition: service_started
u_server:
condition: service_healthy

@ -6,58 +6,63 @@ from docker import docker, check_state, print_errors
class Compose:
ALL_CONTAINERS = [
'u_agent_1',
'u_agent_2',
'u_agent',
'u_server',
'u_db',
'tests_runner',
]
def __init__(self):
self.container_tpl = 'integration_%s_1'
self.cmd_container = self.container_tpl % 'tests_runner'
self.ALL_CONTAINERS = [self.container_tpl % c for c in self.ALL_CONTAINERS]
self.container_tpl = 'integration_%s_%d'
self.cmd_container = self.container_tpl % ('tests_runner', 1)
self.ALL_CONTAINERS = [self.container_tpl % (c, 1) for c in self.ALL_CONTAINERS]
self.scaled_svc = {}
self.scale("u_agent", 2)
def scale(self, svc, count):
for c in range(1, count):
new_container = self.container_tpl % (svc, c + 1)
self.ALL_CONTAINERS.append(new_container)
self.scaled_svc[svc] = count
def _call(self, *args):
subprocess.check_call([
cmd = [
'docker-compose',
'--no-ansi',
] + list(args)
)
log(f'Running docker-compose command: {cmd}')
subprocess.check_call(cmd)
def up(self):
log('Instanciating cluster')
self._call('up', '-d')
log('Ok')
scaled = [f"{k}={v}" for k, v in self.scaled_svc.items()]
if len(scaled) > 0:
scaled.insert(0, '--scale')
self._call('up', '-d', *scaled)
def down(self):
log('Shutting down cluster')
self._call('down')
log('Ok')
def stop(self):
log('Stopping cluster')
self._call('stop')
log('Ok')
def run(self, cmd):
container = self.cmd_container
if isinstance(cmd, str):
cmd = shlex.split(cmd)
log(f'Running command "{cmd}" in container {container}')
result = docker([
'exec',
'-ti',
container
] + cmd)
log('Ok')
return result
def is_alive(self):
log('Check if all containers are alive')
errors = check_state(self.ALL_CONTAINERS)
log('Check done')
if errors:
print_errors(errors)

@ -0,0 +1,19 @@
#!/bin/bash
set -xe
source $(dirname $0)/rootdir.sh #set ROOTDIR
SERVER="ortem"
REMOTE_DIR=/srv/usrv
REMOTE_PATH=$SERVER:$REMOTE_DIR
RSYNC="rsync -arzh --progress"
ssh $SERVER mkdir -p $REMOTE_DIR/{release,deploy}
$RSYNC $ROOTDIR/release/u_server $REMOTE_PATH/release/u_server
$RSYNC --exclude="*.sh" $ROOTDIR/certs/ $REMOTE_PATH/certs
$RSYNC $ROOTDIR/migrations/ $REMOTE_PATH/migrations
$RSYNC $ROOTDIR/.env* $REMOTE_PATH/
$RSYNC $ROOTDIR/integration/docker-compose.yml $REMOTE_PATH/deploy/
$RSYNC $ROOTDIR/images/integration-tests/u_db* $REMOTE_PATH/deploy/
$RSYNC $ROOTDIR/images/integration-tests/u_server.Dockerfile $REMOTE_PATH/deploy/
$RSYNC $ROOTDIR/scripts/start_server.sh $REMOTE_PATH/start_server.sh
ssh $SERVER "cd $REMOTE_DIR/deploy && ./start_server.sh"

@ -1,16 +1,23 @@
set -ex
DIR=.
source $(dirname $0)/rootdir.sh #set ROOTDIR
DIR=$ROOTDIR/certs
V3_CFG=$DIR/v3.ext
mkdir -p $DIR
cat > $V3_CFG << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign
subjectAltName = @alt_names
[alt_names]
DNS.1 = ortem.xyz
DNS.2 = u_server
EOF
openssl req -x509 -newkey rsa:4096 -keyout $DIR/ca.key -out $DIR/ca.crt -nodes -days 365 -subj "/CN=root"
openssl req -newkey rsa:4096 -keyout $DIR/alice.key -out $DIR/alice.csr -nodes -days 365 -subj "/CN=alice"
openssl req -newkey rsa:4096 -keyout $DIR/server.key -out $DIR/server.csr -nodes -days 365 -subj "/CN=u_server"
openssl req -newkey rsa:4096 -keyout $DIR/server.key -out $DIR/server.csr -nodes -days 365 -subj "/CN=ortem.xyz"
openssl x509 -req -in $DIR/alice.csr -CA $DIR/ca.crt -CAkey $DIR/ca.key -out $DIR/alice.crt -set_serial 01 -days 365 -extfile $V3_CFG
openssl x509 -req -in $DIR/server.csr -CA $DIR/ca.crt -CAkey $DIR/ca.key -out $DIR/server.crt -set_serial 01 -days 365 -extfile $V3_CFG
openssl pkcs12 -export -out $DIR/alice.p12 -inkey $DIR/alice.key -in $DIR/alice.crt -passin pass: -passout pass:

@ -0,0 +1,5 @@
#!/bin/bash
docker build -t unki/u_db -f u_db.Dockerfile .
docker build -t unki/u_server -f u_server.Dockerfile .
docker-compose down
docker-compose up -d u_server
Loading…
Cancel
Save