text:
from unittest import mock

import ddt
import webob

from manila.api import common
from manila.api.v2 import share_servers
from manila.common import constants
from manila import context as ctx_api
from manila.db import api as db_api
from manila import exception
from manila import policy
from manila.share import api as share_api
from manila import test
from manila.tests.api import fakes
from manila.tests import db_utils
from manila import utils

@ddt.ddt
class ShareServerControllerTest(test.TestCase):
    """Share server api test"""

    def setUp(self):
        super(ShareServerControllerTest, self).setUp()
        self.mock_policy_check = self.mock_object(
            policy, 'check_policy', mock.Mock(return_value=True))
        self.controller = share_servers.ShareServerController()
        self.resource_name = self.controller.resource_name

    @ddt.data(constants.STATUS_ACTIVE, constants.STATUS_ERROR,
              constants.STATUS_DELETING, constants.STATUS_CREATING,
              constants.STATUS_MANAGING, constants.STATUS_UNMANAGING,
              constants.STATUS_UNMANAGE_ERROR, constants.STATUS_MANAGE_ERROR)
    def test_share_server_reset_status(self, status):
        req = fakes.HTTPRequest.blank('/v2/share-servers/fake-share-server/',
                                      use_admin_context=True,
                                      version="2.49")
        body = {'reset_status': {'status': status}}

        context = req.environ['manila.context']
        mock_update = self.mock_object(db_api, 'share_server_update')

        result = self.controller.share_server_reset_status(
            req, 'fake_server_id', body)

        self.assertEqual(202, result.status_int)
        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'reset_status')
        mock_update.assert_called_once_with(
            context, 'fake_server_id', {'status': status})

    def test_share_reset_server_status_invalid(self):
        req = fakes.HTTPRequest.blank('/reset_status', use_admin_context=True,
                                      version="2.49")
        body = {'reset_status': {'status': constants.STATUS_EXTENDING}}
        context = req.environ['manila.context']

        self.assertRaises(
            webob.exc.HTTPBadRequest,
            self.controller.share_server_reset_status,
            req, id='fake_server_id', body=body)
        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'reset_status')

    def test_share_server_reset_status_no_body(self):
        req = fakes.HTTPRequest.blank('/reset_status', use_admin_context=True,
                                      version="2.49")
        context = req.environ['manila.context']

        self.assertRaises(
            webob.exc.HTTPBadRequest,
            self.controller.share_server_reset_status,
            req, id='fake_server_id', body={})
        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'reset_status')

    def test_share_server_reset_status_no_status(self):
        req = fakes.HTTPRequest.blank('/reset_status', use_admin_context=True,
                                      version="2.49")
        context = req.environ['manila.context']

        self.assertRaises(
            webob.exc.HTTPBadRequest,
            self.controller.share_server_reset_status,
            req, id='fake_server_id', body={'reset_status': {}})
        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'reset_status')

    def _setup_manage_test_request_body(self):
        body = {
            'share_network_id': 'fake_net_id',
            'share_network_subnet_id': 'fake_subnet_id',
            'host': 'fake_host',
            'identifier': 'fake_identifier',
            'driver_options': {'opt1': 'fake_opt1', 'opt2': 'fake_opt2'},
        }
        return body

    @ddt.data('fake_net_name', '')
    def test_manage(self, share_net_name):
        """Tests share server manage"""
        req = fakes.HTTPRequest.blank('/v2/share-servers/',
                                      use_admin_context=True,
                                      version="2.49")
        context = req.environ['manila.context']
        share_network = db_utils.create_share_network(name=share_net_name)
        share_net_subnet = [db_utils.create_share_network_subnet(
            share_network_id=share_network['id'])]
        share_server = db_utils.create_share_server(
            share_network_subnet_id=share_net_subnet[0]['id'],
            host='fake_host',
            identifier='fake_identifier',
            is_auto_deletable=False,
            share_network_subnets=share_net_subnet)

        self.mock_object(db_api, 'share_network_get', mock.Mock(
            return_value=share_network))
        self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
                         mock.Mock(return_value=share_net_subnet))
        self.mock_object(utils, 'validate_service_host')

        body = {
            'share_server': self._setup_manage_test_request_body()
        }

        manage_share_server_mock = self.mock_object(
            share_api.API, 'manage_share_server',
            mock.Mock(return_value=share_server))

        result = self.controller.manage(req, body)
        expected_result = {
            'share_server': {
                'id': share_server['id'],
                'project_id': 'fake',
                'updated_at': None,
                'status': constants.STATUS_ACTIVE,
                'host': 'fake_host',
                'share_network_id':
                    (share_server['share_network_subnets'][0]
                     ['share_network_id']),
                'created_at': share_server['created_at'],
                'backend_details': {},
                'identifier': share_server['identifier'],
                'is_auto_deletable': share_server['is_auto_deletable'],
            }
        }
        if share_net_name != '':
            expected_result['share_server']['share_network_name'] = (
                'fake_net_name')
        else:
            expected_result['share_server']['share_network_name'] = (
                share_net_subnet[0]['share_network_id'])

        req_params = body['share_server']
        manage_share_server_mock.assert_called_once_with(
            context, req_params['identifier'], req_params['host'],
            share_net_subnet[0], req_params['driver_options'])

        self.assertEqual(expected_result, result)

        self.mock_policy_check.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')

    def test_manage_invalid(self):
        req = fakes.HTTPRequest.blank('/manage_share_server',
                                      use_admin_context=True, version="2.49")
        share_network = db_utils.create_share_network()
        share_net_subnet = [db_utils.create_share_network_subnet(
            share_network_id=share_network['id'])]

        body = {
            'share_server': self._setup_manage_test_request_body()
        }
        body['share_server']['driver_options'] = []
        self.mock_object(utils, 'validate_service_host')
        self.mock_object(db_api, 'share_network_get',
                         mock.Mock(return_value=share_network))
        self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
                         mock.Mock(return_value=share_net_subnet))

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.manage, req, body)

    def test_manage_forbidden(self):
        """Tests share server manage without admin privileges"""
        req = fakes.HTTPRequest.blank('/manage_share_server', version="2.49")
        error = mock.Mock(side_effect=exception.PolicyNotAuthorized(action=''))
        self.mock_object(share_api.API, 'manage_share_server', error)

        share_network = db_utils.create_share_network()
        share_net_subnet = [db_utils.create_share_network_subnet(
            share_network_id=share_network['id'])]

        self.mock_object(db_api, 'share_network_get', mock.Mock(
            return_value=share_network))
        self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
                         mock.Mock(return_value=share_net_subnet))
        self.mock_object(utils, 'validate_service_host')

        body = {
            'share_server': self._setup_manage_test_request_body()
        }

        self.assertRaises(webob.exc.HTTPForbidden,
                          self.controller.manage,
                          req,
                          body)

    def test__validate_manage_share_server_validate_no_body(self):
        """Tests share server manage"""
        req = fakes.HTTPRequest.blank('/manage', version="2.49")
        body = {}

        self.assertRaises(webob.exc.HTTPUnprocessableEntity,
                          self.controller.manage,
                          req,
                          body)

    @ddt.data({'empty': False, 'key': 'host'},
              {'empty': False, 'key': 'share_network_id'},
              {'empty': False, 'key': 'identifier'},
              {'empty': True, 'key': 'host'},
              {'empty': True, 'key': 'share_network_id'},
              {'empty': True, 'key': 'identifier'})
    @ddt.unpack
    def test__validate_manage_share_server_validate_without_parameters(
            self, empty, key):
        """Tests share server manage without some parameters"""
        req = fakes.HTTPRequest.blank('/manage_share_server', version="2.49")
        self.mock_object(share_api.API, 'manage_share_server', mock.Mock())

        body = {
            'share_server': self._setup_manage_test_request_body(),
        }

        if empty:
            body['share_server'][key] = None
        else:
            body['share_server'].pop(key)

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.manage,
                          req,
                          body)

    @ddt.data(
        (webob.exc.HTTPBadRequest, exception.ServiceNotFound('foobar')),
        (webob.exc.HTTPBadRequest, exception.ServiceIsDown('foobar')),
        (webob.exc.HTTPForbidden, exception.PolicyNotAuthorized('foobar')),
        (webob.exc.HTTPForbidden, exception.AdminRequired())
    )
    @ddt.unpack
    def test__validate_manage_share_server_validate_service_host(
            self, exception_to_raise, side_effect_exception):
        req = fakes.HTTPRequest.blank('/manage', version="2.49")
        context = req.environ['manila.context']
        error = mock.Mock(side_effect=side_effect_exception)
        self.mock_object(utils, 'validate_service_host', error)

        share_network = db_utils.create_share_network()
        share_net_subnet = [db_utils.create_share_network_subnet(
            share_network_id=share_network['id'])]

        self.mock_object(db_api, 'share_network_get', mock.Mock(
            return_value=share_network))
        self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
                         mock.Mock(return_value=share_net_subnet))
        self.mock_object(common, 'check_share_network_is_active',
                         mock.Mock(return_value=True))

        self.assertRaises(
            exception_to_raise, self.controller.manage, req,
            {'share_server': self._setup_manage_test_request_body()})

        common.check_share_network_is_active.assert_called_once_with(
            share_net_subnet[0]['share_network'])
        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')

    def test__validate_manage_share_network_not_active(self):
        req = fakes.HTTPRequest.blank('/manage', version="2.49")
        context = req.environ['manila.context']

        share_network = db_utils.create_share_network()
        share_net_subnet = [db_utils.create_share_network_subnet(
            share_network_id=share_network['id'])]

        self.mock_object(db_api, 'share_network_get', mock.Mock(
            return_value=share_network))
        self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
                         mock.Mock(return_value=share_net_subnet))
        self.mock_object(utils, 'validate_service_host')
        self.mock_object(common, 'check_share_network_is_active',
                         mock.Mock(side_effect=webob.exc.HTTPBadRequest()))

        self.assertRaises(
            webob.exc.HTTPBadRequest, self.controller.manage, req,
            {'share_server': self._setup_manage_test_request_body()})

        common.check_share_network_is_active.assert_called_once_with(
            share_net_subnet[0]['share_network'])
        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')

    def test__validate_manage_share_server_share_network_not_found(self):
        req = fakes.HTTPRequest.blank('/manage', version="2.49")
        context = req.environ['manila.context']
        self.mock_object(utils, 'validate_service_host')
        error = mock.Mock(
            side_effect=exception.ShareNetworkNotFound(share_network_id="foo"))
        self.mock_object(db_api, 'share_network_get', error)
        body = self._setup_manage_test_request_body()

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.manage,
                          req,
                          {'share_server': body})

        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')

    def test__validate_manage_share_server_driver_opts_not_instance_dict(self):
        req = fakes.HTTPRequest.blank('/manage', version="2.49")
        context = req.environ['manila.context']
        self.mock_object(utils, 'validate_service_host')
        self.mock_object(db_api, 'share_network_get')
        body = self._setup_manage_test_request_body()
        body['driver_options'] = 'incorrect'
        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.manage,
                          req,
                          {'share_server': body})

        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')

    def test__validate_manage_share_server_error_extract_host(self):
        req = fakes.HTTPRequest.blank('/manage', version="2.49")
        context = req.environ['manila.context']
        body = self._setup_manage_test_request_body()
        body['host'] = 'fake@backend#pool'
        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.manage,
                          req,
                          {'share_server': body})

        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')

    @ddt.data(True, False)
    def test__validate_manage_share_server_error_subnet_not_found(
            self, body_contains_subnet):
        req = fakes.HTTPRequest.blank('/manage', version="2.51")
        context = req.environ['manila.context']
        share_network = db_utils.create_share_network()
        body = {'share_server': self._setup_manage_test_request_body()}
        share_net_subnet = [db_utils.create_share_network_subnet(
            share_network_id=share_network['id'])]
        body['share_server']['share_network_subnet_id'] = (
            share_net_subnet[0]['id'] if body_contains_subnet else None)

        self.mock_object(
            db_api, 'share_network_subnet_get_all_with_same_az',
            mock.Mock(side_effect=exception.ShareNetworkSubnetNotFound(
                share_network_subnet_id='fake')))
        self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
                         mock.Mock(return_value=None))

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.manage,
                          req,
                          body)

        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')
        if body_contains_subnet:
            (db_api.share_network_subnet_get_all_with_same_az.
             assert_called_once_with(context, share_net_subnet[0]['id']))
        else:
            (db_api.share_network_subnet_get_default_subnets
                .assert_called_once_with(
                    context, body['share_server']['share_network_id']))

    @ddt.data(True, False)
    def test__validate_manage_share_server_error_multiple_subnet(
            self, body_contains_subnet):
        req = fakes.HTTPRequest.blank('/manage', version="2.70")
        context = req.environ['manila.context']
        share_network = db_utils.create_share_network()
        body = {'share_server': self._setup_manage_test_request_body()}
        share_net_subnets = [
            db_utils.create_share_network_subnet(
                share_network_id=share_network['id']),
            db_utils.create_share_network_subnet(
                share_network_id=share_network['id'], id='fake_sns_id_2'),
        ]
        body['share_server']['share_network_subnet_id'] = (
            share_net_subnets[0]['id'] if body_contains_subnet else None)

        self.mock_object(
            db_api, 'share_network_subnet_get_all_with_same_az',
            mock.Mock(return_value=share_net_subnets))
        self.mock_object(db_api, 'share_network_subnet_get_default_subnets',
                         mock.Mock(return_value=share_net_subnets))

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.manage,
                          req,
                          body)

        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'manage_share_server')
        if body_contains_subnet:
            (db_api.share_network_subnet_get_all_with_same_az.
             assert_called_once_with(context, share_net_subnets[0]['id']))
        else:
            (db_api.share_network_subnet_get_default_subnets
                .assert_called_once_with(
                    context, body['share_server']['share_network_id']))

    @ddt.data(True, False)
    def test_unmanage(self, force):
        server = self._setup_unmanage_tests()
        req = fakes.HTTPRequest.blank('/unmanage', version="2.49")
        context = req.environ['manila.context']
        mock_get = self.mock_object(
            db_api, 'share_server_get', mock.Mock(return_value=server))
        mock_unmanage = self.mock_object(
            share_api.API, 'unmanage_share_server',
            mock.Mock(return_value=202))
        body = {'unmanage': {'force': force}}
        resp = self.controller.unmanage(req, server['id'], body)

        self.assertEqual(202, resp.status_int)

        mock_get.assert_called_once_with(context, server['id'])
        mock_unmanage.assert_called_once_with(context, server, force=force)

    def test_unmanage_share_server_not_found(self):
        """Tests unmanaging share servers"""
        req = fakes.HTTPRequest.blank('/v2/share-servers/fake_server_id/',
                                      version="2.49")
        context = req.environ['manila.context']
        share_server_error = mock.Mock(
            side_effect=exception.ShareServerNotFound(
                share_server_id='fake_server_id'))
        get_mock = self.mock_object(
            db_api, 'share_server_get', share_server_error)
        body = {'unmanage': {'force': True}}

        self.assertRaises(webob.exc.HTTPNotFound,
                          self.controller.unmanage,
                          req,
                          'fake_server_id',
                          body)

        get_mock.assert_called_once_with(context, 'fake_server_id')

    def test_unmanage_share_server_multiple_subnets_fail(self):
        """Tests unmanaging share servers"""
        server = self._setup_unmanage_tests(multiple_subnets=True)
        get_mock = self.mock_object(db_api, 'share_server_get',
                                    mock.Mock(return_value=server))
        req = fakes.HTTPRequest.blank('/unmanage_share_server', version="2.70")
        context = req.environ['manila.context']
        body = {'unmanage': {'force': True}}

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.unmanage,
                          req,
                          server['id'],
                          body)

        get_mock.assert_called_once_with(context, server['id'])

    @ddt.data(constants.STATUS_MANAGING, constants.STATUS_DELETING,
              constants.STATUS_CREATING, constants.STATUS_UNMANAGING)
    def test_unmanage_share_server_invalid_statuses(self, status):
        """Tests unmanaging share servers"""
        server = self._setup_unmanage_tests(status=status)
        get_mock = self.mock_object(db_api, 'share_server_get',
                                    mock.Mock(return_value=server))
        req = fakes.HTTPRequest.blank('/unmanage_share_server', version="2.49")
        context = req.environ['manila.context']
        body = {'unmanage': {'force': True}}

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.unmanage,
                          req,
                          server['id'],
                          body)

        get_mock.assert_called_once_with(context, server['id'])

    def _setup_unmanage_tests(self, status=constants.STATUS_ACTIVE,
                              multiple_subnets=False):
        share_network = db_utils.create_share_network()
        network_subnets = [db_utils.create_share_network_subnet(
            id='fake_sns_id', share_network_id=share_network['id'])]
        if multiple_subnets:
            share_network1 = db_utils.create_share_network()
            network_subnets.append(db_utils.create_share_network_subnet(
                share_network_id=share_network1['id'], id='fake_sns_id_2'))
        server = db_utils.create_share_server(
            id='fake_server_id', status=status,
            share_network_subnets=network_subnets)
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))
        self.mock_object(db_api, 'share_network_get',
                         mock.Mock(return_value=share_network))
        self.mock_object(db_api, 'share_network_subnet_get',
                         mock.Mock(return_value=network_subnets))
        return server

    @ddt.data(exception.ShareServerInUse, exception.PolicyNotAuthorized)
    def test_unmanage_share_server_badrequest(self, exc):
        req = fakes.HTTPRequest.blank('/unmanage', version="2.49")
        server = self._setup_unmanage_tests()
        context = req.environ['manila.context']
        error = mock.Mock(side_effect=exc('foobar'))
        mock_unmanage = self.mock_object(
            share_api.API, 'unmanage_share_server', error)
        self.mock_object(common, 'check_share_network_is_active',
                         mock.Mock(return_value=True))
        body = {'unmanage': {'force': True}}

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.unmanage,
                          req,
                          'fake_server_id',
                          body)

        mock_unmanage.assert_called_once_with(context, server, force=True)
        db_api.share_network_get.assert_called()
        common.check_share_network_is_active.assert_called()
        policy.check_policy.assert_called_once_with(
            context, self.resource_name, 'unmanage_share_server')

    def test_unmanage_share_server_network_not_active(self):
        """Tests unmanaging share servers"""
        req = fakes.HTTPRequest.blank(
            '/v2/share-servers/fake_server_id/', version="2.63")
        context = req.environ['manila.context']
        share_server = db_utils.create_share_server()
        network_subnets = [db_utils.create_share_network_subnet()]
        share_server['share_network_subnets'] = network_subnets
        share_network = db_utils.create_share_network()
        get_mock = self.mock_object(
            db_api, 'share_server_get', mock.Mock(return_value=share_server))
        get_network_mock = self.mock_object(
            db_api, 'share_network_get',
            mock.Mock(return_value=share_network))
        is_active_mock = self.mock_object(
            common, 'check_share_network_is_active',
            mock.Mock(side_effect=webob.exc.HTTPBadRequest()))
        body = {'unmanage': {'force': True}}

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.unmanage,
                          req,
                          'fake_server_id',
                          body)
        get_mock.assert_called_once_with(context, 'fake_server_id')
        get_network_mock.assert_called_once_with(
            context,
            share_server['share_network_subnets'][0]['share_network_id'])
        is_active_mock.assert_called_once_with(share_network)

    def _get_server_migration_request(self, server_id, version='2.57'):
        req = fakes.HTTPRequest.blank(
            '/share-servers/%s/action' % server_id,
            use_admin_context=True, version=version)
        req.method = 'POST'
        req.headers['content-type'] = 'application/json'
        req.api_version_request.experimental = True
        return req

    def test__share_server_migration_start(self):
        server = db_utils.create_share_server(id='fake_server_id',
                                              status=constants.STATUS_ACTIVE)
        share_network = db_utils.create_share_network()
        req = self._get_server_migration_request(server['id'])
        context = req.environ['manila.context']

        self.mock_object(db_api, 'share_network_get', mock.Mock(
            return_value=share_network))
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))
        self.mock_object(common, 'check_share_network_is_active',
                         mock.Mock(return_value=True))
        self.mock_object(share_api.API, 'share_server_migration_start')

        body = {
            'migration_start': {
                'host': 'fake_host',
                'preserve_snapshots': True,
                'writable': True,
                'nondisruptive': True,
                'new_share_network_id': 'fake_net_id',
            }
        }

        self.controller.share_server_migration_start(
            req, server['id'], body)

        db_api.share_server_get.assert_called_once_with(
            context, server['id'])
        share_api.API.share_server_migration_start.assert_called_once_with(
            context, server, 'fake_host', True, True, True,
            new_share_network=share_network)
        db_api.share_network_get.assert_called_once_with(
            context, 'fake_net_id')
        common.check_share_network_is_active.assert_called_once_with(
            share_network)

    @ddt.data({'api_exception': exception.ServiceIsDown(service='fake_srv'),
               'expected_exception': webob.exc.HTTPBadRequest},
              {'api_exception': exception.InvalidShareServer(
                  reason='fake_reason'),
               'expected_exception': webob.exc.HTTPConflict},
              {'api_exception': exception.InvalidInput(reason='fake_reason'),
               'expected_exception': webob.exc.HTTPBadRequest})
    @ddt.unpack
    def test__share_server_migration_start_conflict(self, api_exception,
                                                    expected_exception):
        share_network = db_utils.create_share_network()
        share_network_subnet = [db_utils.create_share_network_subnet(
            share_network_id=share_network['id'])]
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE,
            share_network_subnet_id=share_network_subnet[0]['id'])
        server['share_network_subnets'] = share_network_subnet
        req = self._get_server_migration_request(server['id'])
        context = req.environ['manila.context']
        body = {
            'migration_start': {
                'host': 'fake_host',
                'preserve_snapshots': True,
                'writable': True,
                'nondisruptive': True
            }
        }
        self.mock_object(share_api.API, 'share_server_migration_start',
                         mock.Mock(side_effect=api_exception))
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))
        self.mock_object(common, 'check_share_network_is_active',
                         mock.Mock(return_value=True))
        self.mock_object(db_api, 'share_network_get',
                         mock.Mock(return_value=share_network))

        self.assertRaises(expected_exception,
                          self.controller.share_server_migration_start,
                          req, server['id'], body)

        db_api.share_server_get.assert_called_once_with(context,
                                                        server['id'])
        migration_start_params = body['migration_start']
        common.check_share_network_is_active.assert_called_once_with(
            share_network)
        db_api.share_network_get.assert_called_once_with(
            context, share_network['id'])
        share_api.API.share_server_migration_start.assert_called_once_with(
            context, server, migration_start_params['host'],
            migration_start_params['writable'],
            migration_start_params['nondisruptive'],
            migration_start_params['preserve_snapshots'],
            new_share_network=None)

    @ddt.data('host', 'body')
    def test__share_server_migration_start_missing_mandatory(self, param):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])
        context = req.environ['manila.context']

        body = {
            'migration_start': {
                'host': 'fake_host',
                'preserve_metadata': True,
                'preserve_snapshots': True,
                'writable': True,
                'nondisruptive': True
            }
        }

        if param == 'body':
            body.pop('migration_start')
        else:
            body['migration_start'].pop(param)

        self.mock_object(share_api.API, 'share_server_migration_start')
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))

        self.assertRaises(
            webob.exc.HTTPBadRequest,
            getattr(self.controller, 'share_server_migration_start'),
            req, server['id'], body)

        db_api.share_server_get.assert_called_once_with(context,
                                                        server['id'])

    @ddt.data('nondisruptive', 'writable', 'preserve_snapshots')
    def test__share_server_migration_start_non_boolean(self, param):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])
        context = req.environ['manila.context']

        body = {
            'migration_start': {
                'host': 'fake_host',
                'preserve_snapshots': True,
                'writable': True,
                'nondisruptive': True
            }
        }

        body['migration_start'][param] = None

        self.mock_object(share_api.API, 'share_server_migration_start')
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))

        self.assertRaises(
            webob.exc.HTTPBadRequest,
            getattr(self.controller, 'share_server_migration_start'),
            req, server['id'], body)

        db_api.share_server_get.assert_called_once_with(context,
                                                        server['id'])

    def test__share_server_migration_start_share_server_not_found(self):
        fake_id = 'fake_server_id'
        req = self._get_server_migration_request(fake_id)
        context = req.environ['manila.context']

        body = {'migration_start': {'host': 'fake_host'}}

        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(side_effect=exception.ShareServerNotFound(
                                   share_server_id=fake_id)))

        self.assertRaises(webob.exc.HTTPNotFound,
                          self.controller.share_server_migration_start,
                          req, fake_id, body)
        db_api.share_server_get.assert_called_once_with(context,
                                                        fake_id)

    def test__share_server_migration_start_new_share_network_not_found(self):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])
        context = req.environ['manila.context']

        body = {
            'migration_start': {
                'host': 'fake_host',
                'preserve_metadata': True,
                'preserve_snapshots': True,
                'writable': True,
                'nondisruptive': True,
                'new_share_network_id': 'nonexistent'}}

        self.mock_object(db_api, 'share_network_get',
                         mock.Mock(side_effect=exception.NotFound()))
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.share_server_migration_start,
                          req, server['id'], body)
        db_api.share_network_get.assert_called_once_with(context,
                                                         'nonexistent')
        db_api.share_server_get.assert_called_once_with(context,
                                                        server['id'])

    def test__share_server_migration_start_host_with_pool(self):
        server = db_utils.create_share_server(id='fake_server_id',
                                              status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])

        body = {
            'migration_start': {
                'host': 'fake_host@fakebackend#pool',
                'preserve_snapshots': True,
                'writable': True,
                'nondisruptive': True,
                'new_share_network_id': 'fake_net_id',
            }
        }

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.share_server_migration_start,
                          req, server['id'], body)

    def test_share_server_migration_check_host_with_pool(self):
        server = db_utils.create_share_server(id='fake_server_id',
                                              status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])

        body = {
            'migration_start': {
                'host': 'fake_host@fakebackend#pool',
                'preserve_snapshots': True,
                'writable': True,
                'nondisruptive': True,
                'new_share_network_id': 'fake_net_id',
            }
        }

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.share_server_migration_check,
                          req, server['id'], body)

    @ddt.data(constants.TASK_STATE_MIGRATION_ERROR, None)
    def test_reset_task_state(self, task_state):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])

        update = {'task_state': task_state}
        body = {'reset_task_state': update}

        self.mock_object(db_api, 'share_server_update')

        response = self.controller.share_server_reset_task_state(
            req, server['id'], body)

        self.assertEqual(202, response.status_int)

        db_api.share_server_update.assert_called_once_with(utils.IsAMatcher(
            ctx_api.RequestContext), server['id'], update)

    def test_reset_task_state_error_body(self):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])

        update = {'error': 'error'}
        body = {'reset_task_state': update}

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.share_server_reset_task_state,
                          req, server['id'], body)

    def test_reset_task_state_error_invalid(self):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])

        update = {'task_state': 'error'}
        body = {'reset_task_state': update}

        self.assertRaises(webob.exc.HTTPBadRequest,
                          self.controller.share_server_reset_task_state,
                          req, server['id'], body)

    def test_reset_task_state_not_found(self):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])

        update = {'task_state': constants.TASK_STATE_MIGRATION_ERROR}
        body = {'reset_task_state': update}

        self.mock_object(db_api, 'share_server_update',
                         mock.Mock(side_effect=exception.ShareServerNotFound(
                                   share_server_id='fake_server_id')))

        self.assertRaises(webob.exc.HTTPNotFound,
                          self.controller.share_server_reset_task_state,
                          req, server['id'], body)

        db_api.share_server_update.assert_called_once_with(utils.IsAMatcher(
            ctx_api.RequestContext), server['id'], update)

    def test_share_server_migration_complete(self):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])
        context = req.environ['manila.context']

        body = {'migration_complete': None}
        api_return = {
            'destination_share_server_id': 'fake_destination_id'
        }

        self.mock_object(share_api.API, 'share_server_migration_complete',
                         mock.Mock(return_value=api_return))
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))

        result = self.controller.share_server_migration_complete(
            req, server['id'], body)

        self.assertEqual(api_return, result)
        share_api.API.share_server_migration_complete.assert_called_once_with(
            utils.IsAMatcher(ctx_api.RequestContext), server)
        db_api.share_server_get.assert_called_once_with(context,
                                                        server['id'])

    def test_share_server_migration_complete_not_found(self):
        fake_id = 'fake_server_id'
        req = self._get_server_migration_request(fake_id)
        context = req.environ['manila.context']

        body = {'migration_complete': None}

        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(side_effect=exception.ShareServerNotFound(
                                   share_server_id=fake_id)))
        self.mock_object(share_api.API, 'share_server_migration_complete')

        self.assertRaises(webob.exc.HTTPNotFound,
                          self.controller.share_server_migration_complete,
                          req, fake_id, body)
        db_api.share_server_get.assert_called_once_with(context,
                                                        fake_id)

    @ddt.data({'api_exception': exception.ServiceIsDown(service='fake_srv'),
               'expected_exception': webob.exc.HTTPBadRequest},
              {'api_exception': exception.InvalidShareServer(reason=""),
               'expected_exception': webob.exc.HTTPBadRequest})
    @ddt.unpack
    def test_share_server_migration_complete_exceptions(self, api_exception,
                                                        expected_exception):
        fake_id = 'fake_server_id'
        req = self._get_server_migration_request(fake_id)
        context = req.environ['manila.context']
        body = {'migration_complete': None}
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value='fake_share_server'))
        self.mock_object(share_api.API, 'share_server_migration_complete',
                         mock.Mock(side_effect=api_exception))

        self.assertRaises(expected_exception,
                          self.controller.share_server_migration_complete,
                          req, fake_id, body)

        db_api.share_server_get.assert_called_once_with(context,
                                                        fake_id)
        share_api.API.share_server_migration_complete.assert_called_once_with(
            context, 'fake_share_server')

    def test_share_server_migration_cancel(self):
        server = db_utils.create_share_server(
            id='fake_server_id', status=constants.STATUS_ACTIVE)
        req = self._get_server_migration_request(server['id'])
        context = req.environ['manila.context']

        body = {'migration_cancel': None}

        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value=server))
        self.mock_object(share_api.API, 'share_server_migration_cancel')

        self.controller.share_server_migration_cancel(
            req, server['id'], body)

        share_api.API.share_server_migration_cancel.assert_called_once_with(
            utils.IsAMatcher(ctx_api.RequestContext), server)
        db_api.share_server_get.assert_called_once_with(context,
                                                        server['id'])

    def test_share_server_migration_cancel_not_found(self):
        fake_id = 'fake_server_id'
        req = self._get_server_migration_request(fake_id)
        context = req.environ['manila.context']

        body = {'migration_cancel': None}

        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(side_effect=exception.ShareServerNotFound(
                                   share_server_id=fake_id)))
        self.mock_object(share_api.API, 'share_server_migration_cancel')

        self.assertRaises(webob.exc.HTTPNotFound,
                          self.controller.share_server_migration_cancel,
                          req, fake_id, body)
        db_api.share_server_get.assert_called_once_with(context,
                                                        fake_id)

    @ddt.data({'api_exception': exception.ServiceIsDown(service='fake_srv'),
               'expected_exception': webob.exc.HTTPBadRequest},
              {'api_exception': exception.InvalidShareServer(reason=""),
               'expected_exception': webob.exc.HTTPBadRequest})
    @ddt.unpack
    def test_share_server_migration_cancel_exceptions(self, api_exception,
                                                      expected_exception):
        fake_id = 'fake_server_id'
        req = self._get_server_migration_request(fake_id)
        context = req.environ['manila.context']
        body = {'migration_complete': None}
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value='fake_share_server'))
        self.mock_object(share_api.API, 'share_server_migration_cancel',
                         mock.Mock(side_effect=api_exception))

        self.assertRaises(expected_exception,
                          self.controller.share_server_migration_cancel,
                          req, fake_id, body)

        db_api.share_server_get.assert_called_once_with(context,
                                                        fake_id)
        share_api.API.share_server_migration_cancel.assert_called_once_with(
            context, 'fake_share_server')

    def test_share_server_migration_get_progress(self):
        server = db_utils.create_share_server(
            id='fake_server_id',
            status=constants.STATUS_ACTIVE,
            task_state=constants.TASK_STATE_MIGRATION_SUCCESS)
        req = self._get_server_migration_request(server['id'])

        body = {'migration_get_progress': None}
        expected = {
            'total_progress': 'fake',
            'task_state': constants.TASK_STATE_MIGRATION_SUCCESS,
            'destination_share_server_id': 'fake_destination_server_id'
        }

        self.mock_object(share_api.API, 'share_server_migration_get_progress',
                         mock.Mock(return_value=expected))

        response = self.controller.share_server_migration_get_progress(
            req, server['id'], body)
        self.assertEqual(expected, response)
        (share_api.API.share_server_migration_get_progress.
            assert_called_once_with(utils.IsAMatcher(ctx_api.RequestContext),
                                    server['id']))

    @ddt.data({'api_exception': exception.ServiceIsDown(service='fake_srv'),
               'expected_exception': webob.exc.HTTPConflict},
              {'api_exception': exception.InvalidShareServer(reason=""),
               'expected_exception': webob.exc.HTTPBadRequest})
    @ddt.unpack
    def test_share_server_migration_get_progress_exceptions(
            self, api_exception, expected_exception):
        fake_id = 'fake_server_id'
        req = self._get_server_migration_request(fake_id)
        context = req.environ['manila.context']
        body = {'migration_complete': None}
        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value='fake_share_server'))
        mock_get_progress = self.mock_object(
            share_api.API, 'share_server_migration_get_progress',
            mock.Mock(side_effect=api_exception))

        self.assertRaises(expected_exception,
                          self.controller.share_server_migration_get_progress,
                          req, fake_id, body)

        mock_get_progress.assert_called_once_with(context, fake_id)

    def test_share_server_migration_check(self):
        fake_id = 'fake_server_id'
        fake_share_server = db_utils.create_share_server(id=fake_id)
        fake_share_network = db_utils.create_share_network()
        req = self._get_server_migration_request(fake_id)
        context = req.environ['manila.context']
        requested_writable = False
        requested_nondisruptive = False
        requested_preserve_snapshots = False
        fake_host = 'fakehost@fakebackend'
        body = {
            'migration_check': {
                'writable': requested_writable,
                'nondisruptive': requested_nondisruptive,
                'preserve_snapshots': requested_preserve_snapshots,
                'new_share_network_id': fake_share_network['id'],
                'host': fake_host
            }
        }
        driver_result = {
            'compatible': False,
            'writable': False,
            'nondisruptive': True,
            'preserve_snapshots': False,
            'share_network_id': 'fake_network_uuid',
            'migration_cancel': False,
            'migration_get_progress': False,
        }

        mock_server_get = self.mock_object(
            db_api, 'share_server_get',
            mock.Mock(return_value=fake_share_server))
        mock_network_get = self.mock_object(
            db_api, 'share_network_get',
            mock.Mock(return_value=fake_share_network))
        self.mock_object(common, 'check_share_network_is_active',
                         mock.Mock(return_value=True))
        mock_migration_check = self.mock_object(
            share_api.API, 'share_server_migration_check',
            mock.Mock(return_value=driver_result))

        result = self.controller.share_server_migration_check(
            req, fake_id, body)

        expected_result_keys = ['compatible', 'requested_capabilities',
                                'supported_capabilities']
        [self.assertIn(key, result) for key in expected_result_keys]
        mock_server_get.assert_called_once_with(
            context, fake_share_server['id'])
        mock_network_get.assert_called_once_with(
            context, fake_share_network['id'])
        common.check_share_network_is_active.assert_called_once_with(
            fake_share_network)
        mock_migration_check.assert_called_once_with(
            context, fake_share_server, fake_host, requested_writable,
            requested_nondisruptive, requested_preserve_snapshots,
            new_share_network=fake_share_network)

    @ddt.data(
        (webob.exc.HTTPNotFound, True, False, {'migration_check': {}}),
        (webob.exc.HTTPBadRequest, False, True,
         {'migration_check': {'new_share_network_id': 'fake_id'}}),
        (webob.exc.HTTPBadRequest, False, False, None)
    )
    @ddt.unpack
    def test_share_server_migration_check_exception(
            self, exception_to_raise, raise_server_get_exception,
            raise_network_get_action, body):
        req = self._get_server_migration_request('fake_id')
        context = req.environ['manila.context']
        if body:
            body['migration_check']['writable'] = False
            body['migration_check']['nondisruptive'] = False
            body['migration_check']['preserve_snapshots'] = False
            body['migration_check']['host'] = 'fakehost@fakebackend'
        else:
            body = {}

        server_get = mock.Mock()
        network_get = mock.Mock()
        if raise_server_get_exception:
            server_get = mock.Mock(
                side_effect=exception.ShareServerNotFound(
                    share_server_id='fake'))
        if raise_network_get_action:
            network_get = mock.Mock(
                side_effect=exception.ShareNetworkNotFound(
                    share_network_id='fake'))

        mock_server_get = self.mock_object(
            db_api, 'share_server_get', server_get)

        mock_network_get = self.mock_object(
            db_api, 'share_network_get', network_get)

        self.assertRaises(
            exception_to_raise,
            self.controller.share_server_migration_check,
            req, 'fake_id', body
        )
        mock_server_get.assert_called_once_with(
            context, 'fake_id')
        if raise_network_get_action:
            mock_network_get.assert_called_once_with(context, 'fake_id')

    @ddt.data(
        {'api_exception': exception.ServiceIsDown(service='fake_srv'),
         'expected_exception': webob.exc.HTTPBadRequest},
        {'api_exception': exception.InvalidShareServer(reason=""),
         'expected_exception': webob.exc.HTTPBadRequest})
    @ddt.unpack
    def test_share_server_migration_complete_exceptions_from_api(
            self, api_exception, expected_exception):
        req = self._get_server_migration_request('fake_id')
        context = req.environ['manila.context']
        body = {
            'migration_check': {
                'writable': False,
                'nondisruptive': False,
                'preserve_snapshots': True,
                'host': 'fakehost@fakebackend',
            }
        }

        self.mock_object(db_api, 'share_server_get',
                         mock.Mock(return_value='fake_share_server'))

        self.mock_object(share_api.API, 'share_server_migration_complete',
                         mock.Mock(side_effect=api_exception))

        self.assertRaises(
            expected_exception,
            self.controller.share_server_migration_complete,
            req, 'fake_id', body
        )

        db_api.share_server_get.assert_called_once_with(context,
                                                        'fake_id')
        share_api.API.share_server_migration_complete.assert_called_once_with(
            context, 'fake_share_server', )


The city of Gloucester is found in the south-west of England, close to the border with Wales. You can get to Gloucester on the M5 motorway, which runs from near Birmingham to Exeter in Devon. Hiring a car in Gloucester makes it easy to see everything the city offers.
Gloucester car hire is made simple using our site. So far, we've helped more than five million customers in more than 170 countries with our dedicated customer support. We can compare car hire to find you the right car at the best available price, meaning that you don't pay more than you have to.
In Gloucester, the main car hire desks are found in the city centre, which means that once you've arrived, it's usually simple to pick up your car. Several suppliers are all located in the centre, not far from the train station, so it's a straightforward process to collect the keys once you get to the city.
Gloucester can offer you so many different things, whether it's sporting events, cultural museum or gallery visits or retail therapy. You can explore the history of the city, while taking in some incredible ancient architecture. With the River Severn winding past the city, there is plenty of opportunity to get into nature too.
The Cotswolds Area of Outstanding Natural Beauty is just 25km away from Gloucester, making it a must-visit for anyone who enjoys getting out into the countryside. You can also see a Gloucester Rugby match if you prefer your activities a bit more adrenalin-fuelled. You could also head to Cheltenham, just 15km away, to see the races.
If you love literature and culture, you won't want to miss the chance to see Stratford-upon-Avon, where William Shakespeare was born and raised. You could also drive up the M5 to Birmingham, England's second city, and see the famous Jewellery Quarter. Cardiff is another major city you can see if you put your hire car to good use.
There are lots of fantastic places to eat and drink in Gloucester, from sophisticated restaurants to cosy pubs. Whatever your favourite is, you're bound to find it in Gloucester. You can also find plenty of entertaining bars and nightclubs to spend your evenings in so you don't have to cut your good time short.
You can visit the Jet Age Museum to learn about Gloucester's history in aviation. A registered charity, the museum tells the story of the Gloster Aircraft Company with a focus on the first Allied jet flight. There are a number of vineyards in Gloucester so when you've learnt all you want to, you can head there to taste some British wines.
Gloucester Cathedral is one of the top sights in the city. Built in around 679 and used for filming in the Harry Potter films, the church is ancient and awe-inspiring. You can also see the Gloucester Docks, which have been modernised and turned into museums, cafes and shops to cater for all visitors.


What do you do? Currently I am in school to become a personal trainer as well as I work at a local Juice bar serving up plant based foods and drinks!
What's your favorite J. Selby's menu item? Currently my favorite J Selby's menu item is the Solo Burger with pickles and special sauce. It's seriously amazing!
What's your favorite thing to do in the Cities? My favorite thing to do in the Cities would be walking around Lake Harriet or through the skyways downtown.
What's your favorite animal? My favorite animal is the moose due to their size and structure.
What is something you're passionate about? Why? Something I'm passionate about is helping other people live a happier and fuller life! I really value health and I want to share that with others!
What made you decide to follow the vegan diet/lifestyle? I decided to follow the vegan life style when I became informed on how bad animal products are for our bodies! I also grew in my spirituality thus creating more compassion for animals and living beings!
What is one piece of advice you'd offer to someone hoping to become vegan or eat plant-based? Advice I'd offer for someone starting a plant based diet would be to try to live by the 80/20 rule. Meaning 80 percent is at home where you're going to do your best to eat an exclusive plant based diet and then give yourself 20 percent where you can go out to eat with friends or try a new restaurant! It is important to fuel your body correctly but you never want to deprive yourself of anything!
You can find Ruby on Youtube and Instagram.


Beautiful Brazilian cherry hardwood floors, a peaceful tropical aquarium with fish caught by Dr. Sternberg himself, and the warm, friendly smiles of our supportive staff will instantly make you feel comfortable as you enter our dental facility. New Jersey cosmetic dentist Dennis G. Sternberg, D.D.S. has created a facility in Freehold that is not only designed with patient comfort in mind, but also offers some of the most technologically advanced tools available in modern dentistry. Whether you are in need of dental fillings, root canal, tooth whitening, dental implants, crowns, porcelain veneers, or dental bridges, we can help.
Considered a leading New Jersey cosmetic dentist, Dennis G. Sternberg, D.D.S. has been featured in several high-profile publications including New Jersey Monthly magazine's feature, " New Jersey's Top Dentists." Newsweek also named Dr. Sternberg one of America's "Unsung Heroes" for his unwavering dedication to community service and environmental concerns.
Dennis G. Sternberg, D.D.S., was born in New Jersey. He graduated from New York University College of Dentistry and went on to complete a dental residency at Mount Sinai Hospital. He also completed a mini-residency in problems of the temporomandibular joint (TMJ) at the New Jersey College of Medicine and Dentistry.
Joining the Practice - Sandy Sternberg, D.D.S.
After receiving his Bachelor's Degree at the University of Miami, he went on to attend and graduate from the Arizona School of Dentistry and Oral Health in Mesa, Arizona with a degree in Dental Medicine. Dr. Sandy completed his general practice residency at Monmouth Medical Center in Long Branch, NJ. His residency was concentrated in medically complex patients as well as aesthetics.
Dr. Sandy takes the time with every patient to comprehensively screen for oral cancer. He treats every patient like a family member. When he's not taking care of his patients, Dr. Sandy enjoys surfing, spearfishing and swimming. He is currently accepting new patients at this time, and would love to meet you.
Dr. Sternberg believes in a medically complete approach to dental treatment. He regularly screens his patients for oral cancer, performing visual inspection and examination of the lymph nodes, thyroid region and oral cavity. New Jersey residents under the care of cosmetic dentist Dennis G. Sternberg, D.D.S., can rest assured that they are receiving the most comprehensive dental treatment available.
Contact our cosmetic dentistry office in Freehold today to schedule your appointment with New Jersey cosmetic dentist Dennis G. Sternberg, D.D.S.
Dr. Sternberg has a beautiful smile waiting for you. Review the before and after photos of our cosmetic dentist and view our patient video testimonials and blogs. Imagine what quality dentistry can do for you!


Mining Sweden (miningsweden.se) was launched in January 2015 providing Bitcoin cloud mining services from the North of Sweden. The company's legitimacy has been evaluated based on the items listed below. Every individual item has been checked for the presence of obvious red flags or warning signals. If these are present, an explanation detailing what triggered them has been included. A detailed description of the reasons to evaluate each of the included items can be found below the table.
Scarcity Only a limited number of VIP shares.
Grammar on Website Very poor. For example: "give you more then" and "We will also offer you as a VIP good deals on mining shares in the future."
Contact Information Contact (address) information missing (only telephone number is present).
Verified Address Whois data is hidden, address could not be confirmed. The only info provided on the website is that the company resides in the North of Sweden. The only thing that could be confirmed is that the owner is probably in Sweden, as the provided phone number (46 90 695 43 00) could be traced to the city of Umea. The business registration details are not public.
Verified Owner Information on the owner is hidden. Uses the name "Tommy". Also see "verified address".
Business Registration The company claims to be registered as Mining Sweden LLC with number 5690094, which is confirmed by the Division of Corporations.
There is a 10% promo code for Mining Sweden.
Enter voucher code: MOON while checkout.


/\Heather/\ said… 97 I sure do. It's going to be a constant thing to worry about the well-being of your kids!
An email has been sent to the winners and they have 48 hours to respond or another winner will be chosen.
And the winners are………. And the winners are……….


text:
Hata, Nobuhiro (1)
Nagasaka, Tetsuro (1)
Takagi, Teruhide (1)
Takayasu, Masakazu (1)
Yoshida, Jun (1)
Author or Editor: Nobuhiro Hata x
By Author: Sahara, Yoshiyuki x
Recurrence of a neurenteric cyst with malignant transformation in the foramen magnum after total resection
Yoshiyuki Sahara, Tetsuro Nagasaka, Masakazu Takayasu, Teruhide Takagi, Nobuhiro Hata and Jun Yoshida
✓ A 53-year-old man presented with recurrence of a neurenteric cyst with malignant transformation in the foramen magnum 3.5 years after total resection of the original tumor had been reported. For 2 years following the initial surgery, the patient had been in good condition, but then underwent ventriculoperitoneal shunt placement for intracranial hypertension. At the time there was no evidence of recurrence of the tumor on magnetic resonance (MR) images. One and one-half years later, he presented with headache and anorexia. A massive recurrent tumor was identified on MR images. The tumor was severely adhesive to the brainstem, cranial nerves, and vessels, allowing only partial resection. Histological examination of tumor specimens obtained during the first and second craniotomies indicated a malignant change from a typical neurenteric cyst with a one-layer epithelium in the first specimen to an adenocarcinoma with papillary proliferation in the second. The results of various immunohistochemical studies of the first specimen were typical of those of a neurenteric cyst. The second specimen displayed stronger staining of carbohydrate 19-9 and carcinoembryonic antigens than the initial specimen. The percentage of Ki-67 antigen (MIB-1)—positive cells increased from 0% in the first specimen to 6.7% in the second. To the authors' knowledge this is the first case in which malignant transformation has been demonstrated after total resection of a neurenteric cyst in the foramen magnum.
In Volume null: Issue null: Journal of Neurosurgery Volume 95: Issue 2 (Aug 2001)

redpajama_set_name: RedPajamaCommonCrawl


Purchase this product now and earn 72 OtteCash!
EO Essential Oil Products Liquid Hand Soap Peppermint and Tea Tree Description: Naturally Gentle for the Entire Family Naturally antiseptic and gentle with pure essential oils and organic herbal infusions. Two hands and some soap. Nothing special until they get all mixed up together and then the hands really become something. Clean, refreshed, relaxed and ready to become mixed with whatever is around the corner. Our Hand Soap is an evocative mix of organic herbs and therapeutic ingredients to keep your hands ready for anything and everything. Pure Peppermint and Tea Tree Essential Oils are invigorating and revitalizing. Our Coconut Cleansing Complex creates the gentlest, most effective and richly foaming soaps available. By now you probably know we never use irritating sodium lauryl/laureth sulfates. This concentrated and moisturizing formula is pH balanced to effectively cleanse without drying out your hands – ideal for the whole family. Our Organic Herbal Blend is soothing and healing. EO Hand Soap is biodegradable. Mint-tea-fresh. Tea Tree Essential Oil has been used for thousands of years by the Australian Aborigines because of its powerful antibacterial and antifungal properties. We blend it with refreshing Peppermint Essential Oil to create a naturally antiseptic Hand Soap that effectively cleanses, stimulated the senses and even promotes mental clarity. Choose wisely! No synthetic fragrances, only pure essential oils. Not tested on animals. Free Of Synthetic fragrances and sodium lauryl/laureth sulfates. Disclaimer These statements have not been evaluated by the FDA. These products are not intended to diagnose, treat, cure, or prevent any disease.
Ingredients : Organic Herbal Blend (Purified Water, Organic Chamomile [Anthemis Nobilis] Flower, Organic Aloe Vera [Aloe Barbadensis] Leaf, Organic Green Tea [Camellia Sinensis] Leaf, Organic Calendula [Calendula Officinalis] Flower), Cocamidopropyl Hydroxysultaine, Sodium Methyl Cocoyl Taurate, Sodium Coco-Sulfate, Polysorbate-60, EO Essential Oil Blend, Citric Acid, Disodium EDTA, Phenoxyethanol, Benzyl Alcohol, Potassium Sorbate.


And when these days were expired, the king made a feast to all the people that were present in Shushan the fortress, both to great and small, seven days, in the court of the garden of the king's palace.
White, green, and blue [hangings] were fastened with cords of byssus and purple to silver rings and pillars of white marble; couches of gold and silver [lay] upon a pavement of red and white marble, and alabaster, and black marble.
And they gave drink in vessels of gold (the vessels being diverse one from another), and royal wine in abundance, according to the king's bounty.
And the drinking was, according to commandment, without constraint; for so the king had appointed to all the magnates of his house, that they should do according to every man's pleasure.
Also the queen Vashti made a feast for the women of the royal house which belonged to king Ahasuerus.
But the queen Vashti refused to come at the word of the king which was [sent] by the chamberlains; and the king was very wroth, and his fury burned in him.
What shall be done to the queen Vashti according to law, because she has not performed the word of the king Ahasuerus by the chamberlains?
Then said Memucan before the king and the princes, The queen Vashti has not done wrong to the king only, but also to all the princes, and to all the peoples that are in all the provinces of the king Ahasuerus.
After these things, when the fury of king Ahasuerus was appeased, he remembered Vashti, and what she had done, and what was decreed against her.
and let the king appoint officers in all the provinces of his kingdom, that they may gather together all the young virgins of beautiful countenance to Shushan the fortress, to the house of the women, unto the custody of Hegai the king's chamberlain, keeper of the women; and let their things for purification be given.
And he brought up Hadassah, that is, Esther, his uncle's daughter; for she had neither father nor mother -- and the maiden was fair and beautiful -- and when her father and mother were dead, Mordecai took her for his own daughter.
And it came to pass when the king's commandment and his decree was heard, and when many maidens were gathered together unto Shushan the fortress, unto the custody of Hegai, that Esther also was brought into the king's house, unto the custody of Hegai, keeper of the women.
And the maiden pleased him, and obtained favour before him; and he speedily gave her her things for purification, and her portions, and the seven maidens selected to be given her, out of the king's house; and he removed her and her maids to the best [place] of the house of the women.
Esther had not made known her people nor her birth; for Mordecai had charged her that she should not make it known.
and thus came the maiden in unto the king), whatever she desired was given her to go with her out of the house of the women to the king's house.
In the evening she went, and on the morrow she returned into the second house of the women, unto the custody of Shaashgaz, the king's chamberlain, keeper of the concubines. She came in to the king no more, unless the king delighted in her, and she were called by name.
So Esther was taken to king Ahasuerus, into his royal house, in the tenth month, that is, the month Tebeth, in the seventh year of his reign.
And the king made a great feast to all his princes and his servants, Esther's feast; and he made a release to the provinces, and gave presents according to the king's bounty.
And when the virgins were gathered together the second time, Mordecai sat in the king's gate.
In those days, while Mordecai sat in the king's gate, two of the king's chamberlains, Bigthan and Teresh, of those which kept the threshold, were wroth, and sought to lay hand on the king Ahasuerus.
And the thing became known to Mordecai, and he related it to Esther the queen, and Esther told it to the king in Mordecai's name.
And the matter was investigated and found out; and they were both hanged on a tree. And it was written in the book of the chronicles before the king.
After these things king Ahasuerus promoted Haman the son of Hammedatha the Agagite, and advanced him, and set his seat above all the princes that were with him.
And it came to pass as they spoke daily to him, and he hearkened not to them, that they informed Haman, to see whether Mordecai's matters would stand; for he had told them that he was a Jew.
And Haman said to king Ahasuerus, There is a people scattered abroad and dispersed among the peoples in all the provinces of thy kingdom; and their laws are diverse from [those of] every people, and they keep not the king's laws; and it is not for the king's profit to suffer them.
If it please the king, let it be written that they may be destroyed, and I will pay ten thousand talents of silver into the hands of those that have charge of the affairs, to bring [it] into the king's treasuries.
And the king took his ring from his hand, and gave it to Haman the son of Hammedatha the Agagite, the Jews' enemy.
And the king said to Haman, The silver is given to thee, the people also, to do with them as seems good to thee.
and came even before the king's gate; for none might enter into the king's gate clothed with sackcloth.
And in every province, wherever the king's commandment and his decree came, there was great mourning among the Jews, and fasting, and weeping, and wailing: many lay in sackcloth and ashes.
And Esther's maids and her chamberlains came and told [it] her; and the queen was exceedingly grieved: and she sent raiment to clothe Mordecai, and to take away his sackcloth from him; but he received [it] not.
Then Esther called for Hatach, [one] of the king's chamberlains, whom he had appointed to wait upon her, and gave him a commandment to Mordecai, to know what it was, and why it was.
And Hatach went forth to Mordecai, unto the public place of the city which was before the king's gate.
And Mordecai told him of all that had happened to him, and of the sum of money that Haman had promised to pay to the king's treasuries for the Jews, to destroy them.
And he gave him a copy of the writing of the decree that had been given at Shushan to destroy them, to shew [it] to Esther, and to declare [it] to her, and to charge her that she should go in unto the king, to make supplication to him, and to make request before him, for her people.
All the king's servants and the people of the king's provinces do know that whoever, whether man or woman, shall come to the king into the inner court, who is not called, there is *one* law, to put [him] to death, except [such] to whom the king shall hold out the golden sceptre, that he may live; and I have not been called to come in unto the king these thirty days.
And they told Mordecai Esther's words.
And Mordecai bade to answer Esther: Imagine not in thy heart that thou shalt escape in the king's house, more than all the Jews.
For if thou altogether holdest thy peace at this time, then shall there arise relief and deliverance to the Jews from another place; but thou and thy father's house shall perish. And who knows whether thou art [not] come to the kingdom for such a time as this?
Go, gather together all the Jews that are found in Shushan, and fast for me, and neither eat nor drink three days, night or day: I also and my maidens will fast likewise, and so will I go in unto the king, which is not according to the law; and if I perish, I perish.
And Mordecai went his way, and did according to all that Esther had commanded him.
And the king said to Esther at the banquet of wine, What is thy petition? and it shall be granted thee; and what is thy request? even to the half of the kingdom it shall be done.
If I have found grace in the sight of the king, and if it please the king to grant my petition, and to perform my request, let the king and Haman come to the banquet that I shall prepare for them, and I will do to-morrow according to the king's word.
Then said Zeresh his wife and all his friends to him, Let a gallows be made of fifty cubits high, and in the morning speak to the king that Mordecai may be hanged on it: then go in merrily with the king to the banquet. And the thing pleased Haman; and he caused the gallows to be made.


I say this post on the Raw Story this weekend, and just had to share the video. A dolphin with a hook in its mouth and fishing line tangled around it approaches some divers and allows them to help it.
All in all, an amazing video and one very fortunate dolphin. Just remember that most of us are better off alerting the professionals if we see a dolphin or other aquatic mammal in need of help.


Then quickly after this, two sides for Berliner (Beltona?) were recorded on the 6th of October 1898 and featured 'PM AL Reith and Cpl. Piper R Reith'. James Scott Skinner the fiddler comes next in 1899 see https://www.abdn.ac.uk/scottskinner/.
Clearly, the cornet itself has never loomed large in Scottish traditional music (without discounting the early dance bands' use of brass etc.) but for me, the recording itself features traditional material (Within a mile of Edinburgh Toon) so I'm taking that as the earliest recording of Scottish traditional music until somebody persuades me otherwise!
It is incredible really to think that at the same time as the preservationists were starting all sorts of societies and institutions to 'save' Scottish traditional music that commerce had already begun the job—and done it for profit! This has underscored my belief in the importance of commercial interests in the development of Scottish traditional music—we cannot claim aesthetics have ever had any singular importance (in my view).
Thanks to all who replied (both personally to me and to the group).
Morag Grant writes: 'In the late 1870s, Auld Lang Syne was one of the songs Alexander Graham Bell used to demonstrate his new-fangled invention, and there is an 1890 recording probably made by Emile Berliner himself using his own new-fangled invention'.
John Mitthauer is my great-great grandfather. No Scottish blood. A German through and through!


The third season, to be called Invasion RaDos, was detailed by Greg Collinson on the old Di-Gata forums. All information is taken from his posts.
It was to revolve around Prime RaDosian invaders coming to RaDos, as seen at the end of "Di-Gata Dawn" when their spaceships were seen in the sky. The Defenders were to have been split over how they felt RaDos should be ordered, and a civil war would be waging only to be interrupted by the Invasion.
Seth, Mel, and Erik would have been establishing a new order based on old models, set out by the Wizards of Yan.
Seth was to be confused on how he was supposed to re-order RaDos. At first Greg wanted him to think he had to follow the old model, but then he would learn that a new model would have to be created for peace to be sustainable.
It would have been revealed that Alnar had kept things hidden from the Defenders, as he had an agenda to re-establish the old model of government and power. The Defenders, being younger, would explore new ways to achieve balance.
Circumstances following the defeat of the Ethos would force Mel and Adam apart, and put Seth and Adam at odds further complicating Mel's loyalties.
Rion and Adam would have headed a renegade Defender group and fought against the old, outdated model. They would have included Defenders-In-Training such as Azura, Roodu, Maia, and Darr. Greg wanted to pit them against the more established Defenders until the Invasion started.
One of the new Defenders, most likely Azura, would have gotten V-Moth's stone.
Maia's origins would have been further explored, as to what critical event caused the change in her eyes. And although she would be supporting the renegades, she is unsure of her loyalties.
Brim had been used up, and there were no plans for him beyond what already happened.
Doku was to survive being left on RaDos Prime, and would have aligned with the Invaders on the attack on RaDos.
Finn may have appeared as Greg was interested in her character, but he believed that she didn't look good on screen so she was avoided.
Flinch would have been rehabilitated, and begun helping Erik in establishing order and spreading technology. He would also have quickly joined Doku when the Invasion started.
General Rood would have survived the battle at the Spell Zone, and headed up an Order of Infinis faction that joins the Invaders.
Geo was living on the surface on her farm. Greg had no plans for her to return, but it may have happened incidentally.
Kara may have come back as a guardian, but it would have depended on Erik's character evolution. Greg hadn't mapped out or decided what his main issues would be, and if bringing Kara back in would help explore them.
Lady K'tahsh would have survived the battle, and made another appearance.
Lydia was imprisoned and rehabilitated.
Madame Leizel had served her purpose and there were no plans for her.
Other characters that came in the Invasion would have had Ethos Avatars similar to Rion, who coincidentally would not use this form again.
Other villains who died in the second season would have an impact on the third season's villains, either through an item or influence beyond the grave.
Sari was to survive the fall and reappear.
Seth's mother would be incorperated into the storyline, but it was not clear if she would make a physical appearance. She would have been capable of tempting Seth to join the Invaders.
Yan Shi-On, a guardian created by the winner of a contest on Teletoon, would have been worked into the plot.


As evidenced by the drunken (and completely unnecessary) rant against her boss (who just happened to be behind her in line for the corporate party video-postcard) "career-limiting-moves" – or CLMs, according to the Urban Dictionary folks – such as the above are a sure-fire way to get… well…fired.
Such moves in hospitals can be up there with extreme cases of malpractice and ridiculous mistakes in surgery (which we could fill 10 blog entries with.) But such things are statistical rarities…Here we're talking about much more common ill-advised moves potentially detrimental to a much higher percentage of medical staff.
We all have to work overtime and lots of days may be more draining than they should be, but if you're late or taking too much time off, you could be labelled undependable. You may be in-demand to fill a specific medical position in your line of work, but chronic absence can keep you from making your way to the team or specialty of your dreams.
We're supposed to learn from mistakes (or be doomed to repeat them.) But even worse than not learning from mistakes is refusing to admit to others and yourself that you made one. While most medical professionals fear making mistakes, everyone makes them. But not dealing with the aftermath of a mistake will catch up with you sooner or later.
Doctors or nurses who think the hospital "owes" them for just showing up (setting aside whether or not they're the next superstar when it comes to talent) may keep their job, but this is a recipe for alienating one's self from friends and superiors alike.
While TV makes it look like every other physician is out there pulling a Meredith Grey or Alex Karev every day, the actual figure for doctors who are disciplined each year in the U.S. is 0.3%. However, "Actions taken by state medical boards may reflect only the most extreme forms of unprofessional behavior," said the authors of an article that looked at this in the Dec 22, 2005 issue of the New England Journal of Medicine. If you are engaging in risky behavior, stop before it bites you in the posterior.
This can be a long-term or short-term career-limiting-move; depending on when something unacceptable you've written publically catches the attention of HR or your superiors and what their tolerance level is for what you've decided to post. This is perhaps the most frequently-executed career-limiting move. Even in medical jobs where staff (theoretically) should usually be on their feet, away from computers, smartphone and tablet use by doctors and nurses on the job has made this CLM infinitely more possible.
This is the granddaddy of them all. It's also the most-talked-about and least-done, for good reason. Rule of thumb: If you wouldn't want it in the news, don't say it on-ward or put it in a text or email. "In this era of dwindling face-time, your emails are increasingly a representation of your work ethic and professionalism" notes a post on careeredge.ca on the pitfalls of sending the wrong email to the wrong person.
Not just for you but for others: It goes without saying that dealing from the store room on your floor is a one-way ticket to having your accreditation revoked…Depending on the circumstances, this CLM can also be a one-way ticket to jail.
From inappropriate prescribing, to fraud, to failure to report adverse or unprofessional events or incidents or abuse, errors of omission can stall your career at-best, and end it at-worst.
If you or your colleagues/supervisors/subordinates are tasked with any aspect of billing and you are knowingly involved in cooking the books or defrauding patients or their insurance companies, you are starring down the barrel of a situation that will involve you seeing far more lawyers than doctors and nurses for the next while. Best to report any such abuses and prevent any situations in which you might be the one committing them.
Absolutely everything listed above is preventable for any medical professional.
This is great article and I enjoyed the video, lol. Thanks for details tips about it, Tera.
You should never talk bad about your boss, especially with your colleagues, loud where anybody can hear you and report you. If you really need to let go then make sure the person you're talking to is a trusted friend that will keep what you've got to say to themselves.


You have seen countless Hollywood movies, documentaries of the oceans, seen your friends diving photos on Facebook or Instagram or want a challenge and see what awaits you in the underwater world? Then the Open Water Course is for you.
The most popular diving certification is for the Open Water Course. Our cost includes all equipment rental, a digital certification sent straight to your phone, a digital manual accessible from your phone, free diving insurance from Dive Assure during your training, a free app for recording your training and logging your dives and if you book in advance a free taxi from the pier. The open water course is divided into academic sessions for the theory, shallow water training sessions where we practice the skills required for diving and 4 open water dives in the ocean and after completion you will certified to dive to 18m!
The first 2 open water dives are to a maximum depth of 12m but to begin with we are normally shallow than this, once you feel comfortable underwater we can go a little bit deeper and start to explore. Dives 3 and 4 are to maximum depth of 18m and we dive deeper and further than before, you will be amazed. At all times your instructor will be with you to keep you safe, and you practice some of the skills you did earlier in the shallow water training and find all the cool stuff under the sea. We can also include accommodation at our partner resort or hostel, prices start from 350b per night, please ask about the room types and prices.
Open Water dives 3 and 4 from 6am to 11am, certification and logbooks and advice for your future diving adventures.
You can book in advance by paying a deposit to secure your course or diving and our taxi will collect you for free from the pier and bring you to our shop to complete the registration process. You will receive a confirmation email within 24 hours by our staff where we will ask you to confirm your arrival time and date and ferry company name. Do not worry if you have not booked a ferry yet but please note we need 24 hours notice to arrange our taxi to collect you from pier to avoid any delays in meeting you.
By sending this request and payment you are submitting a reservation for your diving courses. Be ensure that you have read and understood our terms and conditions.
Please ensure that you read the medical form and if you have to answer yes to any questions you will require sign off by a diving doctor. While this is available on Koh Tao some pre-existing conditions may require sign off by your doctor or specialist, if in doubt please ensure the medical questionnaire is completed before leaving your home country. Some medical conditions are not suitable for diving and may preclude you from diving.
Do you want to know more about a Koh Tao diving course? Or do you want to read more about us as Koh Tao diving school? Feel free to contact us.


text:
function V = FPCAhelper(rankMap, basisChanges, projections, X, d, dampen)
% This is the helper function for FPCA. The point is that we've thrown away
% the excess dimensions at this point, and can now just run the FPCAhelper
% function recursively.

% This function carries inside it a Bernoulli generative model for the
% data. For release, should strip it out and make it general.

% This only works for n source variables and n signal variables.

% P: matrix of basis vectors
% A: Original mixing matrix we're generating samples from (we're just
%       pretending we know it here).
% n: dimensionsality of the signal.
% m: number of samples

% What are the major differences here from recursiveFPCA?
% 1. Columns of A are no longer orthogonal.
% 2. We have to use SVD instead of EIG.

% Check for termination.
if size(projections{end},1) <= 1
   V = 1;
   return;
end

% Now do the recursive case.
[m, n] = size(X);

% Pick our random vectors.
u = randn( [n, 1]);
u = dampen * u / norm(u);

v = randn([n, 1]);
v = dampen * v / norm(v);

% Much more complicated tensor to build-up now.
S = rankMap.' * buildFourthDerivative(X,u) * rankMap;
T = rankMap.' * buildFourthDerivative(X,v) * rankMap;

M = S / T;

for j=1:length(projections)
    M = basisChanges{j} \ M * basisChanges{j};
    M = projections{j} * M * projections{j}.';
end

% Now we can try to find the top eigenvalues etc.
[U, D] = eig(real(M));
[eigenvalues, perm] = sort(diag(D));
U = U(:,perm); % Make sure to sort everything in this order too.

diff = eigenvalues(1:end-1) - eigenvalues(2:end);
[~,index] = max(diff);

basisChanges{end+1} = U;
smallProjections = projections;
bigProjections = projections;

identity = eye(length(eigenvalues)); % Are there going to be rank issues here?
smallProjections{end+1} = identity(1:index,:);
bigProjections{end+1} = identity(index+1:end,:);

smallProblem = FPCAhelper( rankMap, basisChanges, smallProjections, X, d, dampen);
bigProblem = FPCAhelper( rankMap, basisChanges, bigProjections, X, d, dampen);

% Reconstituting the solutions now. We're only unwinding one level of maps.
smallV = smallProjections{end}.' * smallProblem;
bigV = bigProjections{end}.' * bigProblem;

V = [ U\smallV U\bigV ];
end

redpajama_set_name: RedPajamaGithub


text:
Future of Work News
IBM Survey Shows Nearly Quarter of Companies Unprepared For IT Modernization
By Luke Bellos January 06, 2021
Cloud Infrastructure has become one of the most necessary innovations for business technology in the past decade, and according to the latest report by IBM, many companies are ill-equipped for the future.
The survey is called The State of IT Transformation Study, and was conducted by the Managed Infrastructure Services unit of IBM's Global Technology Services division, and involved the leaders of the 380 participating CIOs and CTOs in the United States and United Kingdom. Results found that 60% say their company's IT modernization program is not yet ready for the future, and 24% say their company is just starting its IT modernization journey or has yet to begin modernizing. Because of these findings, more than 95% of IT leaders surveyed said they are looking to adopt public, hybrid or private cloud strategies.
"Our clients are looking to accelerate IT modernization by leveraging cloud models - both public and hybrid, data, AI, automation and other key technologies to help shape, scale and manage more effectively massive, complex, global architectures," said Archana Vemulapalli, General Manager, IBM Infrastructure Services - Offerings and CTO. "In this rapidly changing digital business environment, organizations can bring in the right technology and the right partners to help aggregate, integrate, build and maintain a scalable digital business, while also enforcing effective governance."
This has been an exceptionally important time for cloud data and services, as the coronavirus pandemic has left many businesses scrambling to improve their IT infrastructure to help manage the increased remote activity. And even with the pandemic showing signs of slowing, cloud infrastructures will likely be the way of the future. In fact, more than 60% of technology leaders surveyed say they expect increased demand for cloud infrastructure to be permanent.
Edited by Maurice Nagle
Luke Bellos
Future of Work Contributor
Click here to read full bio
A New Mobility Management Solution for the New Normal
By: Erik Linask 1/14/2021
The combination of remote working and 5G creates the framework for a network-centric mobility management solution.
Successful Student Rates Online AI Degrees for 2021
By: Tracey E. Schelmetic 1/12/2021
Successful Student, an education-focused website that provides objective, student-centric college rankings to help students navigate education, recent…
The Next Version of AI May Include More Human Characteristics
By: Laura Stotler 1/8/2021
A recent debate on the future of AI by a number of leading scientists included discussion about incorporating more human characteristics and reasoning…
By: Luke Bellos 1/6/2021
A new report by IBM shows that many companies are struggling to adapt to the new wave of cloud technologies.
Conversational AI Makes Way Into Cloud Communications
By: Luke Bellos 12/21/2020
Cloud Communications company RingCentral has acquired DeepAffect, which specializes in internal and external communication tools and analytics.
ITEXPO Begins in:
Samsung's Bixby Creating New AI-driven Engagement Opportunities
Erik Linask
Tracey E. Schelmetic
Ken Briodagh
Unified Office Awarded 2020 Teleworking Solutions Excellence Award
Maurice Nagle
Voca.ai Sees Influx of Investment
2 Trap Falls Road Suite 106, Shelton, CT 06484 USA
800-243-6002, 203-852-6800;
The Future of Work News site explores how artificial intelligence and machine learning can improve business communications, collaboration, contact center and customer service, and marketing and sales experiences and initiatives.