class MsoKeystoneUtils extends MsoTenantUtils {

    public boolean deleteTenantByName(String tenantName, String cloudSiteId) throws MsoException {
        // Obtain the cloud site information where we will query the tenant
        Optional<CloudSite> cloudSite = cloudConfig.getCloudSite(cloudSiteId);
        if (!cloudSite.isPresent()) {
            throw new MsoCloudSiteNotFound(cloudSiteId);
        }
        Keystone keystoneAdminClient = getKeystoneAdminClient(cloudSite.get());

        try {
            // Need the Tenant ID to delete (can't directly delete by name)
            Tenant tenant = findTenantByName(keystoneAdminClient, tenantName);
            if (tenant == null) {
                // OK if tenant already doesn't exist.
                logger.error("{} Tenant {} not found on Cloud site id {}, {}", MessageEnum.RA_TENANT_NOT_FOUND,
                        tenantName, cloudSiteId, ErrorCode.DataError.getValue());
                return false;
            }

            // Execute the Delete. It has no return value.
            OpenStackRequest<Void> request = keystoneAdminClient.tenants().delete(tenant.getId());
            executeAndRecordOpenstackRequest(request);

            logger.debug("Deleted Tenant {} ({})", tenant.getId(), tenant.getName());

        } catch (OpenStackBaseException e) {
            // Note: It doesn't seem to matter if tenant doesn't exist, no exception is thrown.
            // Convert Keystone OpenStackResponseException to MsoOpenstackException
            throw keystoneErrorToMsoException(e, DELETE_TENANT);
        } catch (RuntimeException e) {
            // Catch-all
            throw runtimeExceptionToMsoException(e, DELETE_TENANT);
        }

        return true;
    }

}