From: –Vamshi Namilikonda Date: Tue, 9 Jul 2024 17:27:09 +0000 (+0530) Subject: changes on docker and build X-Git-Tag: l-release~5 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=e9a8caef6af6608520db0824b915217f00dfb42e;p=smo%2Fo2.git changes on docker and build Issue-ID: SMO-145 Change-Id: Ifc95f937ae74bbeb60c25c8c057b2d393053057b Signed-off-by: Vamshi Namilikonda --- diff --git a/.gitignore b/.gitignore index 71d7636..e376eba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .tox docs/_build/* +nfo/k8s/db.sqlite3 diff --git a/nfo/k8s/Dockerfile b/nfo/k8s/Dockerfile new file mode 100644 index 0000000..1bfad3e --- /dev/null +++ b/nfo/k8s/Dockerfile @@ -0,0 +1,52 @@ +# Start with a base image that includes the tools needed +FROM alpine:latest + +# Install necessary tools (curl, tar, git, Python, Helm dependencies) +RUN apk add --no-cache \ + curl \ + tar \ + git \ + python3 \ + py3-pip \ + libc-dev \ + gcc + +# Install Helm +ENV HELM_VERSION v3.8.0 +ENV FILENAME helm-${HELM_VERSION}-linux-amd64.tar.gz + +# Download and extract Helm binary +RUN curl -fsSL -o /tmp/${FILENAME} https://get.helm.sh/${FILENAME} \ + && tar -zxvf /tmp/${FILENAME} -C /tmp \ + && mv /tmp/linux-amd64/helm /usr/local/bin/helm \ + && rm /tmp/${FILENAME} \ + && rm -rf /tmp/linux-amd64 + +# Set up application directory +ENV PYTHONUNBUFFERED 1 +ENV DJANGO_SETTINGS_MODULE nfo_microservice.settings + + +# Set work directory +WORKDIR /app + +# Install dependencies +COPY requirements.txt /app/ + +RUN python -m venv /venv +ENV PATH="/venv/bin:$PATH" + +RUN pip install -r requirements.txt + +# Copy project files into the container +COPY . /app/ + +RUN python manage.py makemigrations + +RUN python manage.py migrate + +# Expose port (if necessary) +EXPOSE 8000 + +# Command to run the application +CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] diff --git a/nfo/k8s/Makefile b/nfo/k8s/Makefile new file mode 100644 index 0000000..3e533aa --- /dev/null +++ b/nfo/k8s/Makefile @@ -0,0 +1,71 @@ +# Makefile for nfo Project + +# Variables +PYTHON = python3 +PIP = pip3 +VENV = venv_nfo +REQ_FILE = requirements.txt +DJANGO_MANAGE = $(PYTHON) manage.py +APP_NAME = apis + +# Targets +.PHONY: help +help: + @echo "Available targets:" + @echo " setup Setup Python, virtual environment, and dependencies" + @echo " install Install dependencies" + @echo " create-venv Create virtual environment" + @echo " activate-venv Activate virtual environment" + @echo " install-packages Install required Python packages" + @echo " startapp Create a new Django app named 'apis'" + @echo " configure-env Configure environment settings in config.ini" + @echo " migrate Apply database migrations" + @echo " runserver Run Django development server" + @echo " clean Clean up temporary files and virtual environment" + +build: clean create-venv activate-venv install-packages migrate runserver + +# install: +# # Ensure Python 3.12 and necessary tools are installed +# # Install pip if not already installed +# # Install Helm and Kubernetes Client/Server separately + +create-venv: + # Install virtualenv if not already installed + # $(PIP) install virtualenv + $(PYTHON) -m venv $(VENV) + # Create virtual environment named venv_nfo + # virtualenv $(VENV) + +activate-venv: + # Activate virtual environment + /bin/bash -c "source $(VENV)/bin/activate" # Use `$(VENV)\Scripts\activate` on Windows + +install-packages: + # Install required Python packages listed in requirements.txt + $(PIP) install -r $(REQ_FILE) + +# startapp: +# # Create a new Django app named 'apis' +# $(DJANGO_MANAGE) startapp $(APP_NAME) + +configure-env: + # Perform configuration tasks for environment settings in config.ini + # Change Kubernetes config path + # Change Helm executable path + +migrate: + # Apply database migrations + $(DJANGO_MANAGE) makemigrations + $(DJANGO_MANAGE) migrate + +runserver: + # Run Django development server + $(DJANGO_MANAGE) runserver 0.0.0.0:8000 + +clean: + # Clean up temporary files and virtual environment + find . -type f -name '*.pyc' -delete + rm -rf $(VENV) __pycache__ + +# Note: Adjust paths and commands based on your specific environment and requirements diff --git a/nfo/k8s/README.md b/nfo/k8s/README.md new file mode 100644 index 0000000..8253624 --- /dev/null +++ b/nfo/k8s/README.md @@ -0,0 +1,65 @@ +# Summary +The O-RAN Software Community (OSC) and Open Air Interface (OAI) and Nephio open source communities are working together to provide a reference implementation of the Open RAN (O-RAN) Alliance’s cloud-centric specifications using the Nephio enablers and capabilities in order to deploy and manage O-RAN NFs and xApps. The focus of the O-RAN Integration within Nephio focuses on the Federated O-Cloud Orchestration and Management (FOCOM), Network Function Orchestration (NFO), Infrastructure Management (IMS) and Deployment Management (DMS) O-RAN services. + +# NFO installation steps + +# Build the service + + NFO services needs to be installed on any VM + + For testing, you can run the service locally : + + `make build` + +# Build an image through docker + + docker build -t image-name(nfo-service) . + + deploy using docker + + docker run -d -p 0000:0000 image-name(nfo-service) + +#### prerequisites: python 3.12,helm v3.8.0 + +## Run helm_processor REST APIs + + BASE_URL : http://127.0.0.1:8080(any*) + +##### DU: + + GET: BASE_URL/nfo/api/v1/helm/du/ + POST: BASE_URL/nfo/api/v1/helm/du/ + DELETE: BASE_URL/nfo/api/v1/helm/du/ + +##### CUCP: + + GET: BASE_URL/nfo/api/v1/helm/cucp/ + POST: BASE_URL/nfo/api/v1/helm/cucp/ + DELETE: BASE_URL/nfo/api/v1/helm/cucp/ + +##### CUUP: + + GET: BASE_URL/nfo/api/v1/helm/cuup/ + POST: BASE_URL/nfo/api/v1/helm/cuup/ + DELETE: BASE_URL/nfo/api/v1/helm/cuup/ + + +## Run packagevariant_processor REST APIs + +##### DU: + + POST: BASE_URL/nfo/api/v1/operator/du/ + GET: BASE_URL/nfo/api/v1/operator/du/ + DELETE: BASE_URL/nfo/api/v1/operator/du/ + +##### CU_CP: + + POST: BASE_URL/nfo/api/v1/operator/cucp/ + GET: BASE_URL/nfo/api/v1/operator/cucp/ + DELETE: BASE_URL/nfo/api/v1/operator/cucp/ + +##### CU_UP: + + POST: BASE_URL/nfo/api/v1/operator/cuup/ + GET: BASE_URL/nfo/api/v1/operator/cuup/ + DELETE: BASE_URL/nfo/api/v1/operator/cuup/ \ No newline at end of file diff --git a/nfo/k8s/config.ini b/nfo/k8s/config.ini new file mode 100644 index 0000000..fc383a0 --- /dev/null +++ b/nfo/k8s/config.ini @@ -0,0 +1,5 @@ +[localpath] +kubeconfig_file_path = /app/config/config.yaml +helm_executable_path = /usr/local/bin/helm + + diff --git a/nfo/k8s/config/config.yaml b/nfo/k8s/config/config.yaml new file mode 100644 index 0000000..0d9f413 --- /dev/null +++ b/nfo/k8s/config/config.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2akNDQWRLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJME1EWXhOREE1TkRjek4xb1hEVE0wTURZeE1qQTVOVEl6TjFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBUFVtCno3STJVb25jeUt3K0taMFgxaHhKSWUzaVd4c0taZXhNQ2ViY1dwcDZjTmdEUEhyRUs5Lzh6ektRSlFUUmhPNWIKbzk2YWlRMjZZeEhnWUYvK1lFU1UyaEtCNU50YnRKOXQrYU15OGtMRDRoUzhMR0RRY0ovek1jbmxvZDNsSTRWUgo1eWxNbFFrMi82S2N0VEYza0I0Y24waWx6YjdsME94cWxJNlJER2hKT0ZUNmFLcEs2QjBkc1BMZlgyTFZ3R0JmCjkzbFFGRkw2WHZBMGhRcnA2eDQyckc1TElJUmpMcTdzcVdpZis3QmpWS3h3L1RmYk10MGo0UmxlUVQ0R1dqLy8KN0Q2Q0RmWlczUXhJdmowVUdMZkZqVTZRc3dlcUFzY2U0bENUT2x4ZEg2THlUYmt3NjBmblpSVjBXcFEreWU1OApHV080cll1MDA3M2NsR0xjNnBzQ0F3RUFBYU5GTUVNd0RnWURWUjBQQVFIL0JBUURBZ0trTUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdIUVlEVlIwT0JCWUVGSyt5UE9iZWtNN3E0Wmdwb3hIU2JvcG05eUZCTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRQ1ZjenlVVE8xWU52NFJ3UWJmOFZhUG1BWEIvYk53eWFsQ3E5RDRjai9ndHRnSApPb3VKZUdlaGorZHljYTlHRU5UcU54MDVUTU8xcXhFV3JjR3FEcC9pTjE5Qk9hRTMrREtmeGtGbnlQSEo5ZWpTCjBGamowTlFhZkNQTW1TK0dzc1RTeS92U2x1emtDdkZta0dob0ZvYktsMWduTkpDWUpTZFY3aVcrOGtuTXd0SmwKay9OcG5pak5ZT08xMURpUkYxL0Y0UnkzL2ErVTVtWjI4YnMrN0p6S0hMU09QbC9TVVh4R1BIUDVRMUdVWWRXTwpOd1IxQXZPRDZyK00xQnpyMWtBMXNNbXBpQ3RzTHJPTE13bTRSeHBvRDVPY2RNSFRUOUl5dDNMRG8xeGc3RnZ2CjQ1bjJPVDdGdGJxa0dBWkUyRGc3Q2RaTUdWZHRNUmZJc05oQnRNd0kKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + server: https://172.18.0.3:6443 + name: management-cluster +contexts: +- context: + cluster: management-cluster + namespace: sylva-system + user: management-cluster-admin + name: management-cluster-admin@management-cluster +current-context: management-cluster-admin@management-cluster +kind: Config +preferences: {} +users: +- name: management-cluster-admin + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQWZ1Z0F3SUJBZ0lJT01wR3FYZ1I0RVl3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBMk1UUXdPVFEzTXpkYUZ3MHlOVEEyTVRRd09UVXlNemhhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXUveWtKZjFpa1YvOTJmMXYKYjBRKzYxeEpQYVB3RGYzdUhtdlpQQ1VtdlZjZWJva3c4dHpDcXJoNkJRQmp4aEVFY3hkTlBiSXZsRDVnZ1ZFWgpTUEpXYk12VGI3YllydCsveHJIRWJ2dldFUmo3clhaeGlmWEdOa3NoR2J4Yk9Fa2JxYnR1bEVMb2lOQkVUNmFKCmVYMFBXQXZnUy9xdHo5dzFEWkNZM3N1bHFhQzhzbkdCUWV2VW56SWZFN0JCanppTTFaWUNPSXhWQVhMdVBuZ08KaENNZTZQSUVlZ05WU001OGFWTTl0QUt4dFErZnU4VDVxbENIbXI1TEdicXdodXdRVnU2SUNFdW8ycnZGWUoxTAplS2lDeXlKVkJQZjFqOUlsMTNKNGZtbXF5c08zT1FLendqUkwvMldFWVk4T25wZE1hbEZLLzdQUjI2dTlVL3pZCkNkWVlEd0lEQVFBQm8wZ3dSakFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0h3WURWUjBqQkJnd0ZvQVVyN0k4NXQ2UXp1cmhtQ21qRWRKdWltYjNJVUV3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFEV2xZUFNIN3ZaWjg3ZUpWZ3dBT0tIb0hBckhjZ1lnSXdxSzd2a09NMUdRSTBwNVdmaFVzdW0zClBDY2ZJa002YmYvbGF4ZUpUUW1RQVYrMnh6dTYrQjdBMjZ2YVFxbDh2REFUZndjeThBMFZsLzlqR2tTRVJkTDEKVFNOVnRUajBTVUVtNDNPMVpzZ0l2Mm9XcWlBNCtuWENXNklSL0pyblVFY0ZnamMyL0ozaGxYTUc5N3VlRlBBZgovOG85Qis0bGVzUWZBZURRNElsUXpHdUJzclYxVzN5ZmVHNERUVzcxaDJDbVl5bi92L0xzUDFpdENHbDNzU3VOCjdMU09YeEtRUkc5QkphNlJtQzM0YTBUNFYwUTlXUHBaYjRoMmo3b2RSOVV2ZG9yblhBK2VVUWdLTEE3OVJVV1IKUEIvTFRaelUrNmlPbWNBRkQyaWNtd2JnOGVScHYwST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdS95a0pmMWlrVi85MmYxdmIwUSs2MXhKUGFQd0RmM3VIbXZaUENVbXZWY2Vib2t3Cjh0ekNxcmg2QlFCanhoRUVjeGROUGJJdmxENWdnVkVaU1BKV2JNdlRiN2JZcnQrL3hySEVidnZXRVJqN3JYWngKaWZYR05rc2hHYnhiT0VrYnFidHVsRUxvaU5CRVQ2YUplWDBQV0F2Z1MvcXR6OXcxRFpDWTNzdWxxYUM4c25HQgpRZXZVbnpJZkU3QkJqemlNMVpZQ09JeFZBWEx1UG5nT2hDTWU2UElFZWdOVlNNNThhVk05dEFLeHRRK2Z1OFQ1CnFsQ0htcjVMR2Jxd2h1d1FWdTZJQ0V1bzJydkZZSjFMZUtpQ3l5SlZCUGYxajlJbDEzSjRmbW1xeXNPM09RS3oKd2pSTC8yV0VZWThPbnBkTWFsRksvN1BSMjZ1OVUvellDZFlZRHdJREFRQUJBb0lCQUN5SU04YUFHT3FCUjl4dApDZ25jcTk4TGRKb3lqTHB6emdYTTNLQS8yTVovcmNqWG5RM2JPQTVETnp5YUZBaW1uVnc2UitUMm9nakhJZ3RnClQ5SVUvbDQxaHJmdkk3T0JjNmU1RXVTTHFmRlE3c1h2eWdPNWdpUDRkalhuaGVCMmlTUVRMNlhWbDhwWk0rVisKZVJDYmpKZjU4RDl2ZWQ5RXRoaXBpVjAxOXQrUXVSM25SSDROQ2t1NjduTjVRYmdma0tobDdxeFlCNnY3UWRmMwpkWml6L1BvU0crYTE4dXcwbFVSZkRLNkRwTkRKNVFuY0RtUUhRTnBmWjMxUERvbTVZUzdDbkkyM0dCdTVRb3NDCllJRUo2SlhBSXd6STB1bGRxRzhyajRoWWRCcERxc0FmOXNtN1RQRC9hdzQxRUlDTlJaK1MydHMvK29INC9UWTkKQkgzbTQ2RUNnWUVBNmJKQkdvM0lIaU0vRVp2dmczYjYzNE9Ob3VlRXRyZHRKTHpJa1U5OGo3MEM1M3JMUU1HSgp2aU5qTWllV3hhMVJQTitySkFETWF0TW44TkJqUXRQYURGbUQ3TE8yeDBEU3lsSWtuVVJKR1BrTkV0Wk5KZ2hlCkQxU3ZVWTIzeUpFa2NwYjQyTHZUN3VQN0Z1MjhRbGhsUW1uSG9LbzRMb3N3TkxNcmVvdEMybkVDZ1lFQXplMloKV2J6V1VsMFBqMTJhOWp3N25wUlR6NDVrWjVmYXVDZnBWM0VrSGFnZGcrazlzVk1uUEZZZ0M1YTBwdUhyNW04TgoxN1NhVjU3V1lrRnpWTklGeUNuZ0o4eWhsTU5UWWh5V2QvYXg3dVdVQ0lsRFJ5UWNjd2xSSmZ4QkZvQm1KZXFZCjN1ZXI1Q0tNdmN1dGZLY1BCMlk0aDU4cE1idzd4QURWSlZEZ1duOENnWUJxTUNBYkE3K2h5aHczVVNiRkVzUXQKMmVYNjFyNWNFLzdaQ1pzTlJCUHljRTBvaDRoaHRVOTBnVG5xcVVoK0xDSFV5a0ZHaThKVzYvbWpGOTF5bVRiawpFNnk1V25POEdEMXZ4MkZ4d0h5Q2gzQWtWaElhTFFVb2JDOTVuQzZkU1M1SmowWWxuVHRRdW5EMld6SUc1NG1qCll0TmRzdHJ5Y3phRlM4QiszMWFTVVFLQmdRQ2JoWURXUkFaODU2bHp0ZGJ0ZGluMHBzTHhNdkhqUnMwNVhYTWQKeGVYbnUrcW1rQVUyb2IwMUZUcFlaallDL3dhZzNtaE82eWZSV3JWQU9YdjNxRElUcklTTXFqK3gwUjV0TDNmNApHOGpmeW1UVldZMEU4bUhHQTFoVTNzRHRWSVZReDI4eWtUYkJNZEtuR0dicWlHU1NTd0lRY3dTeWVoMk05ckFDCjRhUyswd0tCZ1FDUXhqTW9rVVlnbXRDb3B3bWllZ2NPUDRsc1BFZnpOcUg2em8wZXBwNHk1SlU0Nk1OWEY2TjkKVTR0ZzFoNVY0SU4wVXU0Mmd1d1lBRkJ2Z0IyUWszOXprd2xDTzY3YktyT2sxT2JaUmNqUWhoaVl2ejd0cE00TApnaWRGT0pTRmtFSFY4WE9qMWlFWWt2Z0oxRUVlT2xmRmJkcElmbERZWXErclpteTl6enBRa3c9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= \ No newline at end of file diff --git a/nfo/k8s/manage.py b/nfo/k8s/manage.py new file mode 100644 index 0000000..a212ebd --- /dev/null +++ b/nfo/k8s/manage.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys +import django +#from django.core.management import execute_from_command_line + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nfo_microservice.settings') + try: + from django.core.management import execute_from_command_line + django.setup() + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/nfo/k8s/nfo_microservice/settings.py b/nfo/k8s/nfo_microservice/settings.py index de1e6a2..b657b15 100644 --- a/nfo/k8s/nfo_microservice/settings.py +++ b/nfo/k8s/nfo_microservice/settings.py @@ -20,7 +20,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-@2#ob=f_mn7-8#)(v+*yc9yx3(l(h&av5rjna5$)gv4qevq61v' +SECRET_KEY = ' ' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -76,6 +76,7 @@ WSGI_APPLICATION = 'nfo_microservice.wsgi.application' # Database # https://docs.djangoproject.com/en/5.0/ref/settings/#databases + DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', diff --git a/nfo/k8s/packagevariant_processor/views.py b/nfo/k8s/packagevariant_processor/views.py index 6123d03..2bdfe49 100644 --- a/nfo/k8s/packagevariant_processor/views.py +++ b/nfo/k8s/packagevariant_processor/views.py @@ -8,6 +8,7 @@ import yaml from kubernetes.dynamic import DynamicClient import json from rest_framework.renderers import JSONRenderer +from configparser import ConfigParser # Create your views here. @@ -59,7 +60,7 @@ def executePost(request): get_remote_file(pv, pv_location) # Load kube config #config.load_kube_config() - config.load_kube_config(config_file='/home/ubuntu/.kube/config') + config.load_kube_config(config_file=fetchKubeLocalPath()) # Create a dynamic client dyn_client = DynamicClient(client.ApiClient()) @@ -87,7 +88,7 @@ def executeDelete(request): # Load kube config #config.load_kube_config() - config.load_kube_config(config_file='/home/ubuntu/.kube/config') + config.load_kube_config(config_file=fetchKubeLocalPath()) # Create a CustomObjectsAPI instance custom_api = client.CustomObjectsApi() @@ -110,7 +111,7 @@ def executeGet(request): name = payload['name'] print ("--- Retriving Kubernetes custom resource ---") - config.load_kube_config(config_file='/home/ubuntu/.kube/config') + config.load_kube_config(config_file=fetchKubeLocalPath()) dyn_client = DynamicClient(client.ApiClient()) @@ -144,3 +145,12 @@ def get_remote_file(pv, pv_location): file.write(response.content) else: print('Failed to download the file.') + + +def fetchKubeLocalPath(): + config = ConfigParser() + with open("config.ini", "r") as file_object: + config.read_file(file_object) + kube_config_path = config.get("localpath", "kubeconfig_file_path") + + return kube_config_path \ No newline at end of file diff --git a/nfo/k8s/requirements.txt b/nfo/k8s/requirements.txt new file mode 100644 index 0000000..4af43f3 --- /dev/null +++ b/nfo/k8s/requirements.txt @@ -0,0 +1,7 @@ +requests +django +djangorestframework +pyhelm +kubernetes +pyhelm3 +six \ No newline at end of file