예제 #1
0
    def check_and_start_local_server(self, sid, pause, database_id, is_forced, add_server=False):
        """
        Checks if voltdb server is running locally and
        starts it if the server is not running.
        If the server is running, this returns an error
        """
        if sid == -1:
            return create_response('A VoltDB Server not started wrong configuration', 500)

        if self.is_voltserver_running(database_id):
            return create_response('A VoltDB Server process is already running', 500)

        return_code = self.initialize_local_config(sid, is_forced)

        if return_code == 0:
            retcode = self.start_local_server(sid, pause, add_server)
            if (retcode == 0):
                HTTPListener.Global.SERVERS[sid]['isAdded'] = True
                HTTPListener.sync_configuration()
                return create_response('Success', 200)
            else:
                return create_response('Error', 500)
        else:
            # return create_response('Error starting server', 500)
            return create_response('Error', 500)
예제 #2
0
    def check_and_start_local_server(self, sid, pause, database_id, is_forced, add_server=False):
        """
        Checks if voltdb server is running locally and
        starts it if the server is not running.
        If the server is running, this returns an error
        """
        if sid == -1:
            return create_response('A VoltDB Server not started wrong configuration', 500)

        if self.is_voltserver_running(database_id):
            return create_response('A VoltDB Server process is already running', 500)

        return_code = self.initialize_local_config(sid, is_forced)

        if return_code == 0:
            retcode = self.start_local_server(sid, pause, add_server)
            if (retcode == 0):
                HTTPListener.Global.SERVERS[sid]['isAdded'] = True
                HTTPListener.sync_configuration()
                return create_response('Success', 200)
            else:
                return create_response('Error', 500)
        else:
            # return create_response('Error starting server', 500)
            return create_response('Error', 500)
예제 #3
0
def check_validation_deployment(req):
    if 'systemsettings' in req.json and 'resourcemonitor' in req.json['systemsettings']:
        if 'memorylimit' in req.json['systemsettings']['resourcemonitor'] and \
                            'size' in req.json['systemsettings']['resourcemonitor']['memorylimit']:
            size = str(req.json['systemsettings']['resourcemonitor']['memorylimit']['size'])
            response = json.loads(HTTPListener.check_size_value(size, 'memorylimit').data)
            if 'error' in response:
                return {'status': 'error', 'error': response['error']}
            disk_limit_arr = []
            if 'disklimit' in req.json['systemsettings']['resourcemonitor'] and \
                            'feature' in req.json['systemsettings']['resourcemonitor']['disklimit']:
                for feature in req.json['systemsettings']['resourcemonitor']['disklimit']['feature']:
                    size = feature['size']
                    if feature['name'] in disk_limit_arr:
                        return {'status': 'error', 'error': 'Duplicate items are not allowed.'}
                    disk_limit_arr.append(feature['name'])
                    response = json.loads(HTTPListener.check_size_value(size, 'disklimit').data)
                    if 'error' in response:
                        return {'status': 'error', 'error': response['error']}
        if 'snapshot' in req.json and 'frequency' in req.json['snapshot']:
            frequency_unit = ['h', 'm', 's']
            frequency = str(req.json['snapshot']['frequency'])
            last_char =  frequency[len(frequency)-1]
            if last_char not in frequency_unit:
                return {'status': 'error', 'error': 'Snapshot: Invalid frequency value.'}
            frequency = frequency[:-1]
            try:
                int_frequency = int(frequency)
            except Exception, exp:
                return {'status': 'error', 'error': 'Snapshot: ' + str(exp)}
예제 #4
0
    def start_database(self, is_pause, recover=False):
        """
        Starts voltdb servers on all nodes configured for this database.
        Returns reponse with HTTP status code and error details json.
        """
        # sync deployment file first
        HTTPListener.sync_configuration()

        members = []
        current_database = HTTPListener.Global.DATABASES.get(self.database_id)
        if not current_database:
            return create_response(
                'No database found for id: %u' % self.database_id, 404)
        else:
            members = current_database['members']
        if not members:
            return create_response(
                'No servers configured for the database: %u' %
                self.database_id, 404)

        result = self.check_other_database_status(self.database_id)

        if not result:
            return make_response(
                jsonify({
                    'status': 404,
                    'statusString': 'Error'
                }), 404)

        # Check if there are valid servers configured for all ids
        for server_id in members:
            server = HTTPListener.Global.SERVERS.get(server_id)
            if not server:
                return create_response(
                    'Server details not found for id: %u' % server_id, 404)

        # Now start each server
        failed = False
        server_status = {}
        action = 'start'
        if recover:
            action = 'recover'
        for server_id in members:
            server = HTTPListener.Global.SERVERS.get(server_id)
            curr = server
            try:
                url = ('http://%s:%u/api/1.0/databases/%u/servers/%s?id=%u&pause=%s') % \
                                  (curr['hostname'], HTTPListener.__PORT__, self.database_id, action, server_id, is_pause)
                response = requests.put(url)
                if response.status_code != requests.codes.ok:
                    failed = True

                server_status[curr['hostname']] = json.loads(
                    response.text)['statusString']
            except Exception, err:
                failed = True
                print traceback.format_exc()
                server_status[curr['hostname']] = str(err)
예제 #5
0
    def start_database(self, is_pause, is_force):
        """
        Starts voltdb servers on all nodes configured for this database.
        Returns reponse with HTTP status code and error details json.
        """
        # sync deployment file first
        HTTPListener.sync_configuration()

        members = []
        current_database = HTTPListener.Global.DATABASES.get(self.database_id)
        if not current_database:
            return create_response('No database found for id: %u' % self.database_id, 404)
        else:
            members = current_database['members']
        if not members:
            return create_response('No servers configured for the database: %u' % self.database_id, 404)

        result = self.check_other_database_status(self.database_id)

        if not result:
            return make_response(jsonify({'status': 404, 'statusString': 'Error'}), 404)

        # Check if there are valid servers configured for all ids
        for server_id in members:
            server = HTTPListener.Global.SERVERS.get(server_id)
            if not server:
                return create_response('Server details not found for id: %u' % server_id, 404)

        # Now start each server
        server_unreachable = False
        error_msg = ''
        failed = False
        server_status = {}
        action = 'start'

        for server_id in members:
            server = HTTPListener.Global.SERVERS.get(server_id)
            curr = server
            try:
                url = ('http://%s:%u/api/1.0/databases/%u/servers/%s?id=%u&pause=%s&force=%s') % \
                                  (curr['hostname'], HTTPListener.__PORT__, self.database_id, action, server_id, is_pause, is_force)
                response = requests.put(url)
                if response.status_code != requests.codes.ok:
                    failed = True

                db_status = json.loads(response.text)['statusString']
                server_status[curr['hostname']] = db_status
            except Exception, err:
                if 'ConnectionError' in str(err):
                    error_msg = "Could not connect to the server " + curr['hostname'] + ". " \
                                "Please ensure that all servers are reachable."
                    server_unreachable = True
                    break
                failed = True
                print traceback.format_exc()
                server_status[curr['hostname']] = str(err)
예제 #6
0
def set_deployment_for_upload(database_id, request):
    dep_file = request.files['file']
    if dep_file and HTTPListener.allowed_file(dep_file.filename):
        try:
            content = dep_file.read()
            o = XML(content)
            xml_final = json.loads(json.dumps(etree_to_dict(o)))
            if 'deployment' in xml_final and type(xml_final['deployment']) is dict:
                deployment_data = get_deployment_for_upload(xml_final['deployment'])
                if type(deployment_data) is dict:
                    if 'error' in deployment_data:
                        return {'status': 'failure', 'error': deployment_data['error']}
                else:
                    deployment_json = deployment_data[0]
                req = HTTPListener.DictClass()
                req.json = {}
                req.json = deployment_json
                inputs = JsonInputs(req)
                if not inputs.validate():
                    return {'status': 'failure', 'errors': inputs.errors}

                result = check_validation_deployment(req)
                if 'status' in result and result['status'] == 'error':
                    return {'status': 'failure', 'error': result['error']}

                HTTPListener.map_deployment(req, database_id)
                HTTPListener.Global.DEPLOYMENT_USERS = {}
                if 'users' in req.json and 'user' in req.json['users']:
                    for user in req.json['users']['user']:
                        HTTPListener.Global.DEPLOYMENT_USERS[int(user['userid'])]= {
                                'name': user['name'],
                                'roles': user['roles'],
                                'password': user['password'],
                                'plaintext': user['plaintext'],
                                'databaseid': database_id,
                                'userid': user['userid']
                            }

                HTTPListener.sync_configuration()
                write_configuration_file()

            else:
                return {'status': 'failure', 'error': 'Invalid file content.'}

        except Exception as err:
            return {'status': 'failure', 'error': 'Invalid file content.'}
    else:
        return {'status': 'failure', 'error': 'Invalid file type.'}
    return {'status': 'success'}
예제 #7
0
    def start_database(self, recover=False):
        """
        Starts voltdb servers on all nodes configured for this database.
        Returns reponse with HTTP status code and error details json.
        """
        # sync deployment file first
        HTTPListener.sync_configuration()

        members = []
        current_database = HTTPListener.Global.DATABASES.get(self.database_id)
        if not current_database:
            return create_response("No database found for id: %u" % self.database_id, 404)
        else:
            members = current_database["members"]
        if not members:
            return create_response("No servers configured for the database: %u" % self.database_id, 404)

        # Check if there are valid servers configured for all ids
        for server_id in members:
            server = HTTPListener.Global.SERVERS.get(server_id)
            if not server:
                return create_response("Server details not found for id: %u" % server_id, 404)

        # Now start each server
        failed = False
        server_status = {}
        action = "start"
        if recover:
            action = "recover"
        for server_id in members:
            server = HTTPListener.Global.SERVERS.get(server_id)
            curr = server
            try:
                url = ("http://%s:%u/api/1.0/databases/%u/servers/%s?id=%u") % (
                    curr["hostname"],
                    HTTPListener.__PORT__,
                    self.database_id,
                    action,
                    server_id,
                )
                response = requests.put(url)
                if response.status_code != requests.codes.ok:
                    failed = True
                server_status[curr["hostname"]] = json.loads(response.text)["statusString"]
            except Exception, err:
                failed = True
                print traceback.format_exc()
                server_status[curr["hostname"]] = str(err)
예제 #8
0
    def start_database(self, recover=False):
        """
        Starts voltdb servers on all nodes configured for this database.
        Returns reponse with HTTP status code and error details json.
        """
        # sync deployment file first
        HTTPListener.sync_configuration() 
    
        members = []
        current_database = [database for database in HTTPListener.Global.DATABASES if database['id'] == self.database_id]
        if not current_database:
            return create_response('No database found for id: %u' % self.database_id, 404)
        else:
            members = current_database[0]['members']
        if not members:
            return create_response('No servers configured for the database: %u' % self.database_id, 404)

        # Check if there are valid servers configured for all ids
        for server_id in members:
            server = [server for server in HTTPListener.Global.SERVERS if server['id'] == server_id]
            if not server:
                return create_response('Server details not found for id: %u' % server_id, 404)

        # Now start each server
        failed = False
        server_status = {}
        action = 'start'
        if recover:
            action = 'recover'
        for server_id in members:
            server = [server for server in HTTPListener.Global.SERVERS if server['id'] == server_id]
            curr = server[0]
            try:
                url = ('http://%s:%u/api/1.0/databases/%u/servers/%s?id=%u') % \
                                  (curr['hostname'], HTTPListener.__PORT__, self.database_id, action, server_id)
                response = requests.put(url)
                if response.status_code != requests.codes.ok:
                    failed = True
                server_status[curr['hostname']] = json.loads(response.text)['statusstring']
            except Exception, err:
                failed = True
                print traceback.format_exc()
                server_status[curr['hostname']] = str(err)
예제 #9
0
    def start_database(self, recover=False):
        """
        Starts voltdb servers on all nodes configured for this database.
        Returns reponse with HTTP status code and error details json.
        """
        # sync deployment file first
        HTTPListener.sync_configuration() 
    
        members = []
        current_database = [database for database in HTTPListener.Global.DATABASES if database['id'] == self.database_id]
        if not current_database:
            return create_response('No database found for id: %u' % self.database_id, 404)
        else:
            members = current_database[0]['members']
        if not members:
            return create_response('No servers configured for the database: %u' % self.database_id, 404)

        # Check if there are valid servers configured for all ids
        for server_id in members:
            server = [server for server in HTTPListener.Global.SERVERS if server['id'] == server_id]
            if not server:
                return create_response('Server details not found for id: %u' % server_id, 404)

        # Now start each server
        failed = False
        server_status = {}
        action = 'start'
        if recover:
            action = 'recover'
        for server_id in members:
            server = [server for server in HTTPListener.Global.SERVERS if server['id'] == server_id]
            curr = server[0]
            try:
                url = ('http://%s:%u/api/1.0/databases/%u/servers/%s') % \
                                  (curr['hostname'], HTTPListener.__PORT__, self.database_id, action)
                response = requests.put(url)
                if (response.status_code != requests.codes.ok):
                    failed = True
                server_status[curr['hostname']] = json.loads(response.text)['statusstring']
            except Exception, err:
                failed = True
                print traceback.format_exc()
                server_status[curr['hostname']] = str(err)
예제 #10
0
def check_validation_deployment(req):
    if 'systemsettings' in req.json and 'resourcemonitor' in req.json[
            'systemsettings']:
        if 'memorylimit' in req.json['systemsettings']['resourcemonitor'] and \
                            'size' in req.json['systemsettings']['resourcemonitor']['memorylimit']:
            size = str(req.json['systemsettings']['resourcemonitor']
                       ['memorylimit']['size'])
            response = json.loads(
                HTTPListener.check_size_value(size, 'memorylimit').data)
            if 'error' in response:
                return {'status': 'error', 'error': response['error']}
            disk_limit_arr = []
            if 'disklimit' in req.json['systemsettings']['resourcemonitor'] and \
                            'feature' in req.json['systemsettings']['resourcemonitor']['disklimit']:
                for feature in req.json['systemsettings']['resourcemonitor'][
                        'disklimit']['feature']:
                    size = feature['size']
                    if feature['name'] in disk_limit_arr:
                        return {
                            'status': 'error',
                            'error': 'Duplicate items are not allowed.'
                        }
                    disk_limit_arr.append(feature['name'])
                    response = json.loads(
                        HTTPListener.check_size_value(size, 'disklimit').data)
                    if 'error' in response:
                        return {'status': 'error', 'error': response['error']}
        if 'snapshot' in req.json and 'frequency' in req.json['snapshot']:
            frequency_unit = ['h', 'm', 's']
            frequency = str(req.json['snapshot']['frequency'])
            last_char = frequency[len(frequency) - 1]
            if last_char not in frequency_unit:
                return {
                    'status': 'error',
                    'error': 'Snapshot: Invalid frequency value.'
                }
            frequency = frequency[:-1]
            try:
                int_frequency = int(frequency)
            except Exception, exp:
                return {'status': 'error', 'error': 'Snapshot: ' + str(exp)}
예제 #11
0
def set_deployment_for_upload(database_id, request):
    dep_file = request.files['file']
    if dep_file and HTTPListener.allowed_file(dep_file.filename):
        try:
            content = dep_file.read()
            o = XML(content)
            xml_final = json.loads(json.dumps(etree_to_dict(o)))
            if 'deployment' in xml_final and type(
                    xml_final['deployment']) is dict:
                deployment_data = get_deployment_for_upload(
                    xml_final['deployment'])
                if type(deployment_data) is dict:
                    if 'error' in deployment_data:
                        return {
                            'status': 'failure',
                            'error': deployment_data['error']
                        }
                else:
                    deployment_json = deployment_data[0]
                req = HTTPListener.DictClass()
                req.json = {}
                req.json = deployment_json
                inputs = JsonInputs(req)
                if not inputs.validate():
                    return {'status': 'failure', 'errors': inputs.errors}

                result = check_validation_deployment(req)
                if 'status' in result and result['status'] == 'error':
                    return {'status': 'failure', 'error': result['error']}

                HTTPListener.map_deployment(req, database_id)
                HTTPListener.Global.DEPLOYMENT_USERS = {}
                if 'users' in req.json and 'user' in req.json['users']:
                    for user in req.json['users']['user']:
                        HTTPListener.Global.DEPLOYMENT_USERS[int(
                            user['userid'])] = {
                                'name': user['name'],
                                'roles': user['roles'],
                                'password': user['password'],
                                'plaintext': user['plaintext'],
                                'databaseid': database_id,
                                'userid': user['userid']
                            }

                HTTPListener.sync_configuration()
                write_configuration_file()

            else:
                return {'status': 'failure', 'error': 'Invalid file content.'}

        except Exception as err:
            return {'status': 'failure', 'error': 'Invalid file content.'}
    else:
        return {'status': 'failure', 'error': 'Invalid file type.'}
    return {'status': 'success'}