-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature: Control of balance for instances #462
Merged
Merged
Changes from 18 commits
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
64b4341
Do not merge: fix cost view migration
odesenfans 6d21807
Feature: Control of balance for Instances
1yam 4a42b7a
Fix: price calculations in db views
1yam 5dce8d1
Fix: return type Decimal
1yam 0035df4
Refactor: rename get_extra_storage to get_volume_size
1yam 5d19d62
Refactor: functions get_volume_size
1yam c58f02d
Fix: mypy
1yam 00be932
Add new test with no balance
1yam 7681e22
Fix: Add ERROR code 5 (Insufficient balances) in db migrations
1yam 10404a5
Fix: Unit test
1yam db7f847
Test
1yam eb2c7ea
Fix: Launch control balance only on message post
1yam 67cf926
Fix: Test error with no balance
1yam bb3e11e
Fix: No balance test
1yam 2cff692
Fix: control message type
1yam 9f1738a
Fix: re add __version__
1yam 5a43c29
Refractor: get_volum_size use get_message_file_pin functions instead …
1yam 64d00b0
Fix: mypy error
1yam 0175169
Internal: reenable AVAX signature unit tests (#461)
odesenfans b326c4f
Update src/aleph/handlers/content/content_handler.py
1yam 68eb9e0
Merge branch '1yam-vm-balance-check' of github.com:1yam/pyaleph into …
1yam 9dfc207
Fix: type error functions return Decimal instead of int
1yam 377ae1a
Refactor: move cost calcul & test for cost
1yam 6a46672
Refactor type : ExecutableContent instead of ExecutableContent
1yam fbf68a5
Fix
1yam c3225d7
Fix: formatting issues
odesenfans f2af477
Fix: compute included storage in GiB instead of GB
odesenfans b2334dd
Fix: insufficient balance error format
odesenfans 98b8129
mib
odesenfans File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
174 changes: 174 additions & 0 deletions
174
deployment/migrations/versions/0018_7bcb8e5fe186_fix_vm_cost_view.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
"""fix VM cost view | ||
|
||
Revision ID: 7bcb8e5fe186 | ||
Revises: f9fa39b6bdef | ||
Create Date: 2023-08-04 15:14:39.082370 | ||
|
||
""" | ||
from alembic import op | ||
import sqlalchemy as sa | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision = '7bcb8e5fe186' | ||
down_revision = 'f9fa39b6bdef' | ||
branch_labels = None | ||
depends_on = None | ||
|
||
def upgrade() -> None: | ||
op.execute( | ||
""" | ||
create or replace view vm_volumes_files_view as | ||
SELECT volume.program_hash AS vm_hash, | ||
volume.ref, | ||
volume.use_latest, | ||
'code_volume'::text AS type, | ||
tags.file_hash AS latest, | ||
originals.file_hash AS original, | ||
CASE | ||
WHEN volume.use_latest THEN tags.file_hash | ||
ELSE originals.file_hash | ||
END AS volume_to_use | ||
FROM program_code_volumes volume | ||
LEFT JOIN file_tags tags ON volume.ref::text = tags.tag::text | ||
JOIN file_pins originals ON volume.ref::text = originals.item_hash::text | ||
UNION | ||
SELECT volume.program_hash AS vm_hash, | ||
volume.ref, | ||
volume.use_latest, | ||
'data_volume'::text AS type, | ||
tags.file_hash AS latest, | ||
originals.file_hash AS original, | ||
CASE | ||
WHEN volume.use_latest THEN tags.file_hash | ||
ELSE originals.file_hash | ||
END AS volume_to_use | ||
FROM program_data_volumes volume | ||
LEFT JOIN file_tags tags ON volume.ref::text = tags.tag::text | ||
JOIN file_pins originals ON volume.ref::text = originals.item_hash::text | ||
UNION | ||
SELECT volume.program_hash AS vm_hash, | ||
volume.ref, | ||
volume.use_latest, | ||
'runtime'::text AS type, | ||
tags.file_hash AS latest, | ||
originals.file_hash AS original, | ||
CASE | ||
WHEN volume.use_latest THEN tags.file_hash | ||
ELSE originals.file_hash | ||
END AS volume_to_use | ||
FROM program_runtimes volume | ||
LEFT JOIN file_tags tags ON volume.ref::text = tags.tag::text | ||
JOIN file_pins originals ON volume.ref::text = originals.item_hash::text | ||
UNION | ||
SELECT volume.vm_hash, | ||
volume.ref, | ||
volume.use_latest, | ||
'machine_volume'::text AS type, | ||
tags.file_hash AS latest, | ||
originals.file_hash AS original, | ||
CASE | ||
WHEN volume.use_latest THEN tags.file_hash | ||
ELSE originals.file_hash | ||
END AS volume_to_use | ||
FROM vm_machine_volumes volume | ||
LEFT JOIN file_tags tags ON volume.ref::text = tags.tag::text | ||
JOIN file_pins originals ON volume.ref::text = originals.item_hash::text | ||
""" | ||
) | ||
op.execute( | ||
""" | ||
create or replace view costs_view as | ||
SELECT COALESCE(vm_prices.owner, storage.owner) AS address, | ||
vm_prices.total_vm_cost, | ||
sc.total_storage_cost, | ||
tc.total_cost | ||
FROM (SELECT vm_costs_view.owner, | ||
sum(vm_costs_view.total_price) AS total_vm_cost | ||
FROM vm_costs_view | ||
GROUP BY vm_costs_view.owner) vm_prices | ||
FULL JOIN (SELECT file_pins.owner, | ||
sum(f.size) AS storage_size | ||
FROM file_pins | ||
JOIN files f ON file_pins.file_hash::text = f.hash::text | ||
WHERE file_pins.owner IS NOT NULL | ||
GROUP BY file_pins.owner) storage ON vm_prices.owner::text = storage.owner::text, | ||
LATERAL ( SELECT 3::numeric * storage.storage_size / 1000000::numeric AS total_storage_cost) sc, | ||
LATERAL ( SELECT COALESCE(vm_prices.total_vm_cost, 0::double precision) + | ||
COALESCE(sc.total_storage_cost, 0::numeric)::double precision AS total_cost) tc | ||
""" | ||
) | ||
op.execute( | ||
""" | ||
create or replace view vm_costs_view as | ||
SELECT vm_versions.vm_hash, | ||
vm_versions.owner, | ||
vms.resources_vcpus, | ||
vms.resources_memory, | ||
file_volumes_size.file_volumes_size, | ||
other_volumes_size.other_volumes_size, | ||
used_disk.required_disk_space, | ||
cu.compute_units_required, | ||
bcp.base_compute_unit_price, | ||
m.compute_unit_price_multiplier, | ||
cpm.compute_unit_price, | ||
free_disk.included_disk_space, | ||
additional_disk.additional_disk_space, | ||
adp.disk_price, | ||
tp.total_price | ||
FROM vm_versions | ||
JOIN vms ON vm_versions.current_version::text = vms.item_hash::text | ||
JOIN (SELECT volume.vm_hash, | ||
sum(files.size) AS file_volumes_size | ||
FROM vm_volumes_files_view volume | ||
LEFT JOIN files ON volume.volume_to_use::text = files.hash::text | ||
GROUP BY volume.vm_hash) file_volumes_size | ||
ON vm_versions.current_version::text = file_volumes_size.vm_hash::text | ||
JOIN (SELECT instance_rootfs.instance_hash, | ||
instance_rootfs.size_mib::bigint * 1024 * 1024 AS rootfs_size | ||
FROM instance_rootfs) rootfs_size ON vm_versions.vm_hash::text = rootfs_size.instance_hash::text | ||
JOIN (SELECT vm_machine_volumes.vm_hash, | ||
sum(vm_machine_volumes.size_mib) * 1024 * 1024 AS other_volumes_size | ||
FROM vm_machine_volumes | ||
GROUP BY vm_machine_volumes.vm_hash) other_volumes_size | ||
ON vm_versions.current_version::text = other_volumes_size.vm_hash::text, | ||
LATERAL ( SELECT file_volumes_size.file_volumes_size + | ||
other_volumes_size.other_volumes_size::numeric AS required_disk_space) used_disk, | ||
LATERAL ( SELECT ceil(GREATEST(ceil((vms.resources_vcpus / 1)::double precision), | ||
(vms.resources_memory / 2000)::double precision)) AS compute_units_required) cu, | ||
LATERAL ( SELECT CASE | ||
WHEN COALESCE(vms.persistent, true) | ||
THEN '20000000000'::bigint::double precision * cu.compute_units_required | ||
ELSE 2000000000::double precision * cu.compute_units_required | ||
END AS included_disk_space) free_disk, | ||
LATERAL ( SELECT GREATEST((file_volumes_size.file_volumes_size + rootfs_size.rootfs_size::numeric + | ||
other_volumes_size.other_volumes_size::numeric)::double precision - | ||
free_disk.included_disk_space, | ||
0::double precision) AS additional_disk_space) additional_disk, | ||
LATERAL ( SELECT CASE | ||
WHEN COALESCE(vms.persistent, true) THEN 2000 | ||
ELSE 200 | ||
END AS base_compute_unit_price) bcp, | ||
LATERAL ( SELECT 1 + vms.environment_internet::integer AS compute_unit_price_multiplier) m, | ||
LATERAL ( SELECT cu.compute_units_required * m.compute_unit_price_multiplier::double precision * | ||
bcp.base_compute_unit_price::double precision * | ||
m.compute_unit_price_multiplier::double precision AS compute_unit_price) cpm, | ||
LATERAL ( SELECT additional_disk.additional_disk_space * 20::double precision / | ||
(1024 * 1024)::double precision AS disk_price) adp, | ||
LATERAL ( SELECT cpm.compute_unit_price + adp.disk_price AS total_price) tp | ||
|
||
|
||
""" | ||
) | ||
op.execute( | ||
""" | ||
INSERT INTO error_codes(code, description) VALUES | ||
(5, 'Insufficient balances') | ||
""" | ||
) | ||
|
||
|
||
def downgrade() -> None: | ||
op.execute("drop view costs_view") | ||
op.execute("drop view vm_costs_view") | ||
op.execute("drop view vm_volumes_files_view") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's not really what the downgrade should do. A downgrade should bring the view back to its previous version. I'll fix it myself, just FYI. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The changes to this migration script will have to be put in a separate migration script that recreates the VM cost view (views must be recreated entirely, you cannot just add a column). Create a new empty migration script with
alembic revision -m "fix VM cost view"
and then take the pieces that you need from this migration script to drop the vm cost view and recreate it.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The changes to this file must be reverted now.