Support per-VM migration type selectors

Allow a VM to specify its migration type as a default choice. The valid
options are "default" (i.e. behave as now), "live" which forces a live
migration only, and "shutdown" which forces a shutdown migration only.
The new option is treated as a VM meta option and is set to default if
not found.
This commit is contained in:
2020-10-29 11:31:32 -04:00
parent d2c0d868c4
commit ec0b8acf90
11 changed files with 236 additions and 61 deletions

View File

@ -834,6 +834,9 @@ class API_VM_Root(Resource):
node_autostart:
type: boolean
description: Whether to autostart the VM when its node returns to ready domain state
migration_method:
type: string
description: The preferred migration method (live, shutdown, none)
description:
type: string
description: The description of the VM
@ -1036,6 +1039,7 @@ class API_VM_Root(Resource):
{ 'name': 'node' },
{ 'name': 'selector', 'choices': ('mem', 'vcpus', 'load', 'vms'), 'helptext': "A valid selector must be specified" },
{ 'name': 'autostart' },
{ 'name': 'migration_method', 'choices': ('live', 'shutdown', 'none'), 'helptext': "A valid migration_method must be specified" },
{ 'name': 'xml', 'required': True, 'helptext': "A Libvirt XML document must be specified" },
])
@Authenticator
@ -1077,6 +1081,16 @@ class API_VM_Root(Resource):
type: boolean
required: false
description: Whether to autostart the VM when its node returns to ready domain state
- in: query
name: migration_method
type: string
required: false
description: The preferred migration method (live, shutdown, none)
default: none
enum:
- live
- shutdown
- none
responses:
200:
description: OK
@ -1094,7 +1108,8 @@ class API_VM_Root(Resource):
reqargs.get('node', None),
reqargs.get('limit', None),
reqargs.get('selector', 'mem'),
bool(strtobool(reqargs.get('autostart', 'false')))
bool(strtobool(reqargs.get('autostart', 'false'))),
reqargs.get('migration_method', 'none')
)
api.add_resource(API_VM_Root, '/vm')
@ -1125,6 +1140,7 @@ class API_VM_Element(Resource):
{ 'name': 'node' },
{ 'name': 'selector', 'choices': ('mem', 'vcpus', 'load', 'vms'), 'helptext': "A valid selector must be specified" },
{ 'name': 'autostart' },
{ 'name': 'migration_method', 'choices': ('live', 'shutdown', 'none'), 'helptext': "A valid migration_method must be specified" },
{ 'name': 'xml', 'required': True, 'helptext': "A Libvirt XML document must be specified" },
])
@Authenticator
@ -1168,6 +1184,16 @@ class API_VM_Element(Resource):
type: boolean
required: false
description: Whether to autostart the VM when its node returns to ready domain state
- in: query
name: migration_method
type: string
required: false
description: The preferred migration method (live, shutdown, none)
default: none
enum:
- live
- shutdown
- none
responses:
200:
description: OK
@ -1185,7 +1211,8 @@ class API_VM_Element(Resource):
reqargs.get('node', None),
reqargs.get('limit', None),
reqargs.get('selector', 'mem'),
bool(strtobool(reqargs.get('autostart', 'false')))
bool(strtobool(reqargs.get('autostart', 'false'))),
reqargs.get('migration_method', 'none')
)
@RequestParser([
@ -1296,6 +1323,9 @@ class API_VM_Metadata(Resource):
node_autostart:
type: string
description: Whether to autostart the VM when its node returns to ready domain state
migration_method:
type: string
description: The preferred migration method (live, shutdown, none)
404:
description: Not found
schema:
@ -1309,6 +1339,7 @@ class API_VM_Metadata(Resource):
{ 'name': 'selector', 'choices': ('mem', 'vcpus', 'load', 'vms'), 'helptext': "A valid selector must be specified" },
{ 'name': 'autostart' },
{ 'name': 'profile' },
{ 'name': 'migration_method', 'choices': ('live', 'shutdown', 'none'), 'helptext': "A valid migration_method must be specified" },
])
@Authenticator
def post(self, vm, reqargs):
@ -1343,6 +1374,16 @@ class API_VM_Metadata(Resource):
type: string
required: false
description: The PVC provisioner profile for the VM
- in: query
name: migration_method
type: string
required: false
description: The preferred migration method (live, shutdown, none)
default: none
enum:
- live
- shutdown
- none
responses:
200:
description: OK
@ -1360,7 +1401,8 @@ class API_VM_Metadata(Resource):
reqargs.get('limit', None),
reqargs.get('selector', None),
reqargs.get('autostart', None),
reqargs.get('profile', None)
reqargs.get('profile', None),
reqargs.get('migration_method', None)
)
api.add_resource(API_VM_Metadata, '/vm/<vm>/meta')
@ -4057,6 +4099,9 @@ class API_Provisioner_Template_System_Root(Resource):
node_autostart:
type: boolean
description: Whether to start VM with node ready state (one-time)
migration_method:
type: string
description: The preferred migration method (live, shutdown, none)
parameters:
- in: query
name: limit
@ -4084,7 +4129,8 @@ class API_Provisioner_Template_System_Root(Resource):
{ 'name': 'vnc_bind' },
{ 'name': 'node_limit' },
{ 'name': 'node_selector' },
{ 'name': 'node_autostart' }
{ 'name': 'node_autostart' },
{ 'name': 'migration_method' }
])
@Authenticator
def post(self, reqargs):
@ -4139,6 +4185,11 @@ class API_Provisioner_Template_System_Root(Resource):
type: boolean
required: false
description: Whether to start VM with node ready state (one-time)
- in: query
name: migration_method
type: string
required: false
description: The preferred migration method (live, shutdown, none)
responses:
200:
description: OK
@ -4185,7 +4236,8 @@ class API_Provisioner_Template_System_Root(Resource):
vnc_bind,
reqargs.get('node_limit', None),
reqargs.get('node_selector', None),
node_autostart
node_autostart,
reqargs.get('migration_method', None),
)
api.add_resource(API_Provisioner_Template_System_Root, '/provisioner/template/system')
@ -4222,7 +4274,8 @@ class API_Provisioner_Template_System_Element(Resource):
{ 'name': 'vnc_bind' },
{ 'name': 'node_limit' },
{ 'name': 'node_selector' },
{ 'name': 'node_autostart' }
{ 'name': 'node_autostart' },
{ 'name': 'migration_method' }
])
@Authenticator
def post(self, template, reqargs):
@ -4272,6 +4325,11 @@ class API_Provisioner_Template_System_Element(Resource):
type: boolean
required: false
description: Whether to start VM with node ready state (one-time)
- in: query
name: migration_method
type: string
required: false
description: The preferred migration method (live, shutdown, none)
responses:
200:
description: OK
@ -4318,7 +4376,8 @@ class API_Provisioner_Template_System_Element(Resource):
vnc_bind,
reqargs.get('node_limit', None),
reqargs.get('node_selector', None),
node_autostart
node_autostart,
reqargs.get('migration_method', None),
)
@RequestParser([
@ -4329,7 +4388,8 @@ class API_Provisioner_Template_System_Element(Resource):
{ 'name': 'vnc_bind' },
{ 'name': 'node_limit' },
{ 'name': 'node_selector' },
{ 'name': 'node_autostart' }
{ 'name': 'node_autostart' },
{ 'name': 'migration_method' }
])
@Authenticator
def put(self, template, reqargs):
@ -4371,6 +4431,10 @@ class API_Provisioner_Template_System_Element(Resource):
name: node_autostart
type: boolean
description: Whether to start VM with node ready state (one-time)
- in: query
name: migration_method
type: string
description: The preferred migration method (live, shutdown, none)
responses:
200:
description: OK
@ -4392,7 +4456,8 @@ class API_Provisioner_Template_System_Element(Resource):
reqargs.get('vnc_bind'),
reqargs.get('node_limit', None),
reqargs.get('node_selector', None),
reqargs.get('node_autostart', None)
reqargs.get('node_autostart', None),
reqargs.get('migration_method', None)
)
@Authenticator