mirror of
https://github.com/GNS3/gns3-server
synced 2024-11-28 11:18:11 +00:00
Idle-PC and auto idle-pc for Dynamips.
This commit is contained in:
parent
45a48cfcc1
commit
af700e9bcb
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import base64
|
import base64
|
||||||
|
import asyncio
|
||||||
from ..web.route import Route
|
from ..web.route import Route
|
||||||
from ..schemas.dynamips_vm import VM_CREATE_SCHEMA
|
from ..schemas.dynamips_vm import VM_CREATE_SCHEMA
|
||||||
from ..schemas.dynamips_vm import VM_UPDATE_SCHEMA
|
from ..schemas.dynamips_vm import VM_UPDATE_SCHEMA
|
||||||
@ -366,7 +367,23 @@ class DynamipsVMHandler:
|
|||||||
|
|
||||||
yield from vm.set_idlepc("0x0")
|
yield from vm.set_idlepc("0x0")
|
||||||
idlepcs = yield from vm.get_idle_pc_prop()
|
idlepcs = yield from vm.get_idle_pc_prop()
|
||||||
|
|
||||||
#idlepcs = yield from vm.show_idle_pc_prop()
|
|
||||||
response.set_status(200)
|
response.set_status(200)
|
||||||
response.json({"idlepcs": idlepcs})
|
response.json(idlepcs)
|
||||||
|
|
||||||
|
@Route.get(
|
||||||
|
r"/projects/{project_id}/dynamips/vms/{vm_id}/auto_idlepc",
|
||||||
|
status_codes={
|
||||||
|
200: "Best Idle-pc value found",
|
||||||
|
400: "Invalid request",
|
||||||
|
404: "Instance doesn't exist"
|
||||||
|
},
|
||||||
|
description="Retrieve the idlepc proposals")
|
||||||
|
def get_auto_idlepc(request, response):
|
||||||
|
|
||||||
|
dynamips_manager = Dynamips.instance()
|
||||||
|
vm = dynamips_manager.get_vm(request.match_info["vm_id"],
|
||||||
|
project_id=request.match_info["project_id"])
|
||||||
|
idlepc = yield from dynamips_manager.auto_idlepc(vm)
|
||||||
|
response.set_status(200)
|
||||||
|
response.json({"idlepc": idlepc})
|
||||||
|
|
||||||
|
@ -536,3 +536,53 @@ class Dynamips(BaseManager):
|
|||||||
raise DynamipsError("Could not create config file {}: {}".format(path, e))
|
raise DynamipsError("Could not create config file {}: {}".format(path, e))
|
||||||
|
|
||||||
return os.path.join("configs", os.path.basename(path))
|
return os.path.join("configs", os.path.basename(path))
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def auto_idlepc(self, vm):
|
||||||
|
"""
|
||||||
|
Try to find the best possible idle-pc value.
|
||||||
|
|
||||||
|
:param vm: VM instance
|
||||||
|
"""
|
||||||
|
|
||||||
|
yield from vm.set_idlepc("0x0")
|
||||||
|
was_auto_started = False
|
||||||
|
try:
|
||||||
|
status = yield from vm.get_status()
|
||||||
|
if status != "running":
|
||||||
|
yield from vm.start()
|
||||||
|
was_auto_started = True
|
||||||
|
yield from asyncio.sleep(20) # leave time to the router to boot
|
||||||
|
validated_idlepc = None
|
||||||
|
idlepcs = yield from vm.get_idle_pc_prop()
|
||||||
|
if not idlepcs:
|
||||||
|
raise DynamipsError("No Idle-PC values found")
|
||||||
|
|
||||||
|
for idlepc in idlepcs:
|
||||||
|
yield from vm.set_idlepc(idlepc.split()[0])
|
||||||
|
log.debug("Auto Idle-PC: trying idle-PC value {}".format(vm.idlepc))
|
||||||
|
start_time = time.time()
|
||||||
|
initial_cpu_usage = yield from vm.get_cpu_usage()
|
||||||
|
log.debug("Auto Idle-PC: initial CPU usage is {}%".format(initial_cpu_usage))
|
||||||
|
yield from asyncio.sleep(3) # wait 3 seconds to probe the cpu again
|
||||||
|
elapsed_time = time.time() - start_time
|
||||||
|
cpu_usage = yield from vm.get_cpu_usage()
|
||||||
|
cpu_elapsed_usage = cpu_usage - initial_cpu_usage
|
||||||
|
cpu_usage = abs(cpu_elapsed_usage * 100.0 / elapsed_time)
|
||||||
|
if cpu_usage > 100:
|
||||||
|
cpu_usage = 100
|
||||||
|
log.debug("Auto Idle-PC: CPU usage is {}% after {:.2} seconds".format(cpu_usage, elapsed_time))
|
||||||
|
if cpu_usage < 70:
|
||||||
|
validated_idlepc = vm.idlepc
|
||||||
|
log.debug("Auto Idle-PC: idle-PC value {} has been validated".format(validated_idlepc))
|
||||||
|
break
|
||||||
|
|
||||||
|
if validated_idlepc is None:
|
||||||
|
raise DynamipsError("Sorry, no idle-pc value was suitable")
|
||||||
|
|
||||||
|
except DynamipsError:
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
if was_auto_started:
|
||||||
|
yield from vm.stop()
|
||||||
|
return validated_idlepc
|
||||||
|
Loading…
Reference in New Issue
Block a user