コード例 #1
0
class VantageUpdaterService(Subscriber):
    def __init__(self, config):
        hub_host = config.get('Ratchet Hub', 'host')
        hub_port = int(config.get('Ratchet Hub', 'port'))
        self.ratchet_hub = RatchetHub(hub_host, hub_port)

        vantage_config = self.ratchet_hub.get_vantage_config()
        snapshot_host = vantage_config['host']
        snapshot_port = int(vantage_config['snapshot_sub_port'])
        self.web_host = vantage_config['host']
        self.web_port = int(vantage_config['web_port'])

        ratchet_hub_info = self.ratchet_hub.get_ratchet_hub_info()
        self.name = "%s/VantageUpdaterService" % (ratchet_hub_info['org_name'])

        Subscriber.__init__(self, snapshot_host, snapshot_port, [
                                                   "=====app vantage"
                                                  ])
        return

    # @Override
    def ping(self):
        self.ratchet_hub.log_info(self.name, "Asking web app to update")
        h = httplib.HTTPConnection('%s:%d' % (self.web_host, self.web_port))
        h.request("POST","/update", "", {"Content-type": "application/text"})
        return
コード例 #2
0
ファイル: gen-nginx-sections.py プロジェクト: rjose/ratchet
def get_org_config(org, hub_port):
    result = ''
    ratchet_hub = RatchetHub("127.0.0.1", hub_port)
    vantage_info = ratchet_hub.get_vantage_config()
    result = result + get_vantage_config(org, vantage_info['web_port'])

    teams_info = ratchet_hub.get_team_instances_info()
    teams = teams_info.keys()
    teams.sort()
    for team in teams:
        result = result + get_team_config(org, team, teams_info[team]['web_port'])
    return result
コード例 #3
0
ファイル: app_vantage.py プロジェクト: rjose/ratchet
class AppVantage(SnapshotFilter):
    def __init__(self, config, listen):
        hub_host = config.get('Ratchet Hub', 'host')
        hub_port = int(config.get('Ratchet Hub', 'port'))

        self.ratchet_hub = RatchetHub(hub_host, hub_port)
        vantage_config = self.ratchet_hub.get_vantage_config()
        ratchet_hub_info = self.ratchet_hub.get_ratchet_hub_info()
        self.src_root = ratchet_hub_info['src_root']
        self.name = "%s/AppVantage" % (ratchet_hub_info['org_name'])

        update_periods = self.ratchet_hub.get_update_periods()
        error_retry_period = update_periods['error_retry']

        snapshot_host = vantage_config['host']
        snapshot_req_port = int(vantage_config['snapshot_req_port'])
        snapshot_sub_port = int(vantage_config['snapshot_sub_port'])

        SnapshotFilter.__init__(self,
                                listen,
                                snapshot_host,
                                snapshot_req_port,
                                snapshot_sub_port,
                                error_retry_period,
                                ["=====raw qplans"],
                                "=====app vantage"
                               )
        return

    #===========================================================================
    # Internal functions

    # @Override
    def get_processed_data(self):
        self.ratchet_hub.log_info(self.name, "Start appifying")
        [cond_data] = self.get_inputs()
        result = self.process_app_data(cond_data)
        self.ratchet_hub.log_info(self.name, "Done appifying")
        return result


    def process_app_data(self, cond_data):
        output = StringIO.StringIO()
        sections = sectionize(StringIO.StringIO(cond_data))

        parsed_data = {}
        for team in sections.keys():
            parsed_data[team] = json.loads(sections[team])

        self.print_dimension_stream("teams", parsed_data.keys(), output)

        # Extract skills
        skills = self.gather_skills(parsed_data)
        self.print_dimension_stream("skills", skills, output)

        # Print data
        self.print_quarters(parsed_data, skills, output)
        self.print_resource_data(parsed_data, skills, output)
        self.print_unassigned(parsed_data, skills, output)

        result = output.getvalue()
        output.close()

        return result

    def gather_skills(self, parsed_data):
        # ASSUMPTION: All quarters in one team require identical skills
        skills = []
        for team in parsed_data.keys():
            quarter_data = parsed_data[team].values()
            if (len(quarter_data) > 0):
                skills += quarter_data[0]['skills']

        result = list(set(skills))
        result.sort()
        return result

    def print_dimension_stream(self, dimension, items, output):
        print >>output, "=====%s" % dimension
        for it in items:
            print >>output, "\t%s" % it
        return

    def pack_staff_stats(self, stats, skills, team_skills):
        # ASSUMPTION: stats and team_skills are the same length
        values = []
        for sk in skills:
            if sk in team_skills:
                values.append(stats[team_skills.index(sk)])
            else:
                values.append(0)

        result = ":".join(["%.2f" % v for v in values])
        return result

    def manpower_to_num_staff(self, stats, num_weeks):
        result = {}
        for key in stats.keys():
            result[key] = []
            for val in stats[key]:
                result[key].append(float(val)/num_weeks)
        return result

    def sum_chart_stats(self, stats):
        result = {}
        for st in stats:
            for key in st.keys():
                num_values = len(st[key])
                if key not in result:
                    result[key] = [0] * num_values
                for i in range(num_values):
                    result[key][i] += st[key][i]
        return result

    def normalize_staffing(self, staffing_stats, skills, all_skills):
        # ASSUMPTION: skills is a subset of all_skills

        result = {}
        for k in staffing_stats.keys():
            result[k] = [0] * len(all_skills)
            for i in range(len(skills)):
                # Store staffing stat at appropriate index
                index = all_skills.index(skills[i])
                result[k][index] = staffing_stats[k][i]

        return result

    def print_quarters(self, parsed_data, skills, output):
        print >>output, "=====quarters"
        quarters = []
        for team in parsed_data.keys():
            # ASSUMPTION: Unknown quarters are named "Unknown Quarter"
            quarters += [Quarter(key) for key in parsed_data[team].keys()]

        quarters = list(set(quarters))
        quarters.sort()
        for quarter in quarters:
            print >>output, "\t%s" % str(quarter)
        return

    def print_unassigned(self, parsed_data, skills, output):
        print >>output, "=====unassigned"
        for team in parsed_data.keys():
            # Sort quarters
            # ASSUMPTION: Unknown quarters are named "Unknown Quarter"
            quarters = [Quarter(key) for key in parsed_data[team].keys()]
            quarters.sort()
            for quarter in quarters:
                quarter_data = parsed_data[team][str(quarter)]

                team_skills = quarter_data['skills']
                num_weeks = quarter_data['num_weeks']
                unassigned = [val/num_weeks for val in quarter_data['unassigned']]

                print >>output, "\t%s" % "\t".join([
                    team,
                    str(quarter),
                    self.pack_staff_stats(unassigned, skills, team_skills)
                    ])
        return


    def print_resource_data(self, parsed_data, skills, output):
        # ASSUMPTION: parsed_data is a dictionary of team keys to team data.
        # Each team data is a dictionary of quarters to quarter data. Quarter
        # data consists of staffing_stats, skills, tracks, triages, and
        # num_weeks.
        print >>output, "=====resource data"
        for team in parsed_data.keys():
            for quarter in parsed_data[team].keys():
                quarter_data = parsed_data[team][quarter]

                for tri_index in range(len(quarter_data['triages'])):
                    triage = quarter_data['triages'][tri_index]
                    divisions = quarter_data['tracks']

                    for div_index in range(len(divisions)):
                        division = divisions[div_index]
                        team_skills = quarter_data['skills']
                        chart_stats = quarter_data['staffing_stats'][tri_index][div_index]
                        chart_stats = self.manpower_to_num_staff(chart_stats, quarter_data['num_weeks'])

                        # Print regular records
                        print >>output, "\t%s" % "\t".join([
                            team,
                            division,
                            quarter,
                            triage,
                            self.pack_staff_stats(chart_stats['available'], skills, team_skills),
                            self.pack_staff_stats(chart_stats['required'], skills, team_skills),
                            self.pack_staff_stats(chart_stats['net_left'], skills, team_skills)
                            ])
        return
コード例 #4
0
ファイル: vantage_web.py プロジェクト: rjose/ratchet
    # Read config info
    config = ConfigParser.ConfigParser()
    config.readfp(open('config.ini'))
    full_config_path = "%s/config.ini" % os.getcwd()

    # Ask ratchet hub for port info
    hub_host = config.get('Ratchet Hub', 'host')
    hub_port = int(config.get('Ratchet Hub', 'port'))
    ratchet_hub = RatchetHub(hub_host, hub_port)

    try:
        ratchet_hub_info = ratchet_hub.get_ratchet_hub_info()
        name = "%s/vantage" % (ratchet_hub_info['org_name'])

        vantage_config = ratchet_hub.get_vantage_config()

        web_port = int(vantage_config['web_port'])
        ratchet_src_root = ratchet_hub.get_src_root()
        working_dir = "%s/apps/web/vantage" % ratchet_src_root
        catserve_path = "%s/apps/misc/catserve/catserve" % ratchet_src_root
        print("%s -r=%s -p=%d -c=%s" % (catserve_path, working_dir, web_port, full_config_path))
        p = subprocess.Popen("%s -r=%s -p=%d -c=%s" % (catserve_path, working_dir, web_port, full_config_path), shell=True)

        p.communicate()
        if p.returncode != 0:
            err_msg = "Something went wrong catserve (%s)" % p.returncode
            raise Exception(err_msg)

    except Exception, e:
        ratchet_hub.log_error(name, "Problem running catserve: %s" % e)
コード例 #5
0
        else:
            result = SnapshotService.get_response(self, request)
        return result


if __name__ == "__main__":
    # Read config info
    config = ConfigParser.ConfigParser()
    config.readfp(open('config.ini'))

    # Ask ratchet hub for instance info
    hub_host = config.get('Ratchet Hub', 'host')
    hub_port = int(config.get('Ratchet Hub', 'port'))

    ratchet_hub = RatchetHub(hub_host, hub_port)
    header_file_map = ratchet_hub.get_header_file_map("Vantage Data Files")
    ratchet_hub_info = ratchet_hub.get_ratchet_hub_info()

    # The config file is configured from the client's perspective, so the
    # SnapshotService's reply port is the client's request port.
    vantage_info = ratchet_hub.get_vantage_config()
    reply_port = int(vantage_info['snapshot_req_port'])
    publish_port = int(vantage_info['snapshot_sub_port'])

    working_directory = "."
    name = "%s/VantageSnapshotService" % (ratchet_hub_info['org_name'])

    service = VantageSnapshotService(name, header_file_map, working_directory,
                               reply_port, publish_port, ratchet_hub)
    service.run()