forked from ghe0/brain-to-surreal
migration working
This commit is contained in:
commit
1074942e96
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
4548
Cargo.lock
generated
Normal file
4548
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
21
Cargo.toml
Normal file
21
Cargo.toml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
[package]
|
||||||
|
name = "rust_test"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
chrono = { version = "0.4.40", features = ["serde"] }
|
||||||
|
dashmap = { version = "6.1.0", features = ["serde"] }
|
||||||
|
futures = "0.3.31"
|
||||||
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
|
serde_json = "1.0.140"
|
||||||
|
serde_yaml = "0.9.34"
|
||||||
|
surrealdb = "2.2.2"
|
||||||
|
tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] }
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
lto = true
|
||||||
|
strip = true
|
||||||
|
opt-level = 3
|
||||||
|
panic = 'abort'
|
||||||
|
codegen-units = 1
|
91
final_tables.surql
Normal file
91
final_tables.surql
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
DEFINE TABLE account SCHEMAFULL;
|
||||||
|
DEFINE FIELD balance ON TABLE account TYPE int;
|
||||||
|
DEFINE FIELD tmp_locked ON TABLE account TYPE int;
|
||||||
|
DEFINE FIELD escrow ON TABLE account TYPE int;
|
||||||
|
DEFINE FIELD email ON TABLE account TYPE string;
|
||||||
|
DEFINE FIELD hratls_pubkey ON TABLE account TYPE string;
|
||||||
|
DEFINE FIELD vm_nodes ON TABLE account TYPE array<record>;
|
||||||
|
DEFINE FIELD app_nodes ON TABLE account TYPE array<record>;
|
||||||
|
|
||||||
|
DEFINE TABLE package SCHEMAFULL;
|
||||||
|
DEFINE FIELD url ON TABLE package TYPE array<string>;
|
||||||
|
|
||||||
|
DEFINE TABLE kernel SCHEMAFULL;
|
||||||
|
DEFINE FIELD url ON TABLE kernel TYPE array<string>;
|
||||||
|
|
||||||
|
DEFINE TABLE dtrfs SCHEMAFULL;
|
||||||
|
DEFINE FIELD url ON TABLE dtrfs TYPE array<string>;
|
||||||
|
DEFINE FIELD kernel ON TABLE dtrfs TYPE record<kernel>;
|
||||||
|
|
||||||
|
DEFINE TABLE vm_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD country ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD region ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD city ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD ip ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD avail_mem_mb ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_vcpus ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_storage_gbs ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ipv4 ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ipv6 ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ports ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD max_ports_per_vm ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD price ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD offline_minutes ON TABLE vm_node TYPE int;
|
||||||
|
|
||||||
|
DEFINE TABLE vm_contract TYPE RELATION FROM account TO vm_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD state ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD hostname ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD mapped_ports ON TABLE vm_contract TYPE array<[int, int]>;
|
||||||
|
DEFINE FIELD public_ipv4 ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD public_ipv6 ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD disk_size_gb ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD vcpus ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD memory_mb ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD dtrfs ON TABLE vm_contract TYPE record<dtrfs>;
|
||||||
|
DEFINE FIELD created_at ON TABLE vm_contract TYPE datetime;
|
||||||
|
DEFINE FIELD updated_at ON TABLE vm_contract TYPE datetime;
|
||||||
|
DEFINE FIELD price_per_unit ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD locked_nano ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD collected_at ON TABLE vm_contract TYPE datetime;
|
||||||
|
|
||||||
|
DEFINE TABLE app_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD country ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD region ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD city ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD ip ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD avail_mem_mb ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD avail_vcpus ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD avail_storage_gbs ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ports ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD max_ports_per_app ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD price ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD offline_minutes ON TABLE app_node TYPE int;
|
||||||
|
|
||||||
|
DEFINE TABLE app_contract TYPE RELATION FROM account TO app_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD state ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD app_name ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD mapped_ports ON TABLE app_contract TYPE array<[int, int]>;
|
||||||
|
DEFINE FIELD host_ipv4 ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD vcpus ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD memory_mb ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD disk_size_gb ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD created_at ON TABLE app_contract TYPE datetime;
|
||||||
|
DEFINE FIELD updated_at ON TABLE app_contract TYPE datetime;
|
||||||
|
DEFINE FIELD price_per_unit ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD locked_nano ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD collected_at ON TABLE app_contract TYPE datetime;
|
||||||
|
DEFINE FIELD mr_enclave ON TABLE app_contract TYPE record<package>;
|
||||||
|
|
||||||
|
DEFINE TABLE ban TYPE RELATION FROM account TO account;
|
||||||
|
DEFINE FIELD created_at ON TABLE ban TYPE datetime;
|
||||||
|
|
||||||
|
DEFINE TABLE kick TYPE RELATION FROM account TO account;
|
||||||
|
DEFINE FIELD created_at ON TABLE kick TYPE datetime;
|
||||||
|
DEFINE FIELD reason ON TABLE kick TYPE string;
|
||||||
|
DEFINE FIELD contract ON TABLE kick TYPE record<vm_contract|app_contract>;
|
||||||
|
|
||||||
|
DEFINE TABLE report TYPE RELATION FROM account TO vm_node|app_node;
|
||||||
|
DEFINE FIELD created_at ON TABLE ban TYPE datetime;
|
||||||
|
DEFINE FIELD reason ON TABLE ban TYPE string;
|
||||||
|
|
||||||
|
DEFINE TABLE operator TYPE RELATION FROM account TO vm_node|app_node;
|
81
interim_tables.surql
Normal file
81
interim_tables.surql
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
DEFINE TABLE account SCHEMAFULL;
|
||||||
|
DEFINE FIELD balance ON TABLE account TYPE int;
|
||||||
|
DEFINE FIELD tmp_locked ON TABLE account TYPE int;
|
||||||
|
DEFINE FIELD escrow ON TABLE account TYPE int;
|
||||||
|
DEFINE FIELD email ON TABLE account TYPE string;
|
||||||
|
|
||||||
|
DEFINE TABLE vm_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD country ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD region ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD city ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD ip ON TABLE vm_node TYPE string;
|
||||||
|
DEFINE FIELD avail_mem_mb ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_vcpus ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_storage_gbs ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ipv4 ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ipv6 ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ports ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD max_ports_per_vm ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD price ON TABLE vm_node TYPE int;
|
||||||
|
DEFINE FIELD offline_minutes ON TABLE vm_node TYPE int;
|
||||||
|
|
||||||
|
DEFINE TABLE vm_contract TYPE RELATION FROM account TO vm_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD state ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD hostname ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD mapped_ports ON TABLE vm_contract TYPE array<[int, int]>;
|
||||||
|
DEFINE FIELD public_ipv4 ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD public_ipv6 ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD disk_size_gb ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD vcpus ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD memory_mb ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD dtrfs_sha ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD kernel_sha ON TABLE vm_contract TYPE string;
|
||||||
|
DEFINE FIELD created_at ON TABLE vm_contract TYPE datetime;
|
||||||
|
DEFINE FIELD updated_at ON TABLE vm_contract TYPE datetime;
|
||||||
|
DEFINE FIELD price_per_unit ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD locked_nano ON TABLE vm_contract TYPE int;
|
||||||
|
DEFINE FIELD collected_at ON TABLE vm_contract TYPE datetime;
|
||||||
|
|
||||||
|
DEFINE TABLE app_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD country ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD region ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD city ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD ip ON TABLE app_node TYPE string;
|
||||||
|
DEFINE FIELD avail_mem_mb ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD avail_vcpus ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD avail_storage_gbs ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD avail_ports ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD max_ports_per_app ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD price ON TABLE app_node TYPE int;
|
||||||
|
DEFINE FIELD offline_minutes ON TABLE app_node TYPE int;
|
||||||
|
|
||||||
|
DEFINE TABLE app_contract TYPE RELATION FROM account TO app_node SCHEMAFULL;
|
||||||
|
DEFINE FIELD state ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD app_name ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD mapped_ports ON TABLE app_contract TYPE array<[int, int]>;
|
||||||
|
DEFINE FIELD host_ipv4 ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD vcpus ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD memory_mb ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD disk_size_gb ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD created_at ON TABLE app_contract TYPE datetime;
|
||||||
|
DEFINE FIELD updated_at ON TABLE app_contract TYPE datetime;
|
||||||
|
DEFINE FIELD price_per_unit ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD locked_nano ON TABLE app_contract TYPE int;
|
||||||
|
DEFINE FIELD collected_at ON TABLE app_contract TYPE datetime;
|
||||||
|
DEFINE FIELD mr_enclave ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD package_url ON TABLE app_contract TYPE string;
|
||||||
|
DEFINE FIELD hratls_pubkey ON TABLE app_contract TYPE string;
|
||||||
|
|
||||||
|
DEFINE TABLE ban TYPE RELATION FROM account TO account;
|
||||||
|
DEFINE FIELD created_at ON TABLE ban TYPE datetime;
|
||||||
|
|
||||||
|
DEFINE TABLE kick TYPE RELATION FROM account TO account;
|
||||||
|
DEFINE FIELD created_at ON TABLE kick TYPE datetime;
|
||||||
|
DEFINE FIELD reason ON TABLE kick TYPE string;
|
||||||
|
DEFINE FIELD contract ON TABLE kick TYPE record<vm_contract|app_contract>;
|
||||||
|
|
||||||
|
DEFINE TABLE report TYPE RELATION FROM account TO vm_node|app_node;
|
||||||
|
DEFINE FIELD created_at ON TABLE ban TYPE datetime;
|
||||||
|
DEFINE FIELD reason ON TABLE ban TYPE string;
|
||||||
|
|
||||||
|
DEFINE TABLE operator TYPE RELATION FROM account TO vm_node|app_node;
|
387
saved_data.yaml
Normal file
387
saved_data.yaml
Normal file
@ -0,0 +1,387 @@
|
|||||||
|
accounts:
|
||||||
|
DXXkYSnhP3ijsHYxkedcuMomEyc122WaAbkDX7SaGuUS:
|
||||||
|
balance: 20293420000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL:
|
||||||
|
balance: 25949200000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
Cnkvn3WuHYfTzh1YK1TAv2VD25sNvstJNnQtxjcdQSL7:
|
||||||
|
balance: 4794480000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
|
||||||
|
balance: 4672207240000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
E3bgXsWvgichXeC6AqULJCZDp7FbEdTxBD67UaYVWf9y:
|
||||||
|
balance: 21121600000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
HQyGWpiteHbxjszngZvmiX7ZFZAmF6nFjEraBa1M6bbM:
|
||||||
|
balance: 979410300000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
H21Shi4iE7vgfjWEQNvzmpmBMJSaiZ17PYUcdNoAoKNc:
|
||||||
|
balance: 976000000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
45Pyv9hRfub43NyRrYv95MhZs1Wrm8sj3RhBvA3F1Bvr:
|
||||||
|
balance: 1670441080000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
49JBVzmgsQbUURHzAWax2gxo6jmukqbEQzP97YeeNQyu:
|
||||||
|
balance: 1076960680000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB:
|
||||||
|
balance: 3271040000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK:
|
||||||
|
balance: 554454460000
|
||||||
|
tmp_locked: 547200000
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
3BNggj8ZTsoSjfAGdPfmcU2Gobm2qcTEBg9iHXEUPe1t:
|
||||||
|
balance: 9978460000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
B981xPHmHthfKr15J9uJ64qd9zt2KsdiEuDRR7UUCGWi:
|
||||||
|
balance: 99980200000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
CLYyE6id5876DW69LHDynuH6TjJPvWRBTQC5XDZ6jfT1:
|
||||||
|
balance: 25000000000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
db5ZB6uDbF1mUUgeggBZ9XKbi3mUfX6WHkBpbwUHJpB:
|
||||||
|
balance: 25000000000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
fY3NNjvFTeR1FBh5nXV3ujX7zZqrm3eBUWGEiG75TK1:
|
||||||
|
balance: 1000000000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
FBMWVqME3t1i4R6zWyDQGUuiTeruZ1TxLhTmhaEcFypZ:
|
||||||
|
balance: 181560160000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX:
|
||||||
|
balance: 74660380000
|
||||||
|
tmp_locked: 0
|
||||||
|
kicked_for: []
|
||||||
|
last_kick: 1970-01-01T00:00:00Z
|
||||||
|
banned_by: []
|
||||||
|
operators:
|
||||||
|
BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS:
|
||||||
|
escrow: 5096692000000
|
||||||
|
email: first_on_detee@proton.me
|
||||||
|
banned_users: []
|
||||||
|
vm_nodes:
|
||||||
|
- HiyMp21zaBVbRCjDsD5hEjQnHeHv4e1gpUR6pVfHTKqv
|
||||||
|
- 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
|
||||||
|
- Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
|
||||||
|
- 4QbUXDM915RUFnHm3NiysLXFLk1WRGZvABwLNzx4tTEW
|
||||||
|
- DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
|
||||||
|
app_nodes: []
|
||||||
|
x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK:
|
||||||
|
escrow: 5499700480000
|
||||||
|
email: gheo@detee.ltd
|
||||||
|
banned_users: []
|
||||||
|
vm_nodes:
|
||||||
|
- 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
|
||||||
|
- 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
|
||||||
|
app_nodes: []
|
||||||
|
7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB:
|
||||||
|
escrow: 0
|
||||||
|
email: ''
|
||||||
|
banned_users: []
|
||||||
|
vm_nodes: []
|
||||||
|
app_nodes:
|
||||||
|
- BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
|
||||||
|
vm_nodes:
|
||||||
|
- public_key: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
|
||||||
|
operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
|
||||||
|
country: GB
|
||||||
|
region: England
|
||||||
|
city: London
|
||||||
|
ip: 173.234.17.2
|
||||||
|
avail_mem_mb: 26000
|
||||||
|
avail_vcpus: 28
|
||||||
|
avail_storage_gbs: 680
|
||||||
|
avail_ipv4: 2
|
||||||
|
avail_ipv6: 65516
|
||||||
|
avail_ports: 19999
|
||||||
|
max_ports_per_vm: 5
|
||||||
|
price: 20000
|
||||||
|
reports: {}
|
||||||
|
offline_minutes: 0
|
||||||
|
- public_key: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
|
||||||
|
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
|
||||||
|
country: FR
|
||||||
|
region: Île-de-France
|
||||||
|
city: Paris
|
||||||
|
ip: 156.146.63.215
|
||||||
|
avail_mem_mb: 123000
|
||||||
|
avail_vcpus: 46
|
||||||
|
avail_storage_gbs: 440
|
||||||
|
avail_ipv4: 2
|
||||||
|
avail_ipv6: 0
|
||||||
|
avail_ports: 20000
|
||||||
|
max_ports_per_vm: 5
|
||||||
|
price: 20000
|
||||||
|
reports: {}
|
||||||
|
offline_minutes: 0
|
||||||
|
- public_key: 2Uf5pxhxKTUm6gRMnpbJHYDuyA6BWUfFsdmPyWfbMV1f
|
||||||
|
operator_wallet: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
|
||||||
|
country: CA
|
||||||
|
region: Quebec
|
||||||
|
city: Montréal
|
||||||
|
ip: 184.107.169.199
|
||||||
|
avail_mem_mb: 30000
|
||||||
|
avail_vcpus: 31
|
||||||
|
avail_storage_gbs: 700
|
||||||
|
avail_ipv4: 0
|
||||||
|
avail_ipv6: 0
|
||||||
|
avail_ports: 20000
|
||||||
|
max_ports_per_vm: 5
|
||||||
|
price: 18000
|
||||||
|
reports: {}
|
||||||
|
offline_minutes: 0
|
||||||
|
- public_key: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
|
||||||
|
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
|
||||||
|
country: CA
|
||||||
|
region: British Columbia
|
||||||
|
city: Vancouver
|
||||||
|
ip: 149.22.95.1
|
||||||
|
avail_mem_mb: 109000
|
||||||
|
avail_vcpus: 45
|
||||||
|
avail_storage_gbs: 400
|
||||||
|
avail_ipv4: 25
|
||||||
|
avail_ipv6: 0
|
||||||
|
avail_ports: 20000
|
||||||
|
max_ports_per_vm: 5
|
||||||
|
price: 20000
|
||||||
|
reports: {}
|
||||||
|
offline_minutes: 0
|
||||||
|
- public_key: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
|
||||||
|
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
|
||||||
|
country: US
|
||||||
|
region: California
|
||||||
|
city: San Jose
|
||||||
|
ip: 149.36.48.99
|
||||||
|
avail_mem_mb: 120000
|
||||||
|
avail_vcpus: 41
|
||||||
|
avail_storage_gbs: 390
|
||||||
|
avail_ipv4: 23
|
||||||
|
avail_ipv6: 0
|
||||||
|
avail_ports: 19999
|
||||||
|
max_ports_per_vm: 5
|
||||||
|
price: 20000
|
||||||
|
reports: {}
|
||||||
|
offline_minutes: 0
|
||||||
|
- public_key: HiyMp21zaBVbRCjDsD5hEjQnHeHv4e1gpUR6pVfHTKqv
|
||||||
|
operator_wallet: BFopWmwcZAMF1h2PFECZNdEucdZfnZZ32p6R9ZaBiVsS
|
||||||
|
country: CA
|
||||||
|
region: British Columbia
|
||||||
|
city: Vancouver
|
||||||
|
ip: 149.22.95.28
|
||||||
|
avail_mem_mb: 125000
|
||||||
|
avail_vcpus: 46
|
||||||
|
avail_storage_gbs: 400
|
||||||
|
avail_ipv4: 26
|
||||||
|
avail_ipv6: 0
|
||||||
|
avail_ports: 20000
|
||||||
|
max_ports_per_vm: 5
|
||||||
|
price: 20000
|
||||||
|
reports: {}
|
||||||
|
offline_minutes: 0
|
||||||
|
vm_contracts:
|
||||||
|
- uuid: 958165e3-dea8-407d-8c42-dd17002ef79c
|
||||||
|
hostname: detee-landing-fr
|
||||||
|
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
|
||||||
|
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
|
||||||
|
exposed_ports: []
|
||||||
|
public_ipv4: 156.146.63.216
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 10
|
||||||
|
vcpus: 2
|
||||||
|
memory_mb: 3000
|
||||||
|
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151
|
||||||
|
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b
|
||||||
|
created_at: 2025-02-28T23:19:41.769423466Z
|
||||||
|
updated_at: 2025-04-12T12:11:58.516768949Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 14875500000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461165181Z
|
||||||
|
- uuid: e807a2fd-cf90-4a14-bc3a-89ce6dc59033
|
||||||
|
hostname: detee-landing-gb
|
||||||
|
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
|
||||||
|
node_pubkey: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
|
||||||
|
exposed_ports: []
|
||||||
|
public_ipv4: 173.234.136.154
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 10
|
||||||
|
vcpus: 2
|
||||||
|
memory_mb: 3000
|
||||||
|
kernel_sha: 3ec4fc5aa5729f515967ec71be4a851622785c0080f7191b1b07717149840151
|
||||||
|
dtrfs_sha: 3f6b3e5740f249eedfb2f7248c521a551be8b2676f7fcb040f3f3bc840a5004b
|
||||||
|
created_at: 2025-03-06T19:51:39.595163157Z
|
||||||
|
updated_at: 2025-03-06T19:51:39.595163842Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 14875500000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461181545Z
|
||||||
|
- uuid: 23094406-2307-4332-a642-acee718d0186
|
||||||
|
hostname: heroic-door
|
||||||
|
admin_pubkey: DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX
|
||||||
|
node_pubkey: 7Xw3RxbP5pvfjZ8U6yA3HHVSS9YXjKH5Vkas3JRbQYd9
|
||||||
|
exposed_ports:
|
||||||
|
- 38288
|
||||||
|
public_ipv4: ''
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 10
|
||||||
|
vcpus: 1
|
||||||
|
memory_mb: 1000
|
||||||
|
kernel_sha: 14e225e4aaf84cc2e0b5f64206121186ddebc4b378b886da3b2f7515dfd41692
|
||||||
|
dtrfs_sha: 03ce24dbbe917fdd4f6347e61036805ddbdded5044c272bab188ef9333093bee
|
||||||
|
created_at: 2025-03-12T16:28:24.749161605Z
|
||||||
|
updated_at: 2025-03-12T16:28:24.749162477Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 14134140000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461191231Z
|
||||||
|
- uuid: 1f49a71c-f68c-4c64-a82e-f50e0ba0b574
|
||||||
|
hostname: astromech-wrench
|
||||||
|
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
|
||||||
|
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
|
||||||
|
exposed_ports: []
|
||||||
|
public_ipv4: 149.22.95.2
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 10
|
||||||
|
vcpus: 2
|
||||||
|
memory_mb: 3000
|
||||||
|
kernel_sha: 3a68709138bed09c16671949cf1f03acee95a08381ba84fc70fb586001fa6767
|
||||||
|
dtrfs_sha: 0bb93443f65c9f4379ed469f94794f5c1bf14d8905b0b2c56a125df4a9ebe83e
|
||||||
|
created_at: 2025-03-20T14:40:25.557753393Z
|
||||||
|
updated_at: 2025-03-20T14:40:25.557754242Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 11865620000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461201690Z
|
||||||
|
- uuid: 16577f1c-9867-4a17-80a8-6cf0490f1270
|
||||||
|
hostname: sofenty
|
||||||
|
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
|
||||||
|
node_pubkey: Du3UfPSUUZmA5thQmc9Vrxdy7UimpygcpDsQNnwRQPtu
|
||||||
|
exposed_ports: []
|
||||||
|
public_ipv4: 156.146.63.217
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 10
|
||||||
|
vcpus: 2
|
||||||
|
memory_mb: 3000
|
||||||
|
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
|
||||||
|
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
|
||||||
|
created_at: 2025-04-07T22:57:57.646151746Z
|
||||||
|
updated_at: 2025-04-07T22:57:57.646152630Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 11867500000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461211040Z
|
||||||
|
- uuid: 4b6e25ca-87ac-478b-8f16-aa8f5c44c704
|
||||||
|
hostname: cloaked-mailbox
|
||||||
|
admin_pubkey: DwfL5iFu32xh2YMCUxg63oEAThLRqehDAumiP9q6zuuX
|
||||||
|
node_pubkey: DgkbsrwttkZXvzxY5kDwQQoDd79GLmZ5tc7fYJUFkQQb
|
||||||
|
exposed_ports: []
|
||||||
|
public_ipv4: 149.22.95.2
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 30
|
||||||
|
vcpus: 1
|
||||||
|
memory_mb: 1000
|
||||||
|
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
|
||||||
|
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
|
||||||
|
created_at: 2025-04-12T13:44:56.957037550Z
|
||||||
|
updated_at: 2025-04-12T13:44:56.957038546Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 11177760000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461219779Z
|
||||||
|
- uuid: eb1a13ed-d782-4b71-8860-73540129cb7d
|
||||||
|
hostname: twenty
|
||||||
|
admin_pubkey: FHuecMbeC1PfjkW2JKyoicJAuiU7khgQT16QUB3Q1XdL
|
||||||
|
node_pubkey: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
|
||||||
|
exposed_ports: []
|
||||||
|
public_ipv4: 149.36.48.100
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 10
|
||||||
|
vcpus: 4
|
||||||
|
memory_mb: 4000
|
||||||
|
kernel_sha: e49c8587287b21df7600c04326fd7393524453918c14d67f73757dc769a13542
|
||||||
|
dtrfs_sha: b5f408d00e2b93dc594fed3a7f2466a9878802ff1c7ae502247471cd06728a45
|
||||||
|
created_at: 2025-04-15T00:46:35.622165457Z
|
||||||
|
updated_at: 2025-04-15T00:46:35.622166372Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 15570720000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461230948Z
|
||||||
|
- uuid: 1bf36309-3774-4825-b023-b2a0ef0405ed
|
||||||
|
hostname: shadowy-hobo
|
||||||
|
admin_pubkey: x52w7jARC5erhWWK65VZmjdGXzBK6ZDgfv1A283d8XK
|
||||||
|
node_pubkey: 3zRxiGRnf46vd3zAEmpaYBJocTV9oJB6yXf5GZFR1Sq4
|
||||||
|
exposed_ports:
|
||||||
|
- 46393
|
||||||
|
public_ipv4: ''
|
||||||
|
public_ipv6: ''
|
||||||
|
disk_size_gb: 10
|
||||||
|
vcpus: 1
|
||||||
|
memory_mb: 1000
|
||||||
|
kernel_sha: e765e56166ef321b53399b9638584d1279821dbe3d46191c1f66bbaa075e7919
|
||||||
|
dtrfs_sha: d207644ee60d54009b6ecdfb720e2ec251cde31774dd249fcc7435aca0377990
|
||||||
|
created_at: 2025-04-16T20:37:57.176592933Z
|
||||||
|
updated_at: 2025-04-16T20:37:57.176594069Z
|
||||||
|
price_per_unit: 20000
|
||||||
|
locked_nano: 12730960000
|
||||||
|
collected_at: 2025-04-20T00:34:15.461240342Z
|
||||||
|
app_nodes:
|
||||||
|
- node_pubkey: BiqoPUEoAxYxMRXUmyofoS9H1TBQgQqvLJ6MbWh88AQg
|
||||||
|
operator_wallet: 7V3rEuh6j8VuwMVB5PyGqWKLmjJ4fYSv6WtrTL51NZTB
|
||||||
|
country: DE
|
||||||
|
region: Hesse
|
||||||
|
city: Frankfurt am Main
|
||||||
|
ip: 212.95.45.139
|
||||||
|
avail_mem_mb: 16000
|
||||||
|
avail_vcpus: 16
|
||||||
|
avail_storage_mb: 200000
|
||||||
|
avail_no_of_port: 20000
|
||||||
|
max_ports_per_app: 9
|
||||||
|
price: 20000
|
||||||
|
offline_minutes: 0
|
||||||
|
app_contracts: []
|
16
src/main.rs
Normal file
16
src/main.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
mod old_brain;
|
||||||
|
mod surreal_brain;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
let old_brain_data = old_brain::BrainData::load_from_disk()?;
|
||||||
|
// println!("{}", serde_yaml::to_string(&old_brain_data)?);
|
||||||
|
|
||||||
|
let result = surreal_brain::migrate(&old_brain_data).await?;
|
||||||
|
|
||||||
|
println!("{result:?}");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
129
src/old_brain.rs
Normal file
129
src/old_brain.rs
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
use chrono::Utc;
|
||||||
|
use dashmap::DashMap;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
|
#[derive(Clone, Default, Serialize, Deserialize, Debug)]
|
||||||
|
pub struct AccountData {
|
||||||
|
pub balance: u64,
|
||||||
|
pub tmp_locked: u64,
|
||||||
|
// holds reasons why VMs of this account got kicked
|
||||||
|
pub kicked_for: Vec<String>,
|
||||||
|
pub last_kick: chrono::DateTime<Utc>,
|
||||||
|
// holds accounts that banned this account
|
||||||
|
pub banned_by: HashSet<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Default, Serialize, Deserialize)]
|
||||||
|
pub struct OperatorData {
|
||||||
|
pub escrow: u64,
|
||||||
|
pub email: String,
|
||||||
|
pub banned_users: HashSet<String>,
|
||||||
|
pub vm_nodes: HashSet<String>,
|
||||||
|
pub app_nodes: HashSet<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Eq, PartialEq, Clone, Debug, Default, Serialize, Deserialize)]
|
||||||
|
pub struct VmNode {
|
||||||
|
pub public_key: String,
|
||||||
|
pub operator_wallet: String,
|
||||||
|
pub country: String,
|
||||||
|
pub region: String,
|
||||||
|
pub city: String,
|
||||||
|
pub ip: String,
|
||||||
|
pub avail_mem_mb: u32,
|
||||||
|
pub avail_vcpus: u32,
|
||||||
|
pub avail_storage_gbs: u32,
|
||||||
|
pub avail_ipv4: u32,
|
||||||
|
pub avail_ipv6: u32,
|
||||||
|
pub avail_ports: u32,
|
||||||
|
pub max_ports_per_vm: u32,
|
||||||
|
// nanoLP per unit per minute
|
||||||
|
pub price: u64,
|
||||||
|
// 1st String is user wallet and 2nd String is report message
|
||||||
|
pub reports: HashMap<String, String>,
|
||||||
|
pub offline_minutes: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
|
pub struct VmContract {
|
||||||
|
pub uuid: String,
|
||||||
|
pub hostname: String,
|
||||||
|
pub admin_pubkey: String,
|
||||||
|
pub node_pubkey: String,
|
||||||
|
pub exposed_ports: Vec<u32>,
|
||||||
|
pub public_ipv4: String,
|
||||||
|
pub public_ipv6: String,
|
||||||
|
pub disk_size_gb: u32,
|
||||||
|
pub vcpus: u32,
|
||||||
|
pub memory_mb: u32,
|
||||||
|
pub kernel_sha: String,
|
||||||
|
pub dtrfs_sha: String,
|
||||||
|
pub created_at: chrono::DateTime<Utc>,
|
||||||
|
pub updated_at: chrono::DateTime<Utc>,
|
||||||
|
// recommended value is 20000
|
||||||
|
/// price per unit per minute
|
||||||
|
pub price_per_unit: u64,
|
||||||
|
pub locked_nano: u64,
|
||||||
|
pub collected_at: chrono::DateTime<Utc>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
|
||||||
|
pub struct AppContract {
|
||||||
|
pub uuid: String,
|
||||||
|
pub package_url: String,
|
||||||
|
pub admin_pubkey: String,
|
||||||
|
pub node_pubkey: String,
|
||||||
|
pub mapped_ports: Vec<(u16, u16)>,
|
||||||
|
pub host_ipv4: String,
|
||||||
|
pub disk_size_mb: u32,
|
||||||
|
pub vcpus: u32,
|
||||||
|
pub memory_mb: u32,
|
||||||
|
pub created_at: chrono::DateTime<Utc>,
|
||||||
|
pub updated_at: chrono::DateTime<Utc>,
|
||||||
|
// price per unit per minute
|
||||||
|
// recommended value is 20000
|
||||||
|
pub price_per_unit: u64,
|
||||||
|
pub locked_nano: u64,
|
||||||
|
pub collected_at: chrono::DateTime<Utc>,
|
||||||
|
pub hratls_pubkey: String,
|
||||||
|
pub public_package_mr_enclave: Option<Vec<u8>>,
|
||||||
|
pub app_name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Eq, Hash, PartialEq, Clone, Debug, Default, Serialize, Deserialize)]
|
||||||
|
pub struct AppNode {
|
||||||
|
pub node_pubkey: String,
|
||||||
|
pub operator_wallet: String,
|
||||||
|
pub country: String,
|
||||||
|
pub region: String,
|
||||||
|
pub city: String,
|
||||||
|
pub ip: String,
|
||||||
|
pub avail_mem_mb: u32,
|
||||||
|
pub avail_vcpus: u32,
|
||||||
|
pub avail_storage_mb: u32,
|
||||||
|
pub avail_no_of_port: u32,
|
||||||
|
pub max_ports_per_app: u32,
|
||||||
|
// nanotokens per unit per minute
|
||||||
|
pub price: u64,
|
||||||
|
pub offline_minutes: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, Serialize, Deserialize)]
|
||||||
|
pub struct BrainData {
|
||||||
|
pub accounts: DashMap<String, AccountData>,
|
||||||
|
pub operators: DashMap<String, OperatorData>,
|
||||||
|
pub vm_nodes: Vec<VmNode>,
|
||||||
|
pub vm_contracts: Vec<VmContract>,
|
||||||
|
|
||||||
|
pub app_nodes: Vec<AppNode>,
|
||||||
|
pub app_contracts: Vec<AppContract>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BrainData {
|
||||||
|
pub fn load_from_disk() -> Result<Self, Box<dyn std::error::Error>> {
|
||||||
|
let content = std::fs::read_to_string("./saved_data.yaml")?;
|
||||||
|
let data: Self = serde_yaml::from_str(&content)?;
|
||||||
|
Ok(data)
|
||||||
|
}
|
||||||
|
}
|
323
src/surreal_brain.rs
Normal file
323
src/surreal_brain.rs
Normal file
@ -0,0 +1,323 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::sync::LazyLock;
|
||||||
|
use surrealdb::{
|
||||||
|
engine::remote::ws::{Client, Ws},
|
||||||
|
opt::auth::Root,
|
||||||
|
sql::Datetime,
|
||||||
|
RecordId, Surreal,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::old_brain;
|
||||||
|
|
||||||
|
static DB: LazyLock<Surreal<Client>> = LazyLock::new(Surreal::init);
|
||||||
|
|
||||||
|
async fn init() -> surrealdb::Result<()> {
|
||||||
|
DB.connect::<Ws>("localhost:8000").await?;
|
||||||
|
// Sign in to the server
|
||||||
|
DB.signin(Root {
|
||||||
|
username: "root",
|
||||||
|
password: "root",
|
||||||
|
})
|
||||||
|
.await?;
|
||||||
|
DB.use_ns("brain").use_db("migration").await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn migrate(old_data: &old_brain::BrainData) -> surrealdb::Result<()> {
|
||||||
|
let accounts: Vec<Account> = old_data.into();
|
||||||
|
let vm_nodes: Vec<VmNode> = old_data.into();
|
||||||
|
let app_nodes: Vec<AppNode> = old_data.into();
|
||||||
|
let vm_contracts: Vec<VmContract> = old_data.into();
|
||||||
|
let operators: Vec<Operator> = old_data.into();
|
||||||
|
|
||||||
|
init().await?;
|
||||||
|
|
||||||
|
println!("Inserting accounts...");
|
||||||
|
let _: Vec<Account> = DB.insert(()).content(accounts).await?;
|
||||||
|
println!("Inserting vm nodes...");
|
||||||
|
let _: Vec<VmNode> = DB.insert(()).content(vm_nodes).await?;
|
||||||
|
println!("Inserting app nodes...");
|
||||||
|
let _: Vec<AppNode> = DB.insert(()).content(app_nodes).await?;
|
||||||
|
println!("Inserting vm contracts...");
|
||||||
|
let _: Vec<VmContract> = DB.insert("vm_contract").relation(vm_contracts).await?;
|
||||||
|
println!("Inserting operators...");
|
||||||
|
let _: Vec<Operator> = DB.insert("operator").relation(operators).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// I am not deleting this example cause I might need it later.
|
||||||
|
//
|
||||||
|
// async fn get_wallet_contracts() -> surrealdb::Result<Vec<Wallet>> {
|
||||||
|
// let mut result = DB
|
||||||
|
// .query("select *, ->contract.* from wallet:address1;")
|
||||||
|
// .await?;
|
||||||
|
// let wallets: Vec<Wallet> = result.take(0)?;
|
||||||
|
// Ok(wallets)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[derive(Debug, Serialize, Deserialize)]
|
||||||
|
// pub struct Wallet {
|
||||||
|
// balance: u64,
|
||||||
|
// id: RecordId,
|
||||||
|
// #[serde(rename = "->contract", default)]
|
||||||
|
// contracts: Vec<Contract>,
|
||||||
|
// }
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct Account {
|
||||||
|
id: RecordId,
|
||||||
|
balance: u64,
|
||||||
|
tmp_locked: u64,
|
||||||
|
escrow: u64,
|
||||||
|
email: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&old_brain::BrainData> for Vec<Account> {
|
||||||
|
fn from(old_data: &old_brain::BrainData) -> Self {
|
||||||
|
let mut accounts = Vec::new();
|
||||||
|
for old_account in old_data.accounts.iter() {
|
||||||
|
let mut a = Account {
|
||||||
|
id: RecordId::from(("account", old_account.key())),
|
||||||
|
balance: old_account.value().balance,
|
||||||
|
tmp_locked: old_account.value().tmp_locked,
|
||||||
|
escrow: 0,
|
||||||
|
email: String::new(),
|
||||||
|
};
|
||||||
|
if let Some(operator) = old_data.operators.get(old_account.key()) {
|
||||||
|
a.escrow = operator.escrow;
|
||||||
|
a.email = operator.email.clone();
|
||||||
|
}
|
||||||
|
accounts.push(a);
|
||||||
|
}
|
||||||
|
accounts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct VmNode {
|
||||||
|
id: RecordId,
|
||||||
|
country: String,
|
||||||
|
region: String,
|
||||||
|
city: String,
|
||||||
|
ip: String,
|
||||||
|
avail_mem_mb: u32,
|
||||||
|
avail_vcpus: u32,
|
||||||
|
avail_storage_gbs: u32,
|
||||||
|
avail_ipv4: u32,
|
||||||
|
avail_ipv6: u32,
|
||||||
|
avail_ports: u32,
|
||||||
|
max_ports_per_vm: u32,
|
||||||
|
price: u64,
|
||||||
|
offline_minutes: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&old_brain::BrainData> for Vec<VmNode> {
|
||||||
|
fn from(old_data: &old_brain::BrainData) -> Self {
|
||||||
|
let mut nodes = Vec::new();
|
||||||
|
for old_node in old_data.vm_nodes.iter() {
|
||||||
|
nodes.push(VmNode {
|
||||||
|
id: RecordId::from(("vm_node", old_node.public_key.clone())),
|
||||||
|
country: old_node.country.clone(),
|
||||||
|
region: old_node.region.clone(),
|
||||||
|
city: old_node.city.clone(),
|
||||||
|
ip: old_node.ip.clone(),
|
||||||
|
avail_mem_mb: old_node.avail_mem_mb,
|
||||||
|
avail_vcpus: old_node.avail_vcpus,
|
||||||
|
avail_storage_gbs: old_node.avail_storage_gbs,
|
||||||
|
avail_ipv4: old_node.avail_ipv4,
|
||||||
|
avail_ipv6: old_node.avail_ipv6,
|
||||||
|
avail_ports: old_node.avail_ports,
|
||||||
|
max_ports_per_vm: old_node.max_ports_per_vm,
|
||||||
|
price: old_node.price,
|
||||||
|
offline_minutes: old_node.offline_minutes,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
nodes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct VmContract {
|
||||||
|
id: RecordId,
|
||||||
|
#[serde(rename = "in")]
|
||||||
|
admin: RecordId,
|
||||||
|
#[serde(rename = "out")]
|
||||||
|
vm_node: RecordId,
|
||||||
|
state: String,
|
||||||
|
hostname: String,
|
||||||
|
mapped_ports: Vec<(u32, u32)>,
|
||||||
|
public_ipv4: String,
|
||||||
|
public_ipv6: String,
|
||||||
|
disk_size_gb: u32,
|
||||||
|
vcpus: u32,
|
||||||
|
memory_mb: u32,
|
||||||
|
dtrfs_sha: String,
|
||||||
|
kernel_sha: String,
|
||||||
|
created_at: Datetime,
|
||||||
|
updated_at: Datetime,
|
||||||
|
price_per_unit: u64,
|
||||||
|
locked_nano: u64,
|
||||||
|
collected_at: Datetime,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&old_brain::BrainData> for Vec<VmContract> {
|
||||||
|
fn from(old_data: &old_brain::BrainData) -> Self {
|
||||||
|
let mut contracts = Vec::new();
|
||||||
|
for old_c in old_data.vm_contracts.iter() {
|
||||||
|
let mut mapped_ports = Vec::new();
|
||||||
|
for port in old_c.exposed_ports.iter() {
|
||||||
|
mapped_ports.push((*port, 8080 as u32));
|
||||||
|
}
|
||||||
|
contracts.push(VmContract {
|
||||||
|
id: RecordId::from(("vm_contract", old_c.uuid.replace("-", ""))),
|
||||||
|
admin: RecordId::from(("account", old_c.admin_pubkey.clone())),
|
||||||
|
vm_node: RecordId::from(("vm_node", old_c.node_pubkey.clone())),
|
||||||
|
state: "active".to_string(),
|
||||||
|
hostname: old_c.hostname.clone(),
|
||||||
|
mapped_ports,
|
||||||
|
public_ipv4: old_c.public_ipv4.clone(),
|
||||||
|
public_ipv6: old_c.public_ipv6.clone(),
|
||||||
|
disk_size_gb: old_c.disk_size_gb,
|
||||||
|
vcpus: old_c.vcpus,
|
||||||
|
memory_mb: old_c.memory_mb,
|
||||||
|
dtrfs_sha: old_c.dtrfs_sha.clone(),
|
||||||
|
kernel_sha: old_c.kernel_sha.clone(),
|
||||||
|
price_per_unit: old_c.price_per_unit,
|
||||||
|
locked_nano: old_c.locked_nano,
|
||||||
|
created_at: old_c.created_at.into(),
|
||||||
|
updated_at: old_c.updated_at.into(),
|
||||||
|
collected_at: old_c.collected_at.into(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
contracts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct AppNode {
|
||||||
|
id: RecordId,
|
||||||
|
country: String,
|
||||||
|
region: String,
|
||||||
|
city: String,
|
||||||
|
ip: String,
|
||||||
|
avail_mem_mb: u32,
|
||||||
|
avail_vcpus: u32,
|
||||||
|
avail_storage_gbs: u32,
|
||||||
|
avail_ports: u32,
|
||||||
|
max_ports_per_app: u32,
|
||||||
|
price: u64,
|
||||||
|
offline_minutes: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&old_brain::BrainData> for Vec<AppNode> {
|
||||||
|
fn from(old_data: &old_brain::BrainData) -> Self {
|
||||||
|
let mut nodes = Vec::new();
|
||||||
|
for old_node in old_data.app_nodes.iter() {
|
||||||
|
nodes.push(AppNode {
|
||||||
|
id: RecordId::from(("app_node", old_node.node_pubkey.clone())),
|
||||||
|
country: old_node.country.clone(),
|
||||||
|
region: old_node.region.clone(),
|
||||||
|
city: old_node.city.clone(),
|
||||||
|
ip: old_node.ip.clone(),
|
||||||
|
avail_mem_mb: old_node.avail_mem_mb,
|
||||||
|
avail_vcpus: old_node.avail_vcpus,
|
||||||
|
avail_storage_gbs: old_node.avail_storage_mb,
|
||||||
|
avail_ports: old_node.avail_no_of_port,
|
||||||
|
max_ports_per_app: old_node.max_ports_per_app,
|
||||||
|
price: old_node.price,
|
||||||
|
offline_minutes: old_node.offline_minutes,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
nodes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct AppContract {
|
||||||
|
id: RecordId,
|
||||||
|
#[serde(rename = "in")]
|
||||||
|
admin: RecordId,
|
||||||
|
#[serde(rename = "out")]
|
||||||
|
app_node: RecordId,
|
||||||
|
state: String,
|
||||||
|
app_name: String,
|
||||||
|
mapped_ports: Vec<(u64, u64)>,
|
||||||
|
host_ipv4: String,
|
||||||
|
vcpus: u64,
|
||||||
|
memory_mb: u64,
|
||||||
|
disk_size_gb: u64,
|
||||||
|
created_at: Datetime,
|
||||||
|
updated_at: Datetime,
|
||||||
|
price_per_unit: u64,
|
||||||
|
locked_nano: u64,
|
||||||
|
collected_at: Datetime,
|
||||||
|
mr_enclave: String,
|
||||||
|
package_url: String,
|
||||||
|
hratls_pubkey: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct Ban {
|
||||||
|
id: RecordId,
|
||||||
|
#[serde(rename = "in")]
|
||||||
|
from_account: RecordId,
|
||||||
|
#[serde(rename = "out")]
|
||||||
|
to_account: RecordId,
|
||||||
|
created_at: Datetime,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct Kick {
|
||||||
|
id: RecordId,
|
||||||
|
#[serde(rename = "in")]
|
||||||
|
from_account: RecordId,
|
||||||
|
#[serde(rename = "out")]
|
||||||
|
to_account: RecordId,
|
||||||
|
created_at: Datetime,
|
||||||
|
reason: String,
|
||||||
|
contract: RecordId,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct Report {
|
||||||
|
id: RecordId,
|
||||||
|
#[serde(rename = "in")]
|
||||||
|
from_account: RecordId,
|
||||||
|
#[serde(rename = "out")]
|
||||||
|
to_node: RecordId,
|
||||||
|
created_at: Datetime,
|
||||||
|
reason: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct Operator {
|
||||||
|
#[serde(rename = "in")]
|
||||||
|
account: RecordId,
|
||||||
|
#[serde(rename = "out")]
|
||||||
|
node: RecordId,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Operator {
|
||||||
|
fn new(account: &str, vm_node: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
account: RecordId::from(("account", account.to_string())),
|
||||||
|
node: RecordId::from(("vm_node", vm_node.to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&old_brain::BrainData> for Vec<Operator> {
|
||||||
|
fn from(old_data: &old_brain::BrainData) -> Self {
|
||||||
|
let mut operator_entries = Vec::new();
|
||||||
|
for operator in old_data.operators.clone() {
|
||||||
|
for vm_node in operator.1.vm_nodes.iter() {
|
||||||
|
operator_entries.push(Operator::new(&operator.0, vm_node));
|
||||||
|
}
|
||||||
|
for app_node in operator.1.app_nodes.iter() {
|
||||||
|
operator_entries.push(Operator::new(&operator.0, app_node));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
operator_entries
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user