class ProxMoxSchedulersTest(TestCase): def setUp(self): Resource.objects.all().delete() self.cloud = CmdbCloudConfig() def test_ratingbased(self): s1 = Server.objects.create(name='CN1', rating=15, role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s2 = Server.objects.create(name='CN2', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_LOCKED) s3 = Server.objects.create(name='CN3', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s4 = Server.objects.create(name='CN4', rating=10, role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s5 = Server.objects.create(name='Some server', status=Resource.STATUS_INUSE) s6 = Server.objects.create(name='CN6', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_OPENVZ, status=Resource.STATUS_INUSE) hvisors = self.cloud.get_hypervisors(hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM) self.assertEqual(3, len(hvisors)) scheduler = RatingBasedScheduler() node = scheduler.get_best_node(hvisors) self.assertEqual(s1.id, node.id) def test_roundrobin(self): s1 = Server.objects.create(name='CN1', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s2 = Server.objects.create(name='CN2', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_LOCKED) s3 = Server.objects.create(name='CN3', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s4 = Server.objects.create(name='CN4', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s5 = Server.objects.create(name='Some server', status=Resource.STATUS_INUSE) s6 = Server.objects.create(name='CN6', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_OPENVZ, status=Resource.STATUS_INUSE) hvisors = self.cloud.get_hypervisors(hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM) self.assertEqual(3, len(hvisors)) scheduler = RoundRobinScheduler() scheduler.reset() node = scheduler.get_best_node(hvisors) self.assertEqual(s1.id, node.id) node = scheduler.get_best_node(hvisors) self.assertEqual(s3.id, node.id) node = scheduler.get_best_node(hvisors) self.assertEqual(s4.id, node.id) node = scheduler.get_best_node(hvisors) self.assertEqual(s1.id, node.id)
class Command(BaseCommand): registered_handlers = {} def __init__(self, stdout=None, stderr=None, no_color=False): super(Command, self).__init__(stdout, stderr, no_color) self.cloud = CmdbCloudConfig() self.task_tracker = self.cloud.task_tracker self.backend = ProxMoxJBONServiceBackend(self.cloud) def add_arguments(self, parser): """ Add custom arguments and subcommands """ subparsers = parser.add_subparsers(title="Cloud management commands", help="Commands help", dest='manager_name', parser_class=ArgumentParser) # Tasks tracker_cmd_parser = subparsers.add_parser('tracker', help='Manage task trackers.') tracker_cmd_parser.add_argument('--new', action="store_true", help="Show submitted tasks.") tracker_cmd_parser.add_argument('--failed', action="store_true", help="Show failed tasks.") tracker_cmd_parser.add_argument('--success', action="store_true", help="Show success tasks.") tracker_cmd_parser.add_argument('--progress', action="store_true", help="Show running tasks.") tracker_cmd_parser.add_argument('--limit', type=int, default=10, help="Limit the output.") tracker_cmd_parser.add_argument('--attach', type=int, metavar='TRACKER-ID', help="Attach to the task console.") tracker_cmd_parser.add_argument('--cancel', type=int, metavar='TRACKER-ID', help="Cancel task.") self.register_handler('tracker', self._handle_trackers) # Cloud Services vps_cmd_parser = subparsers.add_parser('vps', help='Manage VPS services.') vps_cmd_parser.add_argument('--create', action="store_true", help="Create VPS server.") vps_cmd_parser.add_argument('--start', action="store_true", help="Start VPS server.") vps_cmd_parser.add_argument('--stop', action="store_true", help="Stop VPS server.") vps_cmd_parser.add_argument('--driver', default='kvm', help="Hypervisor driver, used to manage VPS (must be supported by backend).") vps_cmd_parser.add_argument('--template', help="VPS template.", default='centos.6.64bit') vps_cmd_parser.add_argument('--node', type=int, default=0, help="CMDB node ID. Scheduling is used if not specified.") vps_cmd_parser.add_argument('--vmid', type=int, help="Set ID of the VM..", required=True) vps_cmd_parser.add_argument('--user', help="Specify user name for the VM.") vps_cmd_parser.add_argument('--ip', help="Specify IP address for the VM.") vps_cmd_parser.add_argument('--ram', type=int, help="Set RAM amount (Mb).", default=512) vps_cmd_parser.add_argument('--hdd', type=int, help="Set HDD amount (Gb).", default=5) vps_cmd_parser.add_argument('--cpu', type=int, help="Number of vCPU cores.", default=1) self.register_handler('vps', self._handle_vps) hv_cmd_parser = subparsers.add_parser('hypervisors', help='Manage hypervisors.') hv_cmd_parser.add_argument('--list', action="store_true", help="List known hypervisors.") self.register_handler('hypervisors', self._handle_hypervisors) def _handle_hypervisors(self, *args, **options): if options['list']: table = PrettyTable(['node', 'group', 'label', 'hypervisor_driver', 'rating', 'agentd_heartbeat']) table.padding_width = 1 table.sortby = 'rating' for hypervisor in self.cloud.get_hypervisors(): hyper_driver = hypervisor.get_option_value('hypervisor_driver', default=None) if hyper_driver: current_time_stamp = int(time.time()) agentd_heartbeat = hypervisor.get_option_value('agentd_heartbeat', default=0) agentd_heartbeat_value = agentd_heartbeat if (current_time_stamp - int( agentd_heartbeat)) < 90 else "%s (!)" % agentd_heartbeat table.add_row([hypervisor.id, hypervisor.get_option_value('group'), hypervisor.get_option_value('label'), hypervisor.get_option_value('hypervisor_driver'), hypervisor.get_option_value('rating', default=0), agentd_heartbeat_value, ]) logger.info(table.get_string(reversesort=True)) def _handle_vps(self, *args, **options): tracker = None vmid = int(options['vmid']) user_name = options['user'] node_id = int(options['node']) if options['create']: ram = int(options['ram']) hdd = int(options['hdd']) cpu = int(options['cpu']) template = options['template'] ip_addr = options['ip'] tracker = self.backend.create_vps( node=node_id, vmid=vmid, template=template, user=user_name, ram=ram, hdd=hdd, cpu=cpu, ip=ip_addr) elif options['stop']: hyper_driver = options['driver'] tracker = self.backend.stop_vps( node=node_id, vmid=vmid, user=user_name, driver=hyper_driver) elif options['start']: hyper_driver = options['driver'] tracker = self.backend.start_vps( node=node_id, vmid=vmid, user=user_name, driver=hyper_driver) if tracker: logger.info("Attached to the task tracker %s. Ctrl-C to exit." % tracker.id) try: result_data = tracker.wait() logger.info(result_data) except Exception, ex: logger.error(ex.message)
class ProxMoxSchedulersTest(TestCase): def setUp(self): Resource.objects.all().delete() self.cloud = CmdbCloudConfig() def test_ratingbased(self): s1 = Server.objects.create( name='CN1', rating=15, role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s2 = Server.objects.create( name='CN2', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_LOCKED) s3 = Server.objects.create( name='CN3', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s4 = Server.objects.create( name='CN4', rating=10, role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s5 = Server.objects.create(name='Some server', status=Resource.STATUS_INUSE) s6 = Server.objects.create( name='CN6', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_OPENVZ, status=Resource.STATUS_INUSE) hvisors = self.cloud.get_hypervisors( hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM) self.assertEqual(3, len(hvisors)) scheduler = RatingBasedScheduler() node = scheduler.get_best_node(hvisors) self.assertEqual(s1.id, node.id) def test_roundrobin(self): s1 = Server.objects.create( name='CN1', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s2 = Server.objects.create( name='CN2', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_LOCKED) s3 = Server.objects.create( name='CN3', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s4 = Server.objects.create( name='CN4', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM, status=Resource.STATUS_INUSE) s5 = Server.objects.create(name='Some server', status=Resource.STATUS_INUSE) s6 = Server.objects.create( name='CN6', role='hypervisor', hypervisor_driver=CmdbCloudConfig.TECH_HV_OPENVZ, status=Resource.STATUS_INUSE) hvisors = self.cloud.get_hypervisors( hypervisor_driver=CmdbCloudConfig.TECH_HV_KVM) self.assertEqual(3, len(hvisors)) scheduler = RoundRobinScheduler() scheduler.reset() node = scheduler.get_best_node(hvisors) self.assertEqual(s1.id, node.id) node = scheduler.get_best_node(hvisors) self.assertEqual(s3.id, node.id) node = scheduler.get_best_node(hvisors) self.assertEqual(s4.id, node.id) node = scheduler.get_best_node(hvisors) self.assertEqual(s1.id, node.id)
class Command(BaseCommand): registered_handlers = {} def __init__(self, stdout=None, stderr=None, no_color=False): super(Command, self).__init__(stdout, stderr, no_color) self.cloud = CmdbCloudConfig() self.task_tracker = self.cloud.task_tracker self.backend = ProxMoxJBONServiceBackend(self.cloud) def add_arguments(self, parser): """ Add custom arguments and subcommands """ subparsers = parser.add_subparsers(title="Cloud management commands", help="Commands help", dest='manager_name', parser_class=ArgumentParser) # Tasks tracker_cmd_parser = subparsers.add_parser( 'tracker', help='Manage task trackers.') tracker_cmd_parser.add_argument('--new', action="store_true", help="Show submitted tasks.") tracker_cmd_parser.add_argument('--failed', action="store_true", help="Show failed tasks.") tracker_cmd_parser.add_argument('--success', action="store_true", help="Show success tasks.") tracker_cmd_parser.add_argument('--progress', action="store_true", help="Show running tasks.") tracker_cmd_parser.add_argument('--limit', type=int, default=10, help="Limit the output.") tracker_cmd_parser.add_argument('--attach', type=int, metavar='TRACKER-ID', help="Attach to the task console.") tracker_cmd_parser.add_argument('--cancel', type=int, metavar='TRACKER-ID', help="Cancel task.") self.register_handler('tracker', self._handle_trackers) # Cloud Services vps_cmd_parser = subparsers.add_parser('vps', help='Manage VPS services.') vps_cmd_parser.add_argument('--create', action="store_true", help="Create VPS server.") vps_cmd_parser.add_argument('--start', action="store_true", help="Start VPS server.") vps_cmd_parser.add_argument('--stop', action="store_true", help="Stop VPS server.") vps_cmd_parser.add_argument( '--driver', default='kvm', help= "Hypervisor driver, used to manage VPS (must be supported by backend)." ) vps_cmd_parser.add_argument('--template', help="VPS template.", default='centos.6.64bit') vps_cmd_parser.add_argument( '--node', type=int, default=0, help="CMDB node ID. Scheduling is used if not specified.") vps_cmd_parser.add_argument('--vmid', type=int, help="Set ID of the VM..", required=True) vps_cmd_parser.add_argument('--user', help="Specify user name for the VM.") vps_cmd_parser.add_argument('--ip', help="Specify IP address for the VM.") vps_cmd_parser.add_argument('--ram', type=int, help="Set RAM amount (Mb).", default=512) vps_cmd_parser.add_argument('--hdd', type=int, help="Set HDD amount (Gb).", default=5) vps_cmd_parser.add_argument('--cpu', type=int, help="Number of vCPU cores.", default=1) self.register_handler('vps', self._handle_vps) hv_cmd_parser = subparsers.add_parser('hypervisors', help='Manage hypervisors.') hv_cmd_parser.add_argument('--list', action="store_true", help="List known hypervisors.") self.register_handler('hypervisors', self._handle_hypervisors) def _handle_hypervisors(self, *args, **options): if options['list']: table = PrettyTable([ 'node', 'group', 'label', 'hypervisor_driver', 'rating', 'agentd_heartbeat' ]) table.padding_width = 1 table.sortby = 'rating' for hypervisor in self.cloud.get_hypervisors(): hyper_driver = hypervisor.get_option_value('hypervisor_driver', default=None) if hyper_driver: current_time_stamp = int(time.time()) agentd_heartbeat = hypervisor.get_option_value( 'agentd_heartbeat', default=0) agentd_heartbeat_value = agentd_heartbeat if ( current_time_stamp - int(agentd_heartbeat) ) < 90 else "%s (!)" % agentd_heartbeat table.add_row([ hypervisor.id, hypervisor.get_option_value('group'), hypervisor.get_option_value('label'), hypervisor.get_option_value('hypervisor_driver'), hypervisor.get_option_value('rating', default=0), agentd_heartbeat_value, ]) logger.info(table.get_string(reversesort=True)) def _handle_vps(self, *args, **options): tracker = None vmid = int(options['vmid']) user_name = options['user'] node_id = int(options['node']) if options['create']: ram = int(options['ram']) hdd = int(options['hdd']) cpu = int(options['cpu']) template = options['template'] ip_addr = options['ip'] tracker = self.backend.create_vps(node=node_id, vmid=vmid, template=template, user=user_name, ram=ram, hdd=hdd, cpu=cpu, ip=ip_addr) elif options['stop']: hyper_driver = options['driver'] tracker = self.backend.stop_vps(node=node_id, vmid=vmid, user=user_name, driver=hyper_driver) elif options['start']: hyper_driver = options['driver'] tracker = self.backend.start_vps(node=node_id, vmid=vmid, user=user_name, driver=hyper_driver) if tracker: logger.info("Attached to the task tracker %s. Ctrl-C to exit." % tracker.id) try: result_data = tracker.wait() logger.info(result_data) except Exception, ex: logger.error(ex.message)