Skip to content

Uv for package management #212

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
.gitignore
.idea
.vscode
.venv
venv
backend/plugins/extensibles/ntc-templates
static
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
venv
backend/plugins/extensibles/ntc-templates/
backend/plugins/extensibles/ntc-templates
.venv
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.8
2 changes: 1 addition & 1 deletion docker-compose.ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ services:
netpalm-controller:
build:
context: .
dockerfile: ./dockerfiles/netpalm_controller_dockerfile
dockerfile: ./dockerfiles/controller.dockerfile
environment:
- NET_TEXTFSM=/usr/local/lib/python3.8/site-packages/ntc_templates/templates/
- NETPALM_CONFIG=/code/config/config.json
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ services:
controller:
build:
context: .
dockerfile: ./dockerfiles/netpalm_controller_dockerfile
dockerfile: ./dockerfiles/controller.dockerfile

command: gunicorn -c gunicorn.conf.py netpalm.netpalm_controller:app
environment:
Expand Down
17 changes: 12 additions & 5 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ services:
netpalm-controller:
build:
context: .
dockerfile: ./dockerfiles/netpalm_controller_dockerfile
dockerfile: ./dockerfiles/controller.dockerfile
environment:
- NET_TEXTFSM=/usr/local/lib/python3.8/site-packages/ntc_templates/templates/
- NETPALM_CONFIG=/code/config/config.json
Expand All @@ -21,7 +21,12 @@ services:
netpalm-worker-pinned:
build:
context: .
dockerfile: ./dockerfiles/netpalm_pinned_worker_dockerfile
dockerfile: ./dockerfiles/worker.dockerfile
image: netpalm-worker
command:
- "python3"
- "worker.py"
- "pinned"
environment:
- NET_TEXTFSM=/usr/local/lib/python3.8/site-packages/ntc_templates/templates/
- NETPALM_CONFIG=/code/config/config.json
Expand All @@ -33,9 +38,11 @@ services:
restart: always

netpalm-worker-fifo:
build:
context: .
dockerfile: ./dockerfiles/netpalm_fifo_worker_dockerfile
image: netpalm-worker
command:
- "python3"
- "worker.py"
- "fifo"
environment:
- NET_TEXTFSM=/usr/local/lib/python3.8/site-packages/ntc_templates/templates/
- NETPALM_CONFIG=/code/config/config.json
Expand Down
47 changes: 47 additions & 0 deletions dockerfiles/controller.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
FROM python:3.8-slim AS builder
RUN apt-get update \
&& pip3 install --upgrade pip

ENV PYTHONUNBUFFERED 1

# Install uv
RUN pip install uv --no-cache-dir

# Copy dependency files
RUN mkdir /code
WORKDIR /code
COPY pyproject.toml uv.lock .

# Create venv and install dependencies
ENV UV_COMPILE_BYTECODE=1
RUN uv venv /code/.venv
RUN uv sync --locked
RUN uv sync --locked --group controller


FROM python:3.8-slim AS runtime

RUN apt-get update \
&& apt-get install -y git \
&& git clone https://github.com/networktocode/ntc-templates.git \
&& mv ntc-templates ntc_templates \
&& pip3 install --upgrade pip

ENV PYTHONUNBUFFERED 1

RUN addgroup --system app \
&& adduser --system --ingroup app app

RUN mkdir /code
WORKDIR /code

COPY --chown=app:app . /code

RUN chown -R app:app /code
RUN mkdir /code/.venv

COPY --from=builder /code/.venv/ /code/.venv/
ENV PATH=/code/.venv/bin:$PATH

USER app
CMD gunicorn -p controller.pid -c gunicorn.conf.py netpalm.netpalm_controller:app
18 changes: 0 additions & 18 deletions dockerfiles/netpalm_controller_dockerfile

This file was deleted.

15 changes: 0 additions & 15 deletions dockerfiles/netpalm_fifo_worker_dockerfile

This file was deleted.

15 changes: 0 additions & 15 deletions dockerfiles/netpalm_pinned_worker_dockerfile

This file was deleted.

47 changes: 47 additions & 0 deletions dockerfiles/worker.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
FROM python:3.8-slim AS builder
RUN apt-get update \
&& pip3 install --upgrade pip

ENV PYTHONUNBUFFERED 1

# Install uv
RUN pip install uv --no-cache-dir

# Copy dependency files
RUN mkdir /code
WORKDIR /code
COPY pyproject.toml uv.lock .

# Create venv and install dependencies
ENV UV_COMPILE_BYTECODE=1
RUN uv venv /code/.venv
RUN uv sync --locked


FROM python:3.8-slim AS runtime

RUN apt-get update \
&& apt-get install -y git \
&& git clone https://github.com/networktocode/ntc-templates.git \
&& mv ntc-templates ntc_templates \
&& pip3 install --upgrade pip

ENV PYTHONUNBUFFERED 1

RUN addgroup --system app \
&& adduser --system --ingroup app app

RUN mkdir /code
WORKDIR /code

COPY --chown=app:app . /code

RUN chown -R app:app /code
RUN mkdir /code/.venv

COPY --from=builder /code/.venv/ /code/.venv/
ENV PATH=/code/.venv/bin:$PATH

USER app
STOPSIGNAL SIGINT
CMD ["python3", "worker.py", "pinned"]
58 changes: 29 additions & 29 deletions netpalm/backend/core/security/cert/tls/ca.crt
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFPTCCAyWgAwIBAgIJAJmgbenJU3cuMA0GCSqGSIb3DQEBCwUAMDUxEzARBgNV
BAoMClJlZGlzIFRlc3QxHjAcBgNVBAMMFUNlcnRpZmljYXRlIEF1dGhvcml0eTAe
Fw0yMzEyMDQxNTA5NDhaFw0zMzEyMDExNTA5NDhaMDUxEzARBgNVBAoMClJlZGlz
IFRlc3QxHjAcBgNVBAMMFUNlcnRpZmljYXRlIEF1dGhvcml0eTCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBANzDgsD+Glytgo1+nkb6Kge1McyHiHN7SfPl
rlAOfxtopF/ENfpt5G0GoGf+YY+4f8iYB+fMgWYE8wDVatxOznkJQeVebu+6/rlr
zNplyBwMCIsKUu49+hlnOf3X+sLAhmMcggbRUnTuCXUbEg7BRes8H7TzbmTyvAgP
Idi7XsVSnnyeRvjQiWYbv4N8WJmcWLEvCzsiwGOFmkZuz1fbqrehDJTJ/Djgf6yT
ZVYH8rd0MZai2KJMI7//sJUEY+cuFNP88hizn61Cw6DNR1eqOufktEHC0Q/yXK6g
YSbtAgNjZ1kCG2nP1grpFTnmHeU1GvR3RrLv3oE4FNMs6TVuGwUUnV8hhIFnjuPP
6Lx9X0tYDIsYKVf1BmFSB75CydzWiBesgaGYmwt+OUbeUGxzjUQ/rjyiUl9djfl4
gATGknxKiXO9h+XkS5Pja3PLe1xtFHxd8XwlYhoIAEHsL9I7EvREtPUFwFkRIFbt
6OFf15475ZlCHKdG1Br65mV4wty5beUrdLVoOOZEhOHLvBefvbj8VBXz57nGJuES
cYvZ1CHUAwo+Z0Q3ilZMKDfE84v659ZtWbc9BYuUVRJhcUKSqzOPEL4rmVPePLx0
++7HVeJY2EFHxGJBJi2yQBrhdvxFglXidLTdgIvjkNm9h4S/gjwayM4P20Mo/wW9
FZgVhKL7AgMBAAGjUDBOMB0GA1UdDgQWBBQ2N9LA6zvwTdTxiCtfz0d/qE/XdzAf
BgNVHSMEGDAWgBQ2N9LA6zvwTdTxiCtfz0d/qE/XdzAMBgNVHRMEBTADAQH/MA0G
CSqGSIb3DQEBCwUAA4ICAQAVMrQG0Zl2MEuRjHfNJOWT4xTA+5SCRZaRruAIr6Ge
XaUn+bVwQjG0FDsb+XmDz0oc39yp2ZGG5IgFqNonYARnsUusiJLVAPcm830nOYrm
7zlqyY3Ax7rn1fUgI8pbGdrN/WyuuGFBjIo9iRaqW6cHP08pBenXg7VTXVAPdf3w
IZpB+S/hzYLoJSwLafD2f/HGCtw2avA30UozuXTVri1e0fOVUcq3yC6/qBKkiesY
tjrJdjsmlCM+h+abaKR1aVoEUCPAq03O0w1RTCxntCnU7i1fLmnsGfy8s3FcusN5
pEqHaN5swnXVkC++YVm2iObzhag53mslCbhelxk7PdnbrOZmCdeCnWhpaPf97CtR
4aobqlsni6iIaKcac3DTUqTRU6NcYHOxdviaK+VZ9d2HZ5+SpqoPckYK0waA/XN9
zfyFmpEWXa63kWqVJZdEH5lLWfVvKGucyDcf+tIsUzbCaArHh9HJEuUf4QiTF16i
kEUMCHiCNMHlPIvWbo3+K8UDuZ+g3VcAgdV8C57J/f6nWgmIeow01KilYSrAFBm4
E4qvLYAVzo2z2T03iyLPWucisdkDRk1YaP68oMx99ijtfjrdcDN5K1XCpV5uefu4
9r/fwNTjDJmL61N+qtnlwJJ2P6CaZY9tQ9BHrdqAezQpuAv53AS0FN/BtFrZXm6l
AQ==
MIIFSzCCAzOgAwIBAgIUAwBMgsOktGRHqVSgk6JVOcdCsekwDQYJKoZIhvcNAQEL
BQAwNTETMBEGA1UECgwKUmVkaXMgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUg
QXV0aG9yaXR5MB4XDTI1MDUwOTAyMDYxMloXDTM1MDUwNzAyMDYxMlowNTETMBEG
A1UECgwKUmVkaXMgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwF5j7uo801VDBst3KpfY
EKs//dpzPLyWf6tObNPRGbSefwo4HNgbqPxX10zs8dlmKqJV/J79SDMHSSJgassD
IAlcD8F8poXDa6bzTzMAtKLQStgoLv93Gw729s+ZMUcheKhBXkXBIKsttnWRu5e6
PbjgL908NxzmBt1miJS1os+9/MYwxW8yrBYMecN4jMdQrwqXTyOGfxUZdn2JnA5Y
EWfA+AaZO5NHS9tRUSCzj4BB0MRAIf6bzrhoTpfOlco04BToSFOZnbSpVnPO7bfl
Mma4WuqZhsHjLAajR6szKSaBieie0hMh4zxH7r1a+iCcE+tY/D6lUaWS/2zT7uzn
46fXkaFXGe6N+5XG5kt4ew74G/oGtrO1bEbNAPRd/m7CmQ8DMfTsUImebDKuKIbL
iq68RHlU9zeAywNJg0XmCGpLcNLXJNmby/9ZWcQ4cbMfp2x3/QmrRfQTTrQqqGaT
0dkDIGaRze/K2KvCK8ytmUjMIBwEMU8C/M/k2UEZu2wSqgjmf0dzTz1cAY61SzAO
iwnKUlB22NMJ/N3BgqUyJFebj21zV3dklNIDhyY7JiiyN9r5biFjI9VPq0KSU1l0
dEJPnmeXVrU1yThbahq8gueRtxoCK4zEQbyBI70uq+EGi2YUsvWkLV8Qrq3MIy8b
RCCFOtXDdqRM7m1QCYIQI4cCAwEAAaNTMFEwHQYDVR0OBBYEFLs4OmjwFKeSFbH/
3DQEK5TW4vVhMB8GA1UdIwQYMBaAFLs4OmjwFKeSFbH/3DQEK5TW4vVhMA8GA1Ud
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBADmXi6tWn9qu9aKP7QklyB9X
6fnH9fELwUtVC5yHbtkmLxryw3SI+zdNSh/Obp7UMpRDaGfMbM3/JKG/nJ++Q+rH
qe+fZmV0e04BbXdYfrGHiKJSoyWyUxfx/SevUlwCgUjZ0lo3REqT9jJ1JLELFZN3
HUczEFhK1hkAX9DzJjdGTDgXFzbb0hHL3peG+V+NSySgZZ+SScWXXp4IpwEwkbvZ
xsnwbDrlA1oHf8TXYhujYTHqEkzAwhiWlBywwqWAL5510ODn/8hQotCFShP2GQco
0HEZpKZolAbLByOMOoNsbRXLaq+ffXjxRB/W+WpJhGi+dLEo3sIePXzIMi34Kh6N
IMX1x8neP5rTgdboRDmIjM+tdFecS1G0lZQXnzRxFBXRf5tno/UnDoGkXur32qCq
Uqqiapha7FkQCFHWJKwkaWXXfEj6ePorC6wwMgKpj9QI9RKkUY/6OFoAazqCuL2/
JdQ8pNeiZOLi585VMvfBgy2Z+BAc3BiRE/UxbZxD02r/mTMxuHINP8mUA5BPat3D
HBzTIJPACpvs3RRcUJuj5XWljfJmfgUr0rWMQXliyaUsUn/gIpSiAoZr+6ZeF+qV
+6xAky62780QJ2IZVaK2ONmGEvuu5lWT9JtF2gksMwof/6FuCM6PPJhiq5ikC0po
Y+6wtoKoW3TWIwpsGwXr
-----END CERTIFICATE-----
103 changes: 52 additions & 51 deletions netpalm/backend/core/security/cert/tls/ca.key
Original file line number Diff line number Diff line change
@@ -1,51 +1,52 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
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
YuFppYk94YvLsTZwGPImIMoH/G4H
-----END PRIVATE KEY-----
Loading
Loading