{"id":20572166,"url":"https://github.com/mcaimi/openstack-custom-schedulers","last_synced_at":"2025-07-19T16:37:58.343Z","repository":{"id":69446934,"uuid":"170719628","full_name":"mcaimi/openstack-custom-schedulers","owner":"mcaimi","description":"Custom Schedulers for Openstack Components","archived":false,"fork":false,"pushed_at":"2019-02-25T16:04:27.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-16T21:16:02.059Z","etag":null,"topics":["filter","nova","openstack","scheduler"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mcaimi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-14T16:10:40.000Z","updated_at":"2019-05-07T10:42:28.000Z","dependencies_parsed_at":"2023-05-10T17:45:27.513Z","dependency_job_id":null,"html_url":"https://github.com/mcaimi/openstack-custom-schedulers","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcaimi%2Fopenstack-custom-schedulers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcaimi%2Fopenstack-custom-schedulers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcaimi%2Fopenstack-custom-schedulers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcaimi%2Fopenstack-custom-schedulers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mcaimi","download_url":"https://codeload.github.com/mcaimi/openstack-custom-schedulers/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242187809,"owners_count":20086224,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["filter","nova","openstack","scheduler"],"created_at":"2024-11-16T05:18:37.909Z","updated_at":"2025-03-06T10:20:52.024Z","avatar_url":"https://github.com/mcaimi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## CUSTOM OPENSTACK NOVA SCHEDULERS\n\nThese schedulers were developed in our in-house Openstack Environment to meet our custom use cases.\n\n### NOVA Private Iaas \n\nThis filter allows enabled tenants to only deploy on specific compute nodes.\nThese compute nodes are then dedicated to that tenant, so they are removed from the shared compute pool.\n\n#### Prerequisites:\n\n  - Highly Available Openstack Installation (We use the one from RedHat) version Mitaka or higher. Tested until Queens.\n  - Root access on every controller node\n  - Keystone Admin Access\n  - An admin-enabled user on keystone (nova or admin).\n\n#### Install the scheduler filter:\n\nJust copy the scheduler python file in the site-packages library path:\n\n```\nroot@controller-0 neutron-n-0:~# cp private_iaas_filter.py /usr/lib/python2.7/site-packages/nova/scheduler/filters/\n\n```\n\nDo that on every controller node.\n\n#### Modify /etc/nova/nova.conf:\n\n* Enable all scheduler filters for inclusion in the nova scheduler:\n\nfor Openstack Queens use:\n\n```\navailable_filters=nova.scheduler.filters.all_filters\n\nenabled_filters=PrivateIaasFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter\n\n```\n\nfor Openstack Newton or older:\n```\nscheduler_available_filters=nova.scheduler.filters.all_filters\n\nscheduler_default_filters=PrivateIaasFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter\n\n```\n\n* Configure the scheduler options by adding a config stanza in nova.conf:\n\n```\n[....]\n\n[private_iaas_scheduler]\n# keystone version\nkeystone_version=3\n# if keystone is v3, set domains accordingly\nuser_domain_name=\"Default\"\nproject_domain_name=\"Default\"\n# Nova user (must be admin in the project)\nkeystone_username=\"admin\"\nkeystone_password=\"P4ssw0rd\"\n# Endpoint keystone INTERNAL\nkeystone_url=\"http://192.168.1.174:5000\"\n# project in which the user has the admin role\nkeystone_tenant_name=\"admin\"\n# debug logging\ndebug=True\n# Set the default behaviour in case keystone is unreachable\n# TRUE == deploy anyways and let the admin move instances afterwards\n# FALSE == abort the deployment with a \"No host available\" error message\nkeystone_unreachable_defaults_to_true=True\n\n[...]\n\n```\n\n* Restart the nova scheduler service on all controller nodes:\n\n```\n root@controller-0 neutron-n-0:~# pcs resource |grep nova-scheduler\n Clone Set: openstack-nova-scheduler-clone [openstack-nova-scheduler]\n\n root@controller-0 neutron-n-0:~# pcs resource restart openstack-nova-scheduler-clone \n```\n\nCheck the logs for errors.\n\n\n#### Configure a new private project\n\n* Create an host group dedicated to that project:\n\n```\n[root@controller-0 ~(openstack_admin)]# nova aggregate-create private_iaas_test_hg\n+----+----------------------+-------------------+-------+----------+\n| Id | Name                 | Availability Zone | Hosts | Metadata |\n+----+----------------------+-------------------+-------+----------+\n| 1  | private_iaas_test_hg | -                 |       |          |\n+----+----------------------+-------------------+-------+----------+\n```\n\n* Identify the project ID you want to associate with this host group:\n\n```\n[root@controller-0 ~(openstack_admin)]# keystone tenant-list\n+----------------------------------+----------------------+---------+\n|                id                |         name         | enabled |\n+----------------------------------+----------------------+---------+\n| 254ece3166264a8f899ae050db0a4baa |      VPDC_Demo       |   True  |\n| b318bdbc48444f9281778316ebc83c84 |      VPDC_Test       |   True  |\n| 605a0109a00b4be09074d43b9b7fe3dd |   VPDC_test_router   |   True  |\n| ac8e28f8095242beb07e310eb65e2a61 |        admin         |   True  |\n| 010926a1dc6b4c15bf4ec22b52e60939 |      dev_tenant      |   True  |\n| f9dca225654e42a587a84c12dca45032 | reseller01_project01 |   True  |\n| ee16c655c9074ff19e20dc5f9b715f58 | reseller01_project02 |   True  |\n| 49d65df7639a4cf5b2f3c91cf5bc29e9 |       services       |   True  |\n| 31451f4dd8644aa8aabc803da923073d |     test_tenant      |   True  |\n+----------------------------------+----------------------+---------+\n```\n\nfor example, let's use \"dev_tenant\".\n\n* For this project, set an extra_spec named \"private_iaas_project_id\" and assign the project ID as its value:\n\n```\n[root@controller-0 ~(openstack_admin)]# nova aggregate-set-metadata 1 private_iaas_project_id=010926a1dc6b4c15bf4ec22b52e60939\nMetadata has been successfully updated for aggregate 1.\n+----+----------------------+-------------------+-------+------------------------------------------------------------+\n| Id | Name                 | Availability Zone | Hosts | Metadata                                                   |\n+----+----------------------+-------------------+-------+------------------------------------------------------------+\n| 1  | private_iaas_test_hg | -                 |       | 'private_iaas_project_id=010926a1dc6b4c15bf4ec22b52e60939' |\n+----+----------------------+-------------------+-------+------------------------------------------------------------+\n```\n\n* Get the hostnames of all compute nodes that must be part of this host group:\n\n```\n[root@controller-0 ~(openstack_admin)]# nova host-list|grep compute\n| compute01.dev.openstack.lan    | compute     | nova     |\n| compute02.dev.openstack.lan    | compute     | nova     |\n\n```\n\nFor example, let's add \"compute01\" to the private group.\n\n* Add the host to the host group:\n\n```\n[root@compute-0 ~(openstack_admin)]# nova aggregate-add-host 1 compute01.dev.openstack.lan\nHost compute01.dev.openstack.lan has been successfully added for aggregate 1 \n+----+----------------------+-------------------+---------------------------------------+------------------------------------------------------------+\n| Id | Name                 | Availability Zone | Hosts                                 | Metadata                                                   |\n+----+----------------------+-------------------+---------------------------------------+------------------------------------------------------------+\n| 1  | private_iaas_test_hg | -                 | 'compute01.dev.openstack.lan'         | 'private_iaas_project_id=010926a1dc6b4c15bf4ec22b52e60939' |\n+----+----------------------+-------------------+---------------------------------------+------------------------------------------------------------+\n```\n\n* Lastly, mark the project as private in keystone:\n\nYou can add the the following extra_spec with the keystone CLI or with the provided command:\n\n```\n[root@controller-0 ~(openstack_admin_dev)]$ python private_tenant_ctl.py -h\nusage: private_tenant_ctl.py [options] TENANT_ID\n\nTool to enable/disable the private_iaas metadata key in keystone\n\npositional arguments:\n  tenantid\n\noptional arguments:\n  -h, --help     show this help message and exit\n  -e, --enable   Set the private_iaas key to True for specified tenant\n  -d, --disable  Set the private_iaas key to False for specified tenant\n  -l, --list     List tenant IDs.\n\n```\n\nUse the \"-e\" option to set the project as private or the \"-d\" to mark the project as shared.\n\nGet the ID of the project \"dev_tenant\":\n\n```\n[root@controller-0 ~(openstack_admin_dev)]$ python private_tenant_ctl.py -l all|grep dev_tenant\nTenant IDs:\nID: 010926a1dc6b4c15bf4ec22b52e60939   NAME: dev_tenant\n```\n\nSet the extra_spec flag \"private_iaas\" to True:\n\n```\n[root@controller-0 ~(openstack_admin_dev)]$ python private_tenant_ctl.py -e 010926a1dc6b4c15bf4ec22b52e60939\nStarting operation on tenant id -\u003e dev_tenant [010926a1dc6b4c15bf4ec22b52e60939]\nEnabling private_iaas metadata property...\n{\"tenant\": {\"description\": \"development_tenant\", \"extra\": {\"testproperty\": \"test123\", \"private_iaas\": true}, \"testproperty\": \"test123\", \"enabled\": true, \"id\": \"010926a1dc6b4c15bf4ec22b52e60939\", \"private_iaas\": true, \"name\": \"dev_tenant\"}}\n```\n\n### NOVA Hypervisor Type\n\nThis filter allows the operator to isolate tenants to specific hypervisors.\nThis is useful for tenants that need to only deploy on a particular hypervisor technology (be it Qemu, VMware or HyperV)\n\n#### Prerequisites:\n\n  - Highly Available Openstack Installation (We use the one from RedHat) version Mitaka or higher. Tested until Queens.\n  - Root access on every controller node\n  - Keystone Admin Access\n  - An admin-enabled user on keystone (nova or admin).\n\n#### Install the scheduler filter:\n\nJust copy the scheduler python file in the site-packages library path:\n\n```\nroot@controller-0 neutron-n-0:~# cp hypervisor_type_filter.py /usr/lib/python2.7/site-packages/nova/scheduler/filters/\n\n```\n\nDo that on every controller node.\n\n#### Modify /etc/nova/nova.conf:\n\n* Enable all scheduler filters for inclusion in the nova scheduler:\n\nfor Openstack Queens use:\n\n```\navailable_filters=nova.scheduler.filters.all_filters\n\nenabled_filters=HypervisorTypeFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter\n\n```\n\nfor Openstack Newton or older:\n```\nscheduler_available_filters=nova.scheduler.filters.all_filters\n\nscheduler_default_filters=HypervisorTypeFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter\n\n```\n\n* Configure a new stanza in the nova configuration file:\n\n```\n[hypervisor_type_scheduler]\nkeystone_version=3\n# Utenza applicativa admin\nkeystone_username=\"admin\"\nkeystone_password=\"P4ssw0rd\"\n# Endpoint keystone INTERNAL\nkeystone_url=\"http://192.168.1.174:5000\"\n# Tenant \"services\"\nkeystone_tenant_name=\"admin\"\n# attiva log di debug\ndebug=True\n# Set the default behaviour in case keystone is unreachable\n# TRUE == deploy anyways and let the admin move instances afterwards\n# FALSE == abort the deployment with a \"No host available\" error message\nkeystone_unreachable_defaults_to_true=False\nuser_domain_name=\"Default\"\nproject_domain_name=\"Default\"\n\n```\n\n* Restart the nova scheduler service on all controller nodes:\n\n```\n root@controller-0 neutron-n-0:~# pcs resource |grep nova-scheduler\n Clone Set: openstack-nova-scheduler-clone [openstack-nova-scheduler]\n\n root@controller-0 neutron-n-0:~# pcs resource restart openstack-nova-scheduler-clone \n```\n\nCheck the logs for errors.\n\n### Configure the tenant\n\n* Set the 'tenant_type' extra-key in the keystone database:\n\n```\n[root@controller-0 ~(keystone_admin)]# openstack project list\n+----------------------------------+------------+\n| ID                               | Name       |\n+----------------------------------+------------+\n| 0649a21628fd4f098d5217ada6fd4058 | services   |\n| 6650b690c4e046248f879ba4165407ea | dev_tenant |\n| 79cbac1ae9654e028278568beab4368f | test       |\n| d6e5259e4b8c4e72bedc31d4e1e8b265 | admin      |\n+----------------------------------+------------+\n[root@controller-0 ~(keystone_admin)]# openstack project show 6650b690c4e046248f879ba4165407ea\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| description |                                  |\n| domain_id   | default                          |\n| enabled     | True                             |\n| id          | 6650b690c4e046248f879ba4165407ea |\n| is_domain   | False                            |\n| name        | dev_tenant                       |\n| parent_id   | default                          |\n| tags        | []                               |\n+-------------+----------------------------------+\n[root@controller-0 ~(keystone_admin)]# openstack project set 6650b690c4e046248f879ba4165407ea --property tenant_type=QEMU\n[root@controller-0 ~(keystone_admin)]# openstack project show 6650b690c4e046248f879ba4165407ea\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| description |                                  |\n| domain_id   | default                          |\n| enabled     | True                             |\n| id          | 6650b690c4e046248f879ba4165407ea |\n| is_domain   | False                            |\n| name        | dev_tenant                       |\n| parent_id   | default                          |\n| tags        | []                               |\n| tenant_type | QEMU                             |\n+-------------+----------------------------------+\n\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcaimi%2Fopenstack-custom-schedulers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmcaimi%2Fopenstack-custom-schedulers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcaimi%2Fopenstack-custom-schedulers/lists"}