From 6e85d1922f552b59d665188f69facb54ab50dec0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:37:24 +0000 Subject: [PATCH 01/17] Add changes --- pnap_bmc_api/docs/Server.md | 2 +- pnap_bmc_api/docs/ServersApi.md | 2 +- pnap_bmc_api/pnap_bmc_api/models/server.py | 2 +- .../docs/StorageNetworksApi.md | 2 +- specs/pnap_bmc_api.spec.yaml | 17 +++++------------ specs/pnap_ip_api.spec.yaml | 8 ++++++-- specs/pnap_network_storage_api.spec.yaml | 11 ++++++++--- specs/pnap_rancher_solution_api.spec.yaml | 5 +++-- 8 files changed, 26 insertions(+), 23 deletions(-) diff --git a/pnap_bmc_api/docs/Server.md b/pnap_bmc_api/docs/Server.md index 88cb1df3..f1b7cc52 100644 --- a/pnap_bmc_api/docs/Server.md +++ b/pnap_bmc_api/docs/Server.md @@ -22,7 +22,7 @@ Name | Type | Description | Notes **private_ip_addresses** | **List[str]** | Private IP addresses assigned to server. | **public_ip_addresses** | **List[str]** | Public IP addresses assigned to server. | [optional] **reservation_id** | **str** | The reservation reference id if any. | [optional] -**pricing_model** | **str** | The pricing model this server is being billed. Currently this field should be set to `HOURLY`, `ONE_MONTH_RESERVATION`, `TWELVE_MONTHS_RESERVATION`, `TWENTY_FOUR_MONTHS_RESERVATION` or `THIRTY_SIX_MONTHS_RESERVATION`. | [default to 'HOURLY'] +**pricing_model** | **str** | The pricing model this server is being billed. Currently this field should be set to `HOURLY`, `ONE_MONTH_RESERVATION`, `TWELVE_MONTHS_RESERVATION`, `TWENTY_FOUR_MONTHS_RESERVATION`, `THIRTY_SIX_MONTHS_RESERVATION` or `CUSTOM_TERM_RESERVATION`. | [default to 'HOURLY'] **password** | **str** | Auto-generated password set for user `Admin` on Windows server, user `root` on ESXi servers, user `root` on Proxmox server and user `netris` on Netris servers.<br> The password is not stored and therefore will only be returned in response to provisioning a server. Copy and save it for future reference. | [optional] **network_type** | **str** | The type of network configuration for this server. Currently this field should be set to `PUBLIC_AND_PRIVATE`, `PRIVATE_ONLY`, `PUBLIC_ONLY` or `NONE`. | [optional] [default to 'PUBLIC_AND_PRIVATE'] **cluster_id** | **str** | The cluster reference id if any. | [optional] diff --git a/pnap_bmc_api/docs/ServersApi.md b/pnap_bmc_api/docs/ServersApi.md index 1eb13839..9a0c68bd 100644 --- a/pnap_bmc_api/docs/ServersApi.md +++ b/pnap_bmc_api/docs/ServersApi.md @@ -144,7 +144,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with pnap_bmc_api.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = pnap_bmc_api.ServersApi(api_client) - tag = ['env.dev'] # List[str] | A list of query parameters related to tags in the form of tagName.tagValue (optional) + tag = ['[\"env.dev\"]'] # List[str] | A list of query parameters related to tags in the form of tagName.tagValue (optional) try: # List servers. diff --git a/pnap_bmc_api/pnap_bmc_api/models/server.py b/pnap_bmc_api/pnap_bmc_api/models/server.py index d622bba8..fa550b79 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/server.py +++ b/pnap_bmc_api/pnap_bmc_api/models/server.py @@ -50,7 +50,7 @@ class Server(BaseModel): private_ip_addresses: Annotated[List[StrictStr], Field(min_length=1)] = Field(description="Private IP addresses assigned to server.", alias="privateIpAddresses") public_ip_addresses: Optional[Annotated[List[StrictStr], Field(min_length=0)]] = Field(default=None, description="Public IP addresses assigned to server.", alias="publicIpAddresses") reservation_id: Optional[StrictStr] = Field(default=None, description="The reservation reference id if any.", alias="reservationId") - pricing_model: StrictStr = Field(description="The pricing model this server is being billed. Currently this field should be set to `HOURLY`, `ONE_MONTH_RESERVATION`, `TWELVE_MONTHS_RESERVATION`, `TWENTY_FOUR_MONTHS_RESERVATION` or `THIRTY_SIX_MONTHS_RESERVATION`.", alias="pricingModel") + pricing_model: StrictStr = Field(description="The pricing model this server is being billed. Currently this field should be set to `HOURLY`, `ONE_MONTH_RESERVATION`, `TWELVE_MONTHS_RESERVATION`, `TWENTY_FOUR_MONTHS_RESERVATION`, `THIRTY_SIX_MONTHS_RESERVATION` or `CUSTOM_TERM_RESERVATION`.", alias="pricingModel") password: Optional[StrictStr] = Field(default=None, description="Auto-generated password set for user `Admin` on Windows server, user `root` on ESXi servers, user `root` on Proxmox server and user `netris` on Netris servers.
The password is not stored and therefore will only be returned in response to provisioning a server. Copy and save it for future reference.") network_type: Optional[StrictStr] = Field(default='PUBLIC_AND_PRIVATE', description="The type of network configuration for this server. Currently this field should be set to `PUBLIC_AND_PRIVATE`, `PRIVATE_ONLY`, `PUBLIC_ONLY` or `NONE`.", alias="networkType") cluster_id: Optional[StrictStr] = Field(default=None, description="The cluster reference id if any.", alias="clusterId") diff --git a/pnap_network_storage_api/docs/StorageNetworksApi.md b/pnap_network_storage_api/docs/StorageNetworksApi.md index e2fc26eb..f2c10f3e 100644 --- a/pnap_network_storage_api/docs/StorageNetworksApi.md +++ b/pnap_network_storage_api/docs/StorageNetworksApi.md @@ -450,7 +450,7 @@ with pnap_network_storage_api.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = pnap_network_storage_api.StorageNetworksApi(api_client) storage_id = '50dc434c-9bba-427b-bcd6-0bdba45c4dd2' # str | ID of the storage. - tag = ['env.dev'] # List[str] | A list of query parameters related to tags in the form of tagName.tagValue (optional) + tag = ['[\"env.dev\"]'] # List[str] | A list of query parameters related to tags in the form of tagName.tagValue (optional) try: # Display one or more volumes belonging to a storage network. diff --git a/specs/pnap_bmc_api.spec.yaml b/specs/pnap_bmc_api.spec.yaml index 25acb9df..5045e7c8 100644 --- a/specs/pnap_bmc_api.spec.yaml +++ b/specs/pnap_bmc_api.spec.yaml @@ -54,7 +54,8 @@ paths: type: string description: A list of query parameters related to tags in the form of tagName.tagValue explode: true - example: env.dev + example: + - env.dev responses: '200': description: List of all the servers owned by account. @@ -1718,11 +1719,7 @@ components: type: array items: type: string - example: - - 182.16.0.146 - - 10.1.1.20 - 10.1.1.25 - - 2001:db8::f - - 2001:db8::b - 2001:db8::d + example: 182.16.0.146 example: - 182.16.0.146 - 10.1.1.20 - 10.1.1.25 @@ -1910,7 +1907,7 @@ components: type: string example: fc8bd49a-59cc-4538-a806-5e46228408ec pricingModel: - description: The pricing model this server is being billed. Currently this field should be set to `HOURLY`, `ONE_MONTH_RESERVATION`, `TWELVE_MONTHS_RESERVATION`, `TWENTY_FOUR_MONTHS_RESERVATION` or `THIRTY_SIX_MONTHS_RESERVATION`. + description: The pricing model this server is being billed. Currently this field should be set to `HOURLY`, `ONE_MONTH_RESERVATION`, `TWELVE_MONTHS_RESERVATION`, `TWENTY_FOUR_MONTHS_RESERVATION`, `THIRTY_SIX_MONTHS_RESERVATION` or `CUSTOM_TERM_RESERVATION`. type: string default: HOURLY example: HOURLY @@ -2112,11 +2109,7 @@ components: type: array items: type: string - example: - - 10.1.1.1 - - 10.1.1.20 - 10.1.1.25 - - 2001:db8::f - - 2001:db8::b - 2001:db8::d + example: 10.1.1.1 example: - 10.1.1.1 - 10.1.1.20 - 10.1.1.25 diff --git a/specs/pnap_ip_api.spec.yaml b/specs/pnap_ip_api.spec.yaml index bc0131ea..69eed522 100644 --- a/specs/pnap_ip_api.spec.yaml +++ b/specs/pnap_ip_api.spec.yaml @@ -356,10 +356,14 @@ components: items: $ref: '#/components/schemas/TagAssignment' example: - - name: stage + - id: 60ffafcdffb8b074c7968dad + name: stage value: beta - - name: group + isBillingTag: false + - id: 60ffafcdffb8b074c7968dae + name: group value: discounted + isBillingTag: true isSystemManaged: description: True if the IP block is a `system managed` block. type: boolean diff --git a/specs/pnap_network_storage_api.spec.yaml b/specs/pnap_network_storage_api.spec.yaml index 9625766f..f148e756 100644 --- a/specs/pnap_network_storage_api.spec.yaml +++ b/specs/pnap_network_storage_api.spec.yaml @@ -192,7 +192,8 @@ paths: items: type: string description: A list of query parameters related to tags in the form of tagName.tagValue - example: env.dev + example: + - env.dev tags: - Storage Networks description: Display one or more volumes belonging to a storage network. @@ -589,10 +590,14 @@ components: items: $ref: '#/components/schemas/TagAssignment' example: - - name: stage + - id: 60ffafcdffb8b074c7968dad + name: stage value: beta - - name: group + isBillingTag: false + - id: 60ffafcdffb8b074c7968dae + name: group value: discounted + isBillingTag: true VolumeCreate: title: VolumeCreate type: object diff --git a/specs/pnap_rancher_solution_api.spec.yaml b/specs/pnap_rancher_solution_api.spec.yaml index 52d3e443..37afd5c4 100644 --- a/specs/pnap_rancher_solution_api.spec.yaml +++ b/specs/pnap_rancher_solution_api.spec.yaml @@ -305,7 +305,7 @@ components: nodeCount: description: Number of configured nodes, currently only node counts of 1 and 3 are possible. type: integer - example: '1' + example: 1 serverType: description: Node server type. Cannot be changed once a server is created. Currently this field should be set to either `s0.d1.small`, `s0.d1.medium`, `s1.c1.small`, `s1.c1.medium`, `s1.c2.medium`, `s1.c2.large`, `s2.c1.small`, `s2.c1.medium`, `s2.c1.large`, `s2.c2.small`, `s2.c2.medium`, `s2.c2.large`, `s1.e1.small`, `s1.e1.medium`, `s1.e1.large`. type: string @@ -404,7 +404,8 @@ components: items: type: string example: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDF9LdAFElNCi7JoWh6KUcchrJ2Gac1aqGRPpdZNowObpRtmiRCecAMb7bUgNAaNfcmwiQi7tos9TlnFgprIcfMWb8MSs3ABYHmBgqEEt3RWYf0fAc9CsIpJdMCUG28TPGTlRXCEUVNKgLMdcseAlJoGp1CgbHWIN65fB3he3kAZcfpPn5mapV0tsl2p+ZyuAGRYdn5dJv2RZDHUZBkOeUobwsij+weHCKAFmKQKtCP7ybgVHaQjAPrj8MGnk1jBbjDt5ws+Be+9JNjQJee9zCKbAOsIo3i+GcUIkrw5jxPU/RTGlWBcemPaKHdciSzGcjWboapzIy49qypQhZe1U75 user - example: '[ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDF9LdAFElNCi7JoWh6KUcchrJ2Gac1aqGRPpdZNowObpRtmiRCecAMb7bUgNAaNfcmwiQi7tos9TlnFgprIcfMWb8MSs3ABYHmBgqEEt3RWYf0fAc9CsIpJdMCUG28TPGTlRXCEUVNKgLMdcseAlJoGp1CgbHWIN65fB3he3kAZcfpPn5mapV0tsl2p+ZyuAGRYdn5dJv2RZDHUZBkOeUobwsij+weHCKAFmKQKtCP7ybgVHaQjAPrj8MGnk1jBbjDt5ws+Be+9JNjQJee9zCKbAOsIo3i+GcUIkrw5jxPU/RTGlWBcemPaKHdciSzGcjWboapzIy49qypQhZe1U75 user]' + example: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDF9LdAFElNCi7JoWh6KUcchrJ2Gac1aqGRPpdZNowObpRtmiRCecAMb7bUgNAaNfcmwiQi7tos9TlnFgprIcfMWb8MSs3ABYHmBgqEEt3RWYf0fAc9CsIpJdMCUG28TPGTlRXCEUVNKgLMdcseAlJoGp1CgbHWIN65fB3he3kAZcfpPn5mapV0tsl2p+ZyuAGRYdn5dJv2RZDHUZBkOeUobwsij+weHCKAFmKQKtCP7ybgVHaQjAPrj8MGnk1jBbjDt5ws+Be+9JNjQJee9zCKbAOsIo3i+GcUIkrw5jxPU/RTGlWBcemPaKHdciSzGcjWboapzIy49qypQhZe1U75 user keyIds: description: List of public SSH key identifiers. These are public keys that were already recorded on this system. Use GET /ssh-keys to retrieve a list of possible values. type: array From 0935a079c5dd8c1996974b1749321a3b3320e49b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:32:27 +0000 Subject: [PATCH 02/17] Add changes --- pnap_bmc_api/docs/ServerPublicNetwork.md | 2 +- pnap_bmc_api/pnap_bmc_api/models/server_public_network.py | 2 +- specs/pnap_bmc_api.spec.yaml | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pnap_bmc_api/docs/ServerPublicNetwork.md b/pnap_bmc_api/docs/ServerPublicNetwork.md index b4fa341e..80d913d7 100644 --- a/pnap_bmc_api/docs/ServerPublicNetwork.md +++ b/pnap_bmc_api/docs/ServerPublicNetwork.md @@ -7,7 +7,7 @@ Public network details of bare metal server. Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **id** | **str** | The network identifier. | -**ips** | **List[str]** | Configurable/configured IPs on the server.<br> At least 1 IP address is required. Valid IP formats include single IP addresses or IP ranges (IPv4 or IPv6). All IPs must be within the network's range.<br> Setting the `computeSlaacIp` field to `true` allows you to provide an empty array of IPs.<br> Additionally, setting the `force` query parameter to `true` allows you to:<ul> <li> Assign no specific IP addresses by designating an empty array of IPs. Note that at least one IP is required for the gateway address to be selected from this network. <li> Assign one or more IP addresses which are already configured on other resource(s) in network.</ul> | [optional] +**ips** | **List[str]** | Configurable/configured IPs on the server.<br> At least 1 IP address is required. Valid IP formats include single IP addresses or IP ranges (IPv4 or IPv6). All IPs must be within the network's range.<br> Setting the `computeSlaacIp` field to `true` allows you to provide an empty array of IPs.<br> Referencing network as OS native network allows you to provide an empty array of IPs.<br> Additionally, setting the `force` query parameter to `true` allows you to:<ul> <li> Assign no specific IP addresses by designating an empty array of IPs. Note that at least one IP is required for the gateway address to be selected from this network. <li> Assign one or more IP addresses which are already configured on other resource(s) in network.</ul> | **status_description** | **str** | (Read-only) The status of the assignment to the network. | [optional] [readonly] **compute_slaac_ip** | **bool** | (Write-only) Requests Stateless Address Autoconfiguration (SLAAC). Applicable for Network which contains IPv6 block(s). | [optional] **vlan_id** | **int** | (Read-only) The VLAN on which this network has been configured within the network switch. | [optional] [readonly] diff --git a/pnap_bmc_api/pnap_bmc_api/models/server_public_network.py b/pnap_bmc_api/pnap_bmc_api/models/server_public_network.py index 63940a3c..6ad3e6ae 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/server_public_network.py +++ b/pnap_bmc_api/pnap_bmc_api/models/server_public_network.py @@ -28,7 +28,7 @@ class ServerPublicNetwork(BaseModel): Public network details of bare metal server. """ # noqa: E501 id: StrictStr = Field(description="The network identifier.") - ips: Optional[List[StrictStr]] = Field(default=None, description="Configurable/configured IPs on the server.
At least 1 IP address is required. Valid IP formats include single IP addresses or IP ranges (IPv4 or IPv6). All IPs must be within the network's range.
Setting the `computeSlaacIp` field to `true` allows you to provide an empty array of IPs.
Additionally, setting the `force` query parameter to `true` allows you to:") + ips: List[StrictStr] = Field(description="Configurable/configured IPs on the server.
At least 1 IP address is required. Valid IP formats include single IP addresses or IP ranges (IPv4 or IPv6). All IPs must be within the network's range.
Setting the `computeSlaacIp` field to `true` allows you to provide an empty array of IPs.
Referencing network as OS native network allows you to provide an empty array of IPs.
Additionally, setting the `force` query parameter to `true` allows you to:") status_description: Optional[StrictStr] = Field(default=None, description="(Read-only) The status of the assignment to the network.", alias="statusDescription") compute_slaac_ip: Optional[StrictBool] = Field(default=None, description="(Write-only) Requests Stateless Address Autoconfiguration (SLAAC). Applicable for Network which contains IPv6 block(s).", alias="computeSlaacIp") vlan_id: Optional[StrictInt] = Field(default=None, description="(Read-only) The VLAN on which this network has been configured within the network switch.", alias="vlanId") diff --git a/specs/pnap_bmc_api.spec.yaml b/specs/pnap_bmc_api.spec.yaml index 5045e7c8..ce9890ba 100644 --- a/specs/pnap_bmc_api.spec.yaml +++ b/specs/pnap_bmc_api.spec.yaml @@ -1709,13 +1709,14 @@ components: description: Public network details of bare metal server. required: - id + - ips properties: id: description: The network identifier. type: string example: 60473c2509268bc77fd06d29 ips: - description: Configurable/configured IPs on the server.
At least 1 IP address is required. Valid IP formats include single IP addresses or IP ranges (IPv4 or IPv6). All IPs must be within the network's range.
Setting the `computeSlaacIp` field to `true` allows you to provide an empty array of IPs.
Additionally, setting the `force` query parameter to `true` allows you to: + description: Configurable/configured IPs on the server.
At least 1 IP address is required. Valid IP formats include single IP addresses or IP ranges (IPv4 or IPv6). All IPs must be within the network's range.
Setting the `computeSlaacIp` field to `true` allows you to provide an empty array of IPs.
Referencing network as OS native network allows you to provide an empty array of IPs.
Additionally, setting the `force` query parameter to `true` allows you to: type: array items: type: string From 37567f43a6fec36b56f60f9363c0d3f3e7821e41 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 12:50:36 +0000 Subject: [PATCH 03/17] Add changes --- pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py | 4 ++-- .../pnap_bmc_api/models/quota_edit_limit_request_details.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py index 338f9ba2..46987854 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py +++ b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py @@ -36,8 +36,8 @@ class QuotaEditLimitRequest(BaseModel): @field_validator('reason') def reason_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"(?s)^(?!\s*$).+", value): - raise ValueError("must validate the regular expression /^(?s)(?!\s*$).+/") + if not re.match(r"^(?s)(?!\s*$).+", value): + raise ValueError(r"must validate the regular expression /^(?s)(?!\s*$).+/") return value model_config = ConfigDict( diff --git a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py index 6a29524a..67bcb9c4 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py +++ b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py @@ -38,8 +38,8 @@ class QuotaEditLimitRequestDetails(BaseModel): @field_validator('reason') def reason_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"(?s)^(?!\s*$).+", value): - raise ValueError("must validate the regular expression /^(?s)(?!\s*$).+/") + if not re.match(r"^(?s)(?!\s*$).+", value): + raise ValueError(r"must validate the regular expression /^(?s)(?!\s*$).+/") return value model_config = ConfigDict( From b7b23c677656cacd3493c1379810917a3193089a Mon Sep 17 00:00:00 2001 From: andrej Date: Tue, 7 Apr 2026 17:09:48 +0200 Subject: [PATCH 04/17] Updated versions --- pnap_audit_api/pnap_audit_api/version.py | 2 +- pnap_bmc_api/pnap_bmc_api/version.py | 2 +- pnap_invoicing_api/pnap_invoicing_api/version.py | 2 +- pnap_ip_api/pnap_ip_api/version.py | 2 +- pnap_location_api/pnap_location_api/version.py | 2 +- pnap_network_api/pnap_network_api/version.py | 2 +- pnap_network_storage_api/pnap_network_storage_api/version.py | 2 +- pnap_payments_api/pnap_payments_api/version.py | 2 +- pnap_rancher_solution_api/pnap_rancher_solution_api/version.py | 2 +- pnap_tag_api/pnap_tag_api/version.py | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pnap_audit_api/pnap_audit_api/version.py b/pnap_audit_api/pnap_audit_api/version.py index 09091e00..4a5665b9 100644 --- a/pnap_audit_api/pnap_audit_api/version.py +++ b/pnap_audit_api/pnap_audit_api/version.py @@ -1 +1 @@ -VERSION = "2.0.5" \ No newline at end of file +VERSION = "2.0.6.dev" \ No newline at end of file diff --git a/pnap_bmc_api/pnap_bmc_api/version.py b/pnap_bmc_api/pnap_bmc_api/version.py index 7e8ebebd..3f62f0ab 100644 --- a/pnap_bmc_api/pnap_bmc_api/version.py +++ b/pnap_bmc_api/pnap_bmc_api/version.py @@ -1 +1 @@ -VERSION = "2.3.0" \ No newline at end of file +VERSION = "2.3.1.dev" \ No newline at end of file diff --git a/pnap_invoicing_api/pnap_invoicing_api/version.py b/pnap_invoicing_api/pnap_invoicing_api/version.py index 92f6d2de..2840dec4 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/version.py +++ b/pnap_invoicing_api/pnap_invoicing_api/version.py @@ -1 +1 @@ -VERSION = "1.0.5" \ No newline at end of file +VERSION = "1.0.6.dev" \ No newline at end of file diff --git a/pnap_ip_api/pnap_ip_api/version.py b/pnap_ip_api/pnap_ip_api/version.py index 51380664..300cc7b8 100644 --- a/pnap_ip_api/pnap_ip_api/version.py +++ b/pnap_ip_api/pnap_ip_api/version.py @@ -1 +1 @@ -VERSION = "2.2.0" \ No newline at end of file +VERSION = "2.2.1.dev" \ No newline at end of file diff --git a/pnap_location_api/pnap_location_api/version.py b/pnap_location_api/pnap_location_api/version.py index 91c27a95..fcbc8b3e 100644 --- a/pnap_location_api/pnap_location_api/version.py +++ b/pnap_location_api/pnap_location_api/version.py @@ -1 +1 @@ -VERSION = "3.0.0" \ No newline at end of file +VERSION = "3.0.1.dev" \ No newline at end of file diff --git a/pnap_network_api/pnap_network_api/version.py b/pnap_network_api/pnap_network_api/version.py index 5a135ffc..6da3e19a 100644 --- a/pnap_network_api/pnap_network_api/version.py +++ b/pnap_network_api/pnap_network_api/version.py @@ -1 +1 @@ -VERSION = "3.1.0" \ No newline at end of file +VERSION = "3.1.1.dev" \ No newline at end of file diff --git a/pnap_network_storage_api/pnap_network_storage_api/version.py b/pnap_network_storage_api/pnap_network_storage_api/version.py index 09091e00..4a5665b9 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/version.py +++ b/pnap_network_storage_api/pnap_network_storage_api/version.py @@ -1 +1 @@ -VERSION = "2.0.5" \ No newline at end of file +VERSION = "2.0.6.dev" \ No newline at end of file diff --git a/pnap_payments_api/pnap_payments_api/version.py b/pnap_payments_api/pnap_payments_api/version.py index 92f6d2de..2840dec4 100644 --- a/pnap_payments_api/pnap_payments_api/version.py +++ b/pnap_payments_api/pnap_payments_api/version.py @@ -1 +1 @@ -VERSION = "1.0.5" \ No newline at end of file +VERSION = "1.0.6.dev" \ No newline at end of file diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py index 09091e00..4a5665b9 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py @@ -1 +1 @@ -VERSION = "2.0.5" \ No newline at end of file +VERSION = "2.0.6.dev" \ No newline at end of file diff --git a/pnap_tag_api/pnap_tag_api/version.py b/pnap_tag_api/pnap_tag_api/version.py index 09091e00..4a5665b9 100644 --- a/pnap_tag_api/pnap_tag_api/version.py +++ b/pnap_tag_api/pnap_tag_api/version.py @@ -1 +1 @@ -VERSION = "2.0.5" \ No newline at end of file +VERSION = "2.0.6.dev" \ No newline at end of file From b281612c07d659833cff218238484e2af8cc6c20 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 15:12:05 +0000 Subject: [PATCH 05/17] Add changes --- pnap_audit_api/README.md | 2 +- pnap_audit_api/pnap_audit_api/__init__.py | 2 +- pnap_audit_api/pnap_audit_api/api_client.py | 4 ++-- pnap_audit_api/pnap_audit_api/configuration.py | 2 +- pnap_audit_api/pyproject.toml | 2 +- pnap_audit_api/setup.py | 2 +- pnap_bmc_api/README.md | 2 +- pnap_bmc_api/pnap_bmc_api/__init__.py | 2 +- pnap_bmc_api/pnap_bmc_api/api_client.py | 4 ++-- pnap_bmc_api/pnap_bmc_api/configuration.py | 2 +- pnap_bmc_api/pyproject.toml | 2 +- pnap_bmc_api/setup.py | 2 +- pnap_invoicing_api/README.md | 2 +- pnap_invoicing_api/pnap_invoicing_api/__init__.py | 2 +- pnap_invoicing_api/pnap_invoicing_api/api_client.py | 4 ++-- pnap_invoicing_api/pnap_invoicing_api/configuration.py | 2 +- pnap_invoicing_api/pyproject.toml | 2 +- pnap_invoicing_api/setup.py | 2 +- pnap_ip_api/README.md | 2 +- pnap_ip_api/pnap_ip_api/__init__.py | 2 +- pnap_ip_api/pnap_ip_api/api_client.py | 4 ++-- pnap_ip_api/pnap_ip_api/configuration.py | 2 +- pnap_ip_api/pyproject.toml | 2 +- pnap_ip_api/setup.py | 2 +- pnap_location_api/README.md | 2 +- pnap_location_api/pnap_location_api/__init__.py | 2 +- pnap_location_api/pnap_location_api/api_client.py | 4 ++-- pnap_location_api/pnap_location_api/configuration.py | 2 +- pnap_location_api/pyproject.toml | 2 +- pnap_location_api/setup.py | 2 +- pnap_network_api/README.md | 2 +- pnap_network_api/pnap_network_api/__init__.py | 2 +- pnap_network_api/pnap_network_api/api_client.py | 4 ++-- pnap_network_api/pnap_network_api/configuration.py | 2 +- pnap_network_api/pyproject.toml | 2 +- pnap_network_api/setup.py | 2 +- pnap_network_storage_api/README.md | 2 +- pnap_network_storage_api/pnap_network_storage_api/__init__.py | 2 +- .../pnap_network_storage_api/api_client.py | 4 ++-- .../pnap_network_storage_api/configuration.py | 2 +- pnap_network_storage_api/pyproject.toml | 2 +- pnap_network_storage_api/setup.py | 2 +- pnap_payments_api/README.md | 2 +- pnap_payments_api/pnap_payments_api/__init__.py | 2 +- pnap_payments_api/pnap_payments_api/api_client.py | 4 ++-- pnap_payments_api/pnap_payments_api/configuration.py | 2 +- pnap_payments_api/pyproject.toml | 2 +- pnap_payments_api/setup.py | 2 +- pnap_rancher_solution_api/README.md | 2 +- .../pnap_rancher_solution_api/__init__.py | 2 +- .../pnap_rancher_solution_api/api_client.py | 4 ++-- .../pnap_rancher_solution_api/configuration.py | 2 +- pnap_rancher_solution_api/pyproject.toml | 2 +- pnap_rancher_solution_api/setup.py | 2 +- pnap_tag_api/README.md | 2 +- pnap_tag_api/pnap_tag_api/__init__.py | 2 +- pnap_tag_api/pnap_tag_api/api_client.py | 4 ++-- pnap_tag_api/pnap_tag_api/configuration.py | 2 +- pnap_tag_api/pyproject.toml | 2 +- pnap_tag_api/setup.py | 2 +- 60 files changed, 70 insertions(+), 70 deletions(-) diff --git a/pnap_audit_api/README.md b/pnap_audit_api/README.md index dd015a22..9e60ad63 100644 --- a/pnap_audit_api/README.md +++ b/pnap_audit_api/README.md @@ -12,7 +12,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.0.5 +- Package version: 2.0.6.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_audit_api/pnap_audit_api/__init__.py b/pnap_audit_api/pnap_audit_api/__init__.py index 68eb3c63..7acfd464 100644 --- a/pnap_audit_api/pnap_audit_api/__init__.py +++ b/pnap_audit_api/pnap_audit_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.5" +__version__ = "2.0.6.dev" # Define package exports __all__ = [ diff --git a/pnap_audit_api/pnap_audit_api/api_client.py b/pnap_audit_api/pnap_audit_api/api_client.py index c8620c29..d2b3b1c3 100644 --- a/pnap_audit_api/pnap_audit_api/api_client.py +++ b/pnap_audit_api/pnap_audit_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.5" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.6.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.5" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.6.dev" def __enter__(self): return self diff --git a/pnap_audit_api/pnap_audit_api/configuration.py b/pnap_audit_api/pnap_audit_api/configuration.py index 4744f151..5f9baff3 100644 --- a/pnap_audit_api/pnap_audit_api/configuration.py +++ b/pnap_audit_api/pnap_audit_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.0.5".\ + "SDK Package Version: 2.0.6.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_audit_api/pyproject.toml b/pnap_audit_api/pyproject.toml index f5a24d70..3f78f63f 100644 --- a/pnap_audit_api/pyproject.toml +++ b/pnap_audit_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_audit_api" -version = "2.0.5" +version = "2.0.6.dev" description = "Audit Log API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_audit_api/setup.py b/pnap_audit_api/setup.py index 693035f0..92d6c911 100644 --- a/pnap_audit_api/setup.py +++ b/pnap_audit_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_audit_api" -VERSION = "2.0.5" +VERSION = "2.0.6.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_bmc_api/README.md b/pnap_bmc_api/README.md index 7843b1ed..28469867 100644 --- a/pnap_bmc_api/README.md +++ b/pnap_bmc_api/README.md @@ -14,7 +14,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 0.1 -- Package version: 2.3.0 +- Package version: 2.3.1.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_bmc_api/pnap_bmc_api/__init__.py b/pnap_bmc_api/pnap_bmc_api/__init__.py index fda358c6..163a60cb 100644 --- a/pnap_bmc_api/pnap_bmc_api/__init__.py +++ b/pnap_bmc_api/pnap_bmc_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.3.0" +__version__ = "2.3.1.dev" # Define package exports __all__ = [ diff --git a/pnap_bmc_api/pnap_bmc_api/api_client.py b/pnap_bmc_api/pnap_bmc_api/api_client.py index 5ca259a4..00761238 100644 --- a/pnap_bmc_api/pnap_bmc_api/api_client.py +++ b/pnap_bmc_api/pnap_bmc_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.3.0" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.3.1.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.3.0" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.3.1.dev" def __enter__(self): return self diff --git a/pnap_bmc_api/pnap_bmc_api/configuration.py b/pnap_bmc_api/pnap_bmc_api/configuration.py index d8f18adf..bce84199 100644 --- a/pnap_bmc_api/pnap_bmc_api/configuration.py +++ b/pnap_bmc_api/pnap_bmc_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 0.1\n"\ - "SDK Package Version: 2.3.0".\ + "SDK Package Version: 2.3.1.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_bmc_api/pyproject.toml b/pnap_bmc_api/pyproject.toml index 2021c84c..9111af04 100644 --- a/pnap_bmc_api/pyproject.toml +++ b/pnap_bmc_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_bmc_api" -version = "2.3.0" +version = "2.3.1.dev" description = "Bare Metal Cloud API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_bmc_api/setup.py b/pnap_bmc_api/setup.py index 9542fadb..1d1bc9fa 100644 --- a/pnap_bmc_api/setup.py +++ b/pnap_bmc_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_bmc_api" -VERSION = "2.3.0" +VERSION = "2.3.1.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_invoicing_api/README.md b/pnap_invoicing_api/README.md index 9250bf0f..792d6e50 100644 --- a/pnap_invoicing_api/README.md +++ b/pnap_invoicing_api/README.md @@ -5,7 +5,7 @@ List, fetch and pay invoices with the Invoicing API. This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 1.0.5 +- Package version: 1.0.6.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_invoicing_api/pnap_invoicing_api/__init__.py b/pnap_invoicing_api/pnap_invoicing_api/__init__.py index 199a20d3..5caba34a 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/__init__.py +++ b/pnap_invoicing_api/pnap_invoicing_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "1.0.5" +__version__ = "1.0.6.dev" # Define package exports __all__ = [ diff --git a/pnap_invoicing_api/pnap_invoicing_api/api_client.py b/pnap_invoicing_api/pnap_invoicing_api/api_client.py index d2d1c42d..fd352a22 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/api_client.py +++ b/pnap_invoicing_api/pnap_invoicing_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.5" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.6.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.5" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.6.dev" def __enter__(self): return self diff --git a/pnap_invoicing_api/pnap_invoicing_api/configuration.py b/pnap_invoicing_api/pnap_invoicing_api/configuration.py index 63a2217a..6b7341a1 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/configuration.py +++ b/pnap_invoicing_api/pnap_invoicing_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 1.0.5".\ + "SDK Package Version: 1.0.6.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_invoicing_api/pyproject.toml b/pnap_invoicing_api/pyproject.toml index 47a02f81..394adb2a 100644 --- a/pnap_invoicing_api/pyproject.toml +++ b/pnap_invoicing_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_invoicing_api" -version = "1.0.5" +version = "1.0.6.dev" description = "Invoicing API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_invoicing_api/setup.py b/pnap_invoicing_api/setup.py index 451ef6e5..adc5a156 100644 --- a/pnap_invoicing_api/setup.py +++ b/pnap_invoicing_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_invoicing_api" -VERSION = "1.0.5" +VERSION = "1.0.6.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_ip_api/README.md b/pnap_ip_api/README.md index 2ba4f5ad..17c79012 100644 --- a/pnap_ip_api/README.md +++ b/pnap_ip_api/README.md @@ -13,7 +13,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.2.0 +- Package version: 2.2.1.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_ip_api/pnap_ip_api/__init__.py b/pnap_ip_api/pnap_ip_api/__init__.py index 0e9cbd66..6a4cb3e9 100644 --- a/pnap_ip_api/pnap_ip_api/__init__.py +++ b/pnap_ip_api/pnap_ip_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.2.0" +__version__ = "2.2.1.dev" # Define package exports __all__ = [ diff --git a/pnap_ip_api/pnap_ip_api/api_client.py b/pnap_ip_api/pnap_ip_api/api_client.py index 49192d0f..1e37c90b 100644 --- a/pnap_ip_api/pnap_ip_api/api_client.py +++ b/pnap_ip_api/pnap_ip_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.0" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.1.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.0" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.1.dev" def __enter__(self): return self diff --git a/pnap_ip_api/pnap_ip_api/configuration.py b/pnap_ip_api/pnap_ip_api/configuration.py index 6c7d2a36..b6e27640 100644 --- a/pnap_ip_api/pnap_ip_api/configuration.py +++ b/pnap_ip_api/pnap_ip_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.2.0".\ + "SDK Package Version: 2.2.1.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_ip_api/pyproject.toml b/pnap_ip_api/pyproject.toml index ca6203c1..c70d07f2 100644 --- a/pnap_ip_api/pyproject.toml +++ b/pnap_ip_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_ip_api" -version = "2.2.0" +version = "2.2.1.dev" description = "IP Addresses API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_ip_api/setup.py b/pnap_ip_api/setup.py index 4c071f19..66c70e12 100644 --- a/pnap_ip_api/setup.py +++ b/pnap_ip_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_ip_api" -VERSION = "2.2.0" +VERSION = "2.2.1.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_location_api/README.md b/pnap_location_api/README.md index 2bcb1e49..d689be7f 100644 --- a/pnap_location_api/README.md +++ b/pnap_location_api/README.md @@ -4,7 +4,7 @@ No description provided (generated by Openapi Generator https://github.com/opena This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 3.0.0 +- Package version: 3.0.1.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com](https://phoenixnap.com) diff --git a/pnap_location_api/pnap_location_api/__init__.py b/pnap_location_api/pnap_location_api/__init__.py index 8fafd5ce..5cef386e 100644 --- a/pnap_location_api/pnap_location_api/__init__.py +++ b/pnap_location_api/pnap_location_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "3.0.0" +__version__ = "3.0.1.dev" # Define package exports __all__ = [ diff --git a/pnap_location_api/pnap_location_api/api_client.py b/pnap_location_api/pnap_location_api/api_client.py index 037fd323..d6c46365 100644 --- a/pnap_location_api/pnap_location_api/api_client.py +++ b/pnap_location_api/pnap_location_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.0" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.1.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.0" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.1.dev" def __enter__(self): return self diff --git a/pnap_location_api/pnap_location_api/configuration.py b/pnap_location_api/pnap_location_api/configuration.py index e64e0751..587834a6 100644 --- a/pnap_location_api/pnap_location_api/configuration.py +++ b/pnap_location_api/pnap_location_api/configuration.py @@ -505,7 +505,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 3.0.0".\ + "SDK Package Version: 3.0.1.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_location_api/pyproject.toml b/pnap_location_api/pyproject.toml index 6f0d367c..15a3ef83 100644 --- a/pnap_location_api/pyproject.toml +++ b/pnap_location_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_location_api" -version = "3.0.0" +version = "3.0.1.dev" description = "Locations API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_location_api/setup.py b/pnap_location_api/setup.py index 258354fe..622f1282 100644 --- a/pnap_location_api/setup.py +++ b/pnap_location_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_location_api" -VERSION = "3.0.0" +VERSION = "3.0.1.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_network_api/README.md b/pnap_network_api/README.md index 51f3cf08..a194d455 100644 --- a/pnap_network_api/README.md +++ b/pnap_network_api/README.md @@ -16,7 +16,7 @@ Helpful knowledge base articles are available for This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 3.1.0 +- Package version: 3.1.1.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_network_api/pnap_network_api/__init__.py b/pnap_network_api/pnap_network_api/__init__.py index 2de38ef1..64ed6b01 100644 --- a/pnap_network_api/pnap_network_api/__init__.py +++ b/pnap_network_api/pnap_network_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "3.1.0" +__version__ = "3.1.1.dev" # Define package exports __all__ = [ diff --git a/pnap_network_api/pnap_network_api/api_client.py b/pnap_network_api/pnap_network_api/api_client.py index 84e7ea21..62a65498 100644 --- a/pnap_network_api/pnap_network_api/api_client.py +++ b/pnap_network_api/pnap_network_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.0" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.1.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.0" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.1.dev" def __enter__(self): return self diff --git a/pnap_network_api/pnap_network_api/configuration.py b/pnap_network_api/pnap_network_api/configuration.py index 9885feb4..d7e66ca5 100644 --- a/pnap_network_api/pnap_network_api/configuration.py +++ b/pnap_network_api/pnap_network_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 3.1.0".\ + "SDK Package Version: 3.1.1.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_network_api/pyproject.toml b/pnap_network_api/pyproject.toml index 8e9624f0..fdea0613 100644 --- a/pnap_network_api/pyproject.toml +++ b/pnap_network_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_network_api" -version = "3.1.0" +version = "3.1.1.dev" description = "Networks API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_network_api/setup.py b/pnap_network_api/setup.py index 818f9029..61cd6eca 100644 --- a/pnap_network_api/setup.py +++ b/pnap_network_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_network_api" -VERSION = "3.1.0" +VERSION = "3.1.1.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_network_storage_api/README.md b/pnap_network_storage_api/README.md index bc250b17..aed34e9a 100644 --- a/pnap_network_storage_api/README.md +++ b/pnap_network_storage_api/README.md @@ -12,7 +12,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.0.5 +- Package version: 2.0.6.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_network_storage_api/pnap_network_storage_api/__init__.py b/pnap_network_storage_api/pnap_network_storage_api/__init__.py index e66c1ec3..745367f2 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/__init__.py +++ b/pnap_network_storage_api/pnap_network_storage_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.5" +__version__ = "2.0.6.dev" # Define package exports __all__ = [ diff --git a/pnap_network_storage_api/pnap_network_storage_api/api_client.py b/pnap_network_storage_api/pnap_network_storage_api/api_client.py index 1eb48ed1..14f56c15 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/api_client.py +++ b/pnap_network_storage_api/pnap_network_storage_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.5" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.6.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.5" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.6.dev" def __enter__(self): return self diff --git a/pnap_network_storage_api/pnap_network_storage_api/configuration.py b/pnap_network_storage_api/pnap_network_storage_api/configuration.py index 1e8bcaea..23946ce6 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/configuration.py +++ b/pnap_network_storage_api/pnap_network_storage_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.0.5".\ + "SDK Package Version: 2.0.6.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_network_storage_api/pyproject.toml b/pnap_network_storage_api/pyproject.toml index db72edbb..25f7d6ce 100644 --- a/pnap_network_storage_api/pyproject.toml +++ b/pnap_network_storage_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_network_storage_api" -version = "2.0.5" +version = "2.0.6.dev" description = "Network Storage API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_network_storage_api/setup.py b/pnap_network_storage_api/setup.py index 63b76695..4a01df89 100644 --- a/pnap_network_storage_api/setup.py +++ b/pnap_network_storage_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_network_storage_api" -VERSION = "2.0.5" +VERSION = "2.0.6.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_payments_api/README.md b/pnap_payments_api/README.md index 2264f26d..03e62865 100644 --- a/pnap_payments_api/README.md +++ b/pnap_payments_api/README.md @@ -4,7 +4,7 @@ Payments API are currently designed to fetch Transactions only. This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 0.1 -- Package version: 1.0.5 +- Package version: 1.0.6.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_payments_api/pnap_payments_api/__init__.py b/pnap_payments_api/pnap_payments_api/__init__.py index 5b2594cb..109aa780 100644 --- a/pnap_payments_api/pnap_payments_api/__init__.py +++ b/pnap_payments_api/pnap_payments_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "1.0.5" +__version__ = "1.0.6.dev" # Define package exports __all__ = [ diff --git a/pnap_payments_api/pnap_payments_api/api_client.py b/pnap_payments_api/pnap_payments_api/api_client.py index 628ddccb..775fddcd 100644 --- a/pnap_payments_api/pnap_payments_api/api_client.py +++ b/pnap_payments_api/pnap_payments_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.5" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.6.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.5" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.6.dev" def __enter__(self): return self diff --git a/pnap_payments_api/pnap_payments_api/configuration.py b/pnap_payments_api/pnap_payments_api/configuration.py index df9e456d..239a1a4d 100644 --- a/pnap_payments_api/pnap_payments_api/configuration.py +++ b/pnap_payments_api/pnap_payments_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 0.1\n"\ - "SDK Package Version: 1.0.5".\ + "SDK Package Version: 1.0.6.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_payments_api/pyproject.toml b/pnap_payments_api/pyproject.toml index bd3021a7..4dbd38d4 100644 --- a/pnap_payments_api/pyproject.toml +++ b/pnap_payments_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_payments_api" -version = "1.0.5" +version = "1.0.6.dev" description = "Payments API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_payments_api/setup.py b/pnap_payments_api/setup.py index 6d1657c0..0a06e5d9 100644 --- a/pnap_payments_api/setup.py +++ b/pnap_payments_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_payments_api" -VERSION = "1.0.5" +VERSION = "1.0.6.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_rancher_solution_api/README.md b/pnap_rancher_solution_api/README.md index c15c382b..35a12bd1 100644 --- a/pnap_rancher_solution_api/README.md +++ b/pnap_rancher_solution_api/README.md @@ -13,7 +13,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 0.1 -- Package version: 2.0.5 +- Package version: 2.0.6.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py index 7294adcb..57332bd7 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.5" +__version__ = "2.0.6.dev" # Define package exports __all__ = [ diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py index c47f0f04..a01e04d8 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.5" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.6.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.5" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.6.dev" def __enter__(self): return self diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py index 834e22f3..dbdae67c 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 0.1\n"\ - "SDK Package Version: 2.0.5".\ + "SDK Package Version: 2.0.6.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_rancher_solution_api/pyproject.toml b/pnap_rancher_solution_api/pyproject.toml index 1d5ea4ee..9660843f 100644 --- a/pnap_rancher_solution_api/pyproject.toml +++ b/pnap_rancher_solution_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_rancher_solution_api" -version = "2.0.5" +version = "2.0.6.dev" description = "Rancher Solution API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_rancher_solution_api/setup.py b/pnap_rancher_solution_api/setup.py index 7e24d50a..eda867ab 100644 --- a/pnap_rancher_solution_api/setup.py +++ b/pnap_rancher_solution_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_rancher_solution_api" -VERSION = "2.0.5" +VERSION = "2.0.6.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_tag_api/README.md b/pnap_tag_api/README.md index b8b2c5ca..b03a8371 100644 --- a/pnap_tag_api/README.md +++ b/pnap_tag_api/README.md @@ -14,7 +14,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.0.5 +- Package version: 2.0.6.dev - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_tag_api/pnap_tag_api/__init__.py b/pnap_tag_api/pnap_tag_api/__init__.py index 43753856..a50b1981 100644 --- a/pnap_tag_api/pnap_tag_api/__init__.py +++ b/pnap_tag_api/pnap_tag_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.5" +__version__ = "2.0.6.dev" # Define package exports __all__ = [ diff --git a/pnap_tag_api/pnap_tag_api/api_client.py b/pnap_tag_api/pnap_tag_api/api_client.py index f5c79a75..b51b0b74 100644 --- a/pnap_tag_api/pnap_tag_api/api_client.py +++ b/pnap_tag_api/pnap_tag_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.5" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.6.dev" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.5" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.6.dev" def __enter__(self): return self diff --git a/pnap_tag_api/pnap_tag_api/configuration.py b/pnap_tag_api/pnap_tag_api/configuration.py index 680f339a..0d8ea8ed 100644 --- a/pnap_tag_api/pnap_tag_api/configuration.py +++ b/pnap_tag_api/pnap_tag_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.0.5".\ + "SDK Package Version: 2.0.6.dev".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_tag_api/pyproject.toml b/pnap_tag_api/pyproject.toml index 3623e2b9..4394bc8a 100644 --- a/pnap_tag_api/pyproject.toml +++ b/pnap_tag_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_tag_api" -version = "2.0.5" +version = "2.0.6.dev" description = "Tags API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_tag_api/setup.py b/pnap_tag_api/setup.py index 8d9a251f..db019dd0 100644 --- a/pnap_tag_api/setup.py +++ b/pnap_tag_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_tag_api" -VERSION = "2.0.5" +VERSION = "2.0.6.dev" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", From ab0d8ebb7ca60be41c08f12a5fe23457e84d0f76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 07:52:32 +0000 Subject: [PATCH 06/17] Add changes --- pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py | 4 ++-- .../pnap_bmc_api/models/quota_edit_limit_request_details.py | 4 ++-- specs/pnap_bmc_api.spec.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py index 46987854..6db13ff4 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py +++ b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request.py @@ -36,8 +36,8 @@ class QuotaEditLimitRequest(BaseModel): @field_validator('reason') def reason_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^(?s)(?!\s*$).+", value): - raise ValueError(r"must validate the regular expression /^(?s)(?!\s*$).+/") + if not re.match(r"^[\s\S]*\S[\s\S]*$", value): + raise ValueError(r"must validate the regular expression /^[\s\S]*\S[\s\S]*$/") return value model_config = ConfigDict( diff --git a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py index 67bcb9c4..7e883b05 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py +++ b/pnap_bmc_api/pnap_bmc_api/models/quota_edit_limit_request_details.py @@ -38,8 +38,8 @@ class QuotaEditLimitRequestDetails(BaseModel): @field_validator('reason') def reason_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^(?s)(?!\s*$).+", value): - raise ValueError(r"must validate the regular expression /^(?s)(?!\s*$).+/") + if not re.match(r"^[\s\S]*\S[\s\S]*$", value): + raise ValueError(r"must validate the regular expression /^[\s\S]*\S[\s\S]*$/") return value model_config = ConfigDict( diff --git a/specs/pnap_bmc_api.spec.yaml b/specs/pnap_bmc_api.spec.yaml index ce9890ba..7dd8c68c 100644 --- a/specs/pnap_bmc_api.spec.yaml +++ b/specs/pnap_bmc_api.spec.yaml @@ -2449,7 +2449,7 @@ components: description: The reason for changing the limit. type: string example: I need more servers for my cluster. - pattern: ^(?s)(?!\s*$).+ + pattern: ^[\s\S]*\S[\s\S]*$ QuotaEditLimitRequestDetails: allOf: - $ref: '#/components/schemas/QuotaEditLimitRequest' From 47b38c48eaef88e02149e24e02fbd62d49431b6d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2026 17:04:05 +0000 Subject: [PATCH 07/17] Add changes --- pnap_bmc_api/docs/ServersApi.md | 6 ++++-- pnap_bmc_api/pnap_bmc_api/api/servers_api.py | 18 ++++++++++++++++++ specs/pnap_bmc_api.spec.yaml | 9 +++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pnap_bmc_api/docs/ServersApi.md b/pnap_bmc_api/docs/ServersApi.md index 9a0c68bd..e33846fe 100644 --- a/pnap_bmc_api/docs/ServersApi.md +++ b/pnap_bmc_api/docs/ServersApi.md @@ -111,7 +111,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **servers_get** -> List[Server] servers_get(tag=tag) +> List[Server] servers_get(tag=tag, location=location) List servers. @@ -145,10 +145,11 @@ with pnap_bmc_api.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = pnap_bmc_api.ServersApi(api_client) tag = ['[\"env.dev\"]'] # List[str] | A list of query parameters related to tags in the form of tagName.tagValue (optional) + location = ['[\"PHX\"]'] # List[str] | Filters servers by server location (optional) try: # List servers. - api_response = api_instance.servers_get(tag=tag) + api_response = api_instance.servers_get(tag=tag, location=location) print("The response of ServersApi->servers_get:\n") pprint(api_response) except Exception as e: @@ -163,6 +164,7 @@ with pnap_bmc_api.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **tag** | [**List[str]**](str.md)| A list of query parameters related to tags in the form of tagName.tagValue | [optional] + **location** | [**List[str]**](str.md)| Filters servers by server location | [optional] ### Return type diff --git a/pnap_bmc_api/pnap_bmc_api/api/servers_api.py b/pnap_bmc_api/pnap_bmc_api/api/servers_api.py index 1d30bd98..314cf7cb 100644 --- a/pnap_bmc_api/pnap_bmc_api/api/servers_api.py +++ b/pnap_bmc_api/pnap_bmc_api/api/servers_api.py @@ -349,6 +349,7 @@ def _delete_private_network_serialize( def servers_get( self, tag: Annotated[Optional[List[StrictStr]], Field(description="A list of query parameters related to tags in the form of tagName.tagValue")] = None, + location: Annotated[Optional[List[StrictStr]], Field(description="Filters servers by server location")] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -368,6 +369,8 @@ def servers_get( :param tag: A list of query parameters related to tags in the form of tagName.tagValue :type tag: List[str] + :param location: Filters servers by server location + :type location: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -392,6 +395,7 @@ def servers_get( _param = self._servers_get_serialize( tag=tag, + location=location, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -419,6 +423,7 @@ def servers_get( def servers_get_with_http_info( self, tag: Annotated[Optional[List[StrictStr]], Field(description="A list of query parameters related to tags in the form of tagName.tagValue")] = None, + location: Annotated[Optional[List[StrictStr]], Field(description="Filters servers by server location")] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -438,6 +443,8 @@ def servers_get_with_http_info( :param tag: A list of query parameters related to tags in the form of tagName.tagValue :type tag: List[str] + :param location: Filters servers by server location + :type location: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -462,6 +469,7 @@ def servers_get_with_http_info( _param = self._servers_get_serialize( tag=tag, + location=location, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -489,6 +497,7 @@ def servers_get_with_http_info( def servers_get_without_preload_content( self, tag: Annotated[Optional[List[StrictStr]], Field(description="A list of query parameters related to tags in the form of tagName.tagValue")] = None, + location: Annotated[Optional[List[StrictStr]], Field(description="Filters servers by server location")] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -508,6 +517,8 @@ def servers_get_without_preload_content( :param tag: A list of query parameters related to tags in the form of tagName.tagValue :type tag: List[str] + :param location: Filters servers by server location + :type location: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -532,6 +543,7 @@ def servers_get_without_preload_content( _param = self._servers_get_serialize( tag=tag, + location=location, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -554,6 +566,7 @@ def servers_get_without_preload_content( def _servers_get_serialize( self, tag, + location, _request_auth, _content_type, _headers, @@ -564,6 +577,7 @@ def _servers_get_serialize( _collection_formats: Dict[str, str] = { 'tag': 'multi', + 'location': 'multi', } _path_params: Dict[str, str] = {} @@ -581,6 +595,10 @@ def _servers_get_serialize( _query_params.append(('tag', tag)) + if location is not None: + + _query_params.append(('location', location)) + # process the header parameters # process the form parameters # process the body parameter diff --git a/specs/pnap_bmc_api.spec.yaml b/specs/pnap_bmc_api.spec.yaml index 7dd8c68c..7a7b9da6 100644 --- a/specs/pnap_bmc_api.spec.yaml +++ b/specs/pnap_bmc_api.spec.yaml @@ -56,6 +56,15 @@ paths: explode: true example: - env.dev + - in: query + name: location + schema: + type: array + items: + type: string + description: Filters servers by server location + example: + - PHX responses: '200': description: List of all the servers owned by account. From c563ac0dedc6ce06e5bc8da59dcb4ef32ce17033 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 09:52:45 +0000 Subject: [PATCH 08/17] Add changes --- pnap_bmc_api/README.md | 4 + pnap_bmc_api/docs/OsConfiguration.md | 1 + pnap_bmc_api/docs/OsConfigurationIPXE.md | 31 ++ ...onfigurationIPXENativeVlanConfiguration.md | 32 ++ pnap_bmc_api/docs/RebootRequest.md | 30 ++ pnap_bmc_api/docs/Server.md | 2 +- pnap_bmc_api/docs/ServerCreate.md | 2 +- pnap_bmc_api/docs/ServerProvision.md | 2 +- pnap_bmc_api/docs/ServersApi.md | 93 ++++- pnap_bmc_api/pnap_bmc_api/__init__.py | 6 + pnap_bmc_api/pnap_bmc_api/api/servers_api.py | 337 ++++++++++++++++++ pnap_bmc_api/pnap_bmc_api/models/__init__.py | 3 + .../pnap_bmc_api/models/os_configuration.py | 10 +- .../models/os_configuration_ipxe.py | 115 ++++++ ...guration_ipxe_native_vlan_configuration.py | 128 +++++++ .../pnap_bmc_api/models/reboot_request.py | 129 +++++++ pnap_bmc_api/pnap_bmc_api/models/server.py | 2 +- .../pnap_bmc_api/models/server_create.py | 2 +- .../pnap_bmc_api/models/server_provision.py | 2 +- specs/pnap_bmc_api.spec.yaml | 130 ++++++- 20 files changed, 1047 insertions(+), 14 deletions(-) create mode 100644 pnap_bmc_api/docs/OsConfigurationIPXE.md create mode 100644 pnap_bmc_api/docs/OsConfigurationIPXENativeVlanConfiguration.md create mode 100644 pnap_bmc_api/docs/RebootRequest.md create mode 100644 pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe.py create mode 100644 pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe_native_vlan_configuration.py create mode 100644 pnap_bmc_api/pnap_bmc_api/models/reboot_request.py diff --git a/pnap_bmc_api/README.md b/pnap_bmc_api/README.md index 28469867..35548c84 100644 --- a/pnap_bmc_api/README.md +++ b/pnap_bmc_api/README.md @@ -142,6 +142,7 @@ Class | Method | HTTP request | Description *ServersApi* | [**servers_server_id_get**](docs/ServersApi.md#servers_server_id_get) | **GET** /servers/{serverId} | Get server. *ServersApi* | [**servers_server_id_ip_blocks_ip_block_id_delete**](docs/ServersApi.md#servers_server_id_ip_blocks_ip_block_id_delete) | **DELETE** /servers/{serverId}/network-configuration/ip-block-configurations/ip-blocks/{ipBlockId} | Unassign IP Block from Server. *ServersApi* | [**servers_server_id_ip_blocks_post**](docs/ServersApi.md#servers_server_id_ip_blocks_post) | **POST** /servers/{serverId}/network-configuration/ip-block-configurations/ip-blocks | Assign IP Block to Server. +*ServersApi* | [**servers_server_id_os_configuration_ipxe_put**](docs/ServersApi.md#servers_server_id_os_configuration_ipxe_put) | **PUT** /servers/{serverId}/os-configuration/ipxe | Updates the iPXE OS configuration. *ServersApi* | [**servers_server_id_patch**](docs/ServersApi.md#servers_server_id_patch) | **PATCH** /servers/{serverId} | Patch a Server. *ServersApi* | [**servers_server_id_private_networks_patch**](docs/ServersApi.md#servers_server_id_private_networks_patch) | **PATCH** /servers/{serverId}/network-configuration/private-network-configuration/private-networks/{privateNetworkId} | Updates the server's private network's IP addresses *ServersApi* | [**servers_server_id_private_networks_post**](docs/ServersApi.md#servers_server_id_private_networks_post) | **POST** /servers/{serverId}/network-configuration/private-network-configuration/private-networks | Adds the server to a private network. @@ -164,6 +165,8 @@ Class | Method | HTTP request | Description - [NetworkConfiguration](docs/NetworkConfiguration.md) - [OsConfiguration](docs/OsConfiguration.md) - [OsConfigurationCloudInit](docs/OsConfigurationCloudInit.md) + - [OsConfigurationIPXE](docs/OsConfigurationIPXE.md) + - [OsConfigurationIPXENativeVlanConfiguration](docs/OsConfigurationIPXENativeVlanConfiguration.md) - [OsConfigurationMap](docs/OsConfigurationMap.md) - [OsConfigurationMapEsxi](docs/OsConfigurationMapEsxi.md) - [OsConfigurationMapProxmox](docs/OsConfigurationMapProxmox.md) @@ -175,6 +178,7 @@ Class | Method | HTTP request | Description - [Quota](docs/Quota.md) - [QuotaEditLimitRequest](docs/QuotaEditLimitRequest.md) - [QuotaEditLimitRequestDetails](docs/QuotaEditLimitRequestDetails.md) + - [RebootRequest](docs/RebootRequest.md) - [RelinquishIpBlock](docs/RelinquishIpBlock.md) - [ReservationTransferDetails](docs/ReservationTransferDetails.md) - [ResetResult](docs/ResetResult.md) diff --git a/pnap_bmc_api/docs/OsConfiguration.md b/pnap_bmc_api/docs/OsConfiguration.md index 11d2df52..3e903916 100644 --- a/pnap_bmc_api/docs/OsConfiguration.md +++ b/pnap_bmc_api/docs/OsConfiguration.md @@ -15,6 +15,7 @@ Name | Type | Description | Notes **install_os_to_ram** | **bool** | If true, OS will be installed to and booted from the server's RAM. On restart RAM OS will be lost and the server will not be reachable unless a custom bootable OS has been deployed. Follow the <a href='https://phoenixnap.com/kb/bmc-custom-os' target='_blank'>instructions</a> on how to install custom OS on BMC. Only supported for ubuntu/focal and ubuntu/jammy. | [optional] [default to False] **esxi** | [**EsxiOsConfiguration**](EsxiOsConfiguration.md) | | [optional] **cloud_init** | [**OsConfigurationCloudInit**](OsConfigurationCloudInit.md) | | [optional] +**i_pxe** | [**OsConfigurationIPXE**](OsConfigurationIPXE.md) | | [optional] ## Example diff --git a/pnap_bmc_api/docs/OsConfigurationIPXE.md b/pnap_bmc_api/docs/OsConfigurationIPXE.md new file mode 100644 index 00000000..0cf10026 --- /dev/null +++ b/pnap_bmc_api/docs/OsConfigurationIPXE.md @@ -0,0 +1,31 @@ +# OsConfigurationIPXE + +iPXE configuration details. Configures the server to boot using the iPXE network boot firmware with a custom boot script. Only applicable when osName is 'ipxe' and must not be provided for any other OS. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**url** | **str** | The URL of the iPXE boot script used to start the server. | +**native_vlan_configuration** | [**OsConfigurationIPXENativeVlanConfiguration**](OsConfigurationIPXENativeVlanConfiguration.md) | | [optional] + +## Example + +```python +from pnap_bmc_api.models.os_configuration_ipxe import OsConfigurationIPXE + +# TODO update the JSON string below +json = "{}" +# create an instance of OsConfigurationIPXE from a JSON string +os_configuration_ipxe_instance = OsConfigurationIPXE.from_json(json) +# print the JSON string representation of the object +print(OsConfigurationIPXE.to_json()) + +# convert the object into a dict +os_configuration_ipxe_dict = os_configuration_ipxe_instance.to_dict() +# create an instance of OsConfigurationIPXE from a dict +os_configuration_ipxe_from_dict = OsConfigurationIPXE.from_dict(os_configuration_ipxe_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pnap_bmc_api/docs/OsConfigurationIPXENativeVlanConfiguration.md b/pnap_bmc_api/docs/OsConfigurationIPXENativeVlanConfiguration.md new file mode 100644 index 00000000..fcb2ed45 --- /dev/null +++ b/pnap_bmc_api/docs/OsConfigurationIPXENativeVlanConfiguration.md @@ -0,0 +1,32 @@ +# OsConfigurationIPXENativeVlanConfiguration + +Specifies the native VLAN configuration for the server. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**vlan_id** | **int** | The VLAN ID of the network to be used as the native VLAN. The value must reference a public network with IP V4 block(s) or a public IP V4 block network to which the server is (or will be) attached. If omitted during provisioning, the native VLAN is matched to the configured/auto-purchased public IP V4 block. If no public IP block is available, a VLAN ID must be provided. The VLAN ID must belong to one of the public networks for any of the specified servers. During post-provisioning, if Native VLAN is omitted, the server will be configured with no native VLAN. If provided, the VLAN ID must be specified and must belong to any of the existing server public networks or IP block networks attached to the server. | [optional] +**static_dhcp_address_v4** | **str** | The static IP V4 address assigned to the server within the native VLAN. This address is set as the DHCP reservation and used for the iPXE boot process. Value must be an available/unused IP V4 address within the native network usable IP range. If omitted, the first available IP in the native network will be automatically assigned. Therefore, at least one IP must be available within the native network. | [optional] +**status** | **str** | (Read-only) The status of the native VLAN configuration. | [optional] [readonly] + +## Example + +```python +from pnap_bmc_api.models.os_configuration_ipxe_native_vlan_configuration import OsConfigurationIPXENativeVlanConfiguration + +# TODO update the JSON string below +json = "{}" +# create an instance of OsConfigurationIPXENativeVlanConfiguration from a JSON string +os_configuration_ipxe_native_vlan_configuration_instance = OsConfigurationIPXENativeVlanConfiguration.from_json(json) +# print the JSON string representation of the object +print(OsConfigurationIPXENativeVlanConfiguration.to_json()) + +# convert the object into a dict +os_configuration_ipxe_native_vlan_configuration_dict = os_configuration_ipxe_native_vlan_configuration_instance.to_dict() +# create an instance of OsConfigurationIPXENativeVlanConfiguration from a dict +os_configuration_ipxe_native_vlan_configuration_from_dict = OsConfigurationIPXENativeVlanConfiguration.from_dict(os_configuration_ipxe_native_vlan_configuration_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pnap_bmc_api/docs/RebootRequest.md b/pnap_bmc_api/docs/RebootRequest.md new file mode 100644 index 00000000..4012cba8 --- /dev/null +++ b/pnap_bmc_api/docs/RebootRequest.md @@ -0,0 +1,30 @@ +# RebootRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**boot_type** | **str** | Specifies whether to boot via `IPXE` (requires script) or `STANDARD` (default mechanism, incompatible with `ipxeUrl`). | [optional] [default to 'STANDARD'] +**ipxe_url** | **str** | The URL for the iPXE script, used only with `IPXE` boot type. If provided, it updates and replaces the existing stored URL; if not provided, the existing URL will be used. | [optional] + +## Example + +```python +from pnap_bmc_api.models.reboot_request import RebootRequest + +# TODO update the JSON string below +json = "{}" +# create an instance of RebootRequest from a JSON string +reboot_request_instance = RebootRequest.from_json(json) +# print the JSON string representation of the object +print(RebootRequest.to_json()) + +# convert the object into a dict +reboot_request_dict = reboot_request_instance.to_dict() +# create an instance of RebootRequest from a dict +reboot_request_from_dict = RebootRequest.from_dict(reboot_request_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pnap_bmc_api/docs/Server.md b/pnap_bmc_api/docs/Server.md index f1b7cc52..fc67f96e 100644 --- a/pnap_bmc_api/docs/Server.md +++ b/pnap_bmc_api/docs/Server.md @@ -10,7 +10,7 @@ Name | Type | Description | Notes **status** | **str** | The status of the server. Can have one of the following values: `creating` , `powered-on` , `powered-off` , `rebooting` , `resetting` , `deleting` , `reserved` , `error` or `reinstating`. | **hostname** | **str** | Hostname of server. | **description** | **str** | Description of server. | [optional] -**os** | **str** | The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`. | [optional] +**os** | **str** | The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` , `netris/softgate_25g` or `ipxe`. | [optional] **type** | **str** | Server type ID. Cannot be changed once a server is created. Currently this field should be set to either `s0.d1.small`, `s0.d1.medium`, `s1.c1.small`, `s1.c1.medium`, `s1.c2.medium`, `s1.c2.large`, `s1.e1.small`, `s1.e1.medium`, `s1.e1.large`, `s2.c1.small`, `s2.c1.medium`, `s2.c1.large`, `s2.c2.small`, `s2.c2.medium`, `s2.c2.large`, `d1.c4.small`, `d1.c4.medium`, `d1.c4.large`, `d1.m4.medium`, `d2.c1.medium`, `d2.c2.medium`, `d2.c3.medium`, `d2.c4.medium`, `d2.c5.medium`, `d2.c1.large`, `d2.c2.large`, `d2.c3.large`, `d2.c4.large`, `d2.c5.large`, `d2.m1.xlarge`, `d2.m2.xxlarge`, `d2.m3.xlarge`, `d2.m4.xlarge`, `d2.m5.xlarge`, `d2.c4.db1.pliops1`, `d3.m4.xlarge`, `d3.m5.xlarge`, `d3.m6.xlarge`, `a1.c5.large`, `a1.c5.xlarge`, `d3.s5.xlarge`, `d3.m4.xxlarge`, `d3.m5.xxlarge`, `d3.m6.xxlarge`, `s3.c3.medium`, `s3.c3.large`, `d3.c4.medium`, `d3.c5.medium`, `d3.c6.medium`, `d3.c1.large`, `d3.c2.large`, `d3.c3.large`, `d3.m1.xlarge`, `d3.m2.xlarge`, `d3.m3.xlarge`, `d3.g2.c1.xlarge`, `d3.g2.c2.xlarge`, `d3.g2.c3.xlarge`, `d3.g3.c2.medium`, `s4.x6.c6.large`, `s4.x6.m6.xlarge`, `s5.x6.c3.medium`, `s5.x6.c3.large`, `s5.x6.c8.medium`, `s5.x6.c9.medium`, `s5.x6.c8.large`, `s5.x6.c9.large`, `s5.x6.m8.xlarge`, `s5.x6.m9.xlarge`, `s4.c3.medium`, `s4.c6.medium`, `s4.c6.large`, `s4.c6.xlarge`, `s4.s2.large`, `a2.c9.large` or `a2.c9.xlarge`. | **location** | **str** | Server location ID. Cannot be changed once a server is created. Currently this field should be set to `PHX`, `ASH`, `SGP`, `NLD`, `CHI` or `SEA`. | **cpu** | **str** | A description of the machine CPU. | diff --git a/pnap_bmc_api/docs/ServerCreate.md b/pnap_bmc_api/docs/ServerCreate.md index 98bcb7b3..069ac493 100644 --- a/pnap_bmc_api/docs/ServerCreate.md +++ b/pnap_bmc_api/docs/ServerCreate.md @@ -8,7 +8,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **hostname** | **str** | Hostname of server. | **description** | **str** | Description of server. | [optional] -**os** | **str** | The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`. | +**os** | **str** | The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g`, `netris/softgate_25g` or `ipxe`. | **type** | **str** | Server type ID. Cannot be changed once a server is created. Currently this field should be set to either `s0.d1.small`, `s0.d1.medium`, `s1.c1.small`, `s1.c1.medium`, `s1.c2.medium`, `s1.c2.large`, `s1.e1.small`, `s1.e1.medium`, `s1.e1.large`, `s2.c1.small`, `s2.c1.medium`, `s2.c1.large`, `s2.c2.small`, `s2.c2.medium`, `s2.c2.large`, `d1.c4.small`, `d1.c4.medium`, `d1.c4.large`, `d1.m4.medium`, `d2.c1.medium`, `d2.c2.medium`, `d2.c3.medium`, `d2.c4.medium`, `d2.c5.medium`, `d2.c1.large`, `d2.c2.large`, `d2.c3.large`, `d2.c4.large`, `d2.c5.large`, `d2.m1.xlarge`, `d2.m2.xxlarge`, `d2.m3.xlarge`, `d2.m4.xlarge`, `d2.m5.xlarge`, `d2.c4.db1.pliops1`, `d3.m4.xlarge`, `d3.m5.xlarge`, `d3.m6.xlarge`, `a1.c5.large`, `a1.c5.xlarge`, `d3.s5.xlarge`, `d3.m4.xxlarge`, `d3.m5.xxlarge`, `d3.m6.xxlarge`, `s3.c3.medium`, `s3.c3.large`, `d3.c4.medium`, `d3.c5.medium`, `d3.c6.medium`, `d3.c1.large`, `d3.c2.large`, `d3.c3.large`, `d3.m1.xlarge`, `d3.m2.xlarge`, `d3.m3.xlarge`, `d3.g2.c1.xlarge`, `d3.g2.c2.xlarge`, `d3.g2.c3.xlarge`,`d3.g3.c2.medium`, `s4.x6.c6.large`, `s4.x6.m6.xlarge`, `s5.x6.c3.medium`, `s5.x6.c3.large`, `s5.x6.c8.medium`, `s5.x6.c9.medium`, `s5.x6.c8.large`, `s5.x6.c9.large`, `s5.x6.m8.xlarge`, `s5.x6.m9.xlarge`, `s4.c3.medium`, `s4.c6.medium`, `s4.c6.large`, `s4.c6.xlarge`, `s4.s2.large`, `a2.c9.large` or `a2.c9.xlarge`. | **location** | **str** | Server location ID. Cannot be changed once a server is created. Currently this field should be set to `PHX`, `ASH`, `SGP`, `NLD`, `CHI` or `SEA`. | **install_default_ssh_keys** | **bool** | Whether or not to install SSH keys marked as default in addition to any SSH keys specified in this request. | [optional] [default to True] diff --git a/pnap_bmc_api/docs/ServerProvision.md b/pnap_bmc_api/docs/ServerProvision.md index 4edd48a2..23776513 100644 --- a/pnap_bmc_api/docs/ServerProvision.md +++ b/pnap_bmc_api/docs/ServerProvision.md @@ -8,7 +8,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **hostname** | **str** | Hostname of server. | **description** | **str** | Description of server. | [optional] -**os** | **str** | The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux8`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`,`netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`. | +**os** | **str** | The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux8`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`,`netris/controller`, `netris/softgate_1g`, `netris/softgate_10g`, `netris/softgate_25g` or `ipxe`. | **install_default_ssh_keys** | **bool** | Whether or not to install SSH keys marked as default in addition to any SSH keys specified in this request. | [optional] [default to True] **ssh_keys** | **List[str]** | A list of SSH keys that will be installed on the server. | [optional] **ssh_key_ids** | **List[str]** | A list of SSH key IDs that will be installed on the server in addition to any SSH keys specified in this request. | [optional] diff --git a/pnap_bmc_api/docs/ServersApi.md b/pnap_bmc_api/docs/ServersApi.md index e33846fe..4ab8373c 100644 --- a/pnap_bmc_api/docs/ServersApi.md +++ b/pnap_bmc_api/docs/ServersApi.md @@ -20,6 +20,7 @@ Method | HTTP request | Description [**servers_server_id_get**](ServersApi.md#servers_server_id_get) | **GET** /servers/{serverId} | Get server. [**servers_server_id_ip_blocks_ip_block_id_delete**](ServersApi.md#servers_server_id_ip_blocks_ip_block_id_delete) | **DELETE** /servers/{serverId}/network-configuration/ip-block-configurations/ip-blocks/{ipBlockId} | Unassign IP Block from Server. [**servers_server_id_ip_blocks_post**](ServersApi.md#servers_server_id_ip_blocks_post) | **POST** /servers/{serverId}/network-configuration/ip-block-configurations/ip-blocks | Assign IP Block to Server. +[**servers_server_id_os_configuration_ipxe_put**](ServersApi.md#servers_server_id_os_configuration_ipxe_put) | **PUT** /servers/{serverId}/os-configuration/ipxe | Updates the iPXE OS configuration. [**servers_server_id_patch**](ServersApi.md#servers_server_id_patch) | **PATCH** /servers/{serverId} | Patch a Server. [**servers_server_id_private_networks_patch**](ServersApi.md#servers_server_id_private_networks_patch) | **PATCH** /servers/{serverId}/network-configuration/private-network-configuration/private-networks/{privateNetworkId} | Updates the server's private network's IP addresses [**servers_server_id_private_networks_post**](ServersApi.md#servers_server_id_private_networks_post) | **POST** /servers/{serverId}/network-configuration/private-network-configuration/private-networks | Adds the server to a private network. @@ -603,7 +604,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **servers_server_id_actions_reboot_post** -> ActionResult servers_server_id_actions_reboot_post(server_id) +> ActionResult servers_server_id_actions_reboot_post(server_id, reboot_request=reboot_request) Reboot server. @@ -616,6 +617,7 @@ Reboot specific server. ```python import pnap_bmc_api from pnap_bmc_api.models.action_result import ActionResult +from pnap_bmc_api.models.reboot_request import RebootRequest from pnap_bmc_api.rest import ApiException from pprint import pprint @@ -637,10 +639,11 @@ with pnap_bmc_api.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = pnap_bmc_api.ServersApi(api_client) server_id = '60473a6115e34466c9f8f083' # str | The server's ID. + reboot_request = pnap_bmc_api.RebootRequest() # RebootRequest | Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD). (optional) try: # Reboot server. - api_response = api_instance.servers_server_id_actions_reboot_post(server_id) + api_response = api_instance.servers_server_id_actions_reboot_post(server_id, reboot_request=reboot_request) print("The response of ServersApi->servers_server_id_actions_reboot_post:\n") pprint(api_response) except Exception as e: @@ -655,6 +658,7 @@ with pnap_bmc_api.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **server_id** | **str**| The server's ID. | + **reboot_request** | [**RebootRequest**](RebootRequest.md)| Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD). | [optional] ### Return type @@ -666,7 +670,7 @@ Name | Type | Description | Notes ### HTTP request headers - - **Content-Type**: Not defined + - **Content-Type**: application/json - **Accept**: application/json ### HTTP response details @@ -1335,6 +1339,89 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **servers_server_id_os_configuration_ipxe_put** +> OsConfigurationIPXE servers_server_id_os_configuration_ipxe_put(server_id, os_configuration_ipxe) + +Updates the iPXE OS configuration. + +Updates the iPXE OS configuration by updating the URL and the native VLAN configuration. + +### Example + +* OAuth Authentication (OAuth2): + +```python +import pnap_bmc_api +from pnap_bmc_api.models.os_configuration_ipxe import OsConfigurationIPXE +from pnap_bmc_api.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to https://api.phoenixnap.com/bmc/v1 +# See configuration.py for a list of all supported configuration parameters. +configuration = pnap_bmc_api.Configuration( + host = "https://api.phoenixnap.com/bmc/v1" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with pnap_bmc_api.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = pnap_bmc_api.ServersApi(api_client) + server_id = '60473a6115e34466c9f8f083' # str | The server's ID. + os_configuration_ipxe = {"url":"https://example.com/boot.ipxe","nativeVlanConfiguration":{"vlanId":10,"staticDhcpAddressV4":"185.74.213.56"}} # OsConfigurationIPXE | + + try: + # Updates the iPXE OS configuration. + api_response = api_instance.servers_server_id_os_configuration_ipxe_put(server_id, os_configuration_ipxe) + print("The response of ServersApi->servers_server_id_os_configuration_ipxe_put:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ServersApi->servers_server_id_os_configuration_ipxe_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **server_id** | **str**| The server's ID. | + **os_configuration_ipxe** | [**OsConfigurationIPXE**](OsConfigurationIPXE.md)| | + +### Return type + +[**OsConfigurationIPXE**](OsConfigurationIPXE.md) + +### Authorization + +[OAuth2](../README.md#OAuth2) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Updated URL in iPXE OS configuration. | - | +**202** | The iPXE OS configuration is being updated. | - | +**400** | The request failed due to wrong data. Please check the provided parameters and try again. | - | +**401** | The request failed due to invalid credentials. Please check the provided credentials and try again. | - | +**403** | The request failed since this resource cannot be accessed by the provided credentials. | - | +**409** | The resource is in an incompatible state. | - | +**500** | The server encountered an unexpected condition that prevented it from fulfilling the request. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **servers_server_id_patch** > Server servers_server_id_patch(server_id, server_patch) diff --git a/pnap_bmc_api/pnap_bmc_api/__init__.py b/pnap_bmc_api/pnap_bmc_api/__init__.py index 163a60cb..466cf492 100644 --- a/pnap_bmc_api/pnap_bmc_api/__init__.py +++ b/pnap_bmc_api/pnap_bmc_api/__init__.py @@ -42,6 +42,8 @@ "NetworkConfiguration", "OsConfiguration", "OsConfigurationCloudInit", + "OsConfigurationIPXE", + "OsConfigurationIPXENativeVlanConfiguration", "OsConfigurationMap", "OsConfigurationMapEsxi", "OsConfigurationMapProxmox", @@ -53,6 +55,7 @@ "Quota", "QuotaEditLimitRequest", "QuotaEditLimitRequestDetails", + "RebootRequest", "RelinquishIpBlock", "ReservationTransferDetails", "ResetResult", @@ -103,6 +106,8 @@ from pnap_bmc_api.models.network_configuration import NetworkConfiguration as NetworkConfiguration from pnap_bmc_api.models.os_configuration import OsConfiguration as OsConfiguration from pnap_bmc_api.models.os_configuration_cloud_init import OsConfigurationCloudInit as OsConfigurationCloudInit +from pnap_bmc_api.models.os_configuration_ipxe import OsConfigurationIPXE as OsConfigurationIPXE +from pnap_bmc_api.models.os_configuration_ipxe_native_vlan_configuration import OsConfigurationIPXENativeVlanConfiguration as OsConfigurationIPXENativeVlanConfiguration from pnap_bmc_api.models.os_configuration_map import OsConfigurationMap as OsConfigurationMap from pnap_bmc_api.models.os_configuration_map_esxi import OsConfigurationMapEsxi as OsConfigurationMapEsxi from pnap_bmc_api.models.os_configuration_map_proxmox import OsConfigurationMapProxmox as OsConfigurationMapProxmox @@ -114,6 +119,7 @@ from pnap_bmc_api.models.quota import Quota as Quota from pnap_bmc_api.models.quota_edit_limit_request import QuotaEditLimitRequest as QuotaEditLimitRequest from pnap_bmc_api.models.quota_edit_limit_request_details import QuotaEditLimitRequestDetails as QuotaEditLimitRequestDetails +from pnap_bmc_api.models.reboot_request import RebootRequest as RebootRequest from pnap_bmc_api.models.relinquish_ip_block import RelinquishIpBlock as RelinquishIpBlock from pnap_bmc_api.models.reservation_transfer_details import ReservationTransferDetails as ReservationTransferDetails from pnap_bmc_api.models.reset_result import ResetResult as ResetResult diff --git a/pnap_bmc_api/pnap_bmc_api/api/servers_api.py b/pnap_bmc_api/pnap_bmc_api/api/servers_api.py index 314cf7cb..1556a9b4 100644 --- a/pnap_bmc_api/pnap_bmc_api/api/servers_api.py +++ b/pnap_bmc_api/pnap_bmc_api/api/servers_api.py @@ -21,6 +21,8 @@ from typing_extensions import Annotated from pnap_bmc_api.models.action_result import ActionResult from pnap_bmc_api.models.delete_result import DeleteResult +from pnap_bmc_api.models.os_configuration_ipxe import OsConfigurationIPXE +from pnap_bmc_api.models.reboot_request import RebootRequest from pnap_bmc_api.models.relinquish_ip_block import RelinquishIpBlock from pnap_bmc_api.models.reservation_transfer_details import ReservationTransferDetails from pnap_bmc_api.models.reset_result import ResetResult @@ -2129,6 +2131,7 @@ def _servers_server_id_actions_provision_post_serialize( def servers_server_id_actions_reboot_post( self, server_id: Annotated[StrictStr, Field(description="The server's ID.")], + reboot_request: Annotated[Optional[RebootRequest], Field(description="Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD).")] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -2148,6 +2151,8 @@ def servers_server_id_actions_reboot_post( :param server_id: The server's ID. (required) :type server_id: str + :param reboot_request: Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD). + :type reboot_request: RebootRequest :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -2172,6 +2177,7 @@ def servers_server_id_actions_reboot_post( _param = self._servers_server_id_actions_reboot_post_serialize( server_id=server_id, + reboot_request=reboot_request, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -2201,6 +2207,7 @@ def servers_server_id_actions_reboot_post( def servers_server_id_actions_reboot_post_with_http_info( self, server_id: Annotated[StrictStr, Field(description="The server's ID.")], + reboot_request: Annotated[Optional[RebootRequest], Field(description="Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD).")] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -2220,6 +2227,8 @@ def servers_server_id_actions_reboot_post_with_http_info( :param server_id: The server's ID. (required) :type server_id: str + :param reboot_request: Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD). + :type reboot_request: RebootRequest :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -2244,6 +2253,7 @@ def servers_server_id_actions_reboot_post_with_http_info( _param = self._servers_server_id_actions_reboot_post_serialize( server_id=server_id, + reboot_request=reboot_request, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -2273,6 +2283,7 @@ def servers_server_id_actions_reboot_post_with_http_info( def servers_server_id_actions_reboot_post_without_preload_content( self, server_id: Annotated[StrictStr, Field(description="The server's ID.")], + reboot_request: Annotated[Optional[RebootRequest], Field(description="Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD).")] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -2292,6 +2303,8 @@ def servers_server_id_actions_reboot_post_without_preload_content( :param server_id: The server's ID. (required) :type server_id: str + :param reboot_request: Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD). + :type reboot_request: RebootRequest :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -2316,6 +2329,7 @@ def servers_server_id_actions_reboot_post_without_preload_content( _param = self._servers_server_id_actions_reboot_post_serialize( server_id=server_id, + reboot_request=reboot_request, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -2340,6 +2354,7 @@ def servers_server_id_actions_reboot_post_without_preload_content( def _servers_server_id_actions_reboot_post_serialize( self, server_id, + reboot_request, _request_auth, _content_type, _headers, @@ -2367,6 +2382,8 @@ def _servers_server_id_actions_reboot_post_serialize( # process the header parameters # process the form parameters # process the body parameter + if reboot_request is not None: + _body_params = reboot_request # set the HTTP header `Accept` @@ -2377,6 +2394,19 @@ def _servers_server_id_actions_reboot_post_serialize( ] ) + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type # authentication setting _auth_settings: List[str] = [ @@ -4764,6 +4794,313 @@ def _servers_server_id_ip_blocks_post_serialize( + @validate_call + def servers_server_id_os_configuration_ipxe_put( + self, + server_id: Annotated[StrictStr, Field(description="The server's ID.")], + os_configuration_ipxe: OsConfigurationIPXE, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> OsConfigurationIPXE: + """Updates the iPXE OS configuration. + + Updates the iPXE OS configuration by updating the URL and the native VLAN configuration. + + :param server_id: The server's ID. (required) + :type server_id: str + :param os_configuration_ipxe: (required) + :type os_configuration_ipxe: OsConfigurationIPXE + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._servers_server_id_os_configuration_ipxe_put_serialize( + server_id=server_id, + os_configuration_ipxe=os_configuration_ipxe, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "OsConfigurationIPXE", + '202': "OsConfigurationIPXE", + '400': "Error", + '401': "Error", + '403': "Error", + '409': "Error", + '500': "Error", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def servers_server_id_os_configuration_ipxe_put_with_http_info( + self, + server_id: Annotated[StrictStr, Field(description="The server's ID.")], + os_configuration_ipxe: OsConfigurationIPXE, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[OsConfigurationIPXE]: + """Updates the iPXE OS configuration. + + Updates the iPXE OS configuration by updating the URL and the native VLAN configuration. + + :param server_id: The server's ID. (required) + :type server_id: str + :param os_configuration_ipxe: (required) + :type os_configuration_ipxe: OsConfigurationIPXE + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._servers_server_id_os_configuration_ipxe_put_serialize( + server_id=server_id, + os_configuration_ipxe=os_configuration_ipxe, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "OsConfigurationIPXE", + '202': "OsConfigurationIPXE", + '400': "Error", + '401': "Error", + '403': "Error", + '409': "Error", + '500': "Error", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def servers_server_id_os_configuration_ipxe_put_without_preload_content( + self, + server_id: Annotated[StrictStr, Field(description="The server's ID.")], + os_configuration_ipxe: OsConfigurationIPXE, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Updates the iPXE OS configuration. + + Updates the iPXE OS configuration by updating the URL and the native VLAN configuration. + + :param server_id: The server's ID. (required) + :type server_id: str + :param os_configuration_ipxe: (required) + :type os_configuration_ipxe: OsConfigurationIPXE + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._servers_server_id_os_configuration_ipxe_put_serialize( + server_id=server_id, + os_configuration_ipxe=os_configuration_ipxe, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "OsConfigurationIPXE", + '202': "OsConfigurationIPXE", + '400': "Error", + '401': "Error", + '403': "Error", + '409': "Error", + '500': "Error", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _servers_server_id_os_configuration_ipxe_put_serialize( + self, + server_id, + os_configuration_ipxe, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if server_id is not None: + _path_params['serverId'] = server_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if os_configuration_ipxe is not None: + _body_params = os_configuration_ipxe + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2' + ] + + return self.api_client.param_serialize( + method='PUT', + resource_path='/servers/{serverId}/os-configuration/ipxe', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + @validate_call def servers_server_id_patch( self, diff --git a/pnap_bmc_api/pnap_bmc_api/models/__init__.py b/pnap_bmc_api/pnap_bmc_api/models/__init__.py index 28ce1380..70ec6e65 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/__init__.py +++ b/pnap_bmc_api/pnap_bmc_api/models/__init__.py @@ -25,6 +25,8 @@ from pnap_bmc_api.models.network_configuration import NetworkConfiguration from pnap_bmc_api.models.os_configuration import OsConfiguration from pnap_bmc_api.models.os_configuration_cloud_init import OsConfigurationCloudInit +from pnap_bmc_api.models.os_configuration_ipxe import OsConfigurationIPXE +from pnap_bmc_api.models.os_configuration_ipxe_native_vlan_configuration import OsConfigurationIPXENativeVlanConfiguration from pnap_bmc_api.models.os_configuration_map import OsConfigurationMap from pnap_bmc_api.models.os_configuration_map_esxi import OsConfigurationMapEsxi from pnap_bmc_api.models.os_configuration_map_proxmox import OsConfigurationMapProxmox @@ -36,6 +38,7 @@ from pnap_bmc_api.models.quota import Quota from pnap_bmc_api.models.quota_edit_limit_request import QuotaEditLimitRequest from pnap_bmc_api.models.quota_edit_limit_request_details import QuotaEditLimitRequestDetails +from pnap_bmc_api.models.reboot_request import RebootRequest from pnap_bmc_api.models.relinquish_ip_block import RelinquishIpBlock from pnap_bmc_api.models.reservation_transfer_details import ReservationTransferDetails from pnap_bmc_api.models.reset_result import ResetResult diff --git a/pnap_bmc_api/pnap_bmc_api/models/os_configuration.py b/pnap_bmc_api/pnap_bmc_api/models/os_configuration.py index 6908311a..576ef8d4 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/os_configuration.py +++ b/pnap_bmc_api/pnap_bmc_api/models/os_configuration.py @@ -23,6 +23,7 @@ from typing_extensions import Annotated from pnap_bmc_api.models.esxi_os_configuration import EsxiOsConfiguration from pnap_bmc_api.models.os_configuration_cloud_init import OsConfigurationCloudInit +from pnap_bmc_api.models.os_configuration_ipxe import OsConfigurationIPXE from pnap_bmc_api.models.os_configuration_netris_controller import OsConfigurationNetrisController from pnap_bmc_api.models.os_configuration_netris_softgate import OsConfigurationNetrisSoftgate from pnap_bmc_api.models.os_configuration_windows import OsConfigurationWindows @@ -42,8 +43,9 @@ class OsConfiguration(BaseModel): install_os_to_ram: Optional[StrictBool] = Field(default=False, description="If true, OS will be installed to and booted from the server's RAM. On restart RAM OS will be lost and the server will not be reachable unless a custom bootable OS has been deployed. Follow the instructions on how to install custom OS on BMC. Only supported for ubuntu/focal and ubuntu/jammy.", alias="installOsToRam") esxi: Optional[EsxiOsConfiguration] = None cloud_init: Optional[OsConfigurationCloudInit] = Field(default=None, alias="cloudInit") + i_pxe: Optional[OsConfigurationIPXE] = Field(default=None, alias="iPXE") additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["netrisController", "netrisSoftgate", "windows", "rootPassword", "managementUiUrl", "managementAccessAllowedIps", "installOsToRam", "esxi", "cloudInit"] + __properties: ClassVar[List[str]] = ["netrisController", "netrisSoftgate", "windows", "rootPassword", "managementUiUrl", "managementAccessAllowedIps", "installOsToRam", "esxi", "cloudInit", "iPXE"] model_config = ConfigDict( populate_by_name=True, @@ -105,6 +107,9 @@ def to_dict(self) -> Dict[str, Any]: # override the default output from pydantic by calling `to_dict()` of cloud_init if self.cloud_init: _dict['cloudInit'] = self.cloud_init.to_dict() + # override the default output from pydantic by calling `to_dict()` of i_pxe + if self.i_pxe: + _dict['iPXE'] = self.i_pxe.to_dict() # puts key-value pairs in additional_properties in the top level if self.additional_properties is not None: for _key, _value in self.additional_properties.items(): @@ -130,7 +135,8 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "managementAccessAllowedIps": obj.get("managementAccessAllowedIps"), "installOsToRam": obj.get("installOsToRam") if obj.get("installOsToRam") is not None else False, "esxi": EsxiOsConfiguration.from_dict(obj["esxi"]) if obj.get("esxi") is not None else None, - "cloudInit": OsConfigurationCloudInit.from_dict(obj["cloudInit"]) if obj.get("cloudInit") is not None else None + "cloudInit": OsConfigurationCloudInit.from_dict(obj["cloudInit"]) if obj.get("cloudInit") is not None else None, + "iPXE": OsConfigurationIPXE.from_dict(obj["iPXE"]) if obj.get("iPXE") is not None else None }) # store additional fields in additional_properties for _key in obj.keys(): diff --git a/pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe.py b/pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe.py new file mode 100644 index 00000000..b08f27c7 --- /dev/null +++ b/pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe.py @@ -0,0 +1,115 @@ +# coding: utf-8 + +""" + Bare Metal Cloud API + + Create, power off, power on, reset, reboot, or shut down your server with the Bare Metal Cloud API. Deprovision servers, get or edit SSH key details, assign public IPs, assign servers to networks and a lot more. Manage your infrastructure more efficiently using just a few simple API calls.

Knowledge base articles to help you can be found here

All URLs are relative to (https://api.phoenixnap.com/bmc/v1/) + + The version of the OpenAPI document: 0.1 + Contact: support@phoenixnap.com + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, field_validator +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from pnap_bmc_api.models.os_configuration_ipxe_native_vlan_configuration import OsConfigurationIPXENativeVlanConfiguration +from typing import Optional, Set +from typing_extensions import Self + +class OsConfigurationIPXE(BaseModel): + """ + iPXE configuration details. Configures the server to boot using the iPXE network boot firmware with a custom boot script. Only applicable when osName is 'ipxe' and must not be provided for any other OS. + """ # noqa: E501 + url: Annotated[str, Field(strict=True)] = Field(description="The URL of the iPXE boot script used to start the server.") + native_vlan_configuration: Optional[OsConfigurationIPXENativeVlanConfiguration] = Field(default=None, alias="nativeVlanConfiguration") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["url", "nativeVlanConfiguration"] + + @field_validator('url') + def url_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^https?:\/\/.+$", value): + raise ValueError(r"must validate the regular expression /^https?:\/\/.+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OsConfigurationIPXE from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of native_vlan_configuration + if self.native_vlan_configuration: + _dict['nativeVlanConfiguration'] = self.native_vlan_configuration.to_dict() + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OsConfigurationIPXE from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "url": obj.get("url"), + "nativeVlanConfiguration": OsConfigurationIPXENativeVlanConfiguration.from_dict(obj["nativeVlanConfiguration"]) if obj.get("nativeVlanConfiguration") is not None else None + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe_native_vlan_configuration.py b/pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe_native_vlan_configuration.py new file mode 100644 index 00000000..fba80876 --- /dev/null +++ b/pnap_bmc_api/pnap_bmc_api/models/os_configuration_ipxe_native_vlan_configuration.py @@ -0,0 +1,128 @@ +# coding: utf-8 + +""" + Bare Metal Cloud API + + Create, power off, power on, reset, reboot, or shut down your server with the Bare Metal Cloud API. Deprovision servers, get or edit SSH key details, assign public IPs, assign servers to networks and a lot more. Manage your infrastructure more efficiently using just a few simple API calls.

Knowledge base articles to help you can be found here

All URLs are relative to (https://api.phoenixnap.com/bmc/v1/) + + The version of the OpenAPI document: 0.1 + Contact: support@phoenixnap.com + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class OsConfigurationIPXENativeVlanConfiguration(BaseModel): + """ + Specifies the native VLAN configuration for the server. + """ # noqa: E501 + vlan_id: Optional[StrictInt] = Field(default=None, description="The VLAN ID of the network to be used as the native VLAN. The value must reference a public network with IP V4 block(s) or a public IP V4 block network to which the server is (or will be) attached. If omitted during provisioning, the native VLAN is matched to the configured/auto-purchased public IP V4 block. If no public IP block is available, a VLAN ID must be provided. The VLAN ID must belong to one of the public networks for any of the specified servers. During post-provisioning, if Native VLAN is omitted, the server will be configured with no native VLAN. If provided, the VLAN ID must be specified and must belong to any of the existing server public networks or IP block networks attached to the server. ", alias="vlanId") + static_dhcp_address_v4: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="The static IP V4 address assigned to the server within the native VLAN. This address is set as the DHCP reservation and used for the iPXE boot process. Value must be an available/unused IP V4 address within the native network usable IP range. If omitted, the first available IP in the native network will be automatically assigned. Therefore, at least one IP must be available within the native network. ", alias="staticDhcpAddressV4") + status: Optional[StrictStr] = Field(default=None, description="(Read-only) The status of the native VLAN configuration.") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["vlanId", "staticDhcpAddressV4", "status"] + + @field_validator('static_dhcp_address_v4') + def static_dhcp_address_v4_validate_regular_expression(cls, value): + """Validates the regular expression""" + if value is None: + return value + + if not re.match(r"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.)){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", value): + raise ValueError(r"must validate the regular expression /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.)){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/") + return value + + @field_validator('status') + def status_validate_enum(cls, value): + """Validates the enum""" + if value is None: + return value + + if value not in set(['in-progress', 'assigned', 'error']): + raise ValueError("must be one of enum values ('in-progress', 'assigned', 'error')") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OsConfigurationIPXENativeVlanConfiguration from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * OpenAPI `readOnly` fields are excluded. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "status", + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OsConfigurationIPXENativeVlanConfiguration from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "vlanId": obj.get("vlanId"), + "staticDhcpAddressV4": obj.get("staticDhcpAddressV4"), + "status": obj.get("status") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/pnap_bmc_api/pnap_bmc_api/models/reboot_request.py b/pnap_bmc_api/pnap_bmc_api/models/reboot_request.py new file mode 100644 index 00000000..61339169 --- /dev/null +++ b/pnap_bmc_api/pnap_bmc_api/models/reboot_request.py @@ -0,0 +1,129 @@ +# coding: utf-8 + +""" + Bare Metal Cloud API + + Create, power off, power on, reset, reboot, or shut down your server with the Bare Metal Cloud API. Deprovision servers, get or edit SSH key details, assign public IPs, assign servers to networks and a lot more. Manage your infrastructure more efficiently using just a few simple API calls.

Knowledge base articles to help you can be found here

All URLs are relative to (https://api.phoenixnap.com/bmc/v1/) + + The version of the OpenAPI document: 0.1 + Contact: support@phoenixnap.com + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class RebootRequest(BaseModel): + """ + RebootRequest + """ # noqa: E501 + boot_type: Optional[StrictStr] = Field(default='STANDARD', description="Specifies whether to boot via `IPXE` (requires script) or `STANDARD` (default mechanism, incompatible with `ipxeUrl`).", alias="bootType") + ipxe_url: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="The URL for the iPXE script, used only with `IPXE` boot type. If provided, it updates and replaces the existing stored URL; if not provided, the existing URL will be used.", alias="ipxeUrl") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["bootType", "ipxeUrl"] + + @field_validator('boot_type') + def boot_type_validate_enum(cls, value): + """Validates the enum""" + if value is None: + return value + + if value not in set(['IPXE', 'STANDARD']): + raise ValueError("must be one of enum values ('IPXE', 'STANDARD')") + return value + + @field_validator('ipxe_url') + def ipxe_url_validate_regular_expression(cls, value): + """Validates the regular expression""" + if value is None: + return value + + if not re.match(r"^https?:\/\/.+$", value): + raise ValueError(r"must validate the regular expression /^https?:\/\/.+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RebootRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + # set to None if ipxe_url (nullable) is None + # and model_fields_set contains the field + if self.ipxe_url is None and "ipxe_url" in self.model_fields_set: + _dict['ipxeUrl'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RebootRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "bootType": obj.get("bootType") if obj.get("bootType") is not None else 'STANDARD', + "ipxeUrl": obj.get("ipxeUrl") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/pnap_bmc_api/pnap_bmc_api/models/server.py b/pnap_bmc_api/pnap_bmc_api/models/server.py index fa550b79..047e8cde 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/server.py +++ b/pnap_bmc_api/pnap_bmc_api/models/server.py @@ -38,7 +38,7 @@ class Server(BaseModel): status: StrictStr = Field(description="The status of the server. Can have one of the following values: `creating` , `powered-on` , `powered-off` , `rebooting` , `resetting` , `deleting` , `reserved` , `error` or `reinstating`.") hostname: Annotated[str, Field(min_length=1, strict=True, max_length=100)] = Field(description="Hostname of server.") description: Optional[Annotated[str, Field(strict=True, max_length=250)]] = Field(default=None, description="Description of server.") - os: Optional[StrictStr] = Field(default=None, description="The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`.") + os: Optional[StrictStr] = Field(default=None, description="The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` , `netris/softgate_25g` or `ipxe`.") type: StrictStr = Field(description="Server type ID. Cannot be changed once a server is created. Currently this field should be set to either `s0.d1.small`, `s0.d1.medium`, `s1.c1.small`, `s1.c1.medium`, `s1.c2.medium`, `s1.c2.large`, `s1.e1.small`, `s1.e1.medium`, `s1.e1.large`, `s2.c1.small`, `s2.c1.medium`, `s2.c1.large`, `s2.c2.small`, `s2.c2.medium`, `s2.c2.large`, `d1.c4.small`, `d1.c4.medium`, `d1.c4.large`, `d1.m4.medium`, `d2.c1.medium`, `d2.c2.medium`, `d2.c3.medium`, `d2.c4.medium`, `d2.c5.medium`, `d2.c1.large`, `d2.c2.large`, `d2.c3.large`, `d2.c4.large`, `d2.c5.large`, `d2.m1.xlarge`, `d2.m2.xxlarge`, `d2.m3.xlarge`, `d2.m4.xlarge`, `d2.m5.xlarge`, `d2.c4.db1.pliops1`, `d3.m4.xlarge`, `d3.m5.xlarge`, `d3.m6.xlarge`, `a1.c5.large`, `a1.c5.xlarge`, `d3.s5.xlarge`, `d3.m4.xxlarge`, `d3.m5.xxlarge`, `d3.m6.xxlarge`, `s3.c3.medium`, `s3.c3.large`, `d3.c4.medium`, `d3.c5.medium`, `d3.c6.medium`, `d3.c1.large`, `d3.c2.large`, `d3.c3.large`, `d3.m1.xlarge`, `d3.m2.xlarge`, `d3.m3.xlarge`, `d3.g2.c1.xlarge`, `d3.g2.c2.xlarge`, `d3.g2.c3.xlarge`, `d3.g3.c2.medium`, `s4.x6.c6.large`, `s4.x6.m6.xlarge`, `s5.x6.c3.medium`, `s5.x6.c3.large`, `s5.x6.c8.medium`, `s5.x6.c9.medium`, `s5.x6.c8.large`, `s5.x6.c9.large`, `s5.x6.m8.xlarge`, `s5.x6.m9.xlarge`, `s4.c3.medium`, `s4.c6.medium`, `s4.c6.large`, `s4.c6.xlarge`, `s4.s2.large`, `a2.c9.large` or `a2.c9.xlarge`.") location: StrictStr = Field(description="Server location ID. Cannot be changed once a server is created. Currently this field should be set to `PHX`, `ASH`, `SGP`, `NLD`, `CHI` or `SEA`.") cpu: StrictStr = Field(description="A description of the machine CPU.") diff --git a/pnap_bmc_api/pnap_bmc_api/models/server_create.py b/pnap_bmc_api/pnap_bmc_api/models/server_create.py index 3fe66aba..1bf5d598 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/server_create.py +++ b/pnap_bmc_api/pnap_bmc_api/models/server_create.py @@ -34,7 +34,7 @@ class ServerCreate(BaseModel): """ # noqa: E501 hostname: Annotated[str, Field(min_length=1, strict=True, max_length=100)] = Field(description="Hostname of server.") description: Optional[Annotated[str, Field(strict=True, max_length=250)]] = Field(default=None, description="Description of server.") - os: StrictStr = Field(description="The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`.") + os: StrictStr = Field(description="The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g`, `netris/softgate_25g` or `ipxe`.") type: StrictStr = Field(description="Server type ID. Cannot be changed once a server is created. Currently this field should be set to either `s0.d1.small`, `s0.d1.medium`, `s1.c1.small`, `s1.c1.medium`, `s1.c2.medium`, `s1.c2.large`, `s1.e1.small`, `s1.e1.medium`, `s1.e1.large`, `s2.c1.small`, `s2.c1.medium`, `s2.c1.large`, `s2.c2.small`, `s2.c2.medium`, `s2.c2.large`, `d1.c4.small`, `d1.c4.medium`, `d1.c4.large`, `d1.m4.medium`, `d2.c1.medium`, `d2.c2.medium`, `d2.c3.medium`, `d2.c4.medium`, `d2.c5.medium`, `d2.c1.large`, `d2.c2.large`, `d2.c3.large`, `d2.c4.large`, `d2.c5.large`, `d2.m1.xlarge`, `d2.m2.xxlarge`, `d2.m3.xlarge`, `d2.m4.xlarge`, `d2.m5.xlarge`, `d2.c4.db1.pliops1`, `d3.m4.xlarge`, `d3.m5.xlarge`, `d3.m6.xlarge`, `a1.c5.large`, `a1.c5.xlarge`, `d3.s5.xlarge`, `d3.m4.xxlarge`, `d3.m5.xxlarge`, `d3.m6.xxlarge`, `s3.c3.medium`, `s3.c3.large`, `d3.c4.medium`, `d3.c5.medium`, `d3.c6.medium`, `d3.c1.large`, `d3.c2.large`, `d3.c3.large`, `d3.m1.xlarge`, `d3.m2.xlarge`, `d3.m3.xlarge`, `d3.g2.c1.xlarge`, `d3.g2.c2.xlarge`, `d3.g2.c3.xlarge`,`d3.g3.c2.medium`, `s4.x6.c6.large`, `s4.x6.m6.xlarge`, `s5.x6.c3.medium`, `s5.x6.c3.large`, `s5.x6.c8.medium`, `s5.x6.c9.medium`, `s5.x6.c8.large`, `s5.x6.c9.large`, `s5.x6.m8.xlarge`, `s5.x6.m9.xlarge`, `s4.c3.medium`, `s4.c6.medium`, `s4.c6.large`, `s4.c6.xlarge`, `s4.s2.large`, `a2.c9.large` or `a2.c9.xlarge`.") location: StrictStr = Field(description="Server location ID. Cannot be changed once a server is created. Currently this field should be set to `PHX`, `ASH`, `SGP`, `NLD`, `CHI` or `SEA`.") install_default_ssh_keys: Optional[StrictBool] = Field(default=True, description="Whether or not to install SSH keys marked as default in addition to any SSH keys specified in this request.", alias="installDefaultSshKeys") diff --git a/pnap_bmc_api/pnap_bmc_api/models/server_provision.py b/pnap_bmc_api/pnap_bmc_api/models/server_provision.py index fe79b587..c55b90ea 100644 --- a/pnap_bmc_api/pnap_bmc_api/models/server_provision.py +++ b/pnap_bmc_api/pnap_bmc_api/models/server_provision.py @@ -34,7 +34,7 @@ class ServerProvision(BaseModel): """ # noqa: E501 hostname: Annotated[str, Field(min_length=1, strict=True, max_length=100)] = Field(description="Hostname of server.") description: Optional[Annotated[str, Field(strict=True, max_length=250)]] = Field(default=None, description="Description of server.") - os: StrictStr = Field(description="The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux8`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`,`netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`.") + os: StrictStr = Field(description="The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux8`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`,`netris/controller`, `netris/softgate_1g`, `netris/softgate_10g`, `netris/softgate_25g` or `ipxe`.") install_default_ssh_keys: Optional[StrictBool] = Field(default=True, description="Whether or not to install SSH keys marked as default in addition to any SSH keys specified in this request.", alias="installDefaultSshKeys") ssh_keys: Optional[List[StrictStr]] = Field(default=None, description="A list of SSH keys that will be installed on the server.", alias="sshKeys") ssh_key_ids: Optional[List[StrictStr]] = Field(default=None, description="A list of SSH key IDs that will be installed on the server in addition to any SSH keys specified in this request.", alias="sshKeyIds") diff --git a/specs/pnap_bmc_api.spec.yaml b/specs/pnap_bmc_api.spec.yaml index 7a7b9da6..99f68575 100644 --- a/specs/pnap_bmc_api.spec.yaml +++ b/specs/pnap_bmc_api.spec.yaml @@ -1030,6 +1030,13 @@ paths: security: - OAuth2: - bmc + requestBody: + description: 'Configuration option to specify the reboot type: STANDARD or IPXE (default: STANDARD).' + required: false + content: + application/json: + schema: + $ref: '#/components/schemas/RebootRequest' responses: '200': description: Rebooting server. @@ -1192,6 +1199,64 @@ paths: $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalServerError' + /servers/{serverId}/os-configuration/ipxe: + parameters: + - $ref: '#/components/parameters/serverIdPathParam' + put: + tags: + - Servers + description: Updates the iPXE OS configuration by updating the URL and the native VLAN configuration. + summary: Updates the iPXE OS configuration. + operationId: serversServerIdOsConfigurationIpxePut + security: + - OAuth2: + - bmc + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OsConfigurationIPXE' + example: + url: https://example.com/boot.ipxe + nativeVlanConfiguration: + vlanId: 10 + staticDhcpAddressV4: 185.74.213.56 + responses: + '200': + description: Updated URL in iPXE OS configuration. + content: + application/json: + schema: + $ref: '#/components/schemas/OsConfigurationIPXE' + example: + url: https://example.com/boot.ipxe + nativeVlanConfiguration: + vlanId: 10 + staticDhcpAddressV4: 185.74.213.56 + status: assigned + '202': + description: The iPXE OS configuration is being updated. + content: + application/json: + schema: + $ref: '#/components/schemas/OsConfigurationIPXE' + example: + url: https://example.com/boot.ipxe + nativeVlanConfiguration: + vlanId: 10 + staticDhcpAddressV4: 185.74.213.56 + status: in-progress + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/InternalServerError' /ssh-keys: post: tags: @@ -1503,6 +1568,46 @@ components: properties: datastoreConfiguration: $ref: '#/components/schemas/EsxiDatastoreConfiguration' + OsConfigurationIPXE: + type: object + description: iPXE configuration details. Configures the server to boot using the iPXE network boot firmware with a custom boot script. Only applicable when osName is 'ipxe' and must not be provided for any other OS. + required: + - url + properties: + url: + description: The URL of the iPXE boot script used to start the server. + type: string + pattern: ^https?://.+$ + example: https://example.com/boot.ipxe + nativeVlanConfiguration: + type: object + description: Specifies the native VLAN configuration for the server. + properties: + vlanId: + description: | + The VLAN ID of the network to be used as the native VLAN. + The value must reference a public network with IP V4 block(s) or a public IP V4 block network to which the server is (or will be) attached. + If omitted during provisioning, the native VLAN is matched to the configured/auto-purchased public IP V4 block. If no public IP block is available, a VLAN ID must be provided. The VLAN ID must belong to one of the public networks for any of the specified servers. + During post-provisioning, if Native VLAN is omitted, the server will be configured with no native VLAN. If provided, the VLAN ID must be specified and must belong to any of the existing server public networks or IP block networks attached to the server. + type: integer + example: 10 + staticDhcpAddressV4: + description: | + The static IP V4 address assigned to the server within the native VLAN. This address is set as the DHCP reservation and used for the iPXE boot process. + Value must be an available/unused IP V4 address within the native network usable IP range. + If omitted, the first available IP in the native network will be automatically assigned. Therefore, at least one IP must be available within the native network. + type: string + format: ipv4 + pattern: ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.)){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + example: 185.74.213.56 + status: + description: (Read-only) The status of the native VLAN configuration. + readOnly: true + type: string + enum: + - in-progress + - assigned + - error OsConfiguration: type: object description: OS specific configuration properties. @@ -1614,6 +1719,8 @@ components: type: string format: byte example: IyEvYmluL2Jhc2gKbWtkaXIgL3Jvb3QvY2xvdWQtaW5pdC1zY3JpcHQtZXhlY3V0ZWQ= + iPXE: + $ref: '#/components/schemas/OsConfigurationIPXE' ServerPrivateNetwork: type: object description: Private network details of bare metal server. @@ -1853,7 +1960,7 @@ components: example: 'Server #1 used for computing.' maxLength: 250 os: - description: The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`. + description: The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` , `netris/softgate_25g` or `ipxe`. type: string example: ubuntu/bionic type: @@ -2011,7 +2118,7 @@ components: example: 'Server #1 used for computing.' maxLength: 250 os: - description: The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`. + description: The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `rockylinux/rockylinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`, `netris/controller`, `netris/softgate_1g`, `netris/softgate_10g`, `netris/softgate_25g` or `ipxe`. type: string example: ubuntu/bionic type: @@ -2145,7 +2252,7 @@ components: example: 'Server #1 used for computing.' maxLength: 250 os: - description: The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux8`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`,`netris/controller`, `netris/softgate_1g`, `netris/softgate_10g` or `netris/softgate_25g`. + description: The server’s OS ID used when the server was created. Currently this field should be set to either `ubuntu/bionic`, `ubuntu/focal`, `ubuntu/jammy`, `ubuntu/jammy+pytorch`, `ubuntu/noble`, `centos/centos7`, `centos/centos8`, `windows/srv2019std`, `windows/srv2019dc`, `windows/srv2022std`, `windows/srv2022dc`, `windows/srv2025std`, `windows/srv2025dc`, `esxi/esxi70`, `esxi/esxi80`, `almalinux/almalinux8`, `almalinux/almalinux9`, `rockylinux/rockylinux8`, `rockylinux/rockylinux9`, `virtuozzo/virtuozzo7`, `oraclelinux/oraclelinux9`, `debian/bullseye`, `debian/bookworm`, `debian/trixie`, `proxmox/bullseye`, `proxmox/proxmox8`, `proxmox/proxmox9`,`netris/controller`, `netris/softgate_1g`, `netris/softgate_10g`, `netris/softgate_25g` or `ipxe`. type: string example: ubuntu/bionic installDefaultSshKeys: @@ -2197,6 +2304,23 @@ components: description: Message describing the action's result. type: string example: Powering on server. + RebootRequest: + type: object + properties: + bootType: + type: string + default: STANDARD + enum: + - IPXE + - STANDARD + description: Specifies whether to boot via `IPXE` (requires script) or `STANDARD` (default mechanism, incompatible with `ipxeUrl`). + ipxeUrl: + type: string + pattern: ^https?://.+$ + nullable: true + default: null + example: https://example.com/boot.ipxe + description: The URL for the iPXE script, used only with `IPXE` boot type. If provided, it updates and replaces the existing stored URL; if not provided, the existing URL will be used. OsConfigurationMap: description: OS specific configuration properties. type: object From 1aec22061d8d4c88bf7d4f677a92d70b5e6df68c Mon Sep 17 00:00:00 2001 From: darrenccbill <93383166+darrenccbill@users.noreply.github.com> Date: Tue, 9 Jun 2026 17:22:35 +0200 Subject: [PATCH 09/17] Create prepare-release-prs.yml --- .github/workflows/prepare-release-prs.yml | 438 ++++++++++++++++++++++ 1 file changed, 438 insertions(+) create mode 100644 .github/workflows/prepare-release-prs.yml diff --git a/.github/workflows/prepare-release-prs.yml b/.github/workflows/prepare-release-prs.yml new file mode 100644 index 00000000..d7e0fbfd --- /dev/null +++ b/.github/workflows/prepare-release-prs.yml @@ -0,0 +1,438 @@ +name: prepare-release-prs + +# Triggered manually after generate-all and validate-all have passed on develop. +# +# Expected pipeline: +# generate-all → validate-all → (validate passes) → prepare-release-prs +# +# validate-all passing is the signal that no force_major is needed: if the +# generated code compiled and all tests passed, no method signatures or model +# shapes changed in a way that breaks consumers. In that case, run this workflow +# with no inputs. +# +# If validate-all failed due to a genuine generator-level SDK break (not just a +# test that needs updating for a new required field), pass the affected modules +# via force_major_modules before triggering this workflow. +# +# This workflow: +# - Diffs each module's OpenAPI spec (develop vs master) to classify changes +# - Computes the next semver version per module and for the repo tag +# - Bumps VERSION for every module +# - Opens two draft PRs: +# PR 1 (release -> master): clean release versions +# PR 2 (release -> develop): release versions + patch+1 -SNAPSHOT +# +# After this workflow completes, a developer must: +# 1. Update hand-written tests on the release branch to reflect API changes +# 2. Mark both draft PRs as ready for review +# 3. Merge in order: master first, then develop — the snapshot commit on the +# develop PR must never land on master +# +# If the PR changelog looks wrong, close/delete the release branch and retrigger. +# +# The workflow file must live on master to appear in the GitHub Actions UI, +# but all checkout and diff operations target develop and master explicitly +# via git, so the file location has no effect on the logic. +on: + workflow_dispatch: + inputs: + force_major_modules: + description: 'Comma-separated modules to force a major bump (e.g. "payments,invoicing"). Only needed after a validate-all failure caused by a genuine SDK break. Leave blank in normal operation.' + type: string + required: false + default: '' + +permissions: + contents: write + pull-requests: write + +jobs: + + # JOB 1: discover-modules + # + # Reads the specs/ directory to produce the list of modules dynamically. + # Adding a new module requires no changes to this workflow — it is picked + # up automatically as long as a spec file exists under specs/. + discover-modules: + name: Discover Modules + runs-on: ubuntu-latest + outputs: + modules: ${{ steps.list.outputs.modules }} + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + ref: develop + + - name: List modules from specs/ + id: list + run: | + modules=$(ls specs/*.spec.yaml \ + | sed 's|specs/||;s|\.spec\.yaml||' \ + | jq -R . | jq -sc .) + echo "modules=$modules" >> $GITHUB_OUTPUT + + # JOB 2: analyze-module + # + # Runs once per module in parallel. For each module it: + # - Diffs the OpenAPI spec on develop vs master via oasdiff + # - Applies force_major_modules override if present + # - Computes the next version from the current VERSION + # - Renders a human-readable markdown changelog + # - Uploads results as an artifact for the prepare job to consume + # + # Results go via artifacts rather than job outputs because matrix outputs + # are unreliable when multiple parallel jobs write to the same key — + # the last writer wins and all others are lost. + analyze-module: + name: Analyze ${{ matrix.module }} + needs: discover-modules + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + module: ${{ fromJson(needs.discover-modules.outputs.modules) }} + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + ref: develop + + # oasdiff classifies OpenAPI changes: + # level 3 = spec-breaking (removed endpoint, changed type, etc.) + # level 1 = additive (new endpoint, new optional field, etc.) + # level 2 = non-breaking (description changes, etc.) + # + # Both level 3 and level 1 default to a minor bump. Level 3 changes are + # labelled [SPEC-BREAKING] in the changelog — they are breaking per the + # spec definition but in practice typically reflect corrections for fields + # that were already logically required in backend services, not true + # consumer-visible SDK breaks. force_major_modules is the explicit escape + # hatch when a genuine major bump is warranted. + - name: Install oasdiff + run: | + OASDIFF_VERSION="1.10.14" + curl -sSL "https://github.com/tufin/oasdiff/releases/download/v${OASDIFF_VERSION}/oasdiff_${OASDIFF_VERSION}_linux_amd64.tar.gz" \ + | tar -xz -C /usr/local/bin oasdiff + + # Extract both spec versions from git's object store (no file checkout needed). + # If the spec doesn't exist on master this is a new module — skip the diff, + # write an empty changelog, and flag it so the next step handles it separately. + - name: Diff spec vs master + run: | + MODULE="${{ matrix.module }}" + SPEC_PATH="specs/${MODULE}.spec.yaml" + + if git cat-file -e origin/master:${SPEC_PATH} 2>/dev/null; then + git show origin/master:${SPEC_PATH} > /tmp/master-spec.yaml + git show origin/develop:${SPEC_PATH} > /tmp/develop-spec.yaml + oasdiff changelog --format json /tmp/master-spec.yaml /tmp/develop-spec.yaml > /tmp/${MODULE}-changelog.json + echo "false" > /tmp/${MODULE}-new-module.txt + else + echo "[]" > /tmp/${MODULE}-changelog.json + echo "true" > /tmp/${MODULE}-new-module.txt + fi + + # Semver bump rules: + # force_major_modules flag -> major (explicit override; use after validate-all failure) + # any level 3 or level 1 -> minor + # only level 2 -> patch + # new module -> 1.0.0 + # + # Patch bump: -SNAPSHOT is stripped with no increment — the SNAPSHOT version + # already represents the intended next patch number. + - name: Compute bump type and next version + id: compute + run: | + MODULE="${{ matrix.module }}" + + FORCE_MAJOR="false" + IFS=',' read -ra FLAGGED <<< "${{ inputs.force_major_modules }}" + for flagged in "${FLAGGED[@]}"; do + TRIMMED=$(echo "$flagged" | xargs) + if [ "$TRIMMED" = "$MODULE" ]; then + FORCE_MAJOR="true" + break + fi + done + + NEW_MODULE=$(cat /tmp/${MODULE}-new-module.txt) + if [ "$NEW_MODULE" = "true" ]; then + CURRENT="none" + BUMP="new" + NEXT="1.0.0" + else + BREAKING=$(jq '[.[] | select(.level == 3)] | length' /tmp/${MODULE}-changelog.json) + ADDITIONS=$(jq '[.[] | select(.level == 1)] | length' /tmp/${MODULE}-changelog.json) + + if [ "$FORCE_MAJOR" = "true" ]; then + BUMP="major" + elif [ "$BREAKING" -gt 0 ] || [ "$ADDITIONS" -gt 0 ]; then + BUMP="minor" + else + BUMP="patch" + fi + + CURRENT=$(grep '^VERSION' ${MODULE}/${MODULE}/version.py | sed 's/VERSION = "\(.*\)"/\1/') + BASE=$(echo "$CURRENT" | sed 's/\.dev$//') + MAJOR=$(echo "$BASE" | cut -d. -f1) + MINOR=$(echo "$BASE" | cut -d. -f2) + PATCH=$(echo "$BASE" | cut -d. -f3) + + case "$BUMP" in + major) NEXT="$((MAJOR + 1)).0.0" ;; + minor) NEXT="${MAJOR}.$((MINOR + 1)).0" ;; + patch) NEXT="${MAJOR}.${MINOR}.${PATCH}" ;; + esac + fi + + echo "bump=$BUMP" >> $GITHUB_OUTPUT + echo "version=$NEXT" >> $GITHUB_OUTPUT + echo "current=$CURRENT" >> $GITHUB_OUTPUT + echo "force_major=$FORCE_MAJOR" >> $GITHUB_OUTPUT + + - name: Render module changelog markdown + run: | + MODULE="${{ matrix.module }}" + BUMP="${{ steps.compute.outputs.bump }}" + CURRENT="${{ steps.compute.outputs.current }}" + NEXT="${{ steps.compute.outputs.version }}" + FORCE_MAJOR="${{ steps.compute.outputs.force_major }}" + + { + echo "## \`${MODULE}\` ${CURRENT} -> ${NEXT} (\`${BUMP}\`)" + echo "" + + if [ "$FORCE_MAJOR" = "true" ]; then + echo "> [!WARNING]" + echo "> **Force-major:** this module was explicitly flagged by the operator." + echo "> Carefully diff all generated code before approving —" + echo "> method signatures, model shapes, or serialization behaviour may have changed." + echo "" + fi + + TOTAL=$(jq length /tmp/${MODULE}-changelog.json) + + if [ "$TOTAL" -eq 0 ]; then + echo "_No spec changes detected. Stripping -SNAPSHOT as part of standard release._" + echo "" + else + jq -r 'group_by(.path + .operation) | .[] | "#### " + (.[0].operation | ascii_upcase) + " " + .[0].path + "\n" + (map(if .level == 3 then "- **[SPEC-BREAKING]** " + .text elif .level == 1 then "- **[ADDITION]** " + .text else "- **[CHANGE]** " + .text end) | unique | join("\n")) + "\n"' /tmp/${MODULE}-changelog.json + fi + } > /tmp/${MODULE}-changelog.md + + - name: Save results as artifact + run: | + MODULE="${{ matrix.module }}" + mkdir -p /tmp/release-artifacts/${MODULE} + cp /tmp/${MODULE}-changelog.md /tmp/release-artifacts/${MODULE}/changelog.md + echo "${{ steps.compute.outputs.bump }}" > /tmp/release-artifacts/${MODULE}/bump.txt + echo "${{ steps.compute.outputs.version }}" > /tmp/release-artifacts/${MODULE}/next-version.txt + echo "${{ steps.compute.outputs.current }}" > /tmp/release-artifacts/${MODULE}/current-version.txt + echo "${{ steps.compute.outputs.force_major }}" > /tmp/release-artifacts/${MODULE}/force-major.txt + + - uses: actions/upload-artifact@v6 + with: + name: release-data-${{ matrix.module }} + path: /tmp/release-artifacts/${{ matrix.module }} + + # JOB 3: prepare-release + # + # Runs after all matrix jobs complete. It: + # - Aggregates per-module artifacts + # - Determines the repo-level semver bump (highest module bump wins) + # - Computes the next repo tag from the latest semver git tag + # - Bumps VERSION for every module + # - Writes the job summary to the Actions UI + # - Commits, pushes the release branch, and opens two draft PRs: + # PR 1 (release -> master): clean release versions + # PR 2 (release -> develop): release versions + patch+1 -SNAPSHOT + prepare-release: + name: Prepare Release + needs: + - discover-modules + - analyze-module + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + ref: develop + + - name: Download all release artifacts + uses: actions/download-artifact@v7 + with: + pattern: release-data-* + path: /tmp/release-artifacts + merge-multiple: false + + # Repo-level tag bump follows highest-wins: if any module is major, tag is major. + # "new" module type is treated as minor for the repo tag calculation. + - name: Compute repo-level bump and next tag + id: repo-version + run: | + git fetch --tags + CURRENT_TAG=$(git tag --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1) + CURRENT_TAG="${CURRENT_TAG:-v0.0.0}" + BASE="${CURRENT_TAG#v}" + MAJOR=$(echo "$BASE" | cut -d. -f1) + MINOR=$(echo "$BASE" | cut -d. -f2) + PATCH=$(echo "$BASE" | cut -d. -f3) + + HIGHEST="patch" + for bump_file in /tmp/release-artifacts/release-data-*/bump.txt; do + BUMP=$(cat "$bump_file") + if [ "$BUMP" = "major" ]; then + HIGHEST="major" + elif { [ "$BUMP" = "minor" ] || [ "$BUMP" = "new" ]; } && [ "$HIGHEST" != "major" ]; then + HIGHEST="minor" + fi + done + + case "$HIGHEST" in + major) NEXT_TAG="v$((MAJOR + 1)).0.0" ;; + minor) NEXT_TAG="v${MAJOR}.$((MINOR + 1)).0" ;; + patch) NEXT_TAG="v${MAJOR}.${MINOR}.$((PATCH + 1))" ;; + esac + + echo "current_tag=$CURRENT_TAG" >> $GITHUB_OUTPUT + echo "next_tag=$NEXT_TAG" >> $GITHUB_OUTPUT + echo "bump=$HIGHEST" >> $GITHUB_OUTPUT + echo "branch=release/${NEXT_TAG}" >> $GITHUB_OUTPUT + + - name: Bump VERSION for each module + run: | + for module_dir in /tmp/release-artifacts/release-data-*/; do + MODULE=$(basename "$module_dir" | sed 's/release-data-//') + NEXT=$(cat "${module_dir}/next-version.txt") + sed -i "s/VERSION = \".*\"/VERSION = \"${NEXT}\"/" ${MODULE}/${MODULE}/version.py + done + + - name: Build aggregate changelog + id: changelog + run: | + NEXT_TAG="${{ steps.repo-version.outputs.next_tag }}" + CURRENT_TAG="${{ steps.repo-version.outputs.current_tag }}" + BUMP="${{ steps.repo-version.outputs.bump }}" + FORCE_MAJOR_INPUT="${{ inputs.force_major_modules }}" + + { + echo "# Release ${NEXT_TAG}" + echo "" + echo "**Repo bump:** \`${BUMP}\` (${CURRENT_TAG} -> ${NEXT_TAG})" + echo "" + + if [ -n "$FORCE_MAJOR_INPUT" ]; then + echo "> [!WARNING]" + echo "> **Force-major modules:** \`${FORCE_MAJOR_INPUT}\`" + echo "> These modules had their bump forced to \`major\`. Review their generated" + echo "> code diffs carefully before approving this PR." + echo "" + fi + + echo "> **Next step:** Update tests on this branch to reflect the changes below, then mark both PRs ready for review." + echo "" + echo "---" + echo "" + for module_dir in /tmp/release-artifacts/release-data-*/; do + cat "${module_dir}/changelog.md" + done + } > /tmp/full-changelog.md + + { + echo 'body<> $GITHUB_OUTPUT + cp /tmp/full-changelog.md /tmp/pr-body.md + + - name: Write job summary + run: | + NEXT_TAG="${{ steps.repo-version.outputs.next_tag }}" + CURRENT_TAG="${{ steps.repo-version.outputs.current_tag }}" + BUMP="${{ steps.repo-version.outputs.bump }}" + + { + echo "# Release: ${NEXT_TAG}" + echo "" + echo "| Module | Current | Bump | Next | Force Major |" + echo "|--------|---------|------|------|-------------|" + for module_dir in /tmp/release-artifacts/release-data-*/; do + MODULE=$(basename "$module_dir" | sed 's/release-data-//') + CURRENT=$(cat "${module_dir}/current-version.txt") + MODULE_BUMP=$(cat "${module_dir}/bump.txt") + NEXT=$(cat "${module_dir}/next-version.txt") + FORCE_MAJOR=$(cat "${module_dir}/force-major.txt") + [ "$FORCE_MAJOR" = "true" ] && FORCE_LABEL="YES" || FORCE_LABEL="" + echo "| \`${MODULE}\` | ${CURRENT} | ${MODULE_BUMP} | ${NEXT} | ${FORCE_LABEL} |" + done + echo "" + echo "**Repo tag:** ${CURRENT_TAG} -> **${NEXT_TAG}** (\`${BUMP}\`)" + echo "" + echo "---" + echo "" + cat /tmp/full-changelog.md + } >> $GITHUB_STEP_SUMMARY + + # Commit clean release versions (no -SNAPSHOT) and push the release branch. + # This is the commit the master PR targets. + - name: Create release branch and commit VERSION bumps + run: | + BRANCH="${{ steps.repo-version.outputs.branch }}" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config user.name "github-actions[bot]" + git checkout -b "$BRANCH" + git add -A + if test "$(git status --porcelain=v1 2>/dev/null | wc -l)" -gt "0"; then + git commit -m "chore: bump versions for ${{ steps.repo-version.outputs.next_tag }}" + else + echo "No VERSION changes to commit (all modules already at release version)." + fi + git push origin "$BRANCH" --force + + - name: Open draft PR to master + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr create \ + --base master \ + --head "${{ steps.repo-version.outputs.branch }}" \ + --title "Release ${{ steps.repo-version.outputs.next_tag }}" \ + --draft \ + --body-file /tmp/pr-body.md \ + || echo "PR to master already exists, skipping." + + # Add a second commit on the release branch bumping all modules to + # patch+1 -SNAPSHOT. When the develop PR merges, develop is immediately + # ready for the next development cycle. Must merge master PR first so + # this snapshot commit never lands on master. + - name: Prepare snapshot versions for back-merge + run: | + for module_dir in /tmp/release-artifacts/release-data-*/; do + MODULE=$(basename "$module_dir" | sed 's/release-data-//') + NEXT=$(cat "${module_dir}/next-version.txt") + MAJOR=$(echo "$NEXT" | cut -d. -f1) + MINOR=$(echo "$NEXT" | cut -d. -f2) + PATCH=$(echo "$NEXT" | cut -d. -f3) + SNAPSHOT_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1)).dev" + sed -i "s/VERSION = \".*\"/VERSION = \"${SNAPSHOT_VERSION}\"/" ${MODULE}/${MODULE}/version.py + done + git add -A + if test "$(git status --porcelain=v1 2>/dev/null | wc -l)" -gt "0"; then + git commit -m "chore: prepare next snapshot versions after ${{ steps.repo-version.outputs.next_tag }}" + else + echo "No snapshot version changes to commit." + fi + git push origin "${{ steps.repo-version.outputs.branch }}" + + - name: Open draft PR to develop + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr create \ + --base develop \ + --head "${{ steps.repo-version.outputs.branch }}" \ + --title "Release ${{ steps.repo-version.outputs.next_tag }} back-merge to develop" \ + --draft \ + --body "Back-merge of ${{ steps.repo-version.outputs.next_tag }} into develop. Bumps all modules to next patch .dev for continued development." \ + || echo "PR to develop already exists, skipping." From 26710f0240a2111ed0cfdaa6e7edb80075c8fbeb Mon Sep 17 00:00:00 2001 From: darrenccbill <93383166+darrenccbill@users.noreply.github.com> Date: Tue, 9 Jun 2026 17:42:07 +0200 Subject: [PATCH 10/17] Update prepare-release-prs.yml --- .github/workflows/prepare-release-prs.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/prepare-release-prs.yml b/.github/workflows/prepare-release-prs.yml index d7e0fbfd..84b94da4 100644 --- a/.github/workflows/prepare-release-prs.yml +++ b/.github/workflows/prepare-release-prs.yml @@ -20,7 +20,7 @@ name: prepare-release-prs # - Bumps VERSION for every module # - Opens two draft PRs: # PR 1 (release -> master): clean release versions -# PR 2 (release -> develop): release versions + patch+1 -SNAPSHOT +# PR 2 (release -> develop): release versions + patch+1 .dev # # After this workflow completes, a developer must: # 1. Update hand-written tests on the release branch to reflect API changes @@ -139,7 +139,7 @@ jobs: # only level 2 -> patch # new module -> 1.0.0 # - # Patch bump: -SNAPSHOT is stripped with no increment — the SNAPSHOT version + # Patch bump: .dev is stripped with no increment — the SNAPSHOT version # already represents the intended next patch number. - name: Compute bump type and next version id: compute @@ -214,7 +214,7 @@ jobs: TOTAL=$(jq length /tmp/${MODULE}-changelog.json) if [ "$TOTAL" -eq 0 ]; then - echo "_No spec changes detected. Stripping -SNAPSHOT as part of standard release._" + echo "_No spec changes detected. Stripping .dev as part of standard release._" echo "" else jq -r 'group_by(.path + .operation) | .[] | "#### " + (.[0].operation | ascii_upcase) + " " + .[0].path + "\n" + (map(if .level == 3 then "- **[SPEC-BREAKING]** " + .text elif .level == 1 then "- **[ADDITION]** " + .text else "- **[CHANGE]** " + .text end) | unique | join("\n")) + "\n"' /tmp/${MODULE}-changelog.json @@ -246,7 +246,7 @@ jobs: # - Writes the job summary to the Actions UI # - Commits, pushes the release branch, and opens two draft PRs: # PR 1 (release -> master): clean release versions - # PR 2 (release -> develop): release versions + patch+1 -SNAPSHOT + # PR 2 (release -> develop): release versions + patch+1 .dev prepare-release: name: Prepare Release needs: @@ -374,7 +374,7 @@ jobs: cat /tmp/full-changelog.md } >> $GITHUB_STEP_SUMMARY - # Commit clean release versions (no -SNAPSHOT) and push the release branch. + # Commit clean release versions (no .dev) and push the release branch. # This is the commit the master PR targets. - name: Create release branch and commit VERSION bumps run: | @@ -403,7 +403,7 @@ jobs: || echo "PR to master already exists, skipping." # Add a second commit on the release branch bumping all modules to - # patch+1 -SNAPSHOT. When the develop PR merges, develop is immediately + # patch+1 .dev. When the develop PR merges, develop is immediately # ready for the next development cycle. Must merge master PR first so # this snapshot commit never lands on master. - name: Prepare snapshot versions for back-merge From fff348963a6a47c7c219f87f1676f77eb80b8ff4 Mon Sep 17 00:00:00 2001 From: darrenccbill <93383166+darrenccbill@users.noreply.github.com> Date: Wed, 10 Jun 2026 09:36:16 +0200 Subject: [PATCH 11/17] Update prepare-release-prs.yml --- .github/workflows/prepare-release-prs.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prepare-release-prs.yml b/.github/workflows/prepare-release-prs.yml index 84b94da4..d78c4a87 100644 --- a/.github/workflows/prepare-release-prs.yml +++ b/.github/workflows/prepare-release-prs.yml @@ -408,6 +408,8 @@ jobs: # this snapshot commit never lands on master. - name: Prepare snapshot versions for back-merge run: | + SNAPSHOT_BRANCH="${{ steps.repo-version.outputs.snapshot_branch }}" + git checkout -b "$SNAPSHOT_BRANCH" for module_dir in /tmp/release-artifacts/release-data-*/; do MODULE=$(basename "$module_dir" | sed 's/release-data-//') NEXT=$(cat "${module_dir}/next-version.txt") @@ -423,7 +425,7 @@ jobs: else echo "No snapshot version changes to commit." fi - git push origin "${{ steps.repo-version.outputs.branch }}" + git push origin "$SNAPSHOT_BRANCH" --force - name: Open draft PR to develop env: @@ -431,7 +433,7 @@ jobs: run: | gh pr create \ --base develop \ - --head "${{ steps.repo-version.outputs.branch }}" \ + --head "${{ steps.repo-version.outputs.snapshot_branch }}" \ --title "Release ${{ steps.repo-version.outputs.next_tag }} back-merge to develop" \ --draft \ --body "Back-merge of ${{ steps.repo-version.outputs.next_tag }} into develop. Bumps all modules to next patch .dev for continued development." \ From 060b64fd963ff46d2faf3f2fb1d8ac806d221d6a Mon Sep 17 00:00:00 2001 From: darrenccbill <93383166+darrenccbill@users.noreply.github.com> Date: Wed, 10 Jun 2026 09:53:09 +0200 Subject: [PATCH 12/17] Update prepare-release-prs.yml --- .github/workflows/prepare-release-prs.yml | 126 ++++------------------ 1 file changed, 20 insertions(+), 106 deletions(-) diff --git a/.github/workflows/prepare-release-prs.yml b/.github/workflows/prepare-release-prs.yml index d78c4a87..4fc07240 100644 --- a/.github/workflows/prepare-release-prs.yml +++ b/.github/workflows/prepare-release-prs.yml @@ -1,38 +1,19 @@ name: prepare-release-prs -# Triggered manually after generate-all and validate-all have passed on develop. -# -# Expected pipeline: -# generate-all → validate-all → (validate passes) → prepare-release-prs -# -# validate-all passing is the signal that no force_major is needed: if the -# generated code compiled and all tests passed, no method signatures or model -# shapes changed in a way that breaks consumers. In that case, run this workflow -# with no inputs. -# -# If validate-all failed due to a genuine generator-level SDK break (not just a -# test that needs updating for a new required field), pass the affected modules -# via force_major_modules before triggering this workflow. -# # This workflow: # - Diffs each module's OpenAPI spec (develop vs master) to classify changes # - Computes the next semver version per module and for the repo tag -# - Bumps VERSION for every module -# - Opens two draft PRs: -# PR 1 (release -> master): clean release versions -# PR 2 (release -> develop): release versions + patch+1 .dev -# -# After this workflow completes, a developer must: -# 1. Update hand-written tests on the release branch to reflect API changes -# 2. Mark both draft PRs as ready for review -# 3. Merge in order: master first, then develop — the snapshot commit on the -# develop PR must never land on master +# - Bumps the VERSION file for every module (clean release versions) +# - Opens draft PR (release -> master) with the clean release versions # # If the PR changelog looks wrong, close/delete the release branch and retrigger. -# -# The workflow file must live on master to appear in the GitHub Actions UI, -# but all checkout and diff operations target develop and master explicitly -# via git, so the file location has no effect on the logic. + + +# Change these according to the current repo SDK setup +env: + VERSION_FILE: VERSION.py + SNAPSHOT_SUFFIX: .dev + on: workflow_dispatch: inputs: @@ -77,13 +58,9 @@ jobs: # Runs once per module in parallel. For each module it: # - Diffs the OpenAPI spec on develop vs master via oasdiff # - Applies force_major_modules override if present - # - Computes the next version from the current VERSION + # - Computes the next version from the current VERSION file # - Renders a human-readable markdown changelog # - Uploads results as an artifact for the prepare job to consume - # - # Results go via artifacts rather than job outputs because matrix outputs - # are unreliable when multiple parallel jobs write to the same key — - # the last writer wins and all others are lost. analyze-module: name: Analyze ${{ matrix.module }} needs: discover-modules @@ -98,26 +75,12 @@ jobs: fetch-depth: 0 ref: develop - # oasdiff classifies OpenAPI changes: - # level 3 = spec-breaking (removed endpoint, changed type, etc.) - # level 1 = additive (new endpoint, new optional field, etc.) - # level 2 = non-breaking (description changes, etc.) - # - # Both level 3 and level 1 default to a minor bump. Level 3 changes are - # labelled [SPEC-BREAKING] in the changelog — they are breaking per the - # spec definition but in practice typically reflect corrections for fields - # that were already logically required in backend services, not true - # consumer-visible SDK breaks. force_major_modules is the explicit escape - # hatch when a genuine major bump is warranted. - name: Install oasdiff run: | OASDIFF_VERSION="1.10.14" curl -sSL "https://github.com/tufin/oasdiff/releases/download/v${OASDIFF_VERSION}/oasdiff_${OASDIFF_VERSION}_linux_amd64.tar.gz" \ | tar -xz -C /usr/local/bin oasdiff - # Extract both spec versions from git's object store (no file checkout needed). - # If the spec doesn't exist on master this is a new module — skip the diff, - # write an empty changelog, and flag it so the next step handles it separately. - name: Diff spec vs master run: | MODULE="${{ matrix.module }}" @@ -133,14 +96,6 @@ jobs: echo "true" > /tmp/${MODULE}-new-module.txt fi - # Semver bump rules: - # force_major_modules flag -> major (explicit override; use after validate-all failure) - # any level 3 or level 1 -> minor - # only level 2 -> patch - # new module -> 1.0.0 - # - # Patch bump: .dev is stripped with no increment — the SNAPSHOT version - # already represents the intended next patch number. - name: Compute bump type and next version id: compute run: | @@ -173,8 +128,10 @@ jobs: BUMP="patch" fi - CURRENT=$(grep '^VERSION' ${MODULE}/${MODULE}/version.py | sed 's/VERSION = "\(.*\)"/\1/') - BASE=$(echo "$CURRENT" | sed 's/\.dev$//') + # Read the first semver token from the VERSION file, regardless of the + # surrounding syntax, then strip the configured development suffix. + CURRENT=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*' "${MODULE}/${VERSION_FILE}" | head -1) + BASE="${CURRENT%"$SNAPSHOT_SUFFIX"}" MAJOR=$(echo "$BASE" | cut -d. -f1) MINOR=$(echo "$BASE" | cut -d. -f2) PATCH=$(echo "$BASE" | cut -d. -f3) @@ -214,7 +171,7 @@ jobs: TOTAL=$(jq length /tmp/${MODULE}-changelog.json) if [ "$TOTAL" -eq 0 ]; then - echo "_No spec changes detected. Stripping .dev as part of standard release._" + echo "_No spec changes detected. Stripping ${SNAPSHOT_SUFFIX} as part of standard release._" echo "" else jq -r 'group_by(.path + .operation) | .[] | "#### " + (.[0].operation | ascii_upcase) + " " + .[0].path + "\n" + (map(if .level == 3 then "- **[SPEC-BREAKING]** " + .text elif .level == 1 then "- **[ADDITION]** " + .text else "- **[CHANGE]** " + .text end) | unique | join("\n")) + "\n"' /tmp/${MODULE}-changelog.json @@ -242,11 +199,9 @@ jobs: # - Aggregates per-module artifacts # - Determines the repo-level semver bump (highest module bump wins) # - Computes the next repo tag from the latest semver git tag - # - Bumps VERSION for every module + # - Bumps the VERSION file for every module # - Writes the job summary to the Actions UI - # - Commits, pushes the release branch, and opens two draft PRs: - # PR 1 (release -> master): clean release versions - # PR 2 (release -> develop): release versions + patch+1 .dev + # - Commits, pushes the release branch, and opens release draft PR prepare-release: name: Prepare Release needs: @@ -266,8 +221,6 @@ jobs: path: /tmp/release-artifacts merge-multiple: false - # Repo-level tag bump follows highest-wins: if any module is major, tag is major. - # "new" module type is treated as minor for the repo tag calculation. - name: Compute repo-level bump and next tag id: repo-version run: | @@ -300,12 +253,12 @@ jobs: echo "bump=$HIGHEST" >> $GITHUB_OUTPUT echo "branch=release/${NEXT_TAG}" >> $GITHUB_OUTPUT - - name: Bump VERSION for each module + - name: Bump VERSION file for each module run: | for module_dir in /tmp/release-artifacts/release-data-*/; do MODULE=$(basename "$module_dir" | sed 's/release-data-//') NEXT=$(cat "${module_dir}/next-version.txt") - sed -i "s/VERSION = \".*\"/VERSION = \"${NEXT}\"/" ${MODULE}/${MODULE}/version.py + sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*/${NEXT}/" "${MODULE}/${VERSION_FILE}" done - name: Build aggregate changelog @@ -330,7 +283,7 @@ jobs: echo "" fi - echo "> **Next step:** Update tests on this branch to reflect the changes below, then mark both PRs ready for review." + echo "> **Next step:** Update tests on this branch to reflect the changes below, then mark this PR ready for review and merge to master. Back-merge to develop (bumping each module to its next dev version) is done manually after the merge." echo "" echo "---" echo "" @@ -374,8 +327,6 @@ jobs: cat /tmp/full-changelog.md } >> $GITHUB_STEP_SUMMARY - # Commit clean release versions (no .dev) and push the release branch. - # This is the commit the master PR targets. - name: Create release branch and commit VERSION bumps run: | BRANCH="${{ steps.repo-version.outputs.branch }}" @@ -401,40 +352,3 @@ jobs: --draft \ --body-file /tmp/pr-body.md \ || echo "PR to master already exists, skipping." - - # Add a second commit on the release branch bumping all modules to - # patch+1 .dev. When the develop PR merges, develop is immediately - # ready for the next development cycle. Must merge master PR first so - # this snapshot commit never lands on master. - - name: Prepare snapshot versions for back-merge - run: | - SNAPSHOT_BRANCH="${{ steps.repo-version.outputs.snapshot_branch }}" - git checkout -b "$SNAPSHOT_BRANCH" - for module_dir in /tmp/release-artifacts/release-data-*/; do - MODULE=$(basename "$module_dir" | sed 's/release-data-//') - NEXT=$(cat "${module_dir}/next-version.txt") - MAJOR=$(echo "$NEXT" | cut -d. -f1) - MINOR=$(echo "$NEXT" | cut -d. -f2) - PATCH=$(echo "$NEXT" | cut -d. -f3) - SNAPSHOT_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1)).dev" - sed -i "s/VERSION = \".*\"/VERSION = \"${SNAPSHOT_VERSION}\"/" ${MODULE}/${MODULE}/version.py - done - git add -A - if test "$(git status --porcelain=v1 2>/dev/null | wc -l)" -gt "0"; then - git commit -m "chore: prepare next snapshot versions after ${{ steps.repo-version.outputs.next_tag }}" - else - echo "No snapshot version changes to commit." - fi - git push origin "$SNAPSHOT_BRANCH" --force - - - name: Open draft PR to develop - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh pr create \ - --base develop \ - --head "${{ steps.repo-version.outputs.snapshot_branch }}" \ - --title "Release ${{ steps.repo-version.outputs.next_tag }} back-merge to develop" \ - --draft \ - --body "Back-merge of ${{ steps.repo-version.outputs.next_tag }} into develop. Bumps all modules to next patch .dev for continued development." \ - || echo "PR to develop already exists, skipping." From 757c7b3570bff36d5d03d1b1ccf1d965d141db00 Mon Sep 17 00:00:00 2001 From: darrenccbill <93383166+darrenccbill@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:06:13 +0200 Subject: [PATCH 13/17] Update prepare-release-prs.yml --- .github/workflows/prepare-release-prs.yml | 35 +++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/.github/workflows/prepare-release-prs.yml b/.github/workflows/prepare-release-prs.yml index 4fc07240..17036512 100644 --- a/.github/workflows/prepare-release-prs.yml +++ b/.github/workflows/prepare-release-prs.yml @@ -111,6 +111,15 @@ jobs: fi done + MATCHES=$(find "${MODULE}" -name "${VERSION_FILE}" -type f) + COUNT=$(printf '%s\n' "$MATCHES" | grep -c .) + if [ "$COUNT" -ne 1 ]; then + echo "::error::Expected exactly one '${VERSION_FILE}' under '${MODULE}/', found ${COUNT}" >&2 + printf '%s\n' "$MATCHES" >&2 + exit 1 + fi + VERSION_PATH="$MATCHES" + NEW_MODULE=$(cat /tmp/${MODULE}-new-module.txt) if [ "$NEW_MODULE" = "true" ]; then CURRENT="none" @@ -130,7 +139,7 @@ jobs: # Read the first semver token from the VERSION file, regardless of the # surrounding syntax, then strip the configured development suffix. - CURRENT=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*' "${MODULE}/${VERSION_FILE}" | head -1) + CURRENT=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*' "$VERSION_PATH" | head -1) BASE="${CURRENT%"$SNAPSHOT_SUFFIX"}" MAJOR=$(echo "$BASE" | cut -d. -f1) MINOR=$(echo "$BASE" | cut -d. -f2) @@ -143,10 +152,11 @@ jobs: esac fi - echo "bump=$BUMP" >> $GITHUB_OUTPUT - echo "version=$NEXT" >> $GITHUB_OUTPUT - echo "current=$CURRENT" >> $GITHUB_OUTPUT - echo "force_major=$FORCE_MAJOR" >> $GITHUB_OUTPUT + echo "bump=$BUMP" >> $GITHUB_OUTPUT + echo "version=$NEXT" >> $GITHUB_OUTPUT + echo "current=$CURRENT" >> $GITHUB_OUTPUT + echo "force_major=$FORCE_MAJOR" >> $GITHUB_OUTPUT + echo "version_path=$VERSION_PATH" >> $GITHUB_OUTPUT - name: Render module changelog markdown run: | @@ -182,11 +192,12 @@ jobs: run: | MODULE="${{ matrix.module }}" mkdir -p /tmp/release-artifacts/${MODULE} - cp /tmp/${MODULE}-changelog.md /tmp/release-artifacts/${MODULE}/changelog.md - echo "${{ steps.compute.outputs.bump }}" > /tmp/release-artifacts/${MODULE}/bump.txt - echo "${{ steps.compute.outputs.version }}" > /tmp/release-artifacts/${MODULE}/next-version.txt - echo "${{ steps.compute.outputs.current }}" > /tmp/release-artifacts/${MODULE}/current-version.txt - echo "${{ steps.compute.outputs.force_major }}" > /tmp/release-artifacts/${MODULE}/force-major.txt + cp /tmp/${MODULE}-changelog.md /tmp/release-artifacts/${MODULE}/changelog.md + echo "${{ steps.compute.outputs.bump }}" > /tmp/release-artifacts/${MODULE}/bump.txt + echo "${{ steps.compute.outputs.version }}" > /tmp/release-artifacts/${MODULE}/next-version.txt + echo "${{ steps.compute.outputs.current }}" > /tmp/release-artifacts/${MODULE}/current-version.txt + echo "${{ steps.compute.outputs.force_major }}" > /tmp/release-artifacts/${MODULE}/force-major.txt + echo "${{ steps.compute.outputs.version_path }}" > /tmp/release-artifacts/${MODULE}/version-path.txt - uses: actions/upload-artifact@v6 with: @@ -256,9 +267,9 @@ jobs: - name: Bump VERSION file for each module run: | for module_dir in /tmp/release-artifacts/release-data-*/; do - MODULE=$(basename "$module_dir" | sed 's/release-data-//') NEXT=$(cat "${module_dir}/next-version.txt") - sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*/${NEXT}/" "${MODULE}/${VERSION_FILE}" + VERSION_PATH=$(cat "${module_dir}/version-path.txt") + sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*/${NEXT}/" "$VERSION_PATH" done - name: Build aggregate changelog From 36a2d76a959b28fd565d70ddef375d9147413816 Mon Sep 17 00:00:00 2001 From: darrenccbill <93383166+darrenccbill@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:11:37 +0200 Subject: [PATCH 14/17] Update prepare-release-prs.yml --- .github/workflows/prepare-release-prs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prepare-release-prs.yml b/.github/workflows/prepare-release-prs.yml index 17036512..e8820587 100644 --- a/.github/workflows/prepare-release-prs.yml +++ b/.github/workflows/prepare-release-prs.yml @@ -11,7 +11,7 @@ name: prepare-release-prs # Change these according to the current repo SDK setup env: - VERSION_FILE: VERSION.py + VERSION_FILE: version.py SNAPSHOT_SUFFIX: .dev on: From af43d1d587b2e19d29a5c99e56ce47337afe2d78 Mon Sep 17 00:00:00 2001 From: darrenccbill <93383166+darrenccbill@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:45:36 +0200 Subject: [PATCH 15/17] Update prepare-release-prs.yml --- .github/workflows/prepare-release-prs.yml | 29 ++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/.github/workflows/prepare-release-prs.yml b/.github/workflows/prepare-release-prs.yml index e8820587..82418415 100644 --- a/.github/workflows/prepare-release-prs.yml +++ b/.github/workflows/prepare-release-prs.yml @@ -3,12 +3,11 @@ name: prepare-release-prs # This workflow: # - Diffs each module's OpenAPI spec (develop vs master) to classify changes # - Computes the next semver version per module and for the repo tag -# - Bumps the VERSION file for every module (clean release versions) +# - Bumps every version reference for each module (clean release versions) # - Opens draft PR (release -> master) with the clean release versions # # If the PR changelog looks wrong, close/delete the release branch and retrigger. - # Change these according to the current repo SDK setup env: VERSION_FILE: version.py @@ -210,7 +209,7 @@ jobs: # - Aggregates per-module artifacts # - Determines the repo-level semver bump (highest module bump wins) # - Computes the next repo tag from the latest semver git tag - # - Bumps the VERSION file for every module + # - Bumps every version reference for each module # - Writes the job summary to the Actions UI # - Commits, pushes the release branch, and opens release draft PR prepare-release: @@ -264,12 +263,26 @@ jobs: echo "bump=$HIGHEST" >> $GITHUB_OUTPUT echo "branch=release/${NEXT_TAG}" >> $GITHUB_OUTPUT - - name: Bump VERSION file for each module + - name: Bump version references for each module run: | for module_dir in /tmp/release-artifacts/release-data-*/; do + MODULE=$(basename "$module_dir" | sed 's/release-data-//') NEXT=$(cat "${module_dir}/next-version.txt") - VERSION_PATH=$(cat "${module_dir}/version-path.txt") - sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*/${NEXT}/" "$VERSION_PATH" + CANONICAL=$(cat "${module_dir}/version-path.txt") + + # Source-of-truth version, read before overwriting the canonical file. + OLD=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*' "$CANONICAL" | head -1) + + sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+[0-9A-Za-z.-]*/${NEXT}/" "$CANONICAL" + + # Replace the exact old version token everywhere else in the module. + # Whole-token boundaries (\b) keep it from matching inside a larger number. + if [ -n "$OLD" ] && [ "$OLD" != "$NEXT" ]; then + OLD_ESC=$(printf '%s' "$OLD" | sed 's/\./\\./g') + grep -rlIF -- "$OLD" "$MODULE" | while IFS= read -r f; do + sed -i -E "s/\b${OLD_ESC}\b/${NEXT}/g" "$f" + done + fi done - name: Build aggregate changelog @@ -338,7 +351,7 @@ jobs: cat /tmp/full-changelog.md } >> $GITHUB_STEP_SUMMARY - - name: Create release branch and commit VERSION bumps + - name: Create release branch and commit version bumps run: | BRANCH="${{ steps.repo-version.outputs.branch }}" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" @@ -348,7 +361,7 @@ jobs: if test "$(git status --porcelain=v1 2>/dev/null | wc -l)" -gt "0"; then git commit -m "chore: bump versions for ${{ steps.repo-version.outputs.next_tag }}" else - echo "No VERSION changes to commit (all modules already at release version)." + echo "No version changes to commit (all modules already at release version)." fi git push origin "$BRANCH" --force From 6b447b774eed8dc0c95da672a418b0556edcb1d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 08:46:44 +0000 Subject: [PATCH 16/17] chore: bump versions for v4.1.0 --- pnap_audit_api/README.md | 2 +- pnap_audit_api/pnap_audit_api/__init__.py | 2 +- pnap_audit_api/pnap_audit_api/api_client.py | 4 ++-- pnap_audit_api/pnap_audit_api/configuration.py | 2 +- pnap_audit_api/pnap_audit_api/version.py | 2 +- pnap_audit_api/pyproject.toml | 2 +- pnap_audit_api/setup.py | 2 +- pnap_bmc_api/README.md | 2 +- pnap_bmc_api/pnap_bmc_api/__init__.py | 2 +- pnap_bmc_api/pnap_bmc_api/api_client.py | 4 ++-- pnap_bmc_api/pnap_bmc_api/configuration.py | 2 +- pnap_bmc_api/pnap_bmc_api/version.py | 2 +- pnap_bmc_api/pyproject.toml | 2 +- pnap_bmc_api/setup.py | 2 +- pnap_invoicing_api/README.md | 2 +- pnap_invoicing_api/pnap_invoicing_api/__init__.py | 2 +- pnap_invoicing_api/pnap_invoicing_api/api_client.py | 4 ++-- pnap_invoicing_api/pnap_invoicing_api/configuration.py | 2 +- pnap_invoicing_api/pnap_invoicing_api/version.py | 2 +- pnap_invoicing_api/pyproject.toml | 2 +- pnap_invoicing_api/setup.py | 2 +- pnap_ip_api/README.md | 2 +- pnap_ip_api/pnap_ip_api/__init__.py | 2 +- pnap_ip_api/pnap_ip_api/api_client.py | 4 ++-- pnap_ip_api/pnap_ip_api/configuration.py | 2 +- pnap_ip_api/pnap_ip_api/version.py | 2 +- pnap_ip_api/pyproject.toml | 2 +- pnap_ip_api/setup.py | 2 +- pnap_location_api/README.md | 2 +- pnap_location_api/pnap_location_api/__init__.py | 2 +- pnap_location_api/pnap_location_api/api_client.py | 4 ++-- pnap_location_api/pnap_location_api/configuration.py | 2 +- pnap_location_api/pnap_location_api/version.py | 2 +- pnap_location_api/pyproject.toml | 2 +- pnap_location_api/setup.py | 2 +- pnap_network_api/README.md | 2 +- pnap_network_api/pnap_network_api/__init__.py | 2 +- pnap_network_api/pnap_network_api/api_client.py | 4 ++-- pnap_network_api/pnap_network_api/configuration.py | 2 +- pnap_network_api/pnap_network_api/version.py | 2 +- pnap_network_api/pyproject.toml | 2 +- pnap_network_api/setup.py | 2 +- pnap_network_storage_api/README.md | 2 +- pnap_network_storage_api/pnap_network_storage_api/__init__.py | 2 +- .../pnap_network_storage_api/api_client.py | 4 ++-- .../pnap_network_storage_api/configuration.py | 2 +- pnap_network_storage_api/pnap_network_storage_api/version.py | 2 +- pnap_network_storage_api/pyproject.toml | 2 +- pnap_network_storage_api/setup.py | 2 +- pnap_payments_api/README.md | 2 +- pnap_payments_api/pnap_payments_api/__init__.py | 2 +- pnap_payments_api/pnap_payments_api/api_client.py | 4 ++-- pnap_payments_api/pnap_payments_api/configuration.py | 2 +- pnap_payments_api/pnap_payments_api/version.py | 2 +- pnap_payments_api/pyproject.toml | 2 +- pnap_payments_api/setup.py | 2 +- pnap_rancher_solution_api/README.md | 2 +- .../pnap_rancher_solution_api/__init__.py | 2 +- .../pnap_rancher_solution_api/api_client.py | 4 ++-- .../pnap_rancher_solution_api/configuration.py | 2 +- .../pnap_rancher_solution_api/version.py | 2 +- pnap_rancher_solution_api/pyproject.toml | 2 +- pnap_rancher_solution_api/setup.py | 2 +- pnap_tag_api/README.md | 2 +- pnap_tag_api/pnap_tag_api/__init__.py | 2 +- pnap_tag_api/pnap_tag_api/api_client.py | 4 ++-- pnap_tag_api/pnap_tag_api/configuration.py | 2 +- pnap_tag_api/pnap_tag_api/version.py | 2 +- pnap_tag_api/pyproject.toml | 2 +- pnap_tag_api/setup.py | 2 +- 70 files changed, 80 insertions(+), 80 deletions(-) diff --git a/pnap_audit_api/README.md b/pnap_audit_api/README.md index 9e60ad63..5a84194c 100644 --- a/pnap_audit_api/README.md +++ b/pnap_audit_api/README.md @@ -12,7 +12,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.0.6.dev +- Package version: 2.0.6 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_audit_api/pnap_audit_api/__init__.py b/pnap_audit_api/pnap_audit_api/__init__.py index 7acfd464..fc44fd57 100644 --- a/pnap_audit_api/pnap_audit_api/__init__.py +++ b/pnap_audit_api/pnap_audit_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.6.dev" +__version__ = "2.0.6" # Define package exports __all__ = [ diff --git a/pnap_audit_api/pnap_audit_api/api_client.py b/pnap_audit_api/pnap_audit_api/api_client.py index d2b3b1c3..7058e9e8 100644 --- a/pnap_audit_api/pnap_audit_api/api_client.py +++ b/pnap_audit_api/pnap_audit_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.6.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.6" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.6.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_audit_api/2.0.6" def __enter__(self): return self diff --git a/pnap_audit_api/pnap_audit_api/configuration.py b/pnap_audit_api/pnap_audit_api/configuration.py index 5f9baff3..533b7698 100644 --- a/pnap_audit_api/pnap_audit_api/configuration.py +++ b/pnap_audit_api/pnap_audit_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.0.6.dev".\ + "SDK Package Version: 2.0.6".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_audit_api/pnap_audit_api/version.py b/pnap_audit_api/pnap_audit_api/version.py index 4a5665b9..95c1a985 100644 --- a/pnap_audit_api/pnap_audit_api/version.py +++ b/pnap_audit_api/pnap_audit_api/version.py @@ -1 +1 @@ -VERSION = "2.0.6.dev" \ No newline at end of file +VERSION = "2.0.6" \ No newline at end of file diff --git a/pnap_audit_api/pyproject.toml b/pnap_audit_api/pyproject.toml index 3f78f63f..b640e777 100644 --- a/pnap_audit_api/pyproject.toml +++ b/pnap_audit_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_audit_api" -version = "2.0.6.dev" +version = "2.0.6" description = "Audit Log API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_audit_api/setup.py b/pnap_audit_api/setup.py index 92d6c911..9aa38471 100644 --- a/pnap_audit_api/setup.py +++ b/pnap_audit_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_audit_api" -VERSION = "2.0.6.dev" +VERSION = "2.0.6" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_bmc_api/README.md b/pnap_bmc_api/README.md index 35548c84..1cdedc01 100644 --- a/pnap_bmc_api/README.md +++ b/pnap_bmc_api/README.md @@ -14,7 +14,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 0.1 -- Package version: 2.3.1.dev +- Package version: 2.4.0 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_bmc_api/pnap_bmc_api/__init__.py b/pnap_bmc_api/pnap_bmc_api/__init__.py index 466cf492..e8de3256 100644 --- a/pnap_bmc_api/pnap_bmc_api/__init__.py +++ b/pnap_bmc_api/pnap_bmc_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.3.1.dev" +__version__ = "2.4.0" # Define package exports __all__ = [ diff --git a/pnap_bmc_api/pnap_bmc_api/api_client.py b/pnap_bmc_api/pnap_bmc_api/api_client.py index 00761238..5ed347ee 100644 --- a/pnap_bmc_api/pnap_bmc_api/api_client.py +++ b/pnap_bmc_api/pnap_bmc_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.3.1.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.4.0" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.3.1.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_bmc_api/2.4.0" def __enter__(self): return self diff --git a/pnap_bmc_api/pnap_bmc_api/configuration.py b/pnap_bmc_api/pnap_bmc_api/configuration.py index bce84199..22ba1362 100644 --- a/pnap_bmc_api/pnap_bmc_api/configuration.py +++ b/pnap_bmc_api/pnap_bmc_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 0.1\n"\ - "SDK Package Version: 2.3.1.dev".\ + "SDK Package Version: 2.4.0".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_bmc_api/pnap_bmc_api/version.py b/pnap_bmc_api/pnap_bmc_api/version.py index 3f62f0ab..a9bda57b 100644 --- a/pnap_bmc_api/pnap_bmc_api/version.py +++ b/pnap_bmc_api/pnap_bmc_api/version.py @@ -1 +1 @@ -VERSION = "2.3.1.dev" \ No newline at end of file +VERSION = "2.4.0" \ No newline at end of file diff --git a/pnap_bmc_api/pyproject.toml b/pnap_bmc_api/pyproject.toml index 9111af04..7636cea9 100644 --- a/pnap_bmc_api/pyproject.toml +++ b/pnap_bmc_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_bmc_api" -version = "2.3.1.dev" +version = "2.4.0" description = "Bare Metal Cloud API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_bmc_api/setup.py b/pnap_bmc_api/setup.py index 1d1bc9fa..8b4e7f07 100644 --- a/pnap_bmc_api/setup.py +++ b/pnap_bmc_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_bmc_api" -VERSION = "2.3.1.dev" +VERSION = "2.4.0" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_invoicing_api/README.md b/pnap_invoicing_api/README.md index 792d6e50..2d1226a8 100644 --- a/pnap_invoicing_api/README.md +++ b/pnap_invoicing_api/README.md @@ -5,7 +5,7 @@ List, fetch and pay invoices with the Invoicing API. This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 1.0.6.dev +- Package version: 1.0.6 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_invoicing_api/pnap_invoicing_api/__init__.py b/pnap_invoicing_api/pnap_invoicing_api/__init__.py index 5caba34a..c401a70f 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/__init__.py +++ b/pnap_invoicing_api/pnap_invoicing_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "1.0.6.dev" +__version__ = "1.0.6" # Define package exports __all__ = [ diff --git a/pnap_invoicing_api/pnap_invoicing_api/api_client.py b/pnap_invoicing_api/pnap_invoicing_api/api_client.py index fd352a22..b5ce8351 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/api_client.py +++ b/pnap_invoicing_api/pnap_invoicing_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.6.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.6" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.6.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_invoicing_api/1.0.6" def __enter__(self): return self diff --git a/pnap_invoicing_api/pnap_invoicing_api/configuration.py b/pnap_invoicing_api/pnap_invoicing_api/configuration.py index 6b7341a1..728e60e0 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/configuration.py +++ b/pnap_invoicing_api/pnap_invoicing_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 1.0.6.dev".\ + "SDK Package Version: 1.0.6".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_invoicing_api/pnap_invoicing_api/version.py b/pnap_invoicing_api/pnap_invoicing_api/version.py index 2840dec4..69d5902c 100644 --- a/pnap_invoicing_api/pnap_invoicing_api/version.py +++ b/pnap_invoicing_api/pnap_invoicing_api/version.py @@ -1 +1 @@ -VERSION = "1.0.6.dev" \ No newline at end of file +VERSION = "1.0.6" \ No newline at end of file diff --git a/pnap_invoicing_api/pyproject.toml b/pnap_invoicing_api/pyproject.toml index 394adb2a..397ba1c2 100644 --- a/pnap_invoicing_api/pyproject.toml +++ b/pnap_invoicing_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_invoicing_api" -version = "1.0.6.dev" +version = "1.0.6" description = "Invoicing API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_invoicing_api/setup.py b/pnap_invoicing_api/setup.py index adc5a156..3b43e95a 100644 --- a/pnap_invoicing_api/setup.py +++ b/pnap_invoicing_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_invoicing_api" -VERSION = "1.0.6.dev" +VERSION = "1.0.6" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_ip_api/README.md b/pnap_ip_api/README.md index 17c79012..87fe48d0 100644 --- a/pnap_ip_api/README.md +++ b/pnap_ip_api/README.md @@ -13,7 +13,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.2.1.dev +- Package version: 2.2.1 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_ip_api/pnap_ip_api/__init__.py b/pnap_ip_api/pnap_ip_api/__init__.py index 6a4cb3e9..6052c293 100644 --- a/pnap_ip_api/pnap_ip_api/__init__.py +++ b/pnap_ip_api/pnap_ip_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.2.1.dev" +__version__ = "2.2.1" # Define package exports __all__ = [ diff --git a/pnap_ip_api/pnap_ip_api/api_client.py b/pnap_ip_api/pnap_ip_api/api_client.py index 1e37c90b..cbf5fc93 100644 --- a/pnap_ip_api/pnap_ip_api/api_client.py +++ b/pnap_ip_api/pnap_ip_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.1.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.1" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.1.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_ip_api/2.2.1" def __enter__(self): return self diff --git a/pnap_ip_api/pnap_ip_api/configuration.py b/pnap_ip_api/pnap_ip_api/configuration.py index b6e27640..475b9f8b 100644 --- a/pnap_ip_api/pnap_ip_api/configuration.py +++ b/pnap_ip_api/pnap_ip_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.2.1.dev".\ + "SDK Package Version: 2.2.1".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_ip_api/pnap_ip_api/version.py b/pnap_ip_api/pnap_ip_api/version.py index 300cc7b8..d5cf5185 100644 --- a/pnap_ip_api/pnap_ip_api/version.py +++ b/pnap_ip_api/pnap_ip_api/version.py @@ -1 +1 @@ -VERSION = "2.2.1.dev" \ No newline at end of file +VERSION = "2.2.1" \ No newline at end of file diff --git a/pnap_ip_api/pyproject.toml b/pnap_ip_api/pyproject.toml index c70d07f2..45ebb9d9 100644 --- a/pnap_ip_api/pyproject.toml +++ b/pnap_ip_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_ip_api" -version = "2.2.1.dev" +version = "2.2.1" description = "IP Addresses API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_ip_api/setup.py b/pnap_ip_api/setup.py index 66c70e12..d67df33c 100644 --- a/pnap_ip_api/setup.py +++ b/pnap_ip_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_ip_api" -VERSION = "2.2.1.dev" +VERSION = "2.2.1" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_location_api/README.md b/pnap_location_api/README.md index d689be7f..779ba009 100644 --- a/pnap_location_api/README.md +++ b/pnap_location_api/README.md @@ -4,7 +4,7 @@ No description provided (generated by Openapi Generator https://github.com/opena This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 3.0.1.dev +- Package version: 3.0.1 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com](https://phoenixnap.com) diff --git a/pnap_location_api/pnap_location_api/__init__.py b/pnap_location_api/pnap_location_api/__init__.py index 5cef386e..c4d084ad 100644 --- a/pnap_location_api/pnap_location_api/__init__.py +++ b/pnap_location_api/pnap_location_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "3.0.1.dev" +__version__ = "3.0.1" # Define package exports __all__ = [ diff --git a/pnap_location_api/pnap_location_api/api_client.py b/pnap_location_api/pnap_location_api/api_client.py index d6c46365..b0c17e0b 100644 --- a/pnap_location_api/pnap_location_api/api_client.py +++ b/pnap_location_api/pnap_location_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.1.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.1" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.1.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_location_api/3.0.1" def __enter__(self): return self diff --git a/pnap_location_api/pnap_location_api/configuration.py b/pnap_location_api/pnap_location_api/configuration.py index 587834a6..5b470f76 100644 --- a/pnap_location_api/pnap_location_api/configuration.py +++ b/pnap_location_api/pnap_location_api/configuration.py @@ -505,7 +505,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 3.0.1.dev".\ + "SDK Package Version: 3.0.1".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_location_api/pnap_location_api/version.py b/pnap_location_api/pnap_location_api/version.py index fcbc8b3e..2e42105e 100644 --- a/pnap_location_api/pnap_location_api/version.py +++ b/pnap_location_api/pnap_location_api/version.py @@ -1 +1 @@ -VERSION = "3.0.1.dev" \ No newline at end of file +VERSION = "3.0.1" \ No newline at end of file diff --git a/pnap_location_api/pyproject.toml b/pnap_location_api/pyproject.toml index 15a3ef83..1a94c1ea 100644 --- a/pnap_location_api/pyproject.toml +++ b/pnap_location_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_location_api" -version = "3.0.1.dev" +version = "3.0.1" description = "Locations API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_location_api/setup.py b/pnap_location_api/setup.py index 622f1282..b3707d23 100644 --- a/pnap_location_api/setup.py +++ b/pnap_location_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_location_api" -VERSION = "3.0.1.dev" +VERSION = "3.0.1" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_network_api/README.md b/pnap_network_api/README.md index a194d455..03d6ef7e 100644 --- a/pnap_network_api/README.md +++ b/pnap_network_api/README.md @@ -16,7 +16,7 @@ Helpful knowledge base articles are available for This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 3.1.1.dev +- Package version: 3.1.1 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_network_api/pnap_network_api/__init__.py b/pnap_network_api/pnap_network_api/__init__.py index 64ed6b01..a40a9acf 100644 --- a/pnap_network_api/pnap_network_api/__init__.py +++ b/pnap_network_api/pnap_network_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "3.1.1.dev" +__version__ = "3.1.1" # Define package exports __all__ = [ diff --git a/pnap_network_api/pnap_network_api/api_client.py b/pnap_network_api/pnap_network_api/api_client.py index 62a65498..3c04f825 100644 --- a/pnap_network_api/pnap_network_api/api_client.py +++ b/pnap_network_api/pnap_network_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.1.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.1" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.1.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_api/3.1.1" def __enter__(self): return self diff --git a/pnap_network_api/pnap_network_api/configuration.py b/pnap_network_api/pnap_network_api/configuration.py index d7e66ca5..9cf451aa 100644 --- a/pnap_network_api/pnap_network_api/configuration.py +++ b/pnap_network_api/pnap_network_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 3.1.1.dev".\ + "SDK Package Version: 3.1.1".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_network_api/pnap_network_api/version.py b/pnap_network_api/pnap_network_api/version.py index 6da3e19a..5a61a770 100644 --- a/pnap_network_api/pnap_network_api/version.py +++ b/pnap_network_api/pnap_network_api/version.py @@ -1 +1 @@ -VERSION = "3.1.1.dev" \ No newline at end of file +VERSION = "3.1.1" \ No newline at end of file diff --git a/pnap_network_api/pyproject.toml b/pnap_network_api/pyproject.toml index fdea0613..b71c1dfd 100644 --- a/pnap_network_api/pyproject.toml +++ b/pnap_network_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_network_api" -version = "3.1.1.dev" +version = "3.1.1" description = "Networks API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_network_api/setup.py b/pnap_network_api/setup.py index 61cd6eca..cae7210b 100644 --- a/pnap_network_api/setup.py +++ b/pnap_network_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_network_api" -VERSION = "3.1.1.dev" +VERSION = "3.1.1" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_network_storage_api/README.md b/pnap_network_storage_api/README.md index aed34e9a..cb32f91d 100644 --- a/pnap_network_storage_api/README.md +++ b/pnap_network_storage_api/README.md @@ -12,7 +12,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.0.6.dev +- Package version: 2.0.6 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_network_storage_api/pnap_network_storage_api/__init__.py b/pnap_network_storage_api/pnap_network_storage_api/__init__.py index 745367f2..a80a92d1 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/__init__.py +++ b/pnap_network_storage_api/pnap_network_storage_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.6.dev" +__version__ = "2.0.6" # Define package exports __all__ = [ diff --git a/pnap_network_storage_api/pnap_network_storage_api/api_client.py b/pnap_network_storage_api/pnap_network_storage_api/api_client.py index 14f56c15..9c026dbb 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/api_client.py +++ b/pnap_network_storage_api/pnap_network_storage_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.6.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.6" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.6.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_network_storage_api/2.0.6" def __enter__(self): return self diff --git a/pnap_network_storage_api/pnap_network_storage_api/configuration.py b/pnap_network_storage_api/pnap_network_storage_api/configuration.py index 23946ce6..c685fa53 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/configuration.py +++ b/pnap_network_storage_api/pnap_network_storage_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.0.6.dev".\ + "SDK Package Version: 2.0.6".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_network_storage_api/pnap_network_storage_api/version.py b/pnap_network_storage_api/pnap_network_storage_api/version.py index 4a5665b9..95c1a985 100644 --- a/pnap_network_storage_api/pnap_network_storage_api/version.py +++ b/pnap_network_storage_api/pnap_network_storage_api/version.py @@ -1 +1 @@ -VERSION = "2.0.6.dev" \ No newline at end of file +VERSION = "2.0.6" \ No newline at end of file diff --git a/pnap_network_storage_api/pyproject.toml b/pnap_network_storage_api/pyproject.toml index 25f7d6ce..31a2225e 100644 --- a/pnap_network_storage_api/pyproject.toml +++ b/pnap_network_storage_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_network_storage_api" -version = "2.0.6.dev" +version = "2.0.6" description = "Network Storage API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_network_storage_api/setup.py b/pnap_network_storage_api/setup.py index 4a01df89..a2305ae1 100644 --- a/pnap_network_storage_api/setup.py +++ b/pnap_network_storage_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_network_storage_api" -VERSION = "2.0.6.dev" +VERSION = "2.0.6" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_payments_api/README.md b/pnap_payments_api/README.md index 03e62865..0d0db5f0 100644 --- a/pnap_payments_api/README.md +++ b/pnap_payments_api/README.md @@ -4,7 +4,7 @@ Payments API are currently designed to fetch Transactions only. This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 0.1 -- Package version: 1.0.6.dev +- Package version: 1.0.6 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_payments_api/pnap_payments_api/__init__.py b/pnap_payments_api/pnap_payments_api/__init__.py index 109aa780..fbaa7ef6 100644 --- a/pnap_payments_api/pnap_payments_api/__init__.py +++ b/pnap_payments_api/pnap_payments_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "1.0.6.dev" +__version__ = "1.0.6" # Define package exports __all__ = [ diff --git a/pnap_payments_api/pnap_payments_api/api_client.py b/pnap_payments_api/pnap_payments_api/api_client.py index 775fddcd..671dd2d3 100644 --- a/pnap_payments_api/pnap_payments_api/api_client.py +++ b/pnap_payments_api/pnap_payments_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.6.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.6" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.6.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_payments_api/1.0.6" def __enter__(self): return self diff --git a/pnap_payments_api/pnap_payments_api/configuration.py b/pnap_payments_api/pnap_payments_api/configuration.py index 239a1a4d..ba67981c 100644 --- a/pnap_payments_api/pnap_payments_api/configuration.py +++ b/pnap_payments_api/pnap_payments_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 0.1\n"\ - "SDK Package Version: 1.0.6.dev".\ + "SDK Package Version: 1.0.6".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_payments_api/pnap_payments_api/version.py b/pnap_payments_api/pnap_payments_api/version.py index 2840dec4..69d5902c 100644 --- a/pnap_payments_api/pnap_payments_api/version.py +++ b/pnap_payments_api/pnap_payments_api/version.py @@ -1 +1 @@ -VERSION = "1.0.6.dev" \ No newline at end of file +VERSION = "1.0.6" \ No newline at end of file diff --git a/pnap_payments_api/pyproject.toml b/pnap_payments_api/pyproject.toml index 4dbd38d4..aaadaecd 100644 --- a/pnap_payments_api/pyproject.toml +++ b/pnap_payments_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_payments_api" -version = "1.0.6.dev" +version = "1.0.6" description = "Payments API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_payments_api/setup.py b/pnap_payments_api/setup.py index 0a06e5d9..04bb5560 100644 --- a/pnap_payments_api/setup.py +++ b/pnap_payments_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_payments_api" -VERSION = "1.0.6.dev" +VERSION = "1.0.6" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_rancher_solution_api/README.md b/pnap_rancher_solution_api/README.md index 35a12bd1..6975346f 100644 --- a/pnap_rancher_solution_api/README.md +++ b/pnap_rancher_solution_api/README.md @@ -13,7 +13,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 0.1 -- Package version: 2.0.6.dev +- Package version: 2.0.6 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py index 57332bd7..ff4b4b73 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.6.dev" +__version__ = "2.0.6" # Define package exports __all__ = [ diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py index a01e04d8..b09e41be 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.6.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.6" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.6.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_rancher_solution_api/2.0.6" def __enter__(self): return self diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py index dbdae67c..6f5f5fe2 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 0.1\n"\ - "SDK Package Version: 2.0.6.dev".\ + "SDK Package Version: 2.0.6".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py b/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py index 4a5665b9..95c1a985 100644 --- a/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py +++ b/pnap_rancher_solution_api/pnap_rancher_solution_api/version.py @@ -1 +1 @@ -VERSION = "2.0.6.dev" \ No newline at end of file +VERSION = "2.0.6" \ No newline at end of file diff --git a/pnap_rancher_solution_api/pyproject.toml b/pnap_rancher_solution_api/pyproject.toml index 9660843f..6d93edd4 100644 --- a/pnap_rancher_solution_api/pyproject.toml +++ b/pnap_rancher_solution_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_rancher_solution_api" -version = "2.0.6.dev" +version = "2.0.6" description = "Rancher Solution API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_rancher_solution_api/setup.py b/pnap_rancher_solution_api/setup.py index eda867ab..d2476b87 100644 --- a/pnap_rancher_solution_api/setup.py +++ b/pnap_rancher_solution_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_rancher_solution_api" -VERSION = "2.0.6.dev" +VERSION = "2.0.6" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", diff --git a/pnap_tag_api/README.md b/pnap_tag_api/README.md index b03a8371..ffb7af5b 100644 --- a/pnap_tag_api/README.md +++ b/pnap_tag_api/README.md @@ -14,7 +14,7 @@ Knowledge base articles to help you can be found This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0 -- Package version: 2.0.6.dev +- Package version: 2.0.6 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://phoenixnap.com/](https://phoenixnap.com/) diff --git a/pnap_tag_api/pnap_tag_api/__init__.py b/pnap_tag_api/pnap_tag_api/__init__.py index a50b1981..cd94adf1 100644 --- a/pnap_tag_api/pnap_tag_api/__init__.py +++ b/pnap_tag_api/pnap_tag_api/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "2.0.6.dev" +__version__ = "2.0.6" # Define package exports __all__ = [ diff --git a/pnap_tag_api/pnap_tag_api/api_client.py b/pnap_tag_api/pnap_tag_api/api_client.py index b51b0b74..759f5572 100644 --- a/pnap_tag_api/pnap_tag_api/api_client.py +++ b/pnap_tag_api/pnap_tag_api/api_client.py @@ -91,11 +91,11 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.6.dev" + self.user_agent = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.6" self.client_side_validation = configuration.client_side_validation # Set default X-Powered-By. - self.powered_by = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.6.dev" + self.powered_by = f"PNAP-python-sdk-bmc/pnap_tag_api/2.0.6" def __enter__(self): return self diff --git a/pnap_tag_api/pnap_tag_api/configuration.py b/pnap_tag_api/pnap_tag_api/configuration.py index 0d8ea8ed..4b69d05e 100644 --- a/pnap_tag_api/pnap_tag_api/configuration.py +++ b/pnap_tag_api/pnap_tag_api/configuration.py @@ -514,7 +514,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0\n"\ - "SDK Package Version: 2.0.6.dev".\ + "SDK Package Version: 2.0.6".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/pnap_tag_api/pnap_tag_api/version.py b/pnap_tag_api/pnap_tag_api/version.py index 4a5665b9..95c1a985 100644 --- a/pnap_tag_api/pnap_tag_api/version.py +++ b/pnap_tag_api/pnap_tag_api/version.py @@ -1 +1 @@ -VERSION = "2.0.6.dev" \ No newline at end of file +VERSION = "2.0.6" \ No newline at end of file diff --git a/pnap_tag_api/pyproject.toml b/pnap_tag_api/pyproject.toml index 4394bc8a..8dc9af90 100644 --- a/pnap_tag_api/pyproject.toml +++ b/pnap_tag_api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pnap_tag_api" -version = "2.0.6.dev" +version = "2.0.6" description = "Tags API" authors = [ {name = "PhoenixNAP Team",email = "support@phoenixnap.com"}, diff --git a/pnap_tag_api/setup.py b/pnap_tag_api/setup.py index db019dd0..ff98eff5 100644 --- a/pnap_tag_api/setup.py +++ b/pnap_tag_api/setup.py @@ -20,7 +20,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "pnap_tag_api" -VERSION = "2.0.6.dev" +VERSION = "2.0.6" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0", From 832b29c0d1d0f0657ab21432721e8f908f81480e Mon Sep 17 00:00:00 2001 From: darrenc Date: Wed, 10 Jun 2026 11:18:56 +0200 Subject: [PATCH 17/17] test updates --- .../payloads/bmcapi/servers/servers_get.json | 20 +++++++----- ...rvers_put_os_configuration_ipxe_by_id.json | 31 +++++++++++++++++++ tests/pnap_bmc_api_test.py | 24 ++++++++++++-- 3 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 tests/payloads/bmcapi/servers/servers_put_os_configuration_ipxe_by_id.json diff --git a/tests/payloads/bmcapi/servers/servers_get.json b/tests/payloads/bmcapi/servers/servers_get.json index 8a70975c..04fcaaa6 100644 --- a/tests/payloads/bmcapi/servers/servers_get.json +++ b/tests/payloads/bmcapi/servers/servers_get.json @@ -1,13 +1,17 @@ { "request": { - "method": "GET", - "path": "/bmc/v1/servers", - "queryStringParameters": [ - { - "name": "tag", - "values": ["env.dev"] - } - ] + "method": "GET", + "path": "/bmc/v1/servers", + "queryStringParameters": [ + { + "name": "tag", + "values": ["env.dev"] + }, + { + "name": "location", + "values": ["PHX"] + } + ] }, "response": { "statusCode": 200, diff --git a/tests/payloads/bmcapi/servers/servers_put_os_configuration_ipxe_by_id.json b/tests/payloads/bmcapi/servers/servers_put_os_configuration_ipxe_by_id.json new file mode 100644 index 00000000..cafb2b50 --- /dev/null +++ b/tests/payloads/bmcapi/servers/servers_put_os_configuration_ipxe_by_id.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "PUT", + "path": "/bmc/v1/servers/{id}/os-configuration/ipxe", + "pathParameters": { + "id": ["e6afba51-7de8-4080-83ab-0f915570659c"] + }, + "body": { + "type": "JSON", + "json": { + "url": "https://example.com/boot.ipxe", + "nativeVlanConfiguration": { + "vlanId": 10, + "staticDhcpAddressV4": "185.74.213.56" + } + }, + "matchType": "STRICT" + } + }, + "response": { + "statusCode": 200, + "body": { + "url": "https://example.com/boot.ipxe", + "nativeVlanConfiguration": { + "vlanId": 10, + "staticDhcpAddressV4": "185.74.213.56", + "status": "assigned" + } + } + } +} \ No newline at end of file diff --git a/tests/pnap_bmc_api_test.py b/tests/pnap_bmc_api_test.py index b1d3a6db..89cef0b1 100644 --- a/tests/pnap_bmc_api_test.py +++ b/tests/pnap_bmc_api_test.py @@ -20,6 +20,7 @@ from pnap_bmc_api.models.server_ip_block import ServerIpBlock from pnap_bmc_api.models.server_private_network import ServerPrivateNetwork from pnap_bmc_api.models.server_public_network import ServerPublicNetwork +from pnap_bmc_api.models.os_configuration_ipxe import OsConfigurationIPXE from pnap_bmc_api.models.tag_assignment_request import TagAssignmentRequest from pnap_bmc_api.models.quota_edit_limit_request import QuotaEditLimitRequest from pnap_bmc_api.models.server import Server @@ -185,11 +186,11 @@ def test_get_servers(self): # Setting up expectation request, response = TestUtils.generate_payloads_from('bmcapi/servers/servers_get') expectation_id = TestUtils.setup_expectation(request, response, 1) - + api_instance = servers_api.ServersApi(self.api_client) opts = TestUtils.generate_query_params(request) - result = api_instance.servers_get(tag=[opts['tag']]) + result = api_instance.servers_get(tag=[opts['tag']], location=[opts['location']]) # Parsing time for comparison response['body'][0]['provisionedOn'] = parse(response['body'][0]['provisionedOn']) @@ -510,6 +511,25 @@ def test_server_delete_public_network(self): self.verify_called_once(expectation_id) + + def test_server_put_os_configuration_ipxe_by_id(self): + # Setting up expectation + request, response = TestUtils.generate_payloads_from('bmcapi/servers/servers_put_os_configuration_ipxe_by_id') + expectation_id = TestUtils.setup_expectation(request, response, 1) + + api_instance = servers_api.ServersApi(self.api_client) + server_id = TestUtils.extract_id_from(request) + os_configuration_ipxe = OsConfigurationIPXE(**TestUtils.extract_request_body(request)) + + result = api_instance.servers_server_id_os_configuration_ipxe_put(server_id, os_configuration_ipxe=os_configuration_ipxe) + + response_dict = OsConfigurationIPXE.from_dict(response['body']) + result_dict = OsConfigurationIPXE.from_dict(result) + + self.assertEqual(response_dict, result_dict) + + self.verify_called_once(expectation_id) + def test_server_put_tags_by_id(self): # Setting up expectation request, response = TestUtils.generate_payloads_from('bmcapi/servers/servers_put_tags_by_id')