-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
All of the python code lives in the nautobot-update-cf folder to avoid duplication, but the intention is to cleanup and merge those together in a single python container image down the line.
- Loading branch information
Showing
5 changed files
with
197 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
from functools import cached_property | ||
import requests | ||
|
||
|
||
class Undersync: | ||
def __init__( | ||
self, | ||
auth_token: str, | ||
api_url="http://undersync-service.undersync.svc.cluster.local:8080", | ||
) -> None: | ||
self.token = auth_token | ||
self.api_url = api_url | ||
|
||
def sync_devices(self, switch_hostnames: list[str], force=False, dry_run=False): | ||
if dry_run: | ||
return [self.dry_run(hostname) for hostname in switch_hostnames] | ||
elif force: | ||
return [self.force(hostname) for hostname in switch_hostnames] | ||
else: | ||
return [self.sync(hostname) for hostname in switch_hostnames] | ||
|
||
@cached_property | ||
def client(self): | ||
session = requests.Session() | ||
session.headers = { | ||
"Content-Type": "application/json", | ||
"Authorization": f"Bearer {self.token}", | ||
} | ||
return session | ||
|
||
def sync(self, hostname: str) -> requests.Response: | ||
response = self.client.post(f"{self.api_url}/v1/devices/{hostname}/sync") | ||
response.raise_for_status() | ||
return response | ||
|
||
def dry_run(self, hostname: str) -> requests.Response: | ||
response = self.client.post(f"{self.api_url}/v1/devices/{hostname}/dry-run") | ||
response.raise_for_status() | ||
return response | ||
|
||
def force(self, hostname: str) -> requests.Response: | ||
response = self.client.post(f"{self.api_url}/v1/devices/{hostname}/force") | ||
response.raise_for_status() | ||
return response |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
import sys | ||
from nautobot import Nautobot | ||
from helpers import undersync_parser | ||
from helpers import credential | ||
from helpers import setup_logger | ||
from undersync import Undersync | ||
|
||
logger = setup_logger(__name__) | ||
|
||
def update_nautobot(args) -> list[str]: | ||
default_nb_url = "http://nautobot-default.nautobot.svc.cluster.local" | ||
device_uuid = args.device_uuid | ||
field_name = 'connected_to_network' | ||
field_value = args.network_name | ||
nb_url = args.nautobot_url or default_nb_url | ||
|
||
nb_token = args.nautobot_token or credential("nb-token", "token") | ||
nautobot = Nautobot(nb_url, nb_token, logger=logger) | ||
logger.info(f"Updating Device {device_uuid} and moving it to '{field_value}' network.") | ||
nautobot.update_cf(device_uuid, field_name, field_value) | ||
logger.debug(f"Updated Device.{field_name} to {field_value}") | ||
switches = nautobot.uplink_switches(device_uuid) | ||
logger.info(f"Obtained switch IDs: {switches}") | ||
return switches | ||
|
||
def call_undersync(args, switches): | ||
undersync_token = credential('undersync', 'token') | ||
if not undersync_token: | ||
logger.error("Please provide auth token for Undersync.") | ||
sys.exit(1) | ||
undersync = Undersync(undersync_token) | ||
|
||
try: | ||
return undersync.sync_devices(switches, dry_run=args.dry_run, force=args.force) | ||
except Exception as error: | ||
logger.error(error) | ||
sys.exit(2) | ||
|
||
def main(): | ||
""" | ||
Updates Nautobot Device's 'connected_to_network' field and follows with | ||
request to Undersync service, requesting sync for all of the | ||
uplink_switches that the device is connected to. | ||
""" | ||
parser = undersync_parser(__file__) | ||
args = parser.parse_args() | ||
|
||
switches = update_nautobot(args) | ||
for response in call_undersync(args, switches): | ||
logger.info(f"Undersync returned: {response.json()}") | ||
|
||
|
||
if __name__ == "__main__": | ||
main() |
41 changes: 41 additions & 0 deletions
41
argo-workflows/trigger-undersync/workflowtemplates/sync.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
apiVersion: argoproj.io/v1alpha1 | ||
metadata: | ||
name: undersync-device | ||
kind: WorkflowTemplate | ||
spec: | ||
templates: | ||
- name: trigger-undersync | ||
container: | ||
image: ghcr.io/rackerlabs/understack/nautobot-update-cf:latest | ||
command: | ||
- python | ||
- /app/with_ifaces.py | ||
args: | ||
- --device_uuid | ||
- "{{workflow.parameters.device_uuid}}" | ||
- --network-name | ||
- "{{workflow.parameters.network_name}}" | ||
- --dry-run | ||
- "{{workflow.parameters.dry_run}}" | ||
- --force | ||
- "{{workflow.parameters.force}}" | ||
volumeMounts: | ||
- mountPath: /etc/nb-token/ | ||
name: nb-token | ||
readOnly: true | ||
- mountPath: /etc/undersync/ | ||
name: undersync-token | ||
readOnly: true | ||
inputs: | ||
parameters: | ||
- name: device_uuid | ||
- name: network_name | ||
- name: force | ||
- name: dry_run | ||
volumes: | ||
- name: nb-token | ||
secret: | ||
secretName: nautobot-token | ||
- name: undersync-token | ||
secret: | ||
secretName: undersync-token |