Allocation Lifecycle Management by Service Provider
This page describes operations to be performed by service provider.
Prerequisites
Please, read initial setup for Waldur SDK.
Getting a list of users
list_users
method is used to fetch all users in a Waldur instance.
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 | # The sync function from users_list module is used to fetch all users
from waldur_api_client.api.users import users_list
# Initialize your client first (per the SDK guide)
result = users_list.sync(client=client)
# The result will be a list of User objects with the following attributes:
# - url: str
# - uuid: UUID
# - username: str
# - slug: str
# - full_name: str
# - native_name: str
# - job_title: str
# - email: str
# - phone_number: str
# - organization: str
# - civil_number: str
# - description: str
# - is_staff: bool
# - is_active: bool
# - is_support: bool
# - token: str
# - token_lifetime: int
# - registration_method: str
# - date_joined: datetime
# - agreement_date: datetime
# - preferred_language: str
# - permissions: list[Permission]
# - requested_email: str
# - affiliations: Any
# - first_name: str
# - last_name: str
# - identity_provider_name: str
# - identity_provider_label: str
# - identity_provider_management_url: str
# - identity_provider_fields: list[str]
# - image: str
# - identity_source: str
# - has_active_session: bool
|
Getting a list of SSH keys
keys_list
method is used to fetch all SSH keys in Waldur.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | from waldur_api_client.api.keys import keys_list
# List all SSH keys
result = keys_list.sync(client=client)
# The result will be a list of SshKey objects with the following attributes:
# - url: str
# - uuid: UUID
# - name: str
# - public_key: str
# - fingerprint_md5: str
# - fingerprint_sha256: str
# - fingerprint_sha512: str
# - user_uuid: UUID
# - is_shared: bool
# - type_: str
|
Getting a list of resource allocations
marketplace_resources_list
method is used to fetch resources related to offerings, which belong to user's service provider.
Possible filter options for allocations (each one is optional):
provider_uuid
- UUID of a service provider organization;
state
- current state of a resource allocation; for valid values please use the associated enum values from MarketplaceResourcesListStateItem;
offering_uuid
- UUID of a related resource;
fields
- list of fields to return (can be passed as as strings or imported from MarketplaceResourcesListFieldItem
enum, which includes fields like name
, offering
, state
, limits
, plan
, project
, url
, and many others). Both examples are provided:
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 | from waldur_api_client.models.marketplace_resources_list_state_item import MarketplaceResourcesListStateItem
from waldur_api_client.models.marketplace_resources_list_field_item import MarketplaceResourcesListFieldItem
from waldur_api_client.api.marketplace_resources import marketplace_resources_list
result = marketplace_resources_list.sync(
client=client,
provider_uuid='<provider-uuid>',
state=[MarketplaceResourcesListStateItem.CREATING],
offering_uuid='<offering-uuid>',
field=[
MarketplaceResourcesListFieldItem.NAME,
MarketplaceResourcesListFieldItem.STATE,
MarketplaceResourcesListFieldItem.LIMITS,
MarketplaceResourcesListFieldItem.PLAN,
MarketplaceResourcesListFieldItem.PROJECT,
MarketplaceResourcesListFieldItem.URL
]
)
# The result will be a list of Resource objects with the following fields:
# - name: str
# - offering: str
# - state: ResourceState
# - limits: ResourceLimits
# - plan: str
# - project: str
# - url: str
|
Approving/rejecting allocation order by service provider
The service provider can either approve or reject order using
marketplace_orders_approve_by_provider
and marketplace_orders_reject_by_provider
correspondingly.
Both of these methods expect as its only argument UUID of an order for the allocation.
For example, a consumer requested an allocation using Order
with CREATE
type. After that, an empty allocation with CREATING
state has appeared.
A service provider can change the state to ok
(created successfully) using marketplace_orders_approve_by_provider
or
rejected
(creation rejected) using marketplace_orders_reject_by_provider
.
In order to get a proper order, SP owner can use marketplace_orders_list
method. This action is for order listing and supports filtering by state and allocation.
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 | from waldur_api_client.api.marketplace_orders import (
marketplace_orders_approve_by_provider,
marketplace_orders_reject_by_provider,
marketplace_orders_list,
MarketplaceOrdersListStateItem
)
from waldur_api_client.models.marketplace_orders_list_state_item import MarketplaceOrdersListStateItem
# Service providers can approve or reject orders using:
marketplace_orders_approve_by_provider.sync(
uuid="<order-uuid>",
client=client
)
marketplace_orders_reject_by_provider.sync(
uuid="<order-uuid>",
client=client
)
# To retreive orders with state "executing" with a specific resource uuid
orders = marketplace_orders_list.sync(
client=client,
state=[MarketplaceOrdersListStateItem.EXECUTING], # List of order states to filter by
resource_uuid="<resource-uuid>" # Optional filter by specific resource
)
# Example workflow:
# 1. Get pending orders
orders = marketplace_orders_list.sync(
client=client,
state=[MarketplaceOrdersListStateItem.EXECUTING]
)
# 2. Approve orders
for order in orders:
marketplace_orders_approve_by_provider.sync(
uuid=order.uuid,
client=client
)
# Available order states can be viewed in client's MarketplaceOrdersListStateItem, supported order states:
# - "canceled"
# - "done"
# - "erred"
# - "executing"
# - "pending-consumer"
# - "pending-project"
# - "pending-provider"
# - "rejected"
|
Cancellation of orders for allocations
A consumer can also cancel created order and subsequently interrupt the requested operation over allocation.
For example, this option is suitable if the customer wants to cancel allocation deletion.
For this, marketplace_orders_cancel
method should be used.
It changes the state of the order to canceled
.
NB: this transition is possible only if the order's state is equal to pending-consumer
or pending-provider
and offering type is basic or support.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | from waldur_api_client.api.marketplace_orders import marketplace_orders_list, marketplace_orders_cancel
from waldur_api_client.models.marketplace_orders_list_state_item import MarketplaceOrdersListStateItem
from waldur_api_client.models.marketplace_orders_list_type_item import MarketplaceOrdersListTypeItem
# List orders
orders = marketplace_orders_list.sync(
client=client,
state=[MarketplaceOrdersListStateItem.EXECUTING],
type_=[MarketplaceOrdersListTypeItem.TERMINATE]
)
order = orders[0]
result = marketplace_orders_cancel.sync_detailed(
client=client,
uuid=order.uuid
)
|
Updating resource allocation with local reference (setting backend_id
field)
Each allocation can have a link to a service provider's internal reference using backend_id
field. Only users with service provider owner and manager roles can set this value using marketplace_provider_resources_set_backend_id
method of the client. It requires the following arguments:
uuid
- UUID of a resource allocation;
body
- A request parameter of type ResourceBackendIDRequest
that contains the backend_id
field, which is the unique identifier of the resource in the external system.
1
2
3
4
5
6
7
8
9
10
11
12
13 | from waldur_api_client.api.marketplace_provider_resources import marketplace_provider_resources_set_backend_id
from waldur_api_client.models import ResourceBackendIDRequest
# Set backend ID for a resource
result = marketplace_provider_resources_set_backend_id.sync_detailed(
uuid="resource-uuid", # The UUID of the resource
client=client,
body=ResourceBackendIDRequest(
backend_id="some-backend-id" # The new backend ID
)
)
# The response will contain a ResourceBackendID object with the updated backend_id
|
In case if SDK usage is not possible, HTTP request can be sent:
| POST <API-URL>/marketplace-resources/<resource-uuid>/
{
"backend_id": "<some-backend-id>"
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
"status": "Resource backend_id has been changed."
}
|
Providing additional access detail for resource allocation
For additional details related to allocation access, report
data is used.
In order to provide this information, owners and managers can use marketplace_resource_submit_report
method. It requires the following arguments:
uuid
- UUID of a resource allocation;
report
- A list of ReportSectionRequest
instances that is wrapped in a ResourceReportRequest
object. Each ReportSectionRequest
contains a header and body content. The ResourceReportRequest
serves as a container for these report sections when submitting the report to the API.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | from waldur_api_client.models import ReportSectionRequest, ResourceReportRequest
from waldur_api_client.api.marketplace_provider_resources import marketplace_provider_resources_submit_report
report = [
ReportSectionRequest(header="Header1", body="Body1"),
ReportSectionRequest(header="Header2", body="Body2")
]
report_request = ResourceReportRequest(report=report)
result = marketplace_provider_resources_submit_report.sync(
uuid="your-resource-uuid",
body=report_request
)
# The result will be a ResourceReport object containing:
# - `report`: List of `ReportSection` objects, each with:
# - `header`: The section header
# - `body`: The section content
|
The Waldur API Client SDK supports pagination for list endpoints using page
and page_size
parameters.
Example paginating API results
| from waldur_api_client.api.marketplace_provider_offerings import marketplace_provider_offerings_list
# Get first page with 10 items
result = marketplace_provider_offerings_list.sync(
client=client,
page=1,
page_size=10
)
|
Filtering API Response Fields Using Enum Types
The marketplace_service_providers_list
endpoint allows you to specify which fields you want to retrieve from the service provider objects. This is done using the field
parameter with enum values from MarketplaceServiceProvidersListFieldItem
. The field parameter is present for different API endpoints to allow selective retrieval of specific fields from the response objects.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | from waldur_api_client.api.marketplace_service_providers import marketplace_service_providers_list
from waldur_api_client.models.marketplace_service_providers_list_field_item import (
MarketplaceServiceProvidersListFieldItem,
)
# List service providers with specific fields
result = marketplace_service_providers_list.sync(
client=client,
field=[
MarketplaceServiceProvidersListFieldItem.CUSTOMER_NAME,
MarketplaceServiceProvidersListFieldItem.CUSTOMER_ABBREVIATION,
MarketplaceServiceProvidersListFieldItem.DESCRIPTION,
MarketplaceServiceProvidersListFieldItem.OFFERING_COUNT,
]
)
# Result will contain only the data for specified fields for each service provider.
|
Getting a list of members in a project with active resource allocations
Service provider owners and managers can list project members using a resource allocation with marketplace_resources_team_list
method.
It requires the following arguments:
resource_uuid
- UUID of a resource allocation.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | from waldur_api_client.api.marketplace_resources import marketplace_resources_team_list
# Get team members for a marketplace resource
team = marketplace_resources_team_list.sync(
uuid="resource_uuid",
client=client
)
# Each team member is a ProjectUser object with these fields:
# - url: str
# - uuid: UUID
# - username: str
# - full_name: str
# - role: str
# - expiration_time: Optional[datetime]
# - offering_user_username: Optional[str]
# - email: Optional[str]
|
Reporting usage for a resource allocation
A usage of a resource allocation can be submitted by a corresponding service provider.
For this, the following methods are used:
marketplace_public_offerings_retrieve
- getting offering with components info. Arguments:
-
offering_uuid
- UUID of an offering
-
marketplace_resources_plan_periods_list
- getting current plan periods for resource allocation. Arguments:
-
resource_uuid
- UUID of a resource
-
marketplace_plan_components_list
- retrieves the list of components for a specific offering. Arguments:
offering_uuid
- UUID of the offering to get components for
-
client
- API client instance
-
marketplace_component_usages_set_usage
- creates or updates component usage for the current plan. Arguments:
body
- parameter of type ComponentUsageCreateRequest
containing:
resource_uuid
- UUID of the resource
usages
- list of ComponentUsage
instances
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 | from waldur_api_client.api.marketplace_public_offerings import marketplace_public_offerings_retrieve
from waldur_api_client.api.marketplace_plan_components import marketplace_plan_components_list
from waldur_api_client.api.marketplace_component_usages import marketplace_component_usages_set_usage
from waldur_api_client.api.marketplace_resources import marketplace_resources_plan_periods_list
from waldur_api_client.models import ComponentUsageCreateRequest, ComponentUsageItemRequest
# Get offering details
offering = marketplace_public_offerings_retrieve.sync(
uuid='<offering-uuid>',
client=client
)
# Get components
components = marketplace_plan_components_list.sync(
offering_uuid='<offering-uuid>',
client=client
)
# Create component usages
component_usages = [
ComponentUsageItemRequest(
type_=component.component_name,
amount="10",
description='Usage'
)
for component in components
]
# Submit usages
marketplace_component_usages_set_usage.sync(
client=client,
body=ComponentUsageCreateRequest(
resource="<resource-uuid>,
usages=component_usages
)
)
# Get plan periods
plan_periods = marketplace_resources_plan_periods_list.sync(
uuid='<resource-uuid>',
client=client
)
# plan_periods:
# [{
# 'components': [{
# 'created': '2021-08-11T15:36:45.562440Z',
# 'date': '2021-08-11T15:37:30.556830Z',
# 'description': 'Usage',
# 'measured_unit': 'units',
# 'name': 'CPU',
# 'type_': 'cpu',
# 'usage': 10,
# 'uuid': 'some-uuid'
# }],
# 'end': None,
# 'plan_name': 'sample-plan',
# 'plan_uuid': 'uuid',
# 'start': '2021-08-11T15:20:25.762775Z',
# 'uuid': 'uuid'
# }]
|
Granting user access to resource
An access to a resource can be granted by service provider for a particular user with specification of username.
A result is represented by triplet [user, resource, username].
For this purpose, marketplace_offering_users_create
should be invoked. This method requires the following arguments:
marketplace_offering_users_create
- creates a new offering user mapping. Arguments:
body
- parameter of type OfferingUserRequest
containing:
offering
- URL of the target offering
user
- URL of the target user
username
- username to be associated with the user in the offering context
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | from waldur_api_client.api.marketplace_offering_users import marketplace_offering_users_create
from waldur_api_client.models import OfferingUserRequest
# Create offering user
result = marketplace_offering_users_create.sync(
client=client,
body=OfferingUserRequest(
user='<user-url>',
offering='<offering-url>',
username='<username>'
)
)
# result => {
# 'created': '2021-08-12T15:22:18.993586Z',
# 'offering': 'offering_url',
# 'offering_name': 'offering_name',
# 'offering_uuid': '<offering-uuid>',
# 'user': 'user_url',
# 'user_uuid': '<user-uuid>',
# 'username': 'user_username'
# }
|
In case if SDK usage is not possible, HTTP request can be sent:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | POST <API-URL>/marketplace-offering-users/
{
"offering": "<offering-url>",
"user": "<user-url>",
"username": "<username>"
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
"created": "2021-08-12T15:22:18.993586Z",
"offering": "offering_url",
"offering_name": "offering_name",
"offering_uuid": "<offering-uuid>",
"user": "user_url",
"user_uuid": "<user-uuid>",
"username": "user_username"
}
|
Granting user access to corresponding resources in batch manner
A service provider can grant access mentioned in the previous section to all resources used in projects including a target user.
For such access creation or update, marketplace_service_providers_set_offerings_username
is used.
The method requires the following arguments:
marketplace_service_providers_set_offerings_username
- sets or updates the username for a user across all offerings of a service provider. Arguments:
uuid
- UUID of the service provider
body
- parameter of type SetOfferingsUsernameRequest
containing:
user_uuid
- UUID of the target user
username
- new username to be set for the user across all offerings
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | from waldur_api_client.api.marketplace_service_providers import marketplace_service_providers_set_offerings_username
from waldur_api_client.models import SetOfferingsUsernameRequest
result = marketplace_service_providers_set_offerings_username.sync(
uuid='<service-provider-uuid>',
client=client,
body=SetOfferingsUsernameRequest(
user_uuid=UUID('<user-uuid>'),
username='<username>'
)
)
# result => {
# 'detail': 'Offering users have been set.'
# }
|
Getting service provider for an organization
A user can get service provider details
using marketplace_service_providers_list
with corresponding filter.
This method is guaranteed to return a list with at most one service provider record.
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 | from waldur_api_client.api.marketplace_service_providers import marketplace_service_providers_list
from waldur_api_client.models.marketplace_service_providers_list_field_item import MarketplaceServiceProvidersListFieldItem
# List service providers
result = marketplace_service_providers_list.sync(
client=client,
customer_uuid="uuid"
)
# Result will be a list of ServiceProvider objects with fields:
# 'created': '2021-09-24T13:42:05.448269Z'
# 'customer': '<customer>'
# 'customer_abbreviation': '<customer_abbreviation>'
# 'customer_country': '<customer_country>'
# 'customer_image': '<customer_image_url>'
# 'customer_name': '<customer_name>'
# 'customer_native_name': '<customer_native_name>'
# 'customer_slug': '<customer_slug>'
# 'customer_uuid': '<customer_uuid>'
# 'description': '<description>'
# 'image': '<image_url>'
# 'offering_count': 5
# 'organization_groups': []
# 'url': '<service_provider_url>'
# 'uuid': '<service_provider_uuid>'
|
Listing users of service provider's resources
A service provider owner can list users currently using its resources.
For this, marketplace_service_providers_users_list
should be used. It accepts service_provider_uuid,
which can be fetched using marketplace_service_providers_list
.
marketplace_service_providers_users_list
- retrieves a list of users associated with a service provider's resources. Arguments:
service_provider_uuid
- UUID of the service provider
client
- API client instance
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 | from waldur_api_client.api.marketplace_service_providers import marketplace_service_providers_users_list
from waldur_api_client.api.marketplace_service_providers import marketplace_service_providers_list
# First, get the service provider UUID (as shown in your example)
service_providers = marketplace_service_providers_list.sync(
client=client,
customer_uuid="<customer_uuid>"
)
service_provider = service_providers[0]
service_provider_uuid = service_provider.uuid
# List users of the service provider
result = marketplace_service_providers_users_list.sync(
service_provider_uuid=service_provider_uuid,
client=client,
)
# The response will be a list of MarketplaceServiceProviderUser objects with fields:
# uuid: UUID
# username: str
# full_name: str
# first_name: str
# last_name: str
# organization: str
# email: str
# phone_number: str
# projects_count: int
# registration_method: str
# affiliations: Any
# is_active: bool
# additional_properties: dict[str, Any]
|
Listing ssh key for users of service provider's resources
A service provider owner can list ssh keys of users currently using its resources.
For this, list_service_provider_ssh_keys
should be used. It accepts service_provider_uuid,
which can be fetched using marketplace_service_providers_list
.
marketplace_service_providers_keys_list
- retrieves a list of SSH keys associated with users of a service provider's resources. Arguments:
service_provider_uuid
- UUID of the service provider
client
- API client instance
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 | from waldur_api_client.api.marketplace_service_providers import (
marketplace_service_providers_list,
marketplace_service_providers_keys_list,
)
service_providers = marketplace_service_providers_list.sync(
client=client,
customer_uuid="<customer_uuid>"
)
service_provider = service_providers[0]
service_provider_uuid = service_provider.uuid
# List SSH keys of service provider users
result = marketplace_service_providers_keys_list.sync(
service_provider_uuid=service_provider_uuid,
client=client,
)
# Reulst will be a list of SshKey objects with fields:
# url: str
# uuid: UUID
# name: str
# public_key: str
# fingerprint_md5: str
# fingerprint_sha256: str
# fingerprint_sha512: str
# user_uuid: UUID
# is_shared: bool
# type_: str
|
Listing projects with service provider's resources
A service provider owner can list all projects, which have its resources.
For this, list_service_provider_projects
should be used. It accepts service_provider_uuid,
which can be fetched using marketplace_service_providers_list
.
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 | from waldur_api_client.api.marketplace_service_providers import (
marketplace_service_providers_list,
marketplace_service_providers_projects_list,
)
service_providers = marketplace_service_providers_list.sync(
client=client,
customer_uuid="<customer_uuid>"
)
service_provider = service_providers[0]
service_provider_uuid = service_provider.uuid
projects = marketplace_service_providers_projects_list.sync(
service_provider_uuid=service_provider_uuid,
client=client,
)
# url: str
# uuid: UUID
# name: str
# slug: str
# customer: str
# customer_uuid: UUID
# customer_name: str
# customer_slug: str
# customer_native_name: str
# customer_abbreviation: str
# description: str
# created: datetime.datetime
# type_: str
# type_name: str
# type_uuid: UUID
# backend_id: str
# start_date: datetime.date
# end_date: datetime.date
# end_date_requested_by: str
# oecd_fos_2007_code: OecdFos2007CodeEnum
# oecd_fos_2007_label: str
# is_industry: bool
# image: str
# resources_count: int
# project_credit: float
# marketplace_resource_count: ProjectMarketplaceResourceCount
# billing_price_estimate: NestedPriceEstimate
|
Listing project permissions in projects using service provider's resources
A service provider owner can also list all active projects permissions in projects, which have its resources.
For this, marketplace_service_providers_project_permissions_list
should be used. It accepts service_provider_uuid,
which can be fetched using marketplace_service_providers_list
.
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 | from waldur_api_client.api.marketplace_service_providers import (
marketplace_service_providers_list,
marketplace_service_providers_project_permissions_list,
)
service_providers = marketplace_service_providers_list.sync(
client=client,
customer_uuid="<customer_uuid>"
)
service_provider = service_providers[0]
service_provider_uuid = service_provider.uuid
permissions = marketplace_service_providers_project_permissions_list.sync(
service_provider_uuid=service_provider_uuid,
client=client
)
# created: datetime.datetime
# expiration_time: datetime.datetime | None
# created_by: str | None
# created_by_full_name: str
# created_by_username: str
# project: str
# project_uuid: UUID
# project_name: str
# project_created: datetime.datetime
# project_end_date: datetime.datetime
# customer_uuid: UUID
# customer_name: str
# role: str
# role_name: str
# user: str
# user_full_name: str
# user_native_name: str
# user_username: str
# user_uuid: UUID
# user_email: str
|