def create(self): with database.database.atomic() as txn: cell = Cell() if not self._save_cell(cell): txn.rollback() return False for idx, nform in enumerate(self.nodes): if not self._save_cnode(nform, None, idx, cell): txn.rollback() return False try: cell.deploy_conf() except Exception as e: logger.exceptions(e) return True
def _cell_status(self): cell_name = self.target.name from cellconfig.model import Cell cell = Cell.select().where(Cell.name == cell_name).first() try: st = self._get_status( self.target.group.cell.name, '/RAS/{}/{}'.format(cell.get_appname(), cell.name), cell.nodes) if st['running'] == st['total']: status = 'running' elif st['running'] == 0: status = 'stopped' elif st['running'] >= (st['total'] + 1) // 2: status = 'warning' else: status = 'error' st.update({'cid': cell.id, 'name': cell.name, 'status': status}) return st except Exception as e: logger.exception(e) return { 'cid': cell.id, 'name': cell.name, 'status': 'unknown', 'total': len(cell.nodes) }
def api_cnode_state_by_name(name, no): query = Cell.select().where(Cell.name == name) try: id = query[0].id except: abort(404) return api_cnode_state(id, no)
def api_cell_detail_by_name(name): query = Cell.select().where(Cell.name == name) try: id = query[0].id except: abort(404) return api_cell_detail(id)
def query_cell_all_list(): query = Cell.select().dicts() cell_list = [] for cell in query: cell_list.append(cell) cell['url'] = url_for('api_cell_detail', id=cell['id'], _external=True) return jsonify(cell=cell_list)
def _update_selectfield(self): registerd = RasTarget.select( RasTarget.name).where(RasTarget.type == 'cell') self.cell.choices = [ (c.id, c.name) for c in Cell.select().where(Cell.name.not_in(registerd)) ]
def obj2dict(cls, obj): cell = Cell.select().where(Cell.name == obj.name).first() logger.debug("CELL ID: {}".format(cell.id)) return { 'type': 'cell', 'cell': cell.id, 'comment': obj.comment, }
def api_cell_misc_data(cid, dtype): cell = Cell.get(Cell.id == cid) g = [node.get_misc_info_async(dtype) for node in cell.nodes] gevent.joinall(g) ret = [] for x in g: ret.extend(x.get()) logger.debug("RET: {}".format(ret)) return jsonify(ret)
def cell_list(): if request.method == 'GET': cells = Cell.select().where(Cell.type != 'RAS') return render_template('cell_list.html', cells=cells) elif request.method == 'POST': form = CellForm(request.form) if not (form.validate() and form.create()): return render_template('cell_create.html', form=form) return redirect(url_for('cell_list'))
def delete(cls, id): with database.database.atomic(): cell = Cell.get(Cell.id == id) try: from .ras.forms import RasTargetForm RasTargetForm.delete_nonexists_target('cell', cell.name) except Exception as e: logger.exception(e) cell.delete_instance() CellNode.delete().where(CellNode.cell == id).execute()
def rascell_list(): if request.method == 'GET': cells = Cell.select().where(Cell.type == 'RAS') return render_template('ras/cell_list.html', cells=cells) elif request.method == 'POST': form = RasCellForm(request.form) if not form.validate(): return render_template('ras/cell_create.html', form=form) form.create() return redirect(url_for('rasgrp_list'))
def create(self, grpid): logger.debug("CREATE: {}".format(grpid)) tgt = RasTarget() cell = Cell.get(Cell.id == self.cell.data) tgt.name = cell.name tgt.group = grpid tgt.type = 'cell' tgt.path = '{app}/{cell}'.format(app=cell.get_appname(), cell=cell.name) tgt.comment = self.comment.data tgt.save()
def create(self, grpid): logger.debug("CREATE: {}".format(grpid)) tgt = RasTarget() cell = Cell.get(Cell.id == self.cell.data) tgt.name = cell.name tgt.group = grpid tgt.type = 'cell' tgt.path = '{app}/{cell}'.format( app=cell.get_appname(), cell=cell.name) tgt.comment = self.comment.data tgt.save()
def update(self, id): with database.database.atomic() as txn: cell = Cell().get(Cell.id == id) if not self._save_cell(cell): txn.rollback() return False for cnode in cell.nodes: if not self.exists_cnode(cnode): cnode.delete().where(CellNode.id == cnode.id).execute() for idx, nform in enumerate(self.nodes): node_id = nform.form['node_id'].data nid = (int(node_id) if node_id is not None and node_id.isnumeric() else None) if not self._save_cnode(nform, nid, idx, cell): txn.rollback() return False try: cell.deploy_conf() except Exception as e: logger.exceptions(e) return True
def rasgrp_list(): if request.method == 'GET': if Cell.select().where(Cell.type == 'RAS').count() == 0: return redirect(url_for('rascell_list')) grps = RasGroup.select() return render_template('ras/ras_index.html', groups=grps) elif request.method == 'POST': form = RasGroupForm(request.form) if not form.validate(): return render_template('ras/group_create.html', form=form) logger.debug('URL: {}'.format(request.url_root)) grp = form.create(request.url_root) logger.debug('GROUP: {}'.format(str(grp))) return redirect(url_for('rasgrp_list'))
def cell_event(id): cell = Cell.get(Cell.id == id) logger.debug("REQUEST: {}".format(cell.name)) listener = EventListener('cell:status_detail', source=cell.name) ev = {'name': 'status_detail', 'target': cell} def setup(_callback): listener.regist(_callback) listener.enable(ev) def teardown(_callback): listener.unregist(_callback) listener.disable(ev) return _make_sse_response(_generator(setup, teardown))
def cell_detail(id): if request.method == 'GET': cell = Cell.get(Cell.id == id) nstatus = cell.get_node_status() nodes = [v for k, v in sorted(nstatus.iteritems())] return render_template('cell_show.html', cell=cell, nodes=nodes) elif request.method == 'POST': if request.form['operation'] == 'Update': form = CellForm(request.form) if not (form.validate() and form.update(id)): return render_template('cell_update.html', form=form, id=id) elif request.form['operation'] == 'Delete': CellForm.delete(id) else: abort(400) return redirect(url_for('cell_list'))
def api_cell_op(id, op, params=None): cell = Cell.get(Cell.id == id) if op == 'start': cell.start(params) return make_response('', 204) elif op == 'stop': cell.stop(params) return make_response('', 204) elif op == 'deploy config': cell.deploy_conf() return make_response('', 204) elif op == 'deploy core': for cnode in cell.nodes: cnode.node.deploy() return make_response('', 204) else: abort(400, 'bad operation "{0}"'.format(op))
def cell_list_event(): listener = EventListener('cell:status') cells = Cell.select() events = [{'name': 'status;{}'.format(cell.name), 'target': cell} for cell in cells] def setup(_callback): listener.regist(_callback) for ev in events: listener.enable(ev) def teardown(_callback): listener.unregist(_callback) for ev in events: listener.disable(ev) return _make_sse_response(_generator(setup, teardown))
def api_cell_detail(id): if request.method == 'GET': return api_cell_get(id) elif request.method == 'DELETE': with database.database.atomic(): cell = Cell.get(Cell.id == id) cell.delete_instance(recursive=True) return make_response('', 204) elif request.method == 'PUT': params = request.get_json() logger.debug("PUT: {}".format(params)) if 'op' in params: return api_cell_op(id, params['op'], params) elif 'cell' in params: return api_cell_update(id, params['cell']) else: abort(400) else: abort(405)
def cell_list_event(): listener = EventListener('cell:status') cells = Cell.select() events = [{ 'name': 'status;{}'.format(cell.name), 'target': cell } for cell in cells] def setup(_callback): listener.regist(_callback) for ev in events: listener.enable(ev) def teardown(_callback): listener.unregist(_callback) for ev in events: listener.disable(ev) return _make_sse_response(_generator(setup, teardown))
def api_cell_update(id, jcell): with database.database.atomic(): cell = Cell.get(Cell.id == id) jnodes = jcell['nodes'] del jcell['nodes'] _update_model(Cell, cell, jcell) cell.save() cnids = [jcnode['id'] for jcnode in jnodes if 'id' in jcnode] for cnode in cell.nodes: if cnode.id not in cnids: cnode.delete_instance() for jcnode in jnodes: if 'id' in jcnode: cnode = CellNode.get(CellNode.id == jcnode['id']) _update_model(CellNode, cnode, jcnode) else: jcnode['cell'] = cell.id cnode = dict_to_model(CellNode, jcnode) cnode.save() resp = jsonify(cell=_cell_to_dict(cell)) return resp
def _cell_status(self): cell_name = self.target.name from cellconfig.model import Cell cell = Cell.select().where(Cell.name == cell_name).first() try: st = self._get_status( self.target.group.cell.name, '/RAS/{}/{}'.format(cell.get_appname(), cell.name), cell.nodes) if st['running'] == st['total']: status = 'running' elif st['running'] == 0: status = 'stopped' elif st['running'] >= (st['total'] + 1) // 2: status = 'warning' else: status = 'error' st.update({'cid': cell.id, 'name': cell.name, 'status': status}) return st except Exception as e: logger.exception(e) return {'cid': cell.id, 'name': cell.name, 'status': 'unknown', 'total': len(cell.nodes)}
def _exists_cell(id): try: cell = Cell.get(Cell.id == id) except Cell.DoesNotExist: return False return True
def api_cell_get(id): cell = Cell.get(Cell.id == id) return cell_get(cell)
def get_cell_name(self, id): cell = Cell.get(Cell.id == id) return cell.name
def _update_select(self): cells = Cell.select().where(Cell.type == 'RAS') self.cell.choices = [(c.id, c.name) for c in cells]
def cell_delete(id): cell = Cell.get(Cell.id == id) form = CellForm(obj=cell) form.populate_cellnodes(cell.nodes) return render_template('cell_delete.html', form=form, id=id)
def cell_misc(id): cell = Cell.get(Cell.id == id) target = request.args['target'] info0 = [] if target == 'accept': title = (u'クライアント情報', u'クライアント一覧') label = [u'#', u'サーバ', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済リクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻'] elif target == 'FdEvent': title = (u'FDイベント情報', u'FDイベント情報') label = [u'#', u'サーバ', u'fd', u'FDイベントフラグ'] elif target == 'out_of_band': title = (u'帯域外データ情報', u'帯域外データ一覧') label = [u'#', u'サーバ', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'検証済', u'データのメモリアドレス', u'PAXOS順番号'] elif target == 'path': title = (u'ディレクトリイベント情報', u'イベント受付先のクライアント一覧') label = [u'#', u'サーバ', u'ディレクトリ名', u'参照数', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済みリクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻', u'FD番号', u'イベントビット'] elif target == 'lock': title = (u'ロックイベント情報', u'ロックイベント一覧') label = [u'#', u'サーバ', u'ロック名', u'ロック保有者数', u'保有/待機', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済みリクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻', u'FD番号', u'イベントビット'] elif target == 'queue': title = (u'キューイベント一覧', u'キューデータ一覧', u'待機クライアント一覧') label = [[u'#', u'サーバ', u'キュー名', u'キューデータ数', u'ACK待ち', u'データ長'], [u'#', u'サーバ', u'キュー名', u'キューデータ数', u'ACK待ち', u'待機種', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済みリクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻', u'FD番号', u'イベントビット']] info0 = cell.get_misc_info(target).data elif target == 'meta': title = (u'メタデータ情報', u'メタデータ一覧') label = [u'#', u'サーバ', u'メモリアドレス', u'参照数', u'メタデータ(ファイル)名', u'fd番号', u'ファイルサイズ'] elif target == 'fd': title = (u'Fdデータ情報', u'Fdデータ一覧') label = [u'#', u'サーバ', u'メモリアドレス', u'参照数', u'fdデータ(ファイル)名', u'実ファイルのディレクトリ名', u'実ファイルのファイル名(basename)', u'fd番号'] elif target == 'block': title = (u'ブロックキャッシュデータ情報', u'ブロックキャッシュデータ一覧') label = [u'#', u'サーバ', u'メモリアドレス', u'参照数', u'ファイル名', u'開始オフセット(バイト)', u'データ長(バイト)', u'フラグ'] elif target == 'df': title = (u'領域空き情報', u'領域空き状態') label = [u'#', u'サーバ', u'ファイルシステム', u'総量', u'使用済', u'未使用', u'使用%', u'マウントポイント'] else: abort(400) if isinstance(info0, tuple): tbl = [] for i, v in enumerate(info0): tbl.append(dict( title=title[i + 1], label=label[i], info=sorted(v, key=lambda x: int(x[0])), )) return render_template('cell_misc2.html', cell=cell, title=title[0], table=tbl) else: info = sorted(info0, key=lambda x: int(x[0])) return render_template('cell_misc.html', cell=cell, title=title, label=label, info=info)
def tearDown(self): CellNode.delete().execute() Cell.delete().execute() Node.delete().execute()
def _update_selectfield(self): registerd = RasTarget.select(RasTarget.name).where( RasTarget.type == 'cell') self.cell.choices = [ (c.id, c.name) for c in Cell.select().where(Cell.name.not_in(registerd))]
def cell_misc(id): cell = Cell.get(Cell.id == id) target = request.args['target'] info0 = [] if target == 'accept': title = (u'クライアント情報', u'クライアント一覧') label = [ u'#', u'サーバ', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済リクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻' ] elif target == 'FdEvent': title = (u'FDイベント情報', u'FDイベント情報') label = [u'#', u'サーバ', u'fd', u'FDイベントフラグ'] elif target == 'out_of_band': title = (u'帯域外データ情報', u'帯域外データ一覧') label = [ u'#', u'サーバ', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'検証済', u'データのメモリアドレス', u'PAXOS順番号' ] elif target == 'path': title = (u'ディレクトリイベント情報', u'イベント受付先のクライアント一覧') label = [ u'#', u'サーバ', u'ディレクトリ名', u'参照数', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済みリクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻', u'FD番号', u'イベントビット' ] elif target == 'lock': title = (u'ロックイベント情報', u'ロックイベント一覧') label = [ u'#', u'サーバ', u'ロック名', u'ロック保有者数', u'保有/待機', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済みリクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻', u'FD番号', u'イベントビット' ] elif target == 'queue': title = (u'キューイベント一覧', u'キューデータ一覧', u'待機クライアント一覧') label = [[u'#', u'サーバ', u'キュー名', u'キューデータ数', u'ACK待ち', u'データ長'], [ u'#', u'サーバ', u'キュー名', u'キューデータ数', u'ACK待ち', u'待機種', u'クライアントアドレス', u'クライアントポート', u'プロセスID', u'セッション番号', u'リクエスト順番号', u'再接続番号', u'試行回数', u'参照数', u'fd', u'接続状態', u'処理開始リクエスト順番号', u'処理終了リクエスト順番号', u'応答済みリクエスト順番号', u'コマンド番号', u'送信待ちイベント数', u'イベント即送信可能性', u'生成時刻', u'アクセス時刻', u'FD番号', u'イベントビット' ]] info0 = cell.get_misc_info(target).data elif target == 'meta': title = (u'メタデータ情報', u'メタデータ一覧') label = [ u'#', u'サーバ', u'メモリアドレス', u'参照数', u'メタデータ(ファイル)名', u'fd番号', u'ファイルサイズ' ] elif target == 'fd': title = (u'Fdデータ情報', u'Fdデータ一覧') label = [ u'#', u'サーバ', u'メモリアドレス', u'参照数', u'fdデータ(ファイル)名', u'実ファイルのディレクトリ名', u'実ファイルのファイル名(basename)', u'fd番号' ] elif target == 'block': title = (u'ブロックキャッシュデータ情報', u'ブロックキャッシュデータ一覧') label = [ u'#', u'サーバ', u'メモリアドレス', u'参照数', u'ファイル名', u'開始オフセット(バイト)', u'データ長(バイト)', u'フラグ' ] elif target == 'df': title = (u'領域空き情報', u'領域空き状態') label = [ u'#', u'サーバ', u'ファイルシステム', u'総量', u'使用済', u'未使用', u'使用%', u'マウントポイント' ] else: abort(400) if isinstance(info0, tuple): tbl = [] for i, v in enumerate(info0): tbl.append( dict( title=title[i + 1], label=label[i], info=sorted(v, key=lambda x: int(x[0])), )) return render_template('cell_misc2.html', cell=cell, title=title[0], table=tbl) else: info = sorted(info0, key=lambda x: int(x[0])) return render_template('cell_misc.html', cell=cell, title=title, label=label, info=info)