From 53afd6bd7c084c9a41615e77e58a116110a0789a Mon Sep 17 00:00:00 2001 From: yzamir Date: Tue, 12 Sep 2023 13:02:06 +0300 Subject: [PATCH] Add configuration and CI files to the server application Signed-off-by: yzamir --- rose/server/.coveragerc | 2 + rose/server/.flake8 | 8 +++ rose/server/Dockerfile | 15 ++++++ rose/server/Makefile | 47 +++++++++++++++++ rose/server/README.rst | 89 ++++++++++++++++++++++++++++++++ rose/server/conftest.py | 4 ++ rose/server/pytest.ini | 2 + rose/server/requirements-dev.txt | 13 +++++ rose/server/requirements.txt | 5 ++ rose/server/rose-engine.yaml | 41 +++++++++++++++ 10 files changed, 226 insertions(+) create mode 100644 rose/server/.coveragerc create mode 100644 rose/server/.flake8 create mode 100644 rose/server/Dockerfile create mode 100644 rose/server/Makefile create mode 100644 rose/server/README.rst create mode 100644 rose/server/conftest.py create mode 100644 rose/server/pytest.ini create mode 100644 rose/server/requirements-dev.txt create mode 100644 rose/server/requirements.txt create mode 100644 rose/server/rose-engine.yaml diff --git a/rose/server/.coveragerc b/rose/server/.coveragerc new file mode 100644 index 00000000..75ee2926 --- /dev/null +++ b/rose/server/.coveragerc @@ -0,0 +1,2 @@ +[run] +omit = test_*.py diff --git a/rose/server/.flake8 b/rose/server/.flake8 new file mode 100644 index 00000000..46b65244 --- /dev/null +++ b/rose/server/.flake8 @@ -0,0 +1,8 @@ +[flake8] +show_source = True +statistics = True + +# E501: line to long. +# E203: whitespace before ':' to accept black code style +# W503: line break before binary operator +ignore = E501,E203,W503 diff --git a/rose/server/Dockerfile b/rose/server/Dockerfile new file mode 100644 index 00000000..057807f1 --- /dev/null +++ b/rose/server/Dockerfile @@ -0,0 +1,15 @@ +# Use Red Hat Universal Base Image (UBI) with Python +FROM registry.access.redhat.com/ubi8/python-38 + +# Set the working directory in the Docker container +WORKDIR /app + +# Copy the local package files to the container's workspace +COPY . /app + +# Install the Python dependencies +RUN pip install --no-cache-dir -r requirements.txt + +# Set the command to run the main.py file when the container launches +ENTRYPOINT ["python", "main.py", "--listen", "0.0.0.0"] +CMD [ "--track", "same" ] diff --git a/rose/server/Makefile b/rose/server/Makefile new file mode 100644 index 00000000..eb840412 --- /dev/null +++ b/rose/server/Makefile @@ -0,0 +1,47 @@ +.PHONY: lint test lint-fix code-quality run build-image run-image clean + +IMAGE_NAME ?= quay.io/rose/rose-server +PORT ?= 8880 +WS_PORT ?= 8765 + +# Default driver when running on localhost +DRIVERS ?= http://127.0.0.1:8081 + +# By default, run both linting and tests +all: lint test + +lint: + @echo "Running linting..." + flake8 --show-source --statistics . + black --check --diff . + +lint-fix: + @echo "Running lint fixing..." + black --verbose --color . + +code-quality: + @echo "Running static code quality checks..." + radon cc . + radon mi . + +test: + @echo "Running unittests..." + pytest + +run: + @echo "Running driver logic server ..." + python main.py --port $(PORT) --drivers $(DRIVERS) + +build-image: + @echo "Building container image ..." + podman build -t $(IMAGE_NAME) . + +run-image: + @echo "Running container image ..." + podman run --rm --network host -it $(IMAGE_NAME) + +clean: + -rm -rf .coverage + -rm -rf htmlcov + -find . -name '*.pyc' -exec rm {} \; + -find . -name '__pycache__' -exec rmdir {} \; diff --git a/rose/server/README.rst b/rose/server/README.rst new file mode 100644 index 00000000..94100211 --- /dev/null +++ b/rose/server/README.rst @@ -0,0 +1,89 @@ +======================= +ROSE Engine Game Server +======================= + +Overview +======== +This server provides a simple HTTP endpoint for a driving game. + +Requirements +============ +* Python 3.8+ +* Podman (optional, for containerization) + +Installation +============ +1. Clone the repository: + + .. code-block:: bash + + git clone + cd + +2. Install the required Python packages: + + .. code-block:: bash + + pip install -r requirements.txt + pip install -r requirements-dev.txt + +Running the Server +================== +Run the server using: + +.. code-block:: bash + + python main.py --port 8080 + +By default, the server will start on port 8080. + +Podman Usage +============ +1. Build the Podman image: + + .. code-block:: bash + + podman build -t rose-engine . + +2. Run the container: + + .. code-block:: bash + + podman run -it --rm --network host rose-engine + +Kubernetes Deployment +===================== + +You can deploy the application on a Kubernetes cluster using the provided configuration. + +Instructions: +------------- +1. Apply both the Deployment and Service: + +.. code-block:: bash + + kubectl apply -f rose-engine.yaml + +2. Check the status of the deployment: + +.. code-block:: bash + + kubectl get deployments rose-engine + +3. Forward a local port to your pod for accessing the service locally: + +.. code-block:: bash + + kubectl port-forward deployment/rose-engine-deployment 8880:8880 8765:8765 + +Now, the service will be accessible locally at http://localhost:8880. + +Note: For production deployments, consider exposing the service using an Ingress controller or cloud provider specific solutions. + +Contributing +============ +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. + +License +======= +GPL-v2 diff --git a/rose/server/conftest.py b/rose/server/conftest.py new file mode 100644 index 00000000..89b54641 --- /dev/null +++ b/rose/server/conftest.py @@ -0,0 +1,4 @@ +# conftest.py +import sys + +sys.path.append(".") diff --git a/rose/server/pytest.ini b/rose/server/pytest.ini new file mode 100644 index 00000000..e6da1935 --- /dev/null +++ b/rose/server/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = -vv -rxs --timeout 10 --cov . diff --git a/rose/server/requirements-dev.txt b/rose/server/requirements-dev.txt new file mode 100644 index 00000000..f4aec775 --- /dev/null +++ b/rose/server/requirements-dev.txt @@ -0,0 +1,13 @@ +# requirements.txt + +flake8>=3.9.0 +coverage>=7.3.0 +radon>=6.0.0 +black>=23.7.0 +requests>=2.28.0 +websockets>=11.0.0 +aiohttp>=3.8.0 +pytest +pytest-check-links +pytest-coverage +pytest-timeout \ No newline at end of file diff --git a/rose/server/requirements.txt b/rose/server/requirements.txt new file mode 100644 index 00000000..89174199 --- /dev/null +++ b/rose/server/requirements.txt @@ -0,0 +1,5 @@ +# requirements.txt + +requests>=2.28.0 +websockets>=11.0.0 +aiohttp>=3.8.0 diff --git a/rose/server/rose-engine.yaml b/rose/server/rose-engine.yaml new file mode 100644 index 00000000..a0de2f76 --- /dev/null +++ b/rose/server/rose-engine.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rose-server-deployment + labels: + app: rose-server +spec: + replicas: 1 + selector: + matchLabels: + app: rose-server + template: + metadata: + labels: + app: rose-server + spec: + containers: + - name: rose-server-container + image: quay.io/rose/rose-server:latest # Modify with your Docker image name and tag. + ports: + - containerPort: 8880 + +--- + +apiVersion: v1 +kind: Service +metadata: + name: rose-server-service +spec: + selector: + app: rose-server + ports: + - name: http + protocol: TCP + port: 8880 + targetPort: 8880 + - name: ws + protocol: TCP + port: 8765 + targetPort: 8765 + type: LoadBalancer # run outside the cluster: kubectl port-forward service/rose-server-service 8880:8880 8765:8765 .