First commit

This commit is contained in:
Dryusdan 2019-07-08 17:00:54 +02:00
parent 46ba9e2315
commit 90798cf938
4 changed files with 153 additions and 0 deletions

110
bridge.py Normal file
View file

@ -0,0 +1,110 @@
#!/usr/bin/env python3
# coding: utf-8
# -*- coding: utf-8 -*-
# A bridge to set rudder node into netbox
#import pynetbox
import requests, os, random, sys, time, json, logging, argparse, re, shutil
from logging.handlers import RotatingFileHandler
from pprint import pprint
from utils.config import get_parameter, init_log
config_file = "config.txt"
secrets_filepath = get_parameter("secrets_filepath", config_file)
rudder_url = get_parameter("rudder_url", config_file)
netbox_url = get_parameter("netbox_url", config_file)
log_filepath = get_parameter("log_filepath", config_file)
log = init_log(log_filepath)
def get_nodes(config):
secrets = get_parameter("secrets_filepath", config)
rudder_token = get_parameter("rudder_token", secrets)
rudder_url = get_parameter("rudder_url", config)
nodes = requests.get(rudder_url+'/rudder/api/latest/nodes', headers={'X-API-Token': rudder_token})
for node in nodes.json()['data']['nodes']:
if check_if_node_exist(node['hostname'], config) == 0:
pprint("Machine not exist: adding")
add_node(node['hostname'], 5, 1, node['ram'], 10, node['machine']['type'], config)
else:
pprint("It's ok, pass")
if node['machine']['type'] == "Virtual":
full_nodes_info = requests.get(rudder_url+'/rudder/api/latest/nodes/'+node['id']+'?include=full', headers={'X-API-Token': rudder_token})
for full_node_info in full_nodes_info.json()['data']['nodes']:
populate_vm(full_node_info, config)
elif node['machine']['type'] == "Physical":
pprint("populate IP")
def check_if_node_exist(node_name, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
node = requests.get(netbox_url+'/api/virtualization/virtual-machines/?name='+node_name, headers={"Authorization": "Token "+netbox_token})
if node.json()['count'] > 0:
return 1
else:
node_physical = requests.get(netbox_url+'/api/dcim/devices/?name='+node_name, headers={"Authorization": "Token "+netbox_token})
if node_physical.json()['count'] > 0:
return 1
else:
return 0
def add_node(name, cluster, vcpu, memory, disk, vm_type, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
if vm_type == "Virtual":
node = requests.post(netbox_url+'/api/virtualization/virtual-machines/', headers={"Authorization": "Token "+netbox_token}, json={
"name": name,
"status": 1,
"cluster": cluster,
"vcpus": vcpu,
"memory": memory,
"disk": disk
})
elif vm_type == "Physical":
node = requests.post(netbox_url+'/api/dcim/devices/', headers={"Authorization": "Token "+netbox_token}, json={
"name": name,
"device_type": 2,
"device_role": 8,
"site": 5,
"status": 1
})
else:
pprint(vm_type)
if node.status_code == 201:
pprint("VM "+name+" added")
else:
pprint("Error durring action for vm "+name)
pprint(node.json())
def populate_vm(nodeinfo, config):
pprint(nodeinfo)
vm_id = get_netbox_vm_id(nodeinfo['hostname'], config)
#nodeinfo["networkInterfaces"]
def get_netbox_vm_id(name, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
node = requests.get(netbox_url+'/api/virtualization/virtual-machines/?name='+name, headers={"Authorization": "Token "+netbox_token})
#return node.json()['results']['id']
for vm in node.json()['results']:
return vm['id']
def get_netbox_device_id():
pprint("device_id")
def get_netbox_network_interface(name, config):
pprint("get_netbox_network_interface")
def add_netbox_network_interface(vm_id, name, config):
pprint("add_netbox_network_interface")
def main():
get_nodes(config_file)
main()

4
config.sample.txt Normal file
View file

@ -0,0 +1,4 @@
secrets_filepath: secrets/secrets.txt
log_filepath: activity.log
rudder_url: https://rudder.io
netbox_url: https://netbox.io

View file

@ -0,0 +1,2 @@
rudder_token:
netbox_token:

37
utils/config.py Normal file
View file

@ -0,0 +1,37 @@
from logging.handlers import RotatingFileHandler
import requests, os, random, sys, time, json, logging
def get_parameter( parameter, file_path ):
# Check if secrets file exists
if not os.path.isfile(file_path):
log.error("File %s not found, exiting."%file_path)
sys.exit(0)
# Find parameter in file
with open( file_path ) as f:
for line in f:
if line.startswith( parameter ):
return line.replace(parameter + ":", "").strip()
# Cannot find parameter, exit
log.critical(file_path + " Missing parameter %s "%parameter)
sys.exit(0)
def init_log(log_filepath):
log = logging.getLogger()
log.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
file_handler = RotatingFileHandler(log_filepath, 'a', 1000000, 1)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
stream_handler.setFormatter(formatter)
log.addHandler(stream_handler)
return log