compute-hyperv/compute_hyperv/nova/cluster/driver.py

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)