def run(self):
    super(zkSoftimageWorkThread, self).run()
    job = self.frame.job

    cfg = zookeeper.zkConfig()
    dccversion = job.dccversion
    folder = None
    for suffix in ['SP2', 'SP1', '']:
      folder = os.path.join(cfg.get('softimage_root_folder', ''), 'Softimage %s %s' % (dccversion, suffix))
      if os.path.exists(folder):
        if len(suffix) > 0:
          dccversion = dccversion + ' ' + suffix
        break

    if not os.path.exists(folder):
      return

    bin = os.path.join(folder, 'Application', 'bin', 'xsibatch.exe')

    env = getSoftimageEnv(cfg, dccversion)

    zookeeperPath = os.path.split(os.path.split(zookeeper.__file__)[0])[0]
    dccPath = os.path.join(zookeeperPath, 'dccs', 'Softimage')

    # create a settings template
    prefsFolder = os.path.join(env['XSI_USERHOME'], 'Data', 'Preferences')
    if not os.path.exists(prefsFolder):
      os.makedirs(prefsFolder)
    template = open(os.path.join(dccPath, 'default.xsipref'), 'rb').read()
    template = template.replace('%VERSION%', dccversion)

    # localize workgroups
    localPath = cfg.get('softimage_workgroup_root')
    remotePath = zookeeper.zkDB.zkSetting.getByName(self.connection, 'softimage_workgroup_root').value

    self.log('Synchronizing workgroups...')
    zookeeper.zkClient.zk_synchronizeFolder(remotePath, localPath, logFunc = self.logCallback)

    workgroups = []

    workGroupRoot = cfg.get('softimage_workgroup_root', '')
    workGroupGeneral = os.path.join(workGroupRoot, 'general')
    if not os.path.exists(workGroupGeneral):
      os.makedirs(workGroupGeneral)
    for f in glob.glob(os.path.join(workGroupGeneral, '*')):
      if f.startswith('.'):
        continue
      workgroups += [os.path.normpath(f)]
    workGroupRender = os.path.join(workGroupRoot, 'renderer', job.renderer, job.rendererversion, 'Softimage%s' % dccversion.replace(' ', ''))
    if os.path.exists(workGroupRender):
      workgroups += [os.path.normpath(workGroupRender)]

    template = template.replace('%WORKGROUPS%', ';'.join(workgroups))
    open(os.path.join(prefsFolder, 'default.xsipref'), 'wb').write(template)

    args = ['-processing', '-script']
    args += [os.path.join(dccPath, 'munch.py')]

    self.launchSubProcess(bin, args = args, env = env)
    self.waitForSubProcess()
예제 #2
0
    def launchSubProcess(self, cmd, args, env):

        if not os.path.exists(cmd):
            self.__machine.sendNotification('Cannot start "%s"' % cmd,
                                            self.frame,
                                            severity='ERROR')
            return False

        # ensure to include zookeeper in the path
        zookeeperPath = os.path.split(os.path.split(zookeeper.__file__)[0])[0]
        env['PYTHONPATH'] = env.get('PYTHONPATH') + os.pathsep + zookeeperPath

        cfg = zookeeper.zkConfig()
        job = self.frame.job
        project = self.frame.project

        # also include all of the zookeeper settings
        env['ZK_IP'] = self.connection.ip
        env['ZK_PORT'] = self.connection.port
        env['ZK_DATABASE'] = self.connection.database
        env['ZK_MACHINE'] = self.machine.id
        env['ZK_PROJECT'] = self.frame.projectid
        env['ZK_PROJECT_SCRATCH_FOLDER'] = project.getScratchFolder(cfg)
        env['ZK_JOB'] = self.frame.jobid
        env['ZK_JOB_SCRATCH_FOLDER'] = job.getScratchFolder(cfg)
        env['ZK_FRAME'] = self.frame.id
        env['ZK_DCC'] = job.dcc
        env['ZK_DCC_VERSION'] = job.dccversion
        env['ZK_RENDERER'] = job.renderer
        env['ZK_RENDERER_VERSION'] = job.rendererversion

        # fill in all config fields as env vars
        cfgFields = cfg.getFields()
        for f in cfgFields:
            env['ZK_' + str(f['name'].upper())] = str(f['value'])

        for key in env:
            env[key] = str(env[key])

        cmdargs = [cmd] + args
        self.__process = subprocess.Popen(cmdargs,
                                          env=env,
                                          stdout=subprocess.PIPE,
                                          stderr=subprocess.PIPE,
                                          shell=False)

        p = psutil.Process(self.__process.pid)
        if self.__machine.priority == 'LOW':
            p.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)
        elif self.__machine.priority == 'MED':
            p.nice(psutil.NORMAL_PRIORITY_CLASS)
        elif self.__machine.priority == 'HIGH':
            p.nice(psutil.ABOVE_NORMAL_PRIORITY_CLASS)
예제 #3
0
  def launchSubProcess(self, cmd, args, env):

    if not os.path.exists(cmd):
      self.__machine.sendNotification('Cannot start "%s"' % cmd, self.frame, severity='ERROR')
      return False

    # ensure to include zookeeper in the path
    zookeeperPath = os.path.split(os.path.split(zookeeper.__file__)[0])[0]
    env['PYTHONPATH'] = env.get('PYTHONPATH') + os.pathsep + zookeeperPath

    cfg = zookeeper.zkConfig()
    job = self.frame.job
    project = self.frame.project

    # also include all of the zookeeper settings
    env['ZK_IP'] = self.connection.ip
    env['ZK_PORT'] = self.connection.port
    env['ZK_DATABASE'] = self.connection.database
    env['ZK_MACHINE'] = self.machine.id
    env['ZK_PROJECT'] = self.frame.projectid
    env['ZK_PROJECT_SCRATCH_FOLDER'] = project.getScratchFolder(cfg)
    env['ZK_JOB'] = self.frame.jobid
    env['ZK_JOB_SCRATCH_FOLDER'] = job.getScratchFolder(cfg)
    env['ZK_FRAME'] = self.frame.id
    env['ZK_DCC'] = job.dcc
    env['ZK_DCC_VERSION'] = job.dccversion
    env['ZK_RENDERER'] = job.renderer
    env['ZK_RENDERER_VERSION'] = job.rendererversion

    # fill in all config fields as env vars
    cfgFields = cfg.getFields()
    for f in cfgFields:
      env['ZK_' + str(f['name'].upper())] = str(f['value'])

    for key in env:
      env[key] = str(env[key])

    cmdargs = [cmd] + args
    self.__process = subprocess.Popen(cmdargs, env = env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = False)

    p = psutil.Process(self.__process.pid)
    if self.__machine.priority == 'LOW':
      p.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)
    elif self.__machine.priority == 'MED':
      p.nice(psutil.NORMAL_PRIORITY_CLASS)
    elif self.__machine.priority == 'HIGH':
      p.nice(psutil.ABOVE_NORMAL_PRIORITY_CLASS)
예제 #4
0
  def __init__(self, connection):

    self.__conn = connection
    self.__cfg = zookeeper.zkConfig()

    super(zkManager, self).__init__('Manager')

    self.__widgets = {}
    self.__timers = {}

    self.setMinimumWidth(640)
    self.setMinimumHeight(800)

    self.__widgets['buttonsWidget'] = QtGui.QWidget()
    self.__widgets['buttonsWidget'].setContentsMargins(0, 0, 0, 0)
    self.addWidgetToCentral(self.__widgets['buttonsWidget'])

    buttonsLayout = QtGui.QHBoxLayout()
    self.__widgets['buttonsWidget'].setLayout(buttonsLayout)

    self.__widgets['refreshButton'] = QtGui.QPushButton("Refresh", self.__widgets['buttonsWidget'])
    buttonsLayout.addWidget(self.__widgets['refreshButton'])
    self.__widgets['refreshButton'].clicked.connect(self.poll)

    self.__widgets['tabs'] = QtGui.QTabWidget()
    self.addWidgetToCentral(self.__widgets['tabs'])

    # jobs
    labels = ['project', 'job', 'user', 'frames', 'prio', 'status', 'progress', 'remaining', 'total']
    widths = [2,         3,     1,      1,        1,      1,        6,          2,           2      ]
    self.__widgets['jobs'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_jobs_for_manager',
      labels = labels,
      widths = widths,
      getItemDataCallback = self.onJobGetData
      )
    self.__widgets['jobs'].contextMenuRequested.connect(self.onJobContextMenu)
    self.__widgets['jobs'].doubleClicked.connect(self.onJobDoubleClicked)

    # projects
    labels = ['project', 'jobs', 'machines']
    self.__widgets['projects'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_projects_for_manager',
      labels = labels
      )
    self.__widgets['projects'].contextMenuRequested.connect(self.onProjectContextMenu)

    # machines
    labels = ['name', 'groups', 'status', 'prio', 'cpu', 'ram']
    widths = [2,      4,        1.3,      1,      2,     2    ]
    self.__widgets['machines'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_machines_for_manager',
      labels = labels,
      widths = widths,
      getItemDataCallback = self.onMachineGetData
      )
    self.__widgets['machines'].contextMenuRequested.connect(self.onMachineContextMenu)
    self.__widgets['machines'].doubleClicked.connect(self.onMachineDoubleClicked)

    # groups
    labels = ['name', 'machines']
    widths = [2,      10        ]
    self.__widgets['groups'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachineGroup,
      procedure = 'get_groups_for_manager',
      labels = labels,
      widths = widths,
      getItemDataCallback = self.onMachineGroupGetData
      )
    self.__widgets['groups'].contextMenuRequested.connect(self.onMachineGroupContextMenu)

    # frames
    labels = ['job', 'time', 'status', 'duration', 'machine', 'prio', 'package']
    self.__widgets['frames'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_frames_for_manager',
      procedureArgs = [0],
      labels = labels,
      getItemDataCallback = self.onFrameGetData
      )
    self.__widgets['frames'].contextMenuRequested.connect(self.onFrameContextMenu)
    self.__widgets['frames'].doubleClicked.connect(self.onFrameDoubleClicked)

    # log
    self.__widgets['log'] = QtGui.QPlainTextEdit()

    self.__widgets['tabs'].addTab(self.__widgets['jobs'], 'jobs')
    self.__widgets['tabs'].addTab(self.__widgets['projects'], 'projects')
    self.__widgets['tabs'].addTab(self.__widgets['machines'], 'machines')
    self.__widgets['tabs'].addTab(self.__widgets['groups'], 'groups')
    self.__widgets['tabs'].addTab(self.__widgets['frames'], 'frames')
    self.__widgets['tabs'].addTab(self.__widgets['log'], 'log')

    self.__timers['poll'] = QtCore.QTimer(self)
    self.__timers['poll'].setInterval(5000)
    self.__timers['poll'].setSingleShot(False)
    self.connect(self.__timers['poll'], QtCore.SIGNAL("timeout()"), self.poll)

    for key in self.__timers:
      self.__timers[key].start()

    self.show()
예제 #5
0
파일: munch.py 프로젝트: juanpgit/zookeeper
import os
import sys
import datetime
import time
import zookeeper

# redirect output
hook = zookeeper.zkClient.zkSoftimageLogHook(Application)
sys.stdout = hook
sys.stderr = hook

cfg = zookeeper.zkConfig()
scratchdisc_enabled = cfg.get('scratchdisc_enabled', False)
scratchdisc_folder = cfg.get('scratchdisc_folder', '')

def log(message):
  prefix = datetime.datetime.now().strftime("%Y-%m-%d %H::%M::%S: ")
  Application.LogMessage(prefix+str(message))

def setFrameAsFailed(connection, frame, reason):
  frame.setAsFailed()
  log('Frame %d failed: %s' % (frame.time, reason))

def munch():

  connection = zookeeper.zkDB.zkConnection(
    ip = os.environ['ZK_IP'],
    port = int(os.environ['ZK_PORT']),
    database = os.environ['ZK_DATABASE'],
    debug = False
    )
예제 #6
0
파일: munch.py 프로젝트: juanpgit/zookeeper
import os
import sys
import datetime
import time
import zookeeper

# redirect output
hook = zookeeper.zkClient.zkSoftimageLogHook(Application)
sys.stdout = hook
sys.stderr = hook

cfg = zookeeper.zkConfig()
scratchdisc_enabled = cfg.get('scratchdisc_enabled', False)
scratchdisc_folder = cfg.get('scratchdisc_folder', '')


def log(message):
    prefix = datetime.datetime.now().strftime("%Y-%m-%d %H::%M::%S: ")
    Application.LogMessage(prefix + str(message))


def setFrameAsFailed(connection, frame, reason):
    frame.setAsFailed()
    log('Frame %d failed: %s' % (frame.time, reason))


def munch():

    connection = zookeeper.zkDB.zkConnection(
        ip=os.environ['ZK_IP'],
        port=int(os.environ['ZK_PORT']),
예제 #7
0
  def __init__(self, connection):

    self.__conn = connection
    self.__cfg = zookeeper.zkConfig()

    super(zkManager, self).__init__('Manager')

    self.__widgets = {}
    self.__timers = {}

    self.setMinimumWidth(640)
    self.setMinimumHeight(800)

    self.__widgets['buttonsWidget'] = QtGui.QWidget()
    self.__widgets['buttonsWidget'].setContentsMargins(0, 0, 0, 0)
    self.addWidgetToCentral(self.__widgets['buttonsWidget'])

    buttonsLayout = QtGui.QHBoxLayout()
    self.__widgets['buttonsWidget'].setLayout(buttonsLayout)

    self.__widgets['refreshButton'] = QtGui.QPushButton("Refresh", self.__widgets['buttonsWidget'])
    buttonsLayout.addWidget(self.__widgets['refreshButton'])
    self.__widgets['refreshButton'].clicked.connect(self.poll)

    self.__widgets['tabs'] = QtGui.QTabWidget()
    self.addWidgetToCentral(self.__widgets['tabs'])

    # jobs
    labels = ['project', 'job', 'user', 'frames', 'prio', 'status', 'progress', 'remaining', 'total']
    widths = [2,         3,     1,      1,        1,      1,        6,          2,           2      ]
    self.__widgets['jobs'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_jobs_for_manager',
      labels = labels,
      widths = widths,
      getItemDataCallback = self.onJobGetData
      )
    self.__widgets['jobs'].contextMenuRequested.connect(self.onJobContextMenu)
    self.__widgets['jobs'].doubleClicked.connect(self.onJobDoubleClicked)

    # projects
    labels = ['project', 'jobs', 'machines', 'localize']
    self.__widgets['projects'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_projects_for_manager',
      labels = labels,
      getItemDataCallback = self.onProjectGetData
      )
    self.__widgets['projects'].contextMenuRequested.connect(self.onProjectContextMenu)

    # machines
    labels = ['name', 'groups', 'status', 'prio', 'cpu', 'ram']
    widths = [2,      4,        1.3,      1,      2,     2    ]
    self.__widgets['machines'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_machines_for_manager',
      labels = labels,
      widths = widths,
      getItemDataCallback = self.onMachineGetData
      )
    self.__widgets['machines'].contextMenuRequested.connect(self.onMachineContextMenu)
    self.__widgets['machines'].doubleClicked.connect(self.onMachineDoubleClicked)

    # groups
    labels = ['name', 'machines']
    widths = [2,      10        ]
    self.__widgets['groups'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachineGroup,
      procedure = 'get_groups_for_manager',
      labels = labels,
      widths = widths,
      getItemDataCallback = self.onMachineGroupGetData
      )
    self.__widgets['groups'].contextMenuRequested.connect(self.onMachineGroupContextMenu)

    # frames
    labels = ['job', 'time', 'status', 'duration', 'machine', 'prio', 'package']
    self.__widgets['frames'] = zookeeper.zkUI.zkDbTable(
      self.__conn,
      zookeeper.zkDB.zkMachine,
      procedure = 'get_frames_for_manager',
      procedureArgs = [0],
      labels = labels,
      getItemDataCallback = self.onFrameGetData
      )
    self.__widgets['frames'].contextMenuRequested.connect(self.onFrameContextMenu)
    self.__widgets['frames'].doubleClicked.connect(self.onFrameDoubleClicked)

    # log
    self.__widgets['log'] = QtGui.QPlainTextEdit()

    self.__widgets['tabs'].addTab(self.__widgets['jobs'], 'jobs')
    self.__widgets['tabs'].addTab(self.__widgets['projects'], 'projects')
    self.__widgets['tabs'].addTab(self.__widgets['machines'], 'machines')
    self.__widgets['tabs'].addTab(self.__widgets['groups'], 'groups')
    self.__widgets['tabs'].addTab(self.__widgets['frames'], 'frames')
    self.__widgets['tabs'].addTab(self.__widgets['log'], 'log')

    self.__timers['poll'] = QtCore.QTimer(self)
    self.__timers['poll'].setInterval(5000)
    self.__timers['poll'].setSingleShot(False)
    self.connect(self.__timers['poll'], QtCore.SIGNAL("timeout()"), self.poll)

    for key in self.__timers:
      self.__timers[key].start()

    self.show()
예제 #8
0
  def __init__(self, connection):

    self.__percEx = re.compile(r'.*[^0-9\.]([0-9\.]+%)[^0-9\.]*')
    self.__conn = connection
    self.__machine = zookeeper.zkDB.zkMachine(self.__conn, asClient = True)

    super(zkConsumer, self).__init__('Munch - %s' % self.__machine.name)

    if not os.environ['USERNAME'].lower() == 'render':
      QtGui.QMessageBox.critical(None, "ZooKeeper Error", 'You need to be logged on as the render user.')
      self.close()
      return

    self.__cfg = zookeeper.zkConfig()

    self.__widgets = {}
    self.__timers = {}

    self.setMinimumWidth(640)
    self.setMinimumHeight(800)

    topWidget = QtGui.QWidget()
    topWidget.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Minimum)
    topLayout = QtGui.QGridLayout()
    topWidget.setLayout(topLayout)
    self.addWidgetToCentral(topWidget)

    offset = 0

    backgroundColor = '#e6e6e6'

    # project
    labelWidget = QtGui.QLabel('project', topWidget)
    self.__widgets['project'] = QtGui.QLineEdit(topWidget)
    self.__widgets['project'].setReadOnly(True)
    self.setLineEditColor('project', backgroundColor)
    topLayout.addWidget(labelWidget, 0, offset)
    topLayout.addWidget(self.__widgets['project'], 1, offset)
    offset = offset + 1

    # job
    labelWidget = QtGui.QLabel('job', topWidget)
    self.__widgets['job'] = QtGui.QLineEdit(topWidget)
    self.__widgets['job'].setReadOnly(True)
    self.setLineEditColor('job', backgroundColor)
    topLayout.addWidget(labelWidget, 0, offset)
    topLayout.addWidget(self.__widgets['job'], 1, offset)
    offset = offset + 1

    # frame
    labelWidget = QtGui.QLabel('frame', topWidget)
    self.__widgets['frame'] = QtGui.QLineEdit(topWidget)
    self.__widgets['frame'].setReadOnly(True)
    self.__widgets['frame'].setMaximumWidth(50)
    self.setLineEditColor('frame', backgroundColor)
    topLayout.addWidget(labelWidget, 0, offset)
    topLayout.addWidget(self.__widgets['frame'], 1, offset)
    offset = offset + 1

    # progress
    labelWidget = QtGui.QLabel('progress', topWidget)
    self.__widgets['progress'] = QtGui.QProgressBar(topWidget)
    self.__widgets['progress'].setMinimumWidth(200)
    self.setProgressBarColor('progress', 'green')
    topLayout.addWidget(labelWidget, 0, offset)
    topLayout.addWidget(self.__widgets['progress'], 1, offset)
    offset = offset + 1

    # status
    labelWidget = QtGui.QLabel('status', topWidget)
    self.__widgets['status'] = QtGui.QLineEdit('idle', topWidget)
    self.__widgets['status'].setReadOnly(True)
    self.__widgets['status'].setMaximumWidth(75)
    self.__widgets['status'].setAlignment(QtCore.Qt.AlignHCenter)
    if self.__machine.priority == 'OFF':
      self.__widgets['status'].setText('off')
      self.setLineEditColor('status', 'red')
    else:
      self.setLineEditColor('status', 'yellow')
    topLayout.addWidget(labelWidget, 0, offset)
    topLayout.addWidget(self.__widgets['status'], 1, offset)
    offset = offset + 1

    # cpu
    labelWidget = QtGui.QLabel('cpu', topWidget)
    self.__widgets['cpu'] = QtGui.QProgressBar(topWidget)
    self.setProgressBarColor('cpu', 'blue')
    self.__widgets['cpu'].setMaximumWidth(60)
    topLayout.addWidget(labelWidget, 0, offset)
    topLayout.addWidget(self.__widgets['cpu'], 1, offset)
    offset = offset + 1

    # ram
    labelWidget = QtGui.QLabel('ram', topWidget)
    self.__widgets['ram'] = QtGui.QProgressBar(topWidget)
    self.setProgressBarColor('ram', 'violet')
    self.__widgets['ram'].setMaximumWidth(60)
    topLayout.addWidget(labelWidget, 0, offset)
    topLayout.addWidget(self.__widgets['ram'], 1, offset)
    offset = offset + 1

    self.__widgets['log'] = QtGui.QPlainTextEdit()
    self.__widgets['log'].setReadOnly(True)
    self.addWidgetToCentral(self.__widgets['log'])

    (networkSuccess, networkError) = zookeeper.zkClient.zk_authorizeAllValidNetworkShares(connection, deleteExisting=True, logCallback=self.log)
    if not networkSuccess:
      self.log('ZooKeeper Error:\n'+networkError)
      self.close()
      return

    self.__timers['poll'] = QtCore.QTimer(self)
    self.__timers['poll'].setInterval(5003) # every 5 seconds
    self.__timers['poll'].setSingleShot(False)

    self.__timers['garbagecollect'] = QtCore.QTimer(self)
    self.__timers['garbagecollect'].setInterval(15 * 60 * 1000) # every 15 minutes
    self.__timers['garbagecollect'].setSingleShot(False)

    self.__timers['delivery'] = QtCore.QTimer(self)
    self.__timers['delivery'].setInterval(15107) # every 15 seconds, not quite so we don't overlap
    self.__timers['delivery'].setSingleShot(False)

    self.connect(self.__timers['poll'], QtCore.SIGNAL("timeout()"), self.poll)
    self.connect(self.__timers['delivery'], QtCore.SIGNAL("timeout()"), self.delivery)
    self.connect(self.__timers['garbagecollect'], QtCore.SIGNAL("timeout()"), self.garbagecollect)

    for key in self.__timers:
      self.__timers[key].start()

    self.show()
    self.garbagecollect()
예제 #9
0
    def __init__(self, connection):

        self.__conn = connection
        self.__cfg = zookeeper.zkConfig()

        super(zkManager, self).__init__("Manager")

        self.__widgets = {}
        self.__timers = {}

        self.setMinimumWidth(640)
        self.setMinimumHeight(800)

        self.__widgets["buttonsWidget"] = QtGui.QWidget()
        self.__widgets["buttonsWidget"].setContentsMargins(0, 0, 0, 0)
        self.addWidgetToCentral(self.__widgets["buttonsWidget"])

        buttonsLayout = QtGui.QHBoxLayout()
        self.__widgets["buttonsWidget"].setLayout(buttonsLayout)

        self.__widgets["refreshButton"] = QtGui.QPushButton("Refresh", self.__widgets["buttonsWidget"])
        buttonsLayout.addWidget(self.__widgets["refreshButton"])
        self.__widgets["refreshButton"].clicked.connect(self.poll)

        self.__widgets["tabs"] = QtGui.QTabWidget()
        self.addWidgetToCentral(self.__widgets["tabs"])

        # jobs
        labels = ["project", "job", "user", "frames", "prio", "status", "progress", "remaining", "total"]
        widths = [2, 3, 1, 1, 1, 1, 6, 2, 2]
        self.__widgets["jobs"] = zookeeper.zkUI.zkDbTable(
            self.__conn,
            zookeeper.zkDB.zkMachine,
            procedure="get_jobs_for_manager",
            labels=labels,
            widths=widths,
            getItemDataCallback=self.onJobGetData,
        )
        self.__widgets["jobs"].contextMenuRequested.connect(self.onJobContextMenu)
        self.__widgets["jobs"].doubleClicked.connect(self.onJobDoubleClicked)

        # projects
        labels = ["project", "jobs", "machines"]
        self.__widgets["projects"] = zookeeper.zkUI.zkDbTable(
            self.__conn, zookeeper.zkDB.zkMachine, procedure="get_projects_for_manager", labels=labels
        )
        self.__widgets["projects"].contextMenuRequested.connect(self.onProjectContextMenu)

        # machines
        labels = ["name", "groups", "status", "prio", "cpu", "ram"]
        widths = [2, 4, 1.3, 1, 2, 2]
        self.__widgets["machines"] = zookeeper.zkUI.zkDbTable(
            self.__conn,
            zookeeper.zkDB.zkMachine,
            procedure="get_machines_for_manager",
            labels=labels,
            widths=widths,
            getItemDataCallback=self.onMachineGetData,
        )
        self.__widgets["machines"].contextMenuRequested.connect(self.onMachineContextMenu)
        self.__widgets["machines"].doubleClicked.connect(self.onMachineDoubleClicked)

        # groups
        labels = ["name", "machines"]
        widths = [2, 10]
        self.__widgets["groups"] = zookeeper.zkUI.zkDbTable(
            self.__conn,
            zookeeper.zkDB.zkMachineGroup,
            procedure="get_groups_for_manager",
            labels=labels,
            widths=widths,
            getItemDataCallback=self.onMachineGroupGetData,
        )
        self.__widgets["groups"].contextMenuRequested.connect(self.onMachineGroupContextMenu)

        # frames
        labels = ["job", "time", "status", "duration", "machine", "prio", "package"]
        self.__widgets["frames"] = zookeeper.zkUI.zkDbTable(
            self.__conn,
            zookeeper.zkDB.zkMachine,
            procedure="get_frames_for_manager",
            procedureArgs=[0],
            labels=labels,
            getItemDataCallback=self.onFrameGetData,
        )
        self.__widgets["frames"].contextMenuRequested.connect(self.onFrameContextMenu)
        self.__widgets["frames"].doubleClicked.connect(self.onFrameDoubleClicked)

        # log
        self.__widgets["log"] = QtGui.QPlainTextEdit()

        self.__widgets["tabs"].addTab(self.__widgets["jobs"], "jobs")
        self.__widgets["tabs"].addTab(self.__widgets["projects"], "projects")
        self.__widgets["tabs"].addTab(self.__widgets["machines"], "machines")
        self.__widgets["tabs"].addTab(self.__widgets["groups"], "groups")
        self.__widgets["tabs"].addTab(self.__widgets["frames"], "frames")
        self.__widgets["tabs"].addTab(self.__widgets["log"], "log")

        self.__timers["poll"] = QtCore.QTimer(self)
        self.__timers["poll"].setInterval(5000)
        self.__timers["poll"].setSingleShot(False)
        self.connect(self.__timers["poll"], QtCore.SIGNAL("timeout()"), self.poll)

        for key in self.__timers:
            self.__timers[key].start()

        self.show()
예제 #10
0
    def __init__(self, connection):

        self.__percEx = re.compile(r'.*[^0-9\.]([0-9\.]+%)[^0-9\.]*')
        self.__conn = connection
        self.__machine = zookeeper.zkDB.zkMachine(self.__conn, asClient=True)

        super(zkConsumer, self).__init__('Munch - %s' % self.__machine.name)

        if not os.environ['USERNAME'].lower() == 'render':
            QtGui.QMessageBox.critical(
                None, "ZooKeeper Error",
                'You need to be logged on as the render user.')
            self.close()
            return

        (networkSuccess,
         networkError) = zookeeper.zkClient.zk_mapAllValidNetworkShares(
             connection, deleteExisting=True)
        if not networkSuccess:
            QtGui.QMessageBox.critical(None, "ZooKeeper Error", networkError)
            self.close()
            return

        self.__cfg = zookeeper.zkConfig()

        self.__widgets = {}
        self.__timers = {}

        self.setMinimumWidth(640)
        self.setMinimumHeight(800)

        topWidget = QtGui.QWidget()
        topWidget.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding,
                                QtGui.QSizePolicy.Minimum)
        topLayout = QtGui.QGridLayout()
        topWidget.setLayout(topLayout)
        self.addWidgetToCentral(topWidget)

        offset = 0

        backgroundColor = '#e6e6e6'

        # project
        labelWidget = QtGui.QLabel('project', topWidget)
        self.__widgets['project'] = QtGui.QLineEdit(topWidget)
        self.__widgets['project'].setReadOnly(True)
        self.setLineEditColor('project', backgroundColor)
        topLayout.addWidget(labelWidget, 0, offset)
        topLayout.addWidget(self.__widgets['project'], 1, offset)
        offset = offset + 1

        # job
        labelWidget = QtGui.QLabel('job', topWidget)
        self.__widgets['job'] = QtGui.QLineEdit(topWidget)
        self.__widgets['job'].setReadOnly(True)
        self.setLineEditColor('job', backgroundColor)
        topLayout.addWidget(labelWidget, 0, offset)
        topLayout.addWidget(self.__widgets['job'], 1, offset)
        offset = offset + 1

        # frame
        labelWidget = QtGui.QLabel('frame', topWidget)
        self.__widgets['frame'] = QtGui.QLineEdit(topWidget)
        self.__widgets['frame'].setReadOnly(True)
        self.__widgets['frame'].setMaximumWidth(50)
        self.setLineEditColor('frame', backgroundColor)
        topLayout.addWidget(labelWidget, 0, offset)
        topLayout.addWidget(self.__widgets['frame'], 1, offset)
        offset = offset + 1

        # progress
        labelWidget = QtGui.QLabel('progress', topWidget)
        self.__widgets['progress'] = QtGui.QProgressBar(topWidget)
        self.__widgets['progress'].setMinimumWidth(200)
        self.setProgressBarColor('progress', 'green')
        topLayout.addWidget(labelWidget, 0, offset)
        topLayout.addWidget(self.__widgets['progress'], 1, offset)
        offset = offset + 1

        # status
        labelWidget = QtGui.QLabel('status', topWidget)
        self.__widgets['status'] = QtGui.QLineEdit('idle', topWidget)
        self.__widgets['status'].setReadOnly(True)
        self.__widgets['status'].setMaximumWidth(75)
        self.__widgets['status'].setAlignment(QtCore.Qt.AlignHCenter)
        if self.__machine.priority == 'OFF':
            self.__widgets['status'].setText('off')
            self.setLineEditColor('status', 'red')
        else:
            self.setLineEditColor('status', 'yellow')
        topLayout.addWidget(labelWidget, 0, offset)
        topLayout.addWidget(self.__widgets['status'], 1, offset)
        offset = offset + 1

        # cpu
        labelWidget = QtGui.QLabel('cpu', topWidget)
        self.__widgets['cpu'] = QtGui.QProgressBar(topWidget)
        self.setProgressBarColor('cpu', 'blue')
        self.__widgets['cpu'].setMaximumWidth(60)
        topLayout.addWidget(labelWidget, 0, offset)
        topLayout.addWidget(self.__widgets['cpu'], 1, offset)
        offset = offset + 1

        # ram
        labelWidget = QtGui.QLabel('ram', topWidget)
        self.__widgets['ram'] = QtGui.QProgressBar(topWidget)
        self.setProgressBarColor('ram', 'violet')
        self.__widgets['ram'].setMaximumWidth(60)
        topLayout.addWidget(labelWidget, 0, offset)
        topLayout.addWidget(self.__widgets['ram'], 1, offset)
        offset = offset + 1

        self.__widgets['log'] = QtGui.QPlainTextEdit()
        self.__widgets['log'].setReadOnly(True)
        self.addWidgetToCentral(self.__widgets['log'])

        self.__timers['poll'] = QtCore.QTimer(self)
        self.__timers['poll'].setInterval(5003)  # every 5 seconds
        self.__timers['poll'].setSingleShot(False)

        self.__timers['garbagecollect'] = QtCore.QTimer(self)
        self.__timers['garbagecollect'].setInterval(15 * 60 *
                                                    1000)  # every 15 minutes
        self.__timers['garbagecollect'].setSingleShot(False)

        self.__timers['delivery'] = QtCore.QTimer(self)
        self.__timers['delivery'].setInterval(
            15107)  # every 15 seconds, not quite so we don't overlap
        self.__timers['delivery'].setSingleShot(False)

        self.connect(self.__timers['poll'], QtCore.SIGNAL("timeout()"),
                     self.poll)
        self.connect(self.__timers['delivery'], QtCore.SIGNAL("timeout()"),
                     self.delivery)
        self.connect(self.__timers['garbagecollect'],
                     QtCore.SIGNAL("timeout()"), self.garbagecollect)

        for key in self.__timers:
            self.__timers[key].start()

        self.show()
        self.garbagecollect()