class MsoKeystoneUtils extends MsoTenantUtils {

    public boolean deleteTenant(String tenantId, String cloudSiteId) throws MsoException {
        // Obtain the cloud site information where we will query the tenant
        CloudSite cloudSite =
                cloudConfig.getCloudSite(cloudSiteId).orElseThrow(() -> new MsoCloudSiteNotFound(cloudSiteId));
        Keystone keystoneAdminClient = getKeystoneAdminClient(cloudSite);

        try {
            // Check that the tenant exists. Also, need the ID to delete
            Tenant tenant = findTenantById(keystoneAdminClient, tenantId);
            if (tenant == null) {
                logger.error("{} Tenant id {} not found on cloud site id {}, {}", MessageEnum.RA_TENANT_NOT_FOUND,
                        tenantId, cloudSiteId, ErrorCode.DataError.getValue());
                return false;
            }

            OpenStackRequest<Void> request = keystoneAdminClient.tenants().delete(tenant.getId());
            executeAndRecordOpenstackRequest(request);
            logger.debug("Deleted Tenant {} ({})", tenant.getId(), tenant.getName());
        } catch (OpenStackBaseException e) {
            // Convert Keystone OpenStackResponseException to MsoOpenstackException
            throw keystoneErrorToMsoException(e, DELETE_TENANT);
        } catch (RuntimeException e) {
            // Catch-all
            throw runtimeExceptionToMsoException(e, DELETE_TENANT);
        }

        return true;
    }

}