Compare commits
17 commits
aeddab622f
...
6c3cea25ad
Author | SHA1 | Date | |
---|---|---|---|
6c3cea25ad | |||
4c6aec285b | |||
9efd4faea1 | |||
|
f1f6602985 | ||
96d4bff5ff | |||
aaab7d948e | |||
f4e877e2fe | |||
65723753f6 | |||
c88acdb0f4 | |||
b528c58eae | |||
6772f0a5e0 | |||
b7f41f5675 | |||
adeca856be | |||
c1b21bf093 | |||
ba2a3f6edf | |||
60b3226361 | |||
|
0051c30b8d |
14 changed files with 202 additions and 78 deletions
|
@ -1,4 +1,4 @@
|
|||
name: build and publish
|
||||
name: build pypackage and create release
|
||||
|
||||
on:
|
||||
push:
|
||||
|
@ -9,16 +9,55 @@ on:
|
|||
branches: [main, master]
|
||||
|
||||
jobs:
|
||||
release-pypackage:
|
||||
uses: actions/workflows/.gitea/workflows/release_pypackage.yml@master
|
||||
with:
|
||||
repository: main
|
||||
secrets:
|
||||
username: __token__
|
||||
token: ${{ secrets.PACKAGE_TOKEN }}
|
||||
gh-token: ${{ secrets.GH_TOKEN }}
|
||||
release-github:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
HATCH_INDEX_REPO: main
|
||||
HATCH_INDEX_USER: __token__
|
||||
HATCH_INDEX_AUTH: ${{ secrets.PACKAGE_TOKEN }}
|
||||
steps:
|
||||
- name: checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
update-changelog:
|
||||
uses: actions/workflows/.gitea/workflows/update_changelog.yml@master
|
||||
with:
|
||||
branch: main
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
|
||||
- name: setup go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ">=1.20"
|
||||
|
||||
- name: install hatc h
|
||||
run: pip install -U hatch hatchling
|
||||
|
||||
- name: build package
|
||||
run: hatch build --clean
|
||||
|
||||
- name: install auto-changelog
|
||||
run: npm install auto-changelog
|
||||
|
||||
- name: generate changelog
|
||||
run: >-
|
||||
npx auto-changelog -t keepachangelog
|
||||
--commit-limit 50 --backfill-limit 50
|
||||
--ignore-commit-pattern '[Bb]ump version|[Uu]pdate changelog|[Mm]erge pull request'
|
||||
|
||||
- name: get release notes
|
||||
id: release-notes
|
||||
uses: olofvndrhr/releasenote-gen@v1
|
||||
|
||||
- name: publish package
|
||||
if: gitea.event_name != 'pull_request'
|
||||
run: hatch publish --yes --no-prompt
|
||||
|
||||
- name: create gitea release
|
||||
uses: https://gitea.com/actions/release-action@main
|
||||
if: gitea.event_name != 'pull_request'
|
||||
with:
|
||||
title: ${{ gitea.ref_name }}
|
||||
body: ${{ steps.release-notes.outputs.releasenotes }}
|
||||
files: |-
|
||||
dist/**
|
||||
|
|
|
@ -9,6 +9,23 @@ on:
|
|||
|
||||
jobs:
|
||||
check-code:
|
||||
uses: actions/workflows/.gitea/workflows/check_python_hatch.yml@master
|
||||
with:
|
||||
run-tests: true
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
|
||||
- name: install hatch
|
||||
run: pip install -U hatch
|
||||
|
||||
- name: test codestyle
|
||||
run: hatch run lint:style
|
||||
|
||||
- name: test typing
|
||||
run: hatch run lint:typing
|
||||
|
||||
- name: run tests
|
||||
run: hatch run default:test
|
||||
|
|
20
.github/workflows/build_release.yml
vendored
20
.github/workflows/build_release.yml
vendored
|
@ -1,4 +1,4 @@
|
|||
name: build and release
|
||||
name: build pypackage and create release
|
||||
|
||||
on:
|
||||
push:
|
||||
|
@ -17,7 +17,7 @@ jobs:
|
|||
HATCH_INDEX_AUTH: ${{ secrets.PACKAGE_TOKEN }}
|
||||
steps:
|
||||
- name: checkout code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
@ -25,12 +25,18 @@ jobs:
|
|||
with:
|
||||
python-version: "3.11"
|
||||
|
||||
- name: install hatch
|
||||
run: pip install -U hatch hatchling
|
||||
|
||||
- name: build package
|
||||
run: hatch build --clean
|
||||
|
||||
- name: install auto-changelog
|
||||
run: npm install -g auto-changelog
|
||||
run: npm install auto-changelog
|
||||
|
||||
- name: generate changelog
|
||||
run: >-
|
||||
auto-changelog -t keepachangelog
|
||||
npx auto-changelog -t keepachangelog
|
||||
--commit-limit 50 --backfill-limit 50
|
||||
--ignore-commit-pattern '[Bb]ump version|[Uu]pdate changelog|[Mm]erge pull request'
|
||||
|
||||
|
@ -38,12 +44,6 @@ jobs:
|
|||
id: release-notes
|
||||
uses: olofvndrhr/releasenote-gen@v1
|
||||
|
||||
- name: install hatch
|
||||
run: pip install -U hatch hatchling
|
||||
|
||||
- name: build package
|
||||
run: hatch build --clean
|
||||
|
||||
- name: create github release
|
||||
uses: ncipollo/release-action@v1
|
||||
if: github.event_name != 'pull_request'
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
just 1.25.2
|
||||
lefthook 1.4.6
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
FROM lscr.io/linuxserver/netbox:3.7.6
|
||||
FROM lscr.io/linuxserver/netbox:4.0.8
|
||||
|
||||
RUN pip install -U \
|
||||
wheel \
|
||||
setuptools \
|
||||
netbox-plugin-dns
|
||||
netbox-plugin-dns==1.0.4
|
||||
|
|
|
@ -29,7 +29,7 @@ services:
|
|||
- SUPERUSER_PASSWORD=netbox-dev
|
||||
|
||||
db:
|
||||
image: bitnami/postgresql:14.9.0
|
||||
image: bitnami/postgresql:14.13.0
|
||||
container_name: netbox-dev-db
|
||||
restart: unless-stopped
|
||||
user: ${UID}
|
||||
|
|
|
@ -14,7 +14,7 @@ PLUGINS_CONFIG = {
|
|||
"zone_nameservers": ["ns1.example.com", "ns2.example.com"],
|
||||
"zone_soa_mname": "ns1.example.com",
|
||||
"zone_soa_rname": "admin.example.com",
|
||||
"tolerate_underscores_in_hostnames": False,
|
||||
"tolerate_underscores_in_labels": False,
|
||||
"tolerate_leading_underscore_types": [
|
||||
"TXT",
|
||||
"SRV",
|
||||
|
|
43
dev/sync2.yml
Normal file
43
dev/sync2.yml
Normal file
|
@ -0,0 +1,43 @@
|
|||
manager:
|
||||
max_workers: 1
|
||||
plan_outputs:
|
||||
html:
|
||||
class: octodns.provider.plan.PlanMarkdown
|
||||
processors:
|
||||
spf:
|
||||
class: octodns_spf.SpfDnsLookupProcessor
|
||||
no-root-ns:
|
||||
class: octodns.processor.filter.IgnoreRootNsFilter
|
||||
min-max-ttl:
|
||||
class: octodns.processor.restrict.TtlRestrictionFilter
|
||||
allowed_ttls:
|
||||
- 60
|
||||
- 300
|
||||
- 600
|
||||
- 900
|
||||
- 1800
|
||||
- 3600
|
||||
- 7200
|
||||
- 10800
|
||||
providers:
|
||||
config:
|
||||
class: octodns.provider.yaml.YamlProvider
|
||||
directory: ./zones
|
||||
default_ttl: 3600
|
||||
enforce_order: true
|
||||
populate_should_replace: false
|
||||
netbox:
|
||||
class: octodns_netbox_dns.NetBoxDNSProvider
|
||||
url: http://localhost:8000
|
||||
token: 1ca8f8de1d651b0859052dc5e6a0858fd1e43e3d # change token for netbox
|
||||
view: false
|
||||
replace_duplicates: false
|
||||
make_absolute: true
|
||||
zones:
|
||||
"*":
|
||||
sources:
|
||||
- config
|
||||
processors:
|
||||
- spf
|
||||
targets:
|
||||
- netbox
|
4
justfile
4
justfile
|
@ -19,7 +19,6 @@ show_system_info:
|
|||
|
||||
setup:
|
||||
asdf install
|
||||
lefthook install
|
||||
|
||||
create_venv:
|
||||
@echo "creating venv"
|
||||
|
@ -77,5 +76,8 @@ sync *args:
|
|||
dump *args:
|
||||
hatch -v run default:dump {{ args }}
|
||||
|
||||
dump2 *args:
|
||||
hatch -v run default:dump2 {{ args }}
|
||||
|
||||
validate *args:
|
||||
hatch -v run default:validate {{ args }}
|
||||
|
|
14
lefthook.yml
14
lefthook.yml
|
@ -1,14 +0,0 @@
|
|||
colors: true
|
||||
no_tty: false
|
||||
|
||||
pre-commit:
|
||||
commands:
|
||||
01_ruff_check:
|
||||
stage_fixed: true
|
||||
glob: "*.py"
|
||||
run: ruff check --fix-only --exit-zero --silent {all_files}
|
||||
|
||||
02_ruff_format:
|
||||
stage_fixed: true
|
||||
glob: "*.py"
|
||||
run: ruff format {all_files}
|
|
@ -1,5 +1,5 @@
|
|||
[build-system]
|
||||
requires = ["hatchling>=1.18", "hatch-regex-commit>=0.0.3"]
|
||||
requires = ["hatchling>=1.24", "hatch-regex-commit>=0.0.3"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[project]
|
||||
|
@ -11,7 +11,7 @@ requires-python = ">=3.11"
|
|||
dynamic = ["version"]
|
||||
authors = [
|
||||
{ name = "Jeffrey C. Ollie", email = "" },
|
||||
{ name = "Ivan Schaller", email = "ivan@schaller.sh" }
|
||||
{ name = "Ivan Schaller", email = "ivan@schaller.sh" },
|
||||
]
|
||||
classifiers = [
|
||||
"License :: OSI Approved :: MIT License",
|
||||
|
@ -19,10 +19,7 @@ classifiers = [
|
|||
"Operating System :: OS Independent",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
]
|
||||
dependencies = [
|
||||
"pynetbox>=7.2.0",
|
||||
"dnspython>=2.4.2",
|
||||
]
|
||||
dependencies = ["pynetbox>=7.2.0", "dnspython>=2.4.2"]
|
||||
|
||||
[project.urls]
|
||||
Homepage = "https://github.com/olofvndrhr/octodns-netbox-dns"
|
||||
|
@ -48,9 +45,9 @@ packages = ["src/octodns_netbox_dns"]
|
|||
[tool.hatch.envs.default]
|
||||
python = "3.11"
|
||||
dependencies = [
|
||||
"pytest==7.4.4",
|
||||
"coverage==7.4.2",
|
||||
"octodns==1.7.0",
|
||||
"pytest==8.2.2",
|
||||
"coverage==7.5.3",
|
||||
"octodns==1.9.1",
|
||||
"octodns-spf==0.0.2",
|
||||
]
|
||||
|
||||
|
@ -61,28 +58,23 @@ cov-report = ["- coverage combine", "coverage report", "coverage xml"]
|
|||
cov = ["test-cov", "cov-report"]
|
||||
|
||||
sync = ["cd dev && octodns-sync --debug --config-file sync.yml --force {args}"]
|
||||
dump = ["cd dev && octodns-dump --debug --config-file sync.yml --output-dir output {args} '*' netbox"]
|
||||
dump = [
|
||||
"cd dev && octodns-dump --debug --config-file sync.yml --output-dir output {args} '*' netbox",
|
||||
]
|
||||
dump2 = [
|
||||
"cd dev && octodns-dump --debug --config-file sync2.yml --output-dir output {args} '*' netbox",
|
||||
]
|
||||
validate = ["cd dev && octodns-validate --debug --config-file sync.yml {args}"]
|
||||
|
||||
[tool.hatch.envs.lint]
|
||||
python = "3.11"
|
||||
detached = true
|
||||
dependencies = [
|
||||
"mypy==1.8.0",
|
||||
"ruff==0.2.2",
|
||||
]
|
||||
dependencies = ["mypy==1.10.0", "ruff==0.4.8"]
|
||||
|
||||
[tool.hatch.envs.lint.scripts]
|
||||
typing = "mypy --non-interactive --install-types {args:src/octodns_netbox_dns}"
|
||||
style = [
|
||||
"ruff check --diff {args:.}",
|
||||
"ruff format --check --diff {args:.}"
|
||||
]
|
||||
fmt = [
|
||||
"ruff check --fix {args:.}",
|
||||
"ruff format {args:.}",
|
||||
"style"
|
||||
]
|
||||
style = ["ruff check --diff {args:.}", "ruff format --check --diff {args:.}"]
|
||||
fmt = ["ruff check --fix {args:.}", "ruff format {args:.}", "style"]
|
||||
all = ["style", "typing"]
|
||||
|
||||
###
|
||||
|
@ -112,7 +104,7 @@ exclude = [
|
|||
"dist",
|
||||
"node_modules",
|
||||
"venv",
|
||||
"dev"
|
||||
"dev",
|
||||
]
|
||||
|
||||
[tool.ruff.lint]
|
||||
|
@ -143,8 +135,18 @@ select = [
|
|||
"W",
|
||||
"YTT",
|
||||
]
|
||||
ignore-init-module-imports = true
|
||||
ignore = ["E501", "D103", "D100", "D102", "PLR2004", "D403", "ISC001", "FBT001", "FBT002", "FBT003"]
|
||||
ignore = [
|
||||
"E501",
|
||||
"D103",
|
||||
"D100",
|
||||
"D102",
|
||||
"PLR2004",
|
||||
"D403",
|
||||
"ISC001",
|
||||
"FBT001",
|
||||
"FBT002",
|
||||
"FBT003",
|
||||
]
|
||||
unfixable = ["F401"]
|
||||
|
||||
[tool.ruff.format]
|
||||
|
@ -231,7 +233,10 @@ parallel = true
|
|||
omit = ["src/octodns_netbox_dns/__about__.py"]
|
||||
|
||||
[tool.coverage.paths]
|
||||
octodns_netbox_dns = ["src/octodns_netbox_dns", "*/octodns-netbox-dns/src/octodns_netbox_dns"]
|
||||
octodns_netbox_dns = [
|
||||
"src/octodns_netbox_dns",
|
||||
"*/octodns-netbox-dns/src/octodns_netbox_dns",
|
||||
]
|
||||
tests = ["tests", "*/octodns-netbox-dns/tests"]
|
||||
|
||||
[tool.coverage.report]
|
||||
|
|
|
@ -1 +1 @@
|
|||
__version__ = "0.3.5"
|
||||
__version__ = "0.3.7"
|
||||
|
|
|
@ -75,14 +75,18 @@ class NetBoxDNSProvider(octodns.provider.base.BaseProvider):
|
|||
self.make_absolute = make_absolute
|
||||
self.disable_ptr = disable_ptr
|
||||
|
||||
def _make_absolute(self, value: str) -> str:
|
||||
def _make_absolute(self, value: str, force: bool = False) -> str:
|
||||
"""return dns name with trailing dot to make it absolute
|
||||
|
||||
@param value: dns record value
|
||||
@param force: when `True`, disregard configuration option `make_absolute`
|
||||
|
||||
@return: absolute dns record value
|
||||
"""
|
||||
if not self.make_absolute or value.endswith("."):
|
||||
if value.endswith("."):
|
||||
return value
|
||||
|
||||
if not (self.make_absolute or force):
|
||||
return value
|
||||
|
||||
absolute_value = value + "."
|
||||
|
@ -430,3 +434,14 @@ class NetBoxDNSProvider(octodns.provider.base.BaseProvider):
|
|||
value=record,
|
||||
disable_ptr=self.disable_ptr,
|
||||
)
|
||||
|
||||
def list_zones(self) -> list[str]:
|
||||
"""get all zones from netbox
|
||||
|
||||
@return: a list with all active zones
|
||||
"""
|
||||
query_params = {"status": "active", **self.nb_view}
|
||||
zones = self.api.plugins.netbox_dns.zones.filter(**query_params)
|
||||
absolute_zones = [self._make_absolute(z.name, True) for z in zones]
|
||||
|
||||
return sorted(absolute_zones)
|
||||
|
|
|
@ -11,7 +11,7 @@ DEFAULT_CONFIG = {
|
|||
}
|
||||
|
||||
|
||||
def test1():
|
||||
def test_absolute():
|
||||
nbdns = NetBoxDNSProvider(**DEFAULT_CONFIG)
|
||||
rcd = "example.com"
|
||||
absolute = nbdns._make_absolute(rcd)
|
||||
|
@ -19,9 +19,27 @@ def test1():
|
|||
assert absolute == "example.com."
|
||||
|
||||
|
||||
def test2():
|
||||
def test_noop():
|
||||
nbdns = NetBoxDNSProvider(**DEFAULT_CONFIG)
|
||||
rcd = "example.com."
|
||||
absolute = nbdns._make_absolute(rcd)
|
||||
|
||||
assert absolute == "example.com."
|
||||
|
||||
|
||||
def test_disabled():
|
||||
args = {**DEFAULT_CONFIG, "make_absolute": False}
|
||||
nbdns = NetBoxDNSProvider(**args)
|
||||
rcd = "example.com"
|
||||
relative = nbdns._make_absolute(rcd, force=False)
|
||||
|
||||
assert relative == "example.com"
|
||||
|
||||
|
||||
def test_force():
|
||||
args = {**DEFAULT_CONFIG, "make_absolute": False}
|
||||
nbdns = NetBoxDNSProvider(**args)
|
||||
rcd = "example.com"
|
||||
absolute = nbdns._make_absolute(rcd, force=True)
|
||||
|
||||
assert absolute == "example.com."
|
||||
|
|
Loading…
Reference in a new issue