Esempio n. 1
0
 def add_vehicles_helper(sess, chunk, n):
     owners = sess.query(User).filter_by(city=city).all()
     vehicles = []
     for i in range(chunk, n):
         vehicle_type = MovRGenerator.generate_random_vehicle()
         vehicles.append(Vehicle(id=MovRGenerator.generate_uuid(),
                                 type=vehicle_type,
                                 city=city,
                                 current_location=datagen.address(),
                                 owner_id=(random.choice(owners)).id,
                                 status=MovRGenerator.get_vehicle_availability(),
                                 ext=MovRGenerator.generate_vehicle_metadata(vehicle_type)))
     sess.bulk_save_objects(vehicles)
Esempio n. 2
0
        def start_ride_helper(session, city, rider_id, vehicle_id):
            vehicle = session.query(Vehicle).filter_by(
                city=city, id=vehicle_id
            ) if self.multi_region else session.query(Vehicle).filter_by(
                id=vehicle_id)
            vehicle.update({'status': 'in_use'})
            v = vehicle.first()
            # get promo codes associated with this user's account
            upcs = session.query(UserPromoCode).filter_by(
                city=city, user_id=rider_id).all(
                ) if self.multi_region else session.query(
                    UserPromoCode).filter_by(user_id=rider_id).all()

            # determine which codes are valid
            for upc in upcs:
                promo_code = session.query(PromoCode).filter_by(
                    code=upc.code).first()
                if promo_code and promo_code.expiration_time > datetime.datetime.now(
                ):
                    code_to_update = session.query(UserPromoCode).filter_by(
                        city=city, user_id=rider_id,
                        code=upc.code) if self.multi_region else session.query(
                            UserPromoCode).filter_by(user_id=rider_id,
                                                     code=upc.code)
                    code_to_update.update({'usage_count': upc.usage_count + 1})

            r = Ride(city=city,
                     id=MovRGenerator.generate_uuid(),
                     rider_id=rider_id,
                     vehicle_id=vehicle_id,
                     start_address=v.current_location)

            session.add(r)
            return {'city': r.city, 'id': r.id}
Esempio n. 3
0
 def end_ride_helper(session, city, ride_id):
     ride = session.query(Ride).filter_by(city=city, id=ride_id).first()
     v = session.query(Vehicle).filter_by(city=city, id=ride.vehicle_id).first()
     ride.end_address = v.current_location
     ride.revenue = MovRGenerator.generate_revenue()
     ride.end_time = datetime.datetime.now()
     v.status = "available"
Esempio n. 4
0
 def add_user_helper(session, city, name, address, credit_card_number):
     u = User(city=city,
              id=MovRGenerator.generate_uuid(),
              name=name,
              address=address,
              credit_card=credit_card_number)
     session.add(u)
     return {'city': u.city, 'id': u.id}
Esempio n. 5
0
    def add_rides_helper(sess, chunk, n):
        users = sess.query(User).filter_by(city=city).all()
        vehicles = sess.query(Vehicle).filter_by(city=city).all()

        rides = []
        for i in range(chunk, min(chunk + chunk_size, num_rides)):
            start_time = datetime.datetime.now() - datetime.timedelta(days=random.randint(0, 30))
            rides.append(Ride(id=MovRGenerator.generate_uuid(),
                              city=city,
                              rider_id=random.choice(users).id,
                              vehicle_id=random.choice(vehicles).id,
                              start_time=start_time,
                              start_address=datagen.address(),
                              end_address=datagen.address(),
                              revenue=MovRGenerator.generate_revenue(),
                              end_time=start_time + datetime.timedelta(minutes=random.randint(0, 60))))
        sess.bulk_save_objects(rides)
Esempio n. 6
0
 def add_users_helper(sess, chunk, n):
     users = []
     for i in range(chunk, n):
         users.append(User(id=MovRGenerator.generate_uuid(),
                           city=city,
                           name=datagen.name(),
                           address=datagen.address(),
                           credit_card=datagen.credit_card_number()))
     sess.bulk_save_objects(users)
Esempio n. 7
0
        def add_vehicle_helper(session, city, owner_id, current_location, type, vehicle_metadata, status):
            vehicle_type = type

            vehicle = Vehicle(id=MovRGenerator.generate_uuid(), type=vehicle_type,
                              city=city, owner_id=owner_id, current_location = current_location,
                              status=status,
                              ext=vehicle_metadata)

            session.add(vehicle)
            return {'city': vehicle.city, 'id': vehicle.id}
Esempio n. 8
0
 def end_ride_helper(session, city, ride_id):
     ride = session.query(Ride).filter_by(id=ride_id)
     r = ride.first()
     vehicle = session.query(Vehicle).filter_by(id=r.vehicle_id)
     vehicle.update({'status': 'available'})
     v = vehicle.first()
     ride.update({
         'end_address': v.current_location,
         'revenue': MovRGenerator.generate_revenue(),
         'end_time': datetime.datetime.now()
     })
Esempio n. 9
0
    def add_vehicle_location_histories_helper(sess, chunk, n):
        rides = sess.query(Ride).filter_by(city=city).all()

        histories = []
        for i in range(chunk, min(chunk + chunk_size, num_histories)):
            latlong = MovRGenerator.generate_random_latlong()
            histories.append(
                VehicleLocationHistory(city=city,
                                       ride_id=random.choice(rides).id,
                                       lat=latlong["lat"],
                                       long=latlong["long"]))

        sess.bulk_save_objects(histories)
Esempio n. 10
0
        def start_ride_helper(session, city, rider_id, vehicle_id):
            v = session.query(Vehicle).filter_by(city=city, id=vehicle_id).first()

            # get promo codes associated with this user's account
            upcs = session.query(UserPromoCode).filter_by(city=city, user_id=rider_id).all()

            # determine which codes are valid
            for upc in upcs:
                promo_code = session.query(PromoCode).filter_by(code = upc.code).first()
                if promo_code and promo_code.expiration_time > datetime.datetime.now():
                    upc.usage_count+=1;
                    #@todo: do something with the code

            r = Ride(city=city, vehicle_city=city, id=MovRGenerator.generate_uuid(),
                     rider_id=rider_id, vehicle_id=vehicle_id,
                     start_address=v.current_location)
            session.add(r)
            v.status = "in_use"
            return {'city': r.city, 'id': r.id}
Esempio n. 11
0
def simulate_movr_load(conn_string,
                       cities,
                       movr_objects,
                       active_rides,
                       read_percentage,
                       follower_reads,
                       connection_duration_in_seconds,
                       echo_sql=False):

    datagen = Faker()
    while True:
        logging.debug(
            "creating a new connection to %s, which will reset in %d seconds",
            conn_string, connection_duration_in_seconds)
        try:
            with MovR(conn_string, echo=echo_sql) as movr:
                timeout = time.time(
                ) + connection_duration_in_seconds  #refresh connections so load can balance among cluster nodes even if the cluster size changes
                while True:

                    if TERMINATE_GRACEFULLY:
                        logging.debug("Terminating thread.")
                        return

                    if time.time() > timeout:
                        break

                    active_city = random.choice(cities)

                    if random.random() < read_percentage:
                        # simulate user loading screen
                        start = time.time()
                        movr.get_vehicles(active_city, follower_reads, 25)
                        stats.add_latency_measurement("get vehicles",
                                                      time.time() - start)

                    else:

                        # every write tick, simulate the various vehicles updating their locations if they are being used for rides
                        for ride in active_rides[0:10]:

                            latlong = MovRGenerator.generate_random_latlong()
                            start = time.time()
                            movr.update_ride_location(ride['city'],
                                                      ride_id=ride['id'],
                                                      lat=latlong['lat'],
                                                      long=latlong['long'])
                            stats.add_latency_measurement(
                                ACTION_UPDATE_RIDE_LOC,
                                time.time() - start)

                        #do write operations randomly
                        if random.random() < .03:
                            # simulate a movr marketer creating a new promo code
                            start = time.time()
                            promo_code = movr.create_promo_code(
                                code="_".join(datagen.words(nb=3)) + "_" +
                                str(time.time()),
                                description=datagen.paragraph(),
                                expiration_time=datetime.datetime.now() +
                                datetime.timedelta(days=random.randint(0, 30)),
                                rules={
                                    "type": "percent_discount",
                                    "value": "10%"
                                })
                            stats.add_latency_measurement(
                                ACTION_NEW_CODE,
                                time.time() - start)
                            movr_objects["global"].get("promo_codes",
                                                       []).append(promo_code)

                        elif random.random() < .1:
                            # simulate a user applying a promo code to her account
                            start = time.time()
                            movr.apply_promo_code(
                                active_city,
                                random.choice(movr_objects["local"]
                                              [active_city]["users"])['id'],
                                random.choice(
                                    movr_objects["global"]["promo_codes"]))
                            stats.add_latency_measurement(
                                ACTION_APPLY_CODE,
                                time.time() - start)
                        elif random.random() < .3:
                            # simulate new signup
                            start = time.time()
                            new_user = movr.add_user(
                                active_city, datagen.name(), datagen.address(),
                                datagen.credit_card_number())
                            stats.add_latency_measurement(
                                ACTION_NEW_USER,
                                time.time() - start)
                            movr_objects["local"][active_city]["users"].append(
                                new_user)

                        elif random.random() < .1:
                            # simulate a user adding a new vehicle to the population
                            start = time.time()
                            new_vehicle = movr.add_vehicle(
                                active_city,
                                owner_id=random.choice(
                                    movr_objects["local"][active_city]
                                    ["users"])['id'],
                                type=MovRGenerator.generate_random_vehicle(),
                                vehicle_metadata=MovRGenerator.
                                generate_vehicle_metadata(type),
                                status=MovRGenerator.get_vehicle_availability(
                                ),
                                current_location=datagen.address())
                            stats.add_latency_measurement(
                                ACTION_ADD_VEHICLE,
                                time.time() - start)
                            movr_objects["local"][active_city][
                                "vehicles"].append(new_vehicle)

                        elif random.random() < .5:
                            # simulate a user starting a ride
                            start = time.time()
                            ride = movr.start_ride(
                                active_city,
                                random.choice(movr_objects["local"]
                                              [active_city]["users"])['id'],
                                random.choice(movr_objects["local"]
                                              [active_city]["vehicles"])['id'])
                            stats.add_latency_measurement(
                                ACTION_START_RIDE,
                                time.time() - start)
                            active_rides.append(ride)

                        else:
                            if len(active_rides):
                                #simulate a ride ending
                                ride = active_rides.pop()
                                start = time.time()
                                movr.end_ride(ride['city'], ride['id'])
                                stats.add_latency_measurement(
                                    ACTION_END_RIDE,
                                    time.time() - start)
        except DBAPIError:
            logging.error("lost connection to the db. sleeping for 10 seconds")
            time.sleep(10)