pve_tests/main.py

160 lines
4.5 KiB
Python
Raw Normal View History

import logging
import urllib3
from typing import Callable, List
from time import sleep
2023-03-24 16:31:22 +03:00
from pathlib import Path
2023-10-24 12:22:14 +03:00
import yaml
2023-03-24 16:31:22 +03:00
from proxmoxer import ProxmoxAPI
from functions import clone_template, get_vm_ip
2023-03-24 16:31:22 +03:00
2023-10-11 14:38:56 +03:00
urllib3.disable_warnings()
2023-10-24 12:21:21 +03:00
FORMAT = "%(asctime)s %(name)s %(levelname)s %(message)s"
logging.basicConfig(format=FORMAT)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
2023-10-11 14:38:56 +03:00
2023-03-24 16:31:22 +03:00
PROXMOX_HOST = 'pve.office.basealt.ru'
2023-10-24 12:22:52 +03:00
PROXMOX_USER = 'stepchenkoas'
PROXMOX_USER_FULL = PROXMOX_USER + '@BaseALT'
2023-03-24 16:31:22 +03:00
PROXMOX_PASSWORD = Path('pve_secret').read_text().strip()
2023-03-27 15:51:32 +03:00
def wait_status(funcs: List[Callable], status: str):
statuses = [False] * len(funcs)
while not all(statuses):
logger.debug(statuses)
sleep(5)
for i in range(len(funcs)):
statuses[i] = funcs[i]()['status'] == status
2023-03-24 16:31:22 +03:00
def main():
proxmox = ProxmoxAPI(
2023-10-24 12:22:52 +03:00
PROXMOX_HOST, user=PROXMOX_USER_FULL, password=PROXMOX_PASSWORD, verify_ssl=False
2023-03-24 16:31:22 +03:00
)
nodes = proxmox.nodes.get()
nodes = list(filter(lambda node: node['status'] == 'online', nodes))
node = min(nodes, key=lambda node: node['disk'])['node']
2023-10-11 14:38:56 +03:00
template_id = 374
2023-10-24 12:22:52 +03:00
prefix = PROXMOX_USER + '-test-k8s'
vm_names = {
'master': f'{prefix}-master',
'worker1': f'{prefix}-node1',
'worker2': f'{prefix}-node2',
}
2023-10-24 21:08:11 +03:00
vm_ids = {
'master': 500,
'worker1': 501,
'worker2': 502,
}
vm_id_master, upid_master = clone_template(
proxmox,
node,
template_id,
2023-10-24 21:08:11 +03:00
newid=vm_ids['master'],
name=vm_names['master'],
)
2023-10-24 21:08:11 +03:00
assert vm_id_master == vm_ids['master']
2023-03-24 16:31:22 +03:00
vm_id_worker1, upid_worker1 = clone_template(
proxmox,
node,
template_id,
2023-10-24 21:08:11 +03:00
newid=vm_ids['worker1'],
name=vm_names['worker1'],
)
2023-10-24 21:08:11 +03:00
assert vm_id_worker1 == vm_ids['worker1']
vm_id_worker2, upid_worker2 = clone_template(
proxmox,
node,
template_id,
2023-10-24 21:08:11 +03:00
newid=vm_ids['worker2'],
name=vm_names['worker2'],
)
2023-10-24 21:08:11 +03:00
assert vm_id_worker2 == vm_ids['worker2']
logger.info('Waiting for clone tasks to complete...')
wait_status(
[
proxmox.nodes(node).tasks(upid_master).status.get,
proxmox.nodes(node).tasks(upid_worker1).status.get,
proxmox.nodes(node).tasks(upid_worker2).status.get,
],
'stopped'
)
logger.info('Tasks completed!')
logger.info('Starting VMs...')
2023-10-24 21:08:11 +03:00
proxmox.nodes(node).qemu(vm_ids['master']).status.start.post()
proxmox.nodes(node).qemu(vm_ids['worker1']).status.start.post()
proxmox.nodes(node).qemu(vm_ids['worker2']).status.start.post()
wait_status(
[
2023-10-24 21:08:11 +03:00
proxmox.nodes(node).qemu(vm_ids['master']).status.current.get,
proxmox.nodes(node).qemu(vm_ids['worker1']).status.current.get,
proxmox.nodes(node).qemu(vm_ids['worker2']).status.current.get,
],
'running'
)
2023-10-11 14:38:56 +03:00
sleep(40)
logger.info('VMs are running!')
2023-10-24 21:08:11 +03:00
vm_ip_master = get_vm_ip(proxmox, node, vm_ids['master'])
vm_ip_worker1 = get_vm_ip(proxmox, node, vm_ids['worker1'])
vm_ip_worker2 = get_vm_ip(proxmox, node, vm_ids['worker2'])
2023-10-24 12:24:28 +03:00
proxmox.logout()
2023-10-24 12:23:45 +03:00
with open('run/vm_ids' ,'w') as ofile:
vm_ids = f'{vm_id_master}\t{vm_names["master"]}\n'
vm_ids += f'{vm_id_worker1}\t{vm_names["worker1"]}\n'
vm_ids += f'{vm_id_worker2}\t{vm_names["worker2"]}\n'
logger.info(vm_ids)
ofile.write(vm_ids)
2023-10-24 12:23:45 +03:00
with open('run/hosts' ,'w') as ofile:
hosts = f'{vm_ip_master}\t{vm_names["master"]}\n'
hosts += f'{vm_ip_worker1}\t{vm_names["worker1"]}\n'
hosts += f'{vm_ip_worker2}\t{vm_names["worker2"]}\n'
logger.info(hosts)
ofile.write(hosts)
2023-03-24 16:31:22 +03:00
2023-10-24 12:22:14 +03:00
inventory = {
'workers': {
'hosts': {
'worker1': {
'ansible_host': vm_ip_worker1,
'ansible_user': 'root',
},
'worker2': {
'ansible_host': vm_ip_worker2,
'ansible_user': 'root',
},
},
},
'all_vms': {
'hosts': {
'master': {
'ansible_host': vm_ip_master,
'ansible_user': 'root',
},
},
'children': {
'workers'
},
},
}
2023-03-24 16:31:22 +03:00
2023-10-24 12:22:14 +03:00
with open('run/generated_inventory.yaml', 'w') as ofile:
yaml.dump(inventory, ofile)
2023-03-24 16:31:22 +03:00
if __name__ == '__main__':
main()