def test_create_with_catalog_all_opts(self): cfg.CONF.set_override('heat_service_type', 'orchestrationv3') cfg.CONF.set_override('os_region_name', 'RegionTwo') client = remote.create_heat_client( TroveContext(service_catalog=self.service_catalog)) self.assertEqual(self.heatv3_public_url_region_two, client.http_client.endpoint)
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 test_create_with_conf_override_trailing_slash(self): heat_url_from_conf = 'http://example.com/' tenant_from_ctx = 'abc' cfg.CONF.set_override('heat_url', heat_url_from_conf) client = remote.create_heat_client( TroveContext(tenant=tenant_from_ctx)) self.assertEqual('%s%s' % (heat_url_from_conf, tenant_from_ctx), client.http_client.endpoint)
def test_create_with_conf_override(self): heat_url_from_conf = 'http://example.com' tenant_from_ctx = uuid.uuid4().hex cfg.CONF.set_override('heat_url', heat_url_from_conf) client = remote.create_heat_client( TroveContext(tenant=tenant_from_ctx)) self.assertEqual('%s/%s' % (heat_url_from_conf, tenant_from_ctx), client.http_client.endpoint)
def _delete_resources(self, deleted_at): LOG.debug(_("begin _delete_resources for id: %s") % self.id) server_id = self.db_info.compute_instance_id old_server = self.nova_client.servers.get(server_id) try: 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.exception( _("Error during delete compute server %s") % self.server.id) try: dns_support = CONF.trove_dns_support LOG.debug(_("trove dns support = %s") % dns_support) if dns_support: dns_api = create_dns_client(self.context) dns_api.delete_instance_entry(instance_id=self.db_info.id) except Exception as ex: LOG.exception( _("Error during dns entry of instance %(id)s: %(ex)") % { 'id': self.db_info.id, 'ex': ex }) # Poll until the server is gone. def server_is_finished(): try: server = self.nova_client.servers.get(server_id) if server.status not in ['SHUTDOWN', 'ACTIVE']: LOG.error( _("Server %(server_id)s got into ERROR status " "during delete of instance %(instance_id)s!") % { 'server_id': server.id, 'instance_id': self.id }) return False except nova_exceptions.NotFound: return True try: utils.poll_until(server_is_finished, sleep_time=2, time_out=CONF.server_delete_time_out) except PollTimeOut: LOG.exception( _("Timout during nova server delete of server: %s") % server_id) self.send_usage_event('delete', deleted_at=timeutils.isotime(deleted_at), server=old_server) LOG.debug(_("end _delete_resources for id: %s") % self.id)
def _create_server_volume_heat(self, flavor, image_id, datastore_manager, volume_size, availability_zone): LOG.debug(_("begin _create_server_volume_heat for id: %s") % self.id) client = create_heat_client(self.context) novaclient = create_nova_client(self.context) template_obj = template.load_heat_template(datastore_manager) heat_template_unicode = template_obj.render() try: heat_template = heat_template_unicode.encode('ascii') except UnicodeEncodeError: LOG.error(_("heat template ascii encode issue")) raise TroveError("heat template ascii encode issue") parameters = {"Flavor": flavor["name"], "VolumeSize": volume_size, "InstanceId": self.id, "ImageId": image_id, "DatastoreManager": datastore_manager, "AvailabilityZone": availability_zone} stack_name = 'trove-%s' % self.id 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) if CONF.trove_volume_support: cinderclient = create_cinder_client(self.context) 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) else: volume_info = self._build_volume_info(volume_size) self.update_db(compute_instance_id=server.id) LOG.debug(_("end _create_server_volume_heat for id: %s") % self.id) return server, volume_info
def _delete_resources(self, deleted_at): LOG.debug(_("begin _delete_resources for id: %s") % self.id) server_id = self.db_info.compute_instance_id old_server = self.nova_client.servers.get(server_id) try: 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.exception(_("Error during delete compute server %s") % self.server.id) try: dns_support = CONF.trove_dns_support LOG.debug(_("trove dns support = %s") % dns_support) if dns_support: dns_api = create_dns_client(self.context) dns_api.delete_instance_entry(instance_id=self.db_info.id) except Exception as ex: LOG.exception(_("Error during dns entry of instance %(id)s: %(ex)") % {'id': self.db_info.id, 'ex': ex}) # Poll until the server is gone. def server_is_finished(): try: server = self.nova_client.servers.get(server_id) if server.status not in ['SHUTDOWN', 'ACTIVE']: LOG.error(_("Server %(server_id)s got into ERROR status " "during delete of instance %(instance_id)s!") % {'server_id': server.id, 'instance_id': self.id}) return False except nova_exceptions.NotFound: return True try: utils.poll_until(server_is_finished, sleep_time=2, time_out=CONF.server_delete_time_out) except PollTimeOut: LOG.exception(_("Timout during nova server delete of server: %s") % server_id) self.send_usage_event('delete', deleted_at=timeutils.isotime(deleted_at), server=old_server) LOG.debug(_("end _delete_resources for id: %s") % self.id)
def _create_server_volume_heat(self, flavor, image_id, datastore_manager, volume_size, availability_zone): LOG.debug(_("begin _create_server_volume_heat for id: %s") % self.id) client = create_heat_client(self.context) novaclient = create_nova_client(self.context) cinderclient = create_cinder_client(self.context) template_obj = template.load_heat_template(datastore_manager) heat_template_unicode = template_obj.render() try: heat_template = heat_template_unicode.encode('ascii') except UnicodeEncodeError: LOG.error(_("heat template ascii encode issue")) raise TroveError("heat template ascii encode issue") parameters = { "Flavor": flavor["name"], "VolumeSize": volume_size, "InstanceId": self.id, "ImageId": image_id, "DatastoreManager": datastore_manager, "AvailabilityZone": availability_zone } stack_name = 'trove-%s' % self.id 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) LOG.debug(_("end _create_server_volume_heat for id: %s") % self.id) return server, volume_info
def _delete_resources(self, deleted_at): server_id = self.db_info.compute_instance_id old_server = self.nova_client.servers.get(server_id) try: 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) LOG.error(ex) try: dns_support = CONF.trove_dns_support LOG.debug(_("trove dns support = %s") % dns_support) if dns_support: dns_api = create_dns_client(self.context) dns_api.delete_instance_entry(instance_id=self.db_info.id) except Exception as ex: LOG.error("Error during dns entry for instance %s " % self.db_info.id) LOG.error(ex) # Poll until the server is gone. def server_is_finished(): try: server = self.nova_client.servers.get(server_id) if server.status not in ["SHUTDOWN", "ACTIVE"]: msg = "Server %s got into %s status during delete " "of instance %s!" % ( server.id, server.status, self.id, ) LOG.error(msg) return False except nova_exceptions.NotFound: return True try: poll_until(server_is_finished, sleep_time=2, time_out=CONF.server_delete_time_out) except PollTimeOut as e: LOG.error("Timout during nova server delete", e) self.send_usage_event("delete", deleted_at=timeutils.isotime(deleted_at), server=old_server)
def _create_server_volume_heat(self, flavor, image_id, security_groups, service_type, volume_size, availability_zone): 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": service_type, "InstanceId": self.id, "AvailabilityZone": availability_zone } 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 test_create_with_catalog_and_default_service_type(self): client = remote.create_heat_client( TroveContext(service_catalog=self.service_catalog)) self.assertEqual(self.heat_public_url, client.http_client.endpoint)
def _create_server_volume_heat(self, flavor, image_id, datastore_manager, volume_size, availability_zone): LOG.debug(_("begin _create_server_volume_heat for id: %s") % self.id) try: client = create_heat_client(self.context) template_obj = template.load_heat_template(datastore_manager) heat_template_unicode = template_obj.render( volume_support=CONF.trove_volume_support) try: heat_template = heat_template_unicode.encode('utf-8') except UnicodeEncodeError: LOG.error(_("heat template ascii encode issue")) raise TroveError("heat template ascii encode issue") parameters = {"Flavor": flavor["name"], "VolumeSize": volume_size, "InstanceId": self.id, "ImageId": image_id, "DatastoreManager": datastore_manager, "AvailabilityZone": availability_zone, "TenantId": self.tenant_id} stack_name = 'trove-%s' % self.id client.stacks.create(stack_name=stack_name, template=heat_template, parameters=parameters) stack = client.stacks.get(stack_name) try: utils.poll_until( lambda: client.stacks.get(stack_name), lambda stack: stack.stack_status in ['CREATE_COMPLETE', 'CREATE_FAILED'], sleep_time=USAGE_SLEEP_TIME, time_out=HEAT_TIME_OUT) except PollTimeOut: LOG.error(_("Timeout during stack status tracing")) raise TroveError("Timeout occured in tracking stack status") stack = client.stacks.get(stack_name) if ((stack.action, stack.stack_status) not in HEAT_STACK_SUCCESSFUL_STATUSES): raise TroveError("Heat Stack Create Failed.") resource = client.resources.get(stack.id, 'BaseInstance') if resource.state not in HEAT_RESOURCE_SUCCESSFUL_STATES: raise TroveError("Heat Resource Provisioning Failed.") instance_id = resource.physical_resource_id if CONF.trove_volume_support: resource = client.resources.get(stack.id, 'DataVolume') if resource.state not in HEAT_RESOURCE_SUCCESSFUL_STATES: raise TroveError("Heat Resource Provisioning Failed.") volume_id = resource.physical_resource_id self.update_db(compute_instance_id=instance_id, volume_id=volume_id) else: self.update_db(compute_instance_id=instance_id) except (TroveError, heat_exceptions.HTTPNotFound) as e: msg = _("Error during creating stack for instance %s") % self.id LOG.debug(msg) err = inst_models.InstanceTasks.BUILDING_ERROR_SERVER self._log_and_raise(e, msg, err) device_path = CONF.device_path mount_point = CONF.mount_point volume_info = {'device_path': device_path, 'mount_point': mount_point} LOG.debug(_("end _create_server_volume_heat for id: %s") % self.id) return volume_info