First commit
This commit is contained in:
parent
46ba9e2315
commit
90798cf938
110
bridge.py
Normal file
110
bridge.py
Normal 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
4
config.sample.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
secrets_filepath: secrets/secrets.txt
|
||||
log_filepath: activity.log
|
||||
rudder_url: https://rudder.io
|
||||
netbox_url: https://netbox.io
|
2
secrets/secrets.sample.txt
Normal file
2
secrets/secrets.sample.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
rudder_token:
|
||||
netbox_token:
|
37
utils/config.py
Normal file
37
utils/config.py
Normal 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
|
||||
|
Loading…
Reference in a new issue