예제 #1
0
def get_metrics(host, port, key, api_type, metrics, headers=None, timeout=5):
    assert host, 'host'
    assert port, 'port'
    assert key, 'key'
    assert api_type, 'api_type'
    assert metrics, 'metrics'

    data = dict()
    endpoint = 'http://%s:%s' % (host, port)
    security = rpc.Security(key)
    hsp = rpc.HttpServiceProxy(endpoint, security=security, headers=headers)
    getters = {
        'cpu': get_cpu_stat,
        'la': get_la_stat,
        'mem': get_mem_info,
        'net': get_net_stat,
        'io': get_io_stat,
    }
    for metric in metrics:
        try:
            data.update({metric: getters[metric](hsp, api_type, timeout=timeout)})
        except (urllib2.URLError, urllib2.HTTPError, socket.timeout):
            raise
        except:
            msg = "Endpoint: %s, metric '%s' failed: %s" % (endpoint, metric, helper.exc_info())
            LOG.warning(msg)
            continue
    return data
예제 #2
0
    def get(host=None,
            port=None,
            key=None,
            os_type=None,
            metrics=None,
            proxy=None):
        assert (host or proxy) and port and key and os_type and metrics

        if proxy:
            host = proxy['host']
            port = proxy['port']
            headers = proxy['headers']
        else:
            headers = None

        endpoint = 'http://%s:%s' % (host, port)
        security = rpc.Security(cryptotool.decrypt_key(key))
        hsp = rpc.HttpServiceProxy(endpoint,
                                   security=security,
                                   headers=headers)

        data = dict()

        if 'cpu' in metrics:
            try:
                data.update(ScalarizrAPI._get_cpu_stat(hsp, os_type))
            except Exception as e:
                if type(e) in (urllib2.URLError, socket.timeout): raise e
                LOG.warning('%s:%s scalarizr api CPU failed: %s' %
                            (host, port, helper.exc_info()))
        if 'la' in metrics:
            try:
                data.update(ScalarizrAPI._get_la_stat(hsp, os_type))
            except Exception as e:
                if type(e) in (urllib2.URLError, socket.timeout): raise e
                LOG.warning('%s:%s scalarizr api LA failed: %s' %
                            (host, port, helper.exc_info()))
        if 'mem' in metrics:
            try:
                data.update(ScalarizrAPI._get_mem_info(hsp, os_type))
            except Exception as e:
                if type(e) in (urllib2.URLError, socket.timeout): raise e
                LOG.warning('%s:%s scalarizr api MEM failed: %s' %
                            (host, port, helper.exc_info()))
        if 'net' in metrics:
            try:
                data.update(ScalarizrAPI._get_net_stat(hsp, os_type))
            except Exception as e:
                if type(e) in (urllib2.URLError, socket.timeout): raise e
                LOG.warning('%s:%s scalarizr api NET failed: %s' %
                            (host, port, helper.exc_info()))

        return data
예제 #3
0
파일: steps.py 프로젝트: kikov79/scalr
def answer_error(environ, start_response):
    try:
        server_id = environ['HTTP_X_SERVER_ID']
        crypto_key = lib.world.server_properties[server_id]['scalarizr.key']
        security = rpc.Security(cryptotool.decrypt_key(crypto_key))
        data = json.loads(
            security.decrypt_data(environ['wsgi.input'].readline()))

        server = lib.world.servers[server_id]

        assert 'params' in data
        assert 'method' in data
        assert 'id' in data, 'id'

        if data['method'] == 'status':
            assert 'cached' in data['params'], 'cached'

            repos = {
                'latest': {
                    'linux': 'http://repo.scalr.net/apt-plain latest/',
                    'windows': 'http://repo.scalr.net/win/latest',
                },
                'stable': {
                    'linux': 'http://repo.scalr.net/apt-plain stable/',
                    'windows': 'http://repo.scalr.net/win/stable',
                }
            }

            utcnow = datetime.utcnow()
            status = {
                'server_id': server_id,
                'repository': 'stable',
                'repo_url': repos['stable'][server['os_type']],
                'executed_at': utcnow.strftime('%a %d %b %Y %H:%M:%S UTC'),
                'state': u'error',
                'error': u'Cool error',
            }
            answer = {'result': status}
        elif data['method'] == 'update':
            answer = {'result': 777}
            lib.update_count.setdefault(server_id, 0)
            lib.update_count[server_id] += 1
        else:
            assert False, 'method'

        response = security.encrypt_data(json.dumps(answer))
        start_response('201 OK', [('Content-Type', 'text/html')])
        yield response
    except:
        yield str(sys.exc_info())
예제 #4
0
def answer(environ, start_response):
    try:
        server_id = environ['HTTP_X_SERVER_ID']
        crypto_key = lib.world.server_properties[server_id]['scalarizr.key']
        security = rpc.Security(cryptotool.decrypt_key(crypto_key))
        data = json.loads(
            security.decrypt_data(environ['wsgi.input'].readline()))

        server = lib.world.servers[server_id]

        assert 'params' in data
        assert 'method' in data
        assert 'id' in data, 'id'

        if data['method'] == 'status':
            assert 'cached' in data['params'], 'cached'

            repos = {
                'latest': {
                    'linux': 'http://apt.scalr.net/debian scalr/',
                    'windows': 'http://win.scalr.net',
                },
                'stable': {
                    'linux': 'http://apt-delayed.scalr.net/debian scalr/',
                    'windows': 'http://win-delayed.scalr.net',
                }
            }

            status = {
                'server_id': server_id,
                'repository': 'stable',
                'repo_url': repos['stable'][server['os_type']],
                'executed_at': 'Mon 22 Sep 2014 12:00:00 UTC',
                'state': '',
                'error': '',
            }
            answer = {'result': status}
        elif data['method'] == 'update':
            answer = {'result': 777}
            lib.update_ok[server_id] = True
        else:
            assert False, 'method'

        response = security.encrypt_data(json.dumps(answer))
        start_response('201 OK', [('Content-Type', 'text/html')])
        yield response
    except:
        yield str(sys.exc_info())
예제 #5
0
파일: szr_api.py 프로젝트: AsherBond/scalr
def get_metrics(host, port, key, api_type, metrics, headers=None, timeout=5):
    assert host, 'host'
    assert port, 'port'
    assert key, 'key'
    assert api_type, 'api_type'
    assert metrics, 'metrics'

    data = dict()
    endpoint = 'http://%s:%s' % (host, port)
    security = rpc.Security(key)
    hsp = rpc.HttpServiceProxy(endpoint, security=security, headers=headers)
    getters = {
        'cpu': get_cpu_stat,
        'la': get_la_stat,
        'mem': get_mem_info,
        'net': get_net_stat,
        'io': get_io_stat,
    }
    for metric in metrics:
        data.update({metric: getters[metric](hsp, api_type, timeout=timeout)})
    return data
예제 #6
0
def answer(environ, start_response):
    server_id = environ['HTTP_X_SERVER_ID']
    crypto_key = lib.world.server_properties[server_id]['scalarizr.key']
    security = rpc.Security(cryptotool.decrypt_key(crypto_key))
    data = json.loads(security.decrypt_data(environ['wsgi.input'].readline()))

    responses = {
        'cpu_stat': {
            'user': 10,
            'nice': 10,
            'system': 10,
            'idle': 10,
        },
        'load_average': [
            1,
            1,
            1,
        ],
        'mem_info': {
            'total_swap': 1024,
            'avail_swap': 1024,
            'total_real': 1024,
            'total_free': 1024,
            'shared': 1024,
            'buffer': 1024,
            'cached': 1024,
        },
        'net_stats': {
            'eth0': {
                'receive': {
                    'bytes': 1024,
                    'packets': 1024,
                    'errors': 0,
                },
                'transmit': {
                    'bytes': 1024,
                    'packets': 1024,
                    'errors': 0,
                },
            },
        },
        'disk_stats': {
            'sda1': {
                'read': {
                    'num': 10,
                    'sectors': 10,
                    'bytes': 10,
                },
                'write': {
                    'num': 10,
                    'sectors': 10,
                    'bytes': 10,
                },
            },
        },
    }

    result = {'result': responses[data['method']]}

    response = security.encrypt_data(json.dumps(result))

    start_response('201 OK', [('Content-Type', 'text/html')])
    yield response
예제 #7
0
 def __init__(self, host, port, key, headers=None):
     endpoint = 'http://%s:%s' % (host, port)
     security = rpc.Security(key)
     super(SzrUpdClient, self).__init__(endpoint,
                                        security=security,
                                        headers=headers)