Example: Creating a sub-allocation (deposit operation)¶
Frequency of use | Common |
---|---|
Actors |
|
Communication Flow: Kotlin
/* In this example, we will show how a workspace can create a sub-allocation. The new allocation will
have an existing allocation as a child. This is the recommended way of creating allocations.
Resources are not immediately removed from the parent allocation. In addition, workspaces can
over-allocate resources. For example, a workspace can deposit more resources than they have into
sub-allocations. This doesn't create more resources in the system. As we saw from the charge
examples, all allocations in a hierarchy must be able to carry a charge. */
Wallets.browse.call(
WalletBrowseRequest(
consistency = null,
filterType = null,
itemsPerPage = null,
itemsToSkip = null,
next = null,
),
piRoot
).orThrow()
/*
PageV2(
items = listOf(Wallet(
allocations = listOf(WalletAllocation(
allocationPath = listOf("42"),
allowSubAllocationsToAllocate = true,
balance = 500,
canAllocate = false,
endDate = null,
grantedIn = 1,
id = "42",
initialBalance = 500,
localBalance = 500,
startDate = 1633941615074,
)),
chargePolicy = AllocationSelectorPolicy.EXPIRE_FIRST,
chargeType = ChargeType.ABSOLUTE,
owner = WalletOwner.Project(
projectId = "root-project",
),
paysFor = ProductCategoryId(
id = "example-slim",
name = "example-slim",
provider = "example",
),
productType = ProductType.COMPUTE,
unit = ProductPriceUnit.UNITS_PER_HOUR,
)),
itemsPerPage = 50,
next = null,
)
*/
Wallets.browse.call(
WalletBrowseRequest(
consistency = null,
filterType = null,
itemsPerPage = null,
itemsToSkip = null,
next = null,
),
piLeaf
).orThrow()
/*
PageV2(
items = listOf(Wallet(
allocations = emptyList(),
chargePolicy = AllocationSelectorPolicy.EXPIRE_FIRST,
chargeType = ChargeType.ABSOLUTE,
owner = WalletOwner.Project(
projectId = "leaf-project",
),
paysFor = ProductCategoryId(
id = "example-slim",
name = "example-slim",
provider = "example",
),
productType = ProductType.COMPUTE,
unit = ProductPriceUnit.UNITS_PER_HOUR,
)),
itemsPerPage = 50,
next = null,
)
*/
/* Our initial state shows that the root project has 500 core hours. The leaf doesn't have any
resources at the moment. */
/* We now perform a deposit operation with the leaf workspace as the target. */
Accounting.deposit.call(
bulkRequestOf(DepositToWalletRequestItem(
amount = 100,
description = "Create sub-allocation",
dry = false,
endDate = null,
recipient = WalletOwner.Project(
projectId = "leaf-project",
),
sourceAllocation = "42",
startDate = null,
transactionId = "14200366667568935411676450983129",
)),
piRoot
).orThrow()
/*
Unit
*/
Wallets.browse.call(
WalletBrowseRequest(
consistency = null,
filterType = null,
itemsPerPage = null,
itemsToSkip = null,
next = null,
),
piRoot
).orThrow()
/*
PageV2(
items = listOf(Wallet(
allocations = listOf(WalletAllocation(
allocationPath = listOf("42"),
allowSubAllocationsToAllocate = true,
balance = 500,
canAllocate = false,
endDate = null,
grantedIn = 1,
id = "42",
initialBalance = 500,
localBalance = 500,
startDate = 1633941615074,
)),
chargePolicy = AllocationSelectorPolicy.EXPIRE_FIRST,
chargeType = ChargeType.ABSOLUTE,
owner = WalletOwner.Project(
projectId = "root-project",
),
paysFor = ProductCategoryId(
id = "example-slim",
name = "example-slim",
provider = "example",
),
productType = ProductType.COMPUTE,
unit = ProductPriceUnit.UNITS_PER_HOUR,
)),
itemsPerPage = 50,
next = null,
)
*/
Wallets.browse.call(
WalletBrowseRequest(
consistency = null,
filterType = null,
itemsPerPage = null,
itemsToSkip = null,
next = null,
),
piLeaf
).orThrow()
/*
PageV2(
items = listOf(Wallet(
allocations = listOf(WalletAllocation(
allocationPath = listOf("42", "52"),
allowSubAllocationsToAllocate = true,
balance = 100,
canAllocate = false,
endDate = null,
grantedIn = 1,
id = "52",
initialBalance = 100,
localBalance = 100,
startDate = 1633941615074,
)),
chargePolicy = AllocationSelectorPolicy.EXPIRE_FIRST,
chargeType = ChargeType.ABSOLUTE,
owner = WalletOwner.Project(
projectId = "leaf-project",
),
paysFor = ProductCategoryId(
id = "example-slim",
name = "example-slim",
provider = "example",
),
productType = ProductType.COMPUTE,
unit = ProductPriceUnit.UNITS_PER_HOUR,
)),
itemsPerPage = 50,
next = null,
)
*/
/* After inspecting the allocations, we see that the original (root) allocation remains unchanged.
However, the leaf workspace now have a new allocation. This allocation has the root allocation as a
parent, indicated by the path. */
Communication Flow: Curl
# ------------------------------------------------------------------------------------------------------
# $host is the UCloud instance to contact. Example: 'http://localhost:8080' or 'https://cloud.sdu.dk'
# $accessToken is a valid access-token issued by UCloud
# ------------------------------------------------------------------------------------------------------
# In this example, we will show how a workspace can create a sub-allocation. The new allocation will
# have an existing allocation as a child. This is the recommended way of creating allocations.
# Resources are not immediately removed from the parent allocation. In addition, workspaces can
# over-allocate resources. For example, a workspace can deposit more resources than they have into
# sub-allocations. This doesn't create more resources in the system. As we saw from the charge
# examples, all allocations in a hierarchy must be able to carry a charge.
# Authenticated as piRoot
curl -XGET -H "Authorization: Bearer $accessToken" "$host/api/accounting/wallets/browse?"
# {
# "itemsPerPage": 50,
# "items": [
# {
# "owner": {
# "type": "project",
# "projectId": "root-project"
# },
# "paysFor": {
# "name": "example-slim",
# "provider": "example"
# },
# "allocations": [
# {
# "id": "42",
# "allocationPath": [
# "42"
# ],
# "balance": 500,
# "initialBalance": 500,
# "localBalance": 500,
# "startDate": 1633941615074,
# "endDate": null,
# "grantedIn": 1,
# "canAllocate": false,
# "allowSubAllocationsToAllocate": true
# }
# ],
# "chargePolicy": "EXPIRE_FIRST",
# "productType": "COMPUTE",
# "chargeType": "ABSOLUTE",
# "unit": "UNITS_PER_HOUR"
# }
# ],
# "next": null
# }
# Authenticated as piLeaf
curl -XGET -H "Authorization: Bearer $accessToken" "$host/api/accounting/wallets/browse?"
# {
# "itemsPerPage": 50,
# "items": [
# {
# "owner": {
# "type": "project",
# "projectId": "leaf-project"
# },
# "paysFor": {
# "name": "example-slim",
# "provider": "example"
# },
# "allocations": [
# ],
# "chargePolicy": "EXPIRE_FIRST",
# "productType": "COMPUTE",
# "chargeType": "ABSOLUTE",
# "unit": "UNITS_PER_HOUR"
# }
# ],
# "next": null
# }
# Our initial state shows that the root project has 500 core hours. The leaf doesn't have any
# resources at the moment.
# We now perform a deposit operation with the leaf workspace as the target.
# Authenticated as piRoot
curl -XPOST -H "Authorization: Bearer $accessToken" -H "Content-Type: content-type: application/json; charset=utf-8" "$host/api/accounting/deposit" -d '{
"items": [
{
"recipient": {
"type": "project",
"projectId": "leaf-project"
},
"sourceAllocation": "42",
"amount": 100,
"description": "Create sub-allocation",
"startDate": null,
"endDate": null,
"transactionId": "14200366667568935411676450983129",
"dry": false
}
]
}'
# {
# }
curl -XGET -H "Authorization: Bearer $accessToken" "$host/api/accounting/wallets/browse?"
# {
# "itemsPerPage": 50,
# "items": [
# {
# "owner": {
# "type": "project",
# "projectId": "root-project"
# },
# "paysFor": {
# "name": "example-slim",
# "provider": "example"
# },
# "allocations": [
# {
# "id": "42",
# "allocationPath": [
# "42"
# ],
# "balance": 500,
# "initialBalance": 500,
# "localBalance": 500,
# "startDate": 1633941615074,
# "endDate": null,
# "grantedIn": 1,
# "canAllocate": false,
# "allowSubAllocationsToAllocate": true
# }
# ],
# "chargePolicy": "EXPIRE_FIRST",
# "productType": "COMPUTE",
# "chargeType": "ABSOLUTE",
# "unit": "UNITS_PER_HOUR"
# }
# ],
# "next": null
# }
# Authenticated as piLeaf
curl -XGET -H "Authorization: Bearer $accessToken" "$host/api/accounting/wallets/browse?"
# {
# "itemsPerPage": 50,
# "items": [
# {
# "owner": {
# "type": "project",
# "projectId": "leaf-project"
# },
# "paysFor": {
# "name": "example-slim",
# "provider": "example"
# },
# "allocations": [
# {
# "id": "52",
# "allocationPath": [
# "42",
# "52"
# ],
# "balance": 100,
# "initialBalance": 100,
# "localBalance": 100,
# "startDate": 1633941615074,
# "endDate": null,
# "grantedIn": 1,
# "canAllocate": false,
# "allowSubAllocationsToAllocate": true
# }
# ],
# "chargePolicy": "EXPIRE_FIRST",
# "productType": "COMPUTE",
# "chargeType": "ABSOLUTE",
# "unit": "UNITS_PER_HOUR"
# }
# ],
# "next": null
# }
# After inspecting the allocations, we see that the original (root) allocation remains unchanged.
# However, the leaf workspace now have a new allocation. This allocation has the root allocation as a
# parent, indicated by the path.