netmito 0.6.8

A Unified Distributed Transport Evaluation Framework
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
use sea_orm_migration::prelude::*;

#[derive(DeriveMigrationName)]
pub struct Migration;

const DEFAULT_STORAGE_QUOTA: i64 = 1000 * 1000 * 1000 * 16; // 16GB
const DEFAULT_GROUP_QUOTA: i32 = 8;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .create_table(
                Table::create()
                    .table(Users::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(Users::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(
                        ColumnDef::new(Users::Username)
                            .text()
                            .not_null()
                            .unique_key(),
                    )
                    .col(ColumnDef::new(Users::EncryptedPassword).text().not_null())
                    .col(ColumnDef::new(Users::AuthSignature).big_integer().null())
                    .col(ColumnDef::new(Users::ResetPasswordToken).text().null())
                    .col(
                        ColumnDef::new(Users::ResetPasswordTokenExpiry)
                            .timestamp_with_time_zone()
                            .null(),
                    )
                    .col(
                        ColumnDef::new(Users::CurrentSignInAt)
                            .timestamp_with_time_zone()
                            .null(),
                    )
                    .col(
                        ColumnDef::new(Users::LastSignInAt)
                            .timestamp_with_time_zone()
                            .null(),
                    )
                    .col(ColumnDef::new(Users::CurrentSignInIp).text().null())
                    .col(ColumnDef::new(Users::LastSignInIp).text().null())
                    .col(
                        ColumnDef::new(Users::CreatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Users::UpdatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Users::Admin)
                            .boolean()
                            .not_null()
                            .default(false),
                    )
                    .col(ColumnDef::new(Users::State).integer().not_null().default(0))
                    .col(
                        ColumnDef::new(Users::GroupQuota)
                            .integer()
                            .not_null()
                            .default(DEFAULT_GROUP_QUOTA),
                    )
                    .col(
                        ColumnDef::new(Users::GroupCount)
                            .integer()
                            .not_null()
                            .default(1),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(Groups::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(Groups::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(
                        ColumnDef::new(Groups::GroupName)
                            .text()
                            .not_null()
                            .unique_key(),
                    )
                    .col(ColumnDef::new(Groups::CreatorId).big_integer().not_null())
                    .col(
                        ColumnDef::new(Groups::CreatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Groups::UpdatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Groups::State)
                            .integer()
                            .not_null()
                            .default(0),
                    )
                    .col(
                        ColumnDef::new(Groups::TaskCount)
                            .big_integer()
                            .not_null()
                            .default(0),
                    )
                    .col(
                        ColumnDef::new(Groups::StorageQuota)
                            .big_integer()
                            .not_null()
                            .default(DEFAULT_STORAGE_QUOTA),
                    )
                    .col(
                        ColumnDef::new(Groups::StorageUsed)
                            .big_integer()
                            .not_null()
                            .default(0),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-groups-creator_id")
                            .from(Groups::Table, Groups::CreatorId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(UserGroup::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(UserGroup::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(ColumnDef::new(UserGroup::UserId).big_integer().not_null())
                    .col(ColumnDef::new(UserGroup::GroupId).big_integer().not_null())
                    .col(ColumnDef::new(UserGroup::Role).integer().not_null())
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-user_group-user_id")
                            .from(UserGroup::Table, UserGroup::UserId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-user_group-group_id")
                            .from(UserGroup::Table, UserGroup::GroupId)
                            .to(Groups::Table, Groups::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .index(
                        Index::create()
                            .name("idx_user_group-user_id-group_id")
                            .table(UserGroup::Table)
                            .unique()
                            .col(UserGroup::UserId)
                            .col(UserGroup::GroupId),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(Workers::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(Workers::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(
                        ColumnDef::new(Workers::WorkerId)
                            .uuid()
                            .unique_key()
                            .not_null(),
                    )
                    .col(ColumnDef::new(Workers::CreatorId).big_integer().not_null())
                    .col(
                        ColumnDef::new(Workers::Tags)
                            .array(ColumnType::Text)
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Workers::CreatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Workers::UpdatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Workers::State)
                            .integer()
                            .not_null()
                            .default(0),
                    )
                    .col(
                        ColumnDef::new(Workers::LastHeartbeat)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(ColumnDef::new(Workers::AssignedTaskId).big_integer().null())
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-workers-creator_id")
                            .from(Workers::Table, Workers::CreatorId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(GroupWorker::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(GroupWorker::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(
                        ColumnDef::new(GroupWorker::GroupId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(GroupWorker::WorkerId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(ColumnDef::new(GroupWorker::Role).integer().not_null())
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-group_worker-group_id")
                            .from(GroupWorker::Table, GroupWorker::GroupId)
                            .to(Groups::Table, Groups::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-group_worker-worker_id")
                            .from(GroupWorker::Table, GroupWorker::WorkerId)
                            .to(Workers::Table, Workers::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .index(
                        Index::create()
                            .name("idx_group_worker-group_id-worker_id")
                            .table(GroupWorker::Table)
                            .unique()
                            .col(GroupWorker::GroupId)
                            .col(GroupWorker::WorkerId),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(ActiveTasks::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(ActiveTasks::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::CreatorId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::GroupId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(ColumnDef::new(ActiveTasks::TaskId).big_integer().not_null())
                    .col(
                        ColumnDef::new(ActiveTasks::Uuid)
                            .uuid()
                            .unique_key()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::Tags)
                            .array(ColumnType::Text)
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::Labels)
                            .array(ColumnType::Text)
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::CreatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::UpdatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::State)
                            .integer()
                            .not_null()
                            .default(0),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::AssignedWorker)
                            .big_integer()
                            .null(),
                    )
                    .col(
                        ColumnDef::new(ActiveTasks::Timeout)
                            .big_integer()
                            .not_null(),
                    )
                    .col(ColumnDef::new(ActiveTasks::Priority).integer().not_null())
                    .col(ColumnDef::new(ActiveTasks::Spec).json().not_null())
                    .col(ColumnDef::new(ActiveTasks::Result).json().null())
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-active_tasks-creator_id")
                            .from(ActiveTasks::Table, ActiveTasks::CreatorId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-active_tasks-group_id")
                            .from(ActiveTasks::Table, ActiveTasks::GroupId)
                            .to(Groups::Table, Groups::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .index(
                        Index::create()
                            .name("idx_active_tasks-group_id-task_id")
                            .table(ActiveTasks::Table)
                            .unique()
                            .col(ActiveTasks::GroupId)
                            .col(ActiveTasks::TaskId),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(ArchivedTasks::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(ArchivedTasks::Id)
                            .big_integer()
                            .not_null()
                            .primary_key(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::CreatorId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::GroupId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::TaskId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::Uuid)
                            .uuid()
                            .unique_key()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::Tags)
                            .array(ColumnType::Text)
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::Labels)
                            .array(ColumnType::Text)
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::CreatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::UpdatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(ColumnDef::new(ArchivedTasks::State).integer().not_null())
                    .col(
                        ColumnDef::new(ArchivedTasks::AssignedWorker)
                            .big_integer()
                            .null(),
                    )
                    .col(
                        ColumnDef::new(ArchivedTasks::Timeout)
                            .big_integer()
                            .not_null(),
                    )
                    .col(ColumnDef::new(ArchivedTasks::Priority).integer().not_null())
                    .col(ColumnDef::new(ArchivedTasks::Spec).json().not_null())
                    .col(ColumnDef::new(ArchivedTasks::Result).json().null())
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-archived_tasks-creator_id")
                            .from(ArchivedTasks::Table, ArchivedTasks::CreatorId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-archived_tasks-group_id")
                            .from(ArchivedTasks::Table, ArchivedTasks::GroupId)
                            .to(Groups::Table, Groups::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .index(
                        Index::create()
                            .name("idx_archived_tasks-group_id-task_id")
                            .table(ArchivedTasks::Table)
                            .unique()
                            .col(ArchivedTasks::GroupId)
                            .col(ArchivedTasks::TaskId),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(Attachments::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(Attachments::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(
                        ColumnDef::new(Attachments::GroupId)
                            .big_integer()
                            .not_null(),
                    )
                    .col(ColumnDef::new(Attachments::Key).text().not_null())
                    .col(
                        ColumnDef::new(Attachments::ContentType)
                            .integer()
                            .not_null()
                            .default(0),
                    )
                    .col(ColumnDef::new(Attachments::Size).big_integer().not_null())
                    .col(
                        ColumnDef::new(Attachments::CreatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Attachments::UpdatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .name("fk-attachments-group_id")
                            .from(Attachments::Table, Attachments::GroupId)
                            .to(Groups::Table, Groups::Id)
                            .on_delete(ForeignKeyAction::Restrict)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .index(
                        Index::create()
                            .name("idx_attachments-group_id-key")
                            .table(Attachments::Table)
                            .unique()
                            .col(Attachments::GroupId)
                            .col(Attachments::Key),
                    )
                    .to_owned(),
            )
            .await?;
        manager
            .create_table(
                Table::create()
                    .table(Artifacts::Table)
                    .if_not_exists()
                    .col(
                        ColumnDef::new(Artifacts::Id)
                            .big_integer()
                            .not_null()
                            .auto_increment()
                            .primary_key(),
                    )
                    .col(ColumnDef::new(Artifacts::TaskId).uuid().not_null())
                    .col(
                        ColumnDef::new(Artifacts::ContentType)
                            .integer()
                            .not_null()
                            .default(0),
                    )
                    .col(ColumnDef::new(Artifacts::Size).big_integer().not_null())
                    .col(
                        ColumnDef::new(Artifacts::CreatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .col(
                        ColumnDef::new(Artifacts::UpdatedAt)
                            .timestamp_with_time_zone()
                            .not_null(),
                    )
                    .index(
                        Index::create()
                            .name("idx_artifacts-task_id-content_type")
                            .table(Artifacts::Table)
                            .unique()
                            .col(Artifacts::TaskId)
                            .col(Artifacts::ContentType),
                    )
                    .to_owned(),
            )
            .await
    }

    async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .drop_table(Table::drop().table(Artifacts::Table).if_exists().to_owned())
            .await?;
        manager
            .drop_table(
                Table::drop()
                    .table(Attachments::Table)
                    .if_exists()
                    .to_owned(),
            )
            .await?;
        manager
            .drop_table(
                Table::drop()
                    .table(ArchivedTasks::Table)
                    .if_exists()
                    .to_owned(),
            )
            .await?;
        manager
            .drop_table(
                Table::drop()
                    .table(ActiveTasks::Table)
                    .if_exists()
                    .to_owned(),
            )
            .await?;
        manager
            .drop_table(
                Table::drop()
                    .table(GroupWorker::Table)
                    .if_exists()
                    .to_owned(),
            )
            .await?;
        manager
            .drop_table(Table::drop().table(Workers::Table).if_exists().to_owned())
            .await?;
        manager
            .drop_table(Table::drop().table(UserGroup::Table).if_exists().to_owned())
            .await?;
        manager
            .drop_table(Table::drop().table(Groups::Table).if_exists().to_owned())
            .await?;
        manager
            .drop_table(Table::drop().table(Users::Table).if_exists().to_owned())
            .await
    }
}

#[derive(DeriveIden)]
enum Users {
    Table,
    Id,
    Username,
    EncryptedPassword,
    AuthSignature,
    ResetPasswordToken,
    ResetPasswordTokenExpiry,
    CurrentSignInAt,
    LastSignInAt,
    CurrentSignInIp,
    LastSignInIp,
    CreatedAt,
    UpdatedAt,
    Admin,
    State,
    GroupQuota,
    GroupCount,
}

#[derive(DeriveIden)]
enum Groups {
    Table,
    Id,
    GroupName,
    CreatorId,
    CreatedAt,
    UpdatedAt,
    State,
    TaskCount,
    StorageQuota,
    StorageUsed,
}

#[derive(DeriveIden)]
enum UserGroup {
    Table,
    Id,
    UserId,
    GroupId,
    Role,
}

#[derive(DeriveIden)]
enum Workers {
    Table,
    Id,
    WorkerId,
    CreatorId,
    Tags,
    CreatedAt,
    UpdatedAt,
    State,
    LastHeartbeat,
    AssignedTaskId,
}

#[derive(DeriveIden)]
enum GroupWorker {
    Table,
    Id,
    GroupId,
    WorkerId,
    Role,
}

#[derive(DeriveIden)]
enum ActiveTasks {
    Table,
    Id,
    CreatorId,
    GroupId,
    TaskId,
    Uuid,
    Tags,
    Labels,
    CreatedAt,
    UpdatedAt,
    State,
    AssignedWorker,
    Timeout,
    Priority,
    Spec,
    Result,
}

#[derive(DeriveIden)]
enum ArchivedTasks {
    Table,
    Id,
    CreatorId,
    GroupId,
    TaskId,
    Uuid,
    Tags,
    Labels,
    CreatedAt,
    UpdatedAt,
    State,
    AssignedWorker,
    Timeout,
    Priority,
    Spec,
    Result,
}

#[derive(DeriveIden)]
enum Attachments {
    Table,
    Id,
    GroupId,
    Key,
    ContentType,
    Size,
    CreatedAt,
    UpdatedAt,
}

#[derive(DeriveIden)]
enum Artifacts {
    Table,
    Id,
    TaskId,
    ContentType,
    Size,
    CreatedAt,
    UpdatedAt,
}