예제 #1
0
def main(argv):
    print('Kamonohashi Slackbot')

    # KQI実行のための環境変数追加
    if os.name == 'posix':
        # linux: kqiが格納されている場所 (デフォルトの想定場所)
        # 本当は外だしすべき
        kqicli = '/home/(username)/.local/bin'
        os.environ['PATH'] = os.environ['PATH'] + ':' + kqicli

    # 設定ファイルの読込み
    sec = JsonManager(filepath=os.path.join(FLAGS.config_root, 'secure.json'))
    cfg = JsonManager(filepath=os.path.join(FLAGS.config_root, 'config.json'))
    msg = MessageManager(filepath=os.path.join(FLAGS.config_root, 'message.json'), kamonohashi_uri=sec['KAMONOHASHI']['Server'], postmessage_uri=sec['SlackURI'])

    # 監視状態変数
    watch_status = { 
        'dailyjob' : False,
        'watching' : False,
        'waketime' : datetime.now()
    }
    # テナント状態変数
    tenant_status = {
        'count' : {},
        'state' : {}
    }
    tenant_active_job = {}
    # 監視開始
    print('Watch Loop Start')
    while True:
        sec.Load()
        kqi.Login(sec['KAMONOHASHI']['Application']['Username'], sec['KAMONOHASHI']['Application']['Password'])
        tenants = kqi.GetTenantDict()
        print('Daily Loop Start')
        while datetime.now().day == watch_status['waketime'].day:
            # JSONファイルの更新確認
            msg.Load()
            if cfg.Load():
                # 設定ファイルの更新があればテナント情報も再取得する
                tenants = kqi.GetTenantDict()
            # 監視状態更新
            watch_status = UpdateWatchStatus(watch_status, GetWatchCondition(cfg), msg)
            # 監視状態変数のクリア
            tenant_status['count'] = {}
            # 監視状態がアクティブの場合はテナント毎に監視処理を行う
            for tenant in tenants:
                tenant_condition = {}
                if str(tenant) in cfg['Tenant']:
                    tenant_condition = cfg['Tenant'][str(tenant)]
                kqi.SwitchTenant(tenant)
                # 監視状態かどうか
                tenant_status = UpdateTenantTrainStatus(tenant_status, tenant_condition, tenant, tenants, watch_status, msg, kqi)
                tenant_status = UpdateTenantInferStatus(tenant_status, tenant_condition, tenant, tenants, watch_status, msg, kqi)
            # サーバーヘルス監視(特に監視したいのはGPU温度)
            # T.B.D
            # すべての監視対象テナントでしばらくメッセージ送信していない場合は実行中に応じてメッセージを投げる
            if watch_status['watching'] and msg.IsPassedTime(seconds=120 * 60):
                msg.SendMessage(msg.CreateTenantsRunningInfo(tenants, tenant_status['count']))
                msg.UpdateTimestamp()
            # 連続で処理すると負荷がかかるため、指定したポーリング間隔で待機
            time.sleep(cfg['Polling'])
        # 日の処理完了を抜けた場合はリセットする
        watch_status['dailyjob'] = False
        watch_status['waketime'] = datetime.now()