99 lines
4.5 KiB
Python
99 lines
4.5 KiB
Python
# Copyright (c) 2016 Cloudbase Solutions Srl
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""A Hyper-V Cluster Nova Compute driver."""
|
|
|
|
from compute_hyperv.nova.cluster import clusterops
|
|
from compute_hyperv.nova.cluster import livemigrationops
|
|
from compute_hyperv.nova.cluster import volumeops
|
|
from compute_hyperv.nova import driver
|
|
|
|
|
|
class HyperVClusterDriver(driver.HyperVDriver):
|
|
def __init__(self, virtapi):
|
|
super(HyperVClusterDriver, self).__init__(virtapi)
|
|
|
|
self._clops = clusterops.ClusterOps()
|
|
self._livemigrationops = livemigrationops.ClusterLiveMigrationOps()
|
|
self._volumeops = volumeops.ClusterVolumeOps()
|
|
|
|
self._clops.start_failover_listener_daemon()
|
|
self._clops.reclaim_failovered_instances()
|
|
|
|
def _set_event_handler_callbacks(self):
|
|
super(HyperVClusterDriver, self)._set_event_handler_callbacks()
|
|
|
|
self._event_handler.add_callback(
|
|
self._clops.instance_state_change_callback)
|
|
|
|
def spawn(self, context, instance, image_meta, injected_files,
|
|
admin_password, allocations, network_info=None,
|
|
block_device_info=None):
|
|
super(HyperVClusterDriver, self).spawn(
|
|
context, instance, image_meta, injected_files, admin_password,
|
|
allocations, network_info, block_device_info)
|
|
self._clops.add_to_cluster(instance)
|
|
|
|
def destroy(self, context, instance, network_info, block_device_info=None,
|
|
destroy_disks=True):
|
|
self._clops.remove_from_cluster(instance)
|
|
super(HyperVClusterDriver, self).destroy(
|
|
context, instance, network_info, block_device_info,
|
|
destroy_disks)
|
|
|
|
def migrate_disk_and_power_off(self, context, instance, dest,
|
|
flavor, network_info,
|
|
block_device_info=None,
|
|
timeout=0, retry_interval=0):
|
|
self._clops.remove_from_cluster(instance)
|
|
return super(HyperVClusterDriver, self).migrate_disk_and_power_off(
|
|
context, instance, dest, flavor, network_info,
|
|
block_device_info, timeout, retry_interval)
|
|
|
|
def finish_migration(self, context, migration, instance, disk_info,
|
|
network_info, image_meta, resize_instance,
|
|
block_device_info=None, power_on=True):
|
|
super(HyperVClusterDriver, self).finish_migration(
|
|
context, migration, instance, disk_info, network_info,
|
|
image_meta, resize_instance, block_device_info, power_on)
|
|
self._clops.add_to_cluster(instance)
|
|
|
|
def finish_revert_migration(self, context, instance, network_info,
|
|
block_device_info=None, power_on=True):
|
|
super(HyperVClusterDriver, self).finish_revert_migration(
|
|
context, instance, network_info, block_device_info, power_on)
|
|
self._clops.add_to_cluster(instance)
|
|
|
|
def rollback_live_migration_at_destination(self, context, instance,
|
|
network_info,
|
|
block_device_info,
|
|
destroy_disks=True,
|
|
migrate_data=None):
|
|
if self._livemigrationops.is_instance_clustered(instance.name):
|
|
self.unplug_vifs(instance, network_info)
|
|
else:
|
|
super(HyperVClusterDriver,
|
|
self).rollback_live_migration_at_destination(
|
|
context, instance, network_info, block_device_info,
|
|
destroy_disks, migrate_data)
|
|
|
|
def post_live_migration_at_destination(self, context, instance,
|
|
network_info,
|
|
block_migration=False,
|
|
block_device_info=None):
|
|
self._clops.post_migration(instance)
|
|
super(HyperVClusterDriver, self).post_live_migration_at_destination(
|
|
context, instance, network_info,
|
|
block_migration, block_device_info)
|