Merge branch 'master' of github.com:openobservatory/gooni

This commit is contained in:
Will Scott
2018-03-08 05:12:52 -08:00
4 changed files with 98 additions and 48 deletions
+6 -3
View File
@@ -28,7 +28,7 @@ func init() {
result, err := database.CreateResult(ctx.DB, database.Result{
Name: *nettestGroup,
StartTime: time.Now().UTC(), // XXX get this from MK
StartTime: time.Now().UTC(),
})
if err != nil {
log.Errorf("DB result error: %s", err)
@@ -37,14 +37,17 @@ func init() {
for _, nt := range group.Nettests {
ctl := nettests.NewController(ctx, result)
nt.Run(ctl)
if err := nt.Run(ctl); err != nil {
log.WithError(err).Errorf("Failed to run %s", group.Label)
return err
}
// XXX
// 1. Generate the summary
// 2. Link the measurement to the Result (this should probably happen in
// the nettest class)
// 3. Update the summary of the result and the other metadata in the db
}
result.Update(ctx.DB)
// result.Update(ctx.DB)
return nil
})
}
+32 -15
View File
@@ -27,6 +27,11 @@ type Measurement struct {
ResultID string `db:"result_id"`
}
// SetGeoIPInfo for the Measurement
func (m *Measurement) SetGeoIPInfo() error {
return nil
}
// CreateMeasurement writes the measurement to the database a returns a pointer
// to the Measurement
func CreateMeasurement(db *sqlx.DB, m Measurement) (*Measurement, error) {
@@ -53,35 +58,47 @@ func CreateMeasurement(db *sqlx.DB, m Measurement) (*Measurement, error) {
return &m, nil
}
// Update the measurement in the database
func (r Measurement) Update(db *sqlx.DB) error {
// XXX implement me
return nil
}
// Result model
type Result struct {
ID int64 `db:"id"`
Name string `db:"name"`
StartTime time.Time `db:"start_time"`
EndTime time.Time `db:"end_time"`
Runtime float64 `db:"runtime"` // Runtime is expressed in Microseconds
Summary string `db:"summary"` // XXX this should be JSON
Done bool `db:"done"`
DataUsageUp int64 `db:"data_usage_up"`
DataUsageDown int64 `db:"data_usage_down"`
started time.Time
}
// Update the Result in the database
func (r Result) Update(db *sqlx.DB) error {
log.Debugf("Updating result %v", r)
_, err := db.NamedExec(`UPDATE results SET
(name, start_time, end_time, summary, done, data_usage_up, data_usage_down) =
(:name, :start_time, :end_time, :summary, :done, :data_usage_up, :data_usage_down)
WHERE id = :id`, r)
// Started marks the Result as having started
func (r *Result) Started(db *sqlx.DB) error {
r.started = time.Now()
return nil
}
// Finished marks the result as done and sets the runtime
func (r *Result) Finished(db *sqlx.DB) error {
if r.Done == true || r.Runtime != 0 {
return errors.New("Result is already finished")
}
r.Runtime = float64(time.Now().Sub(r.started)) / float64(time.Microsecond)
r.Done = true
res, err := db.NamedExec(`UPDATE results
SET done = true, runtime = :runtime
WHERE id = :id`, r)
if err != nil {
return errors.Wrap(err, "updating result")
}
count, err := res.RowsAffected()
if err != nil {
return errors.Wrap(err, "updating result")
}
if count != 1 {
return errors.New("inconsistent update count")
}
return nil
}
@@ -98,7 +115,7 @@ func CreateResult(db *sqlx.DB, r Result) (*Result, error) {
}
id, err := res.LastInsertId()
if err != nil {
return nil, errors.Wrap(err, "creating measurement")
return nil, errors.Wrap(err, "creating result")
}
r.ID = id
return &r, nil