Skip to content
Merged
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
6 changes: 0 additions & 6 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
Business Source License 1.1

Dual License Notice: This project is dual-licensed under BSL-1.1 (this file)
and MIT (LICENSE-MIT). You may choose either license at your option.

Parameters

Licensor: Plures
Expand All @@ -22,9 +19,6 @@ Notice

Business Source License 1.1

Dual License Notice: This project is dual-licensed under BSL-1.1 (this file)
and MIT (LICENSE-MIT). You may choose either license at your option.

Terms

The Licensor hereby grants you the right to copy, modify, create derivative
Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[![Version](https://img.shields.io/github/v/release/plures/netops-toolkit?display_name=tag&sort=semver)](https://github.com/plures/netops-toolkit/releases)
[![Python](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/downloads/)
[![License: BSL-1.1](https://img.shields.io/badge/License-BSL--1.1-blue.svg)](LICENSE) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE-MIT)
[![License: BUSL-1.1](https://img.shields.io/badge/License-BUSL--1.1-blue.svg)](LICENSE)
[![CI](https://github.com/plures/netops-toolkit/actions/workflows/release.yml/badge.svg)](https://github.com/plures/netops-toolkit/actions/workflows/release.yml)
[![interrogate](https://img.shields.io/badge/interrogate-100%25-brightgreen.svg)](https://interrogate.readthedocs.io)
[![docs](https://img.shields.io/badge/docs-mkdocs-blue.svg)](https://plures.io/netops-toolkit/)
Expand Down Expand Up @@ -249,4 +249,8 @@ require their corresponding extras.

## License

See [LICENSE](LICENSE).
netops-toolkit is source-available under the [Business Source License 1.1](LICENSE).
Personal and non-commercial use is permitted under its Additional Use Grant;
production use outside that grant requires a commercial license from Plures. Each released version
changes to Apache License 2.0 no later than four years after its first public
distribution. For commercial terms, contact `licensing@plures.io`.
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_acl/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,4 @@ molecule test

## License

MIT
BUSL-1.1
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_acl/meta/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ galaxy_info:
Deploy Access Control Lists to network devices with an optional diff
preview and safety checks to prevent unintentional ACL removal.
company: ""
license: MIT
license: BUSL-1.1
min_ansible_version: "2.16"
platforms:
- name: all
Expand Down
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_backup/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@ molecule test

## License

MIT
BUSL-1.1
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_backup/meta/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ galaxy_info:
Back up the running configuration of network devices and enforce a
configurable retention policy on the Ansible control node.
company: ""
license: MIT
license: BUSL-1.1
min_ansible_version: "2.16"
platforms:
- name: all
Expand Down
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_health/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,4 @@ molecule test

## License

MIT
BUSL-1.1
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_health/meta/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ galaxy_info:
Run health checks (CPU, memory, interfaces, BGP, OSPF) against network
devices and fail the play on any CRITICAL finding.
company: ""
license: MIT
license: BUSL-1.1
min_ansible_version: "2.16"
platforms:
- name: all
Expand Down
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_ntp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,4 @@ molecule test

## License

MIT
BUSL-1.1
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_ntp/meta/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ galaxy_info:
Standardise NTP configuration on network devices: add/remove servers,
configure authentication keys and timezone, and validate synchronisation.
company: ""
license: MIT
license: BUSL-1.1
min_ansible_version: "2.16"
platforms:
- name: all
Expand Down
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_update/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,4 @@ molecule test

## License

MIT
BUSL-1.1
2 changes: 1 addition & 1 deletion netops/ansible/roles/netops_update/meta/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ galaxy_info:
Upgrade the OS of network devices with pre/post validation and automatic
rollback on failure.
company: ""
license: MIT
license: BUSL-1.1
min_ansible_version: "2.16"
platforms:
- name: all
Expand Down
5 changes: 3 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
[build-system]
requires = ["setuptools>=68.0"]
requires = ["setuptools>=77.0"]
build-backend = "setuptools.build_meta"

[project]
name = "netops-toolkit"
version = "0.52.1"
description = "Modular network automation utilities for telco operations"
requires-python = ">=3.9"
license = {text = "MIT"}
license = "BUSL-1.1"
license-files = ["LICENSE"]

dependencies = [
"netmiko>=4.3.0,<4.5.0",
Expand Down
4 changes: 2 additions & 2 deletions tests/test_ansible_roles.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ def test_galaxy_meta_role_name_matches(role: str) -> None:


@pytest.mark.parametrize("role", ROLE_NAMES)
def test_galaxy_meta_license_is_mit(role: str) -> None:
def test_galaxy_meta_license_is_busl(role: str) -> None:
meta = _load_yaml(ROLES_ROOT / role / "meta/main.yml")
assert meta["galaxy_info"]["license"] == "MIT", f"{role}/meta/main.yml license should be MIT"
assert meta["galaxy_info"]["license"] == "BUSL-1.1", f"{role}/meta/main.yml license should be BUSL-1.1"


# ---------------------------------------------------------------------------
Expand Down
26 changes: 26 additions & 0 deletions tests/test_licensing_metadata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""Regression checks for the single, source-available licensing declaration."""

from pathlib import Path

REPOSITORY_ROOT = Path(__file__).resolve().parents[1]


def test_public_license_surfaces_consistently_declare_busl() -> None:
"""Distribution metadata, license text, and README cannot drift into dual licensing."""
license_text = (REPOSITORY_ROOT / "LICENSE").read_text(encoding="utf-8")
package_metadata = (REPOSITORY_ROOT / "pyproject.toml").read_text(encoding="utf-8")
readme = (REPOSITORY_ROOT / "README.md").read_text(encoding="utf-8")

assert "Business Source License 1.1" in license_text
assert "Dual License Notice" not in license_text
assert 'license = "BUSL-1.1"' in package_metadata
assert 'license-files = ["LICENSE"]' in package_metadata
assert "LICENSE-MIT" not in readme
Comment thread
kayodebristol marked this conversation as resolved.
assert "BUSL-1.1" in readme

for role in ("netops_acl", "netops_backup", "netops_health", "netops_ntp", "netops_update"):
role_meta = REPOSITORY_ROOT / "netops" / "ansible" / "roles" / role / "meta" / "main.yml"
role_readme = REPOSITORY_ROOT / "netops" / "ansible" / "roles" / role / "README.md"

assert 'license: BUSL-1.1' in role_meta.read_text(encoding="utf-8")
assert "BUSL-1.1" in role_readme.read_text(encoding="utf-8")
Loading