summaryrefslogtreecommitdiff
path: root/trove/taskmanager/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'trove/taskmanager/models.py')
-rw-r--r--trove/taskmanager/models.py65
1 files changed, 63 insertions, 2 deletions
diff --git a/trove/taskmanager/models.py b/trove/taskmanager/models.py
index c786badd..6d2fee93 100644
--- a/trove/taskmanager/models.py
+++ b/trove/taskmanager/models.py
@@ -17,6 +17,9 @@ import os.path
from cinderclient import exceptions as cinder_exceptions
from eventlet import greenthread
from novaclient import exceptions as nova_exceptions
+from novaclient import base
+from novaclient.v1_1 import servers
+from novaclient.v1_1 import volumes
from trove.common import cfg
from trove.common import template
from trove.common import utils
@@ -26,12 +29,15 @@ from trove.common.exception import PollTimeOut
from trove.common.exception import VolumeCreationFailure
from trove.common.exception import TroveError
from trove.common.remote import create_dns_client
+from trove.common.remote import create_nova_client
+from trove.common.remote import create_heat_client
from trove.common.remote import create_cinder_client
from swiftclient.client import ClientException
from trove.common.utils import poll_until
from trove.instance import models as inst_models
from trove.instance.models import BuiltInstance
from trove.instance.models import FreshInstance
+
from trove.instance.models import InstanceStatus
from trove.instance.models import InstanceServiceStatus
from trove.instance.models import ServiceStatuses
@@ -49,10 +55,12 @@ VOLUME_TIME_OUT = CONF.volume_time_out # seconds.
DNS_TIME_OUT = CONF.dns_time_out # seconds.
RESIZE_TIME_OUT = CONF.resize_time_out # seconds.
REVERT_TIME_OUT = CONF.revert_time_out # seconds.
+HEAT_TIME_OUT = CONF.heat_time_out # seconds.
USAGE_SLEEP_TIME = CONF.usage_sleep_time # seconds.
USAGE_TIMEOUT = CONF.usage_timeout # seconds.
use_nova_server_volume = CONF.use_nova_server_volume
+use_heat = CONF.use_heat
class NotifyMixin(object):
@@ -128,7 +136,14 @@ class FreshInstanceTasks(FreshInstance, NotifyMixin, ConfigurationMixin):
def create_instance(self, flavor, image_id, databases, users,
service_type, volume_size, security_groups,
backup_id):
- if use_nova_server_volume:
+ if use_heat:
+ server, volume_info = self._create_server_volume_heat(
+ flavor,
+ image_id,
+ security_groups,
+ service_type,
+ volume_size)
+ elif use_nova_server_volume:
server, volume_info = self._create_server_volume(
flavor['id'],
image_id,
@@ -142,6 +157,7 @@ class FreshInstanceTasks(FreshInstance, NotifyMixin, ConfigurationMixin):
security_groups,
service_type,
volume_size)
+
try:
self._create_dns_entry()
except Exception as e:
@@ -237,6 +253,42 @@ class FreshInstanceTasks(FreshInstance, NotifyMixin, ConfigurationMixin):
return server, volume_info
+ def _create_server_volume_heat(self, flavor, image_id,
+ security_groups, service_type,
+ volume_size):
+ client = create_heat_client(self.context)
+ novaclient = create_nova_client(self.context)
+ cinderclient = create_cinder_client(self.context)
+ heat_template = template.HeatTemplate().template()
+ parameters = {"KeyName": "heatkey",
+ "Flavor": flavor["name"],
+ "VolumeSize": volume_size,
+ "ServiceType": "mysql",
+ "InstanceId": self.id}
+ stack_name = 'trove-%s' % self.id
+ stack = client.stacks.create(stack_name=stack_name,
+ template=heat_template,
+ parameters=parameters)
+ stack = client.stacks.get(stack_name)
+
+ utils.poll_until(
+ lambda: client.stacks.get(stack_name),
+ lambda stack: stack.stack_status in ['CREATE_COMPLETE',
+ 'CREATE_FAILED'],
+ sleep_time=2,
+ time_out=HEAT_TIME_OUT)
+
+ resource = client.resources.get(stack.id, 'BaseInstance')
+ server = novaclient.servers.get(resource.physical_resource_id)
+
+ resource = client.resources.get(stack.id, 'DataVolume')
+ volume = cinderclient.volumes.get(resource.physical_resource_id)
+ volume_info = self._build_volume(volume)
+
+ self.update_db(compute_instance_id=server.id, volume_id=volume.id)
+
+ return server, volume_info
+
def _create_server_volume_individually(self, flavor_id, image_id,
security_groups, service_type,
volume_size):
@@ -305,6 +357,9 @@ class FreshInstanceTasks(FreshInstance, NotifyMixin, ConfigurationMixin):
v_ref = volume_client.volumes.get(volume_ref.id)
if v_ref.status in ['error']:
raise VolumeCreationFailure()
+ return self._build_volume(v_ref)
+
+ def _build_volume(self, v_ref):
LOG.debug(_("Created volume %s") % v_ref)
# The mapping is in the format:
# <id>:[<type>]:[<size(GB)>]:[<delete_on_terminate>]
@@ -417,7 +472,13 @@ class BuiltInstanceTasks(BuiltInstance, NotifyMixin, ConfigurationMixin):
server_id = self.db_info.compute_instance_id
old_server = self.nova_client.servers.get(server_id)
try:
- self.server.delete()
+ if use_heat:
+ # Delete the server via heat
+ heatclient = create_heat_client(self.context)
+ name = 'trove-%s' % self.id
+ heatclient.stacks.delete(name)
+ else:
+ self.server.delete()
except Exception as ex:
LOG.error("Error during delete compute server %s "
% self.server.id)