| is_name |
bool |
@@ -1329,6 +1648,2131 @@ File-level Extensions
+
+
fits/api/mvm/v1/location.proto
Top
+
+
+
+
+ Location
+ Location is the definition of an available datacenter location for MVM instances.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ Uuid of this location |
+
+
+
+ | title |
+ string |
+ |
+ title of the location |
+
+
+
+
+
+
+
+
+
+ LocationServiceListRequest
+ LocationServiceListRequest is the request payload for a location list request.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | tenant |
+ string |
+ |
+ Tenant to list available locations for |
+
+
+
+
+
+
+
+
+
+ LocationServiceListResponse
+ LocationServiceListResponse is the response payload for a location list request.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | locations |
+ Location |
+ repeated |
+ The available locations |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LocationService
+ LocationService lists datacenter locations available for managed VM (MVM) instances, scoped per tenant.
+
+
+
+
+
+
+
fits/api/mvm/v1/vlan.proto
Top
+
+
+
+
+ VLAN
+ VLAN is a VLAN that a MVM can be connected to.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ Uuid of this VLAN |
+
+
+
+ | vlan_id |
+ int32 |
+ |
+ Id of this VLAN
+This is not a foreign key, this is the actual ID of the VLAN the network interface is attached to. |
+
+
+
+ | subnet_title |
+ string |
+ |
+ Title of the subnet this VLAN belongs to |
+
+
+
+ | subnet_cidr |
+ string |
+ |
+ CIDR of the subnet this VLAN belongs to |
+
+
+
+ | location_uuid |
+ string |
+ optional |
+ TODO instead of the pod title, could we have the location_uuid? |
+
+
+
+ | stage_type_uuid |
+ string |
+ |
+ TODO: instead of a stage type, this should be mapped to a project.
+TODO: this would have to be re-mapped in the customer onboarding
+Uuid of the stage type of this VLAN |
+
+
+
+ | tenant |
+ string |
+ |
+ Tenant this VLAN belongs to. |
+
+
+
+
+
+
+
+
+
+ VLANServiceListRequest
+ VLANServiceListRequest is the request payload for a VLAN list request.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | tenant |
+ string |
+ |
+ Tenant to list available VLANs for
+TODO should be filtered by project instead, see https://github.com/fi-ts/fco-apiserver/issues/39 |
+
+
+
+
+
+
+
+
+
+ VLANServiceListResponse
+ VLANServiceListResponse is the response payload for a VLAN list request
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | vlans |
+ VLAN |
+ repeated |
+ The available VLANs |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VLANService
+ VLANService lists VLANs available for managed VM (MVM) instances.
+
+
+
+
+
+
+
fits/api/mvm/v1/mvm.proto
Top
+
+
+
+
+
+ ContactChange is the payload for changing a MVM's contact person.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | contact_uuid |
+ string |
+ |
+ UUID of the new contact. |
+
+
+
+
+
+
+
+
+
+ LinuxDetails
+ Linux-specific MVM details.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | disks |
+ LinuxDisk |
+ repeated |
+ Disks configured on the Linux MVM. |
+
+
+
+ | ldap_uuid |
+ string |
+ |
+ UUID of the LDAP directory the MVM is integrated with. |
+
+
+
+ | ldap_fqdn |
+ string |
+ |
+ Linux-specific FQDN, derived from the name at creation or generated by the backend. |
+
+
+
+
+
+
+
+
+
+ LinuxDisk
+ Disk configuration for a Linux MVM. See DiskType for the kinds of disks
(os, system, data) and their lifecycle rules.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ optional |
+ UUID of the disk; set for existing disks, unset for new ones. |
+
+
+
+ | label |
+ string |
+ |
+ Label (name) of the disk. |
+
+
+
+ | auto_extend |
+ bool |
+ |
+ Whether the disk grows automatically when space runs low. |
+
+
+
+ | size |
+ uint64 |
+ optional |
+ Size of the disk in GB; defaults to 50 when unset. |
+
+
+
+ | mount_point |
+ string |
+ optional |
+ Mount point (e.g. "/data"). Fixed to "/appdata" for the system disk;
+free-form for data disks. |
+
+
+
+ | disk_type |
+ DiskType |
+ optional |
+ Kind of the disk; determines which operations are allowed on it.
+Provided by the client in create/add requests and populated by the
+API in responses.
+TODO: talk to FCE that we will provide the disk type in create/add
+requests. |
+
+
+
+
+
+
+
+
+
+ MVMServiceAddDiskRequest
+ Request to order an additional data disk for a MVM.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM to attach the disk to. |
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+ | linux |
+ LinuxDisk |
+ |
+ Linux data disk. |
+
+
+
+ | windows |
+ WindowsDisk |
+ |
+ Windows data disk. |
+
+
+
+
+
+
+
+
+
+ MVMServiceAddDiskResponse
+ Response for AddDisk.
+
+
+
+
+
+ MVMServiceAddNetworkInterfaceRequest
+ Request to order an additional network interface for a MVM.
Nulink treats interface and IP as a 1:1 relation; move and delete
operate on the interface_uuid.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM to attach the interface to. |
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+
+
+
+
+
+
+ MVMServiceAddNetworkInterfaceResponse
+ Response for AddNetworkInterface.
+
+
+
+
+
+ MVMServiceCreateLinuxRequest
+ Linux-specific create request parts.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | ldap_uuid |
+ string |
+ |
+ UUID of the LDAP directory the MVM should integrate with. |
+
+
+
+ | disks |
+ LinuxDisk |
+ repeated |
+ Disks for the Linux MVM, excluding the OS disk; must contain exactly
+one system disk plus any number of data disks (see DiskType). |
+
+
+
+
+
+
+
+
+
+ MVMServiceCreateRequest
+ Request to create a new MVM instance.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | project_uuid |
+ string |
+ |
+ UUID of the project this MVM belongs to. |
+
+
+
+ | name |
+ string |
+ optional |
+ Optional name; the FQDN is derived from it. |
+
+
+
+ | os_uuid |
+ string |
+ |
+ UUID of the operating system image to install. |
+
+
+
+ | vlan_uuid |
+ string |
+ |
+ UUID of the VLAN network to attach the MVM to. |
+
+
+
+ | location_uuid |
+ string |
+ |
+ UUID of the datacenter location; the MVM is scheduled into one data center within it. |
+
+
+
+ | contact_uuid |
+ string |
+ |
+ TODO: Contact UUID – open discussion with FCN; may become a dedicated /contact endpoint. |
+
+
+
+ | cpu |
+ uint32 |
+ |
+ Number of CPU cores. |
+
+
+
+ | ram |
+ uint32 |
+ |
+ RAM in GB. Must be a power of 2. |
+
+
+
+ | order_number |
+ string |
+ |
+ Internal reference number provided by the user, e.g. a ticket ID.
+TODO: can this be optional? |
+
+
+
+ | labels |
+ fits.api.v1.Labels |
+ |
+ Optional key-value labels for accounting purposes.
+(e.g. contract number, transaction number, technical key, accounting key). |
+
+
+
+ | backup |
+ bool |
+ |
+ Whether backup is enabled. |
+
+
+
+ | availability |
+ Availability |
+ |
+ Availability level. |
+
+
+
+ | serviceclass |
+ ServiceClass |
+ |
+ Service class; only certain combinations with availability are valid. |
+
+
+
+ | windows |
+ MVMServiceCreateWindowsRequest |
+ |
+ Windows-specific settings (domain + disk). |
+
+
+
+ | linux |
+ MVMServiceCreateLinuxRequest |
+ |
+ Linux-specific settings (LDAP + disk). |
+
+
+
+
+
+
+
+
+
+ MVMServiceCreateResponse
+ Response for Create; an empty response means the MVM was accepted.
+
+
+
+
+
+ MVMServiceCreateWindowsRequest
+ Windows-specific create request parts.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | domain_uuid |
+ string |
+ |
+ UUID of the Windows domain the MVM should join. |
+
+
+
+ | disks |
+ WindowsDisk |
+ repeated |
+ Disks for the Windows MVM, excluding the OS disk; must contain exactly
+one system disk plus any number of data disks (see DiskType). |
+
+
+
+
+
+
+
+
+
+ MVMServiceDeleteDiskRequest
+ Request to cancel a data disk; OS and system disks are rejected by the
upstream.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM the disk belongs to. |
+
+
+
+ | disk_uuid |
+ string |
+ |
+ UUID of the disk to cancel. |
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+
+
+
+
+
+
+ MVMServiceDeleteDiskResponse
+ Response for DeleteDisk.
+
+
+
+
+
+ MVMServiceDeleteNetworkInterfaceRequest
+ Request to delete a network interface from a MVM.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM the interface belongs to. |
+
+
+
+ | interface_uuid |
+ string |
+ |
+ UUID of the network interface holding the IP. |
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+
+
+
+
+
+
+ MVMServiceDeleteNetworkInterfaceResponse
+ Response for DeleteNetworkInterface.
+
+
+
+
+
+ MVMServiceDeleteRequest
+ Request to cancel a MVM instance.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM to delete. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+
+
+
+
+
+
+ MVMServiceDeleteResponse
+ Response for Delete; an empty response means the cancellation was accepted.
+
+
+
+
+
+ MVMServiceGetRequest
+ Request to get a MVM by UUID.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ optional |
+ UUID of the MVM. |
+
+
+
+ | tenant |
+ string |
+ |
+ Tenant of the MVM. |
+
+
+
+
+
+
+
+
+
+ MVMServiceGetResponse
+ Response containing the requested MVM.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | mvm |
+ ManagedVM |
+ |
+ The MVM. |
+
+
+
+
+
+
+
+
+
+ MVMServiceListRequest
+ Request to list MVMs.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | tenant |
+ string |
+ optional |
+ Tenant of the MVMs. |
+
+
+
+
+
+
+
+
+
+ MVMServiceListResponse
+ Response containing the list of MVMs.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | mvms |
+ ManagedVM |
+ repeated |
+ The MVM instances. |
+
+
+
+
+
+
+
+
+
+ MVMServiceMoveNetworkInterfaceRequest
+ Request to move a network interface from one MVM to another.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM the interface currently belongs to. |
+
+
+
+ | interface_uuid |
+ string |
+ |
+ UUID of the network interface holding the IP. |
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+ | target_mvm_uuid |
+ string |
+ |
+ UUID of the MVM to move the interface to. |
+
+
+
+
+
+
+
+
+
+ MVMServiceMoveNetworkInterfaceResponse
+ Response for MoveNetworkInterface.
+
+
+
+
+
+ MVMServiceUpdateDiskRequest
+ Request to change an existing disk; only size and auto-extend are
mutable (see DiskType for applicability per disk kind).
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM the disk belongs to. |
+
+
+
+ | disk_uuid |
+ string |
+ |
+ UUID of the disk to change. |
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+ | auto_extend |
+ bool |
+ optional |
+ New auto-extend behavior; unset keeps the current value. |
+
+
+
+ | size |
+ uint64 |
+ optional |
+ New size of the disk in GB; unset keeps the current value. |
+
+
+
+
+
+
+
+
+
+ MVMServiceUpdateDiskResponse
+ Response for UpdateDisk.
+
+
+
+
+
+ MVMServiceUpdateRequest
+ Request to change a mutable property of an existing MVM.
Exactly one action must be set; each maps onto its own upstream endpoint.
TODO: the oneof mirrors the upstream constraint (nulink has one endpoint per
action); combined changes would need
server-side fan-out without rollback.
TODO: clarify async semantics — this is a queued "request to update", not an
immediate update (e.g. disk changes are applied overnight). Consider
renaming to reflect that.
TODO: differentiate between fire-and-forget and queued actions in the API.
TODO: is it possible to expose the pending-change queue (list/cancel) to the caller?
TODO: clarify who enqueues the request and whether a pending change blocks
further edits (e.g. after AddDisk, until the change executes).
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of the MVM to update. |
+
+
+
+ | project |
+ string |
+ |
+ Project the MVM belongs to. |
+
+
+
+ | order_number |
+ string |
+ |
+ Order reference for this operation.
+TODO: can this be optional? |
+
+
+
+ | update_meta |
+ fits.api.v1.UpdateMeta |
+ |
+ Timestamp and strategy for this update. |
+
+
+
+ | performance_class |
+ PerformanceClassChange |
+ |
+ Change the CPU/RAM performance class. |
+
+
+
+ | service_class |
+ ServiceClassChange |
+ |
+ Change the service class. |
+
+
+
+ | contact |
+ ContactChange |
+ |
+ Change the contact person. |
+
+
+
+
+
+
+
+
+
+ MVMServiceUpdateResponse
+ Response for Update; an empty response means the change was accepted.
+
+
+
+
+
+ MVMServiceValidateAddDiskRequest
+ Request to validate an AddDisk without ordering anything.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | add_disk |
+ MVMServiceAddDiskRequest |
+ |
+ The add disk request to validate. |
+
+
+
+
+
+
+
+
+
+ MVMServiceValidateAddDiskResponse
+ Response for ValidateAddDisk; violations are returned as an InvalidArgument error.
+
+
+
+
+
+ MVMServiceValidateAddNetworkInterfaceRequest
+ Request to validate an AddNetworkInterface without ordering anything.
+
+
+
+
+
+
+
+
+ MVMServiceValidateAddNetworkInterfaceResponse
+ Response for ValidateAddNetworkInterface; violations are returned as an InvalidArgument error.
+
+
+
+
+
+ MVMServiceValidateCreateRequest
+ Request to validate a MVM create without creating anything.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | create |
+ MVMServiceCreateRequest |
+ |
+ The create request to validate. |
+
+
+
+
+
+
+
+
+
+ MVMServiceValidateCreateResponse
+ Response for ValidateCreate; violations are returned as an InvalidArgument error.
+
+
+
+
+
+ MVMServiceValidateUpdateDiskRequest
+ Request to validate an UpdateDisk without changing anything.
+
+
+
+
+
+
+
+
+ MVMServiceValidateUpdateDiskResponse
+ Response for ValidateUpdateDisk; violations are returned as an InvalidArgument error.
+
+
+
+
+
+ ManagedVM
+ ManagedVM is a managed VM instance as returned by the API.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of this MVM. |
+
+
+
+ | meta |
+ fits.api.v1.Meta |
+ |
+ Metadata for this MVM.
+TODO: dates are available in the nulink db but not passed through yet. |
+
+
+
+ | fqdn |
+ string |
+ |
+ FQDN of the MVM, derived from the name at creation or generated by the backend. |
+
+
+
+ | tenant |
+ string |
+ |
+ Tenant this MVM belongs to. |
+
+
+
+ | project_uuid |
+ string |
+ |
+ UUID of the project this MVM belongs to. |
+
+
+
+ | os_uuid |
+ string |
+ |
+ UUID of the OS image installed on the MVM; resolve the title via the OS endpoint. |
+
+
+
+ | location_uuid |
+ string |
+ |
+ UUID of the datacenter location. |
+
+
+
+ | contact_uuid |
+ string |
+ |
+ TODO: Contact UUID – not yet implemented; open discussion with FCN (#23). |
+
+
+
+ | cpu |
+ uint32 |
+ |
+ Number of CPU cores. |
+
+
+
+ | ram |
+ uint32 |
+ |
+ RAM in GB. |
+
+
+
+ | backup |
+ bool |
+ |
+ Whether backup is enabled.
+TODO: the upstream (nulink) list/get models do not expose this; always false. |
+
+
+
+ | status |
+ MVMStatus |
+ |
+ Status of the MVM. |
+
+
+
+ | status_info |
+ string |
+ |
+ Additional information about the current status. |
+
+
+
+ | availability |
+ Availability |
+ |
+ Availability level. |
+
+
+
+ | serviceclass |
+ ServiceClass |
+ |
+ Service class. |
+
+
+
+ | windows_details |
+ WindowsDetails |
+ |
+ Windows-specific settings (domain + disks). |
+
+
+
+ | linux_details |
+ LinuxDetails |
+ |
+ Linux-specific settings (LDAP + disks). |
+
+
+
+ | interfaces |
+ NetworkInterface |
+ repeated |
+ Network interfaces attached to the MVM (IPv4 only). |
+
+
+
+ | vlan |
+ VLAN |
+ |
+ VLAN the MVM is attached to.
+TODO: not exposed by the upstream (nulink) MVM records yet; always unset. |
+
+
+
+ | order_number |
+ string |
+ |
+ Internal reference number provided by the user, e.g. a ticket ID. |
+
+
+
+
+
+
+
+
+
+ NetworkInterface
+ A network interface of a MVM. IPv4 only; IPv6 is not yet supported.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ UUID of this interface. |
+
+
+
+ | ipaddress |
+ string |
+ |
+ IPv4 address assigned to this interface. |
+
+
+
+ | macaddress |
+ string |
+ |
+ MAC address of this interface.
+
+TODO: add validation |
+
+
+
+
+
+
+
+
+
+
+ PerformanceClassChange is the payload for changing a MVM's CPU and RAM.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | cpu |
+ uint32 |
+ |
+ Number of vCPUs (1-64). |
+
+
+
+ | ram |
+ uint32 |
+ |
+ RAM size in GB. |
+
+
+
+
+
+
+
+
+
+ ServiceClassChange
+ ServiceClassChange is the payload for changing a MVM's service class.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | serviceclass |
+ ServiceClass |
+ |
+ Target service class. |
+
+
+
+
+
+
+
+
+
+ WindowsDetails
+ Windows-specific MVM details.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | disks |
+ WindowsDisk |
+ repeated |
+ Disks configured on the Windows MVM. |
+
+
+
+ | domain_uuid |
+ string |
+ |
+ UUID of the Windows domain the MVM has joined. |
+
+
+
+ | domain_fqdn |
+ string |
+ |
+ Windows-specific FQDN, derived from the name at creation or generated by the backend. |
+
+
+
+
+
+
+
+
+
+ WindowsDisk
+ Disk configuration for a Windows MVM. See DiskType for the kinds of
disks (os, system, data) and their lifecycle rules.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ optional |
+ UUID of the disk; set for existing disks, unset for new ones. |
+
+
+
+ | label |
+ string |
+ |
+ Label (name) of the disk. |
+
+
+
+ | auto_extend |
+ bool |
+ |
+ Whether the disk grows automatically when space runs low. |
+
+
+
+ | size |
+ uint64 |
+ optional |
+ Size of the disk in GB; defaults to 50 when unset. |
+
+
+
+ | driveletter |
+ string |
+ optional |
+ Drive letter (e.g. "D"). Fixed to "F" for the system disk; free-form
+for data disks. |
+
+
+
+ | disk_type |
+ DiskType |
+ optional |
+ Kind of the disk; determines which operations are allowed on it.
+Provided by the client in create/add requests and populated by the
+API in responses.
+TODO: talk to FCE that we will provide the disk type in create/add
+requests. |
+
+
+
+
+
+
+
+
+
+
+
+ Availability
+ Availability specifies the availability level of a MVM; higher value = higher availability.
+
+
+ | Name | Number | Description |
+
+
+
+
+ | AVAILABILITY_UNSPECIFIED |
+ 0 |
+ AVAILABILITY_UNSPECIFIED is not specified. |
+
+
+
+ | AVAILABILITY_V0 |
+ 1 |
+ AVAILABILITY_V0 is availability level V0. |
+
+
+
+ | AVAILABILITY_V1 |
+ 2 |
+ AVAILABILITY_V1 is availability level V1. |
+
+
+
+ | AVAILABILITY_V2 |
+ 3 |
+ AVAILABILITY_V2 is availability level V2. |
+
+
+
+ | AVAILABILITY_V3 |
+ 4 |
+ AVAILABILITY_V3 is availability level V3. |
+
+
+
+
+
+ DiskType
+ DiskType classifies a MVM disk by its lifecycle rules.
The upstream (nulink) API returns every disk of a MVM, including the
backend-provisioned OS disk, so that oversized OS disks stay billable.
Lifecycle per kind:
- OS: provisioned by the backend and never part of create/add
requests; resizable via UpdateDisk, never deletable.
- SYSTEM: exactly one per MVM (drive letter F on Windows, mount point
/appdata on Linux), whose letter/mount point is fixed; must be
included in the create request; resizable via UpdateDisk, never
deletable.
- DATA: fully controllable (letter/mount point, size, auto-extend)
and deletable; may be included at creation or added later via
AddDisk.
Whether auto-extend is supported for OS and SYSTEM disks is not yet
known; only DATA disks are documented as supporting it.
These rules are enforced by the upstream (nulink) API at creation and
edit time (e.g. duplicate drive letters, deleting a system disk);
fco-api does not re-validate them locally and surfaces upstream
violations as InvalidArgument errors. Use the Validate* RPCs to
pre-check a request against the upstream rules.
+
+
+ | Name | Number | Description |
+
+
+
+
+ | DISK_TYPE_UNSPECIFIED |
+ 0 |
+ DISK_TYPE_UNSPECIFIED is not specified. |
+
+
+
+ | DISK_TYPE_OS |
+ 1 |
+ DISK_TYPE_OS is the operating system disk; provisioned by the backend,
+resizable, never deletable. |
+
+
+
+ | DISK_TYPE_SYSTEM |
+ 2 |
+ DISK_TYPE_SYSTEM is the additional system disk (volume F on Windows,
+/appdata on Linux); the letter/mount point is fixed, the size is
+resizable, never deletable. |
+
+
+
+ | DISK_TYPE_DATA |
+ 3 |
+ DISK_TYPE_DATA is a user-managed data disk; fully controllable and
+deletable. |
+
+
+
+
+
+ MVMStatus
+ MVMStatus specifies the status of a MVM.
+
+
+ | Name | Number | Description |
+
+
+
+
+ | MVM_STATUS_UNSPECIFIED |
+ 0 |
+ MVM_STATUS_UNSPECIFIED is not specified. |
+
+
+
+ | MVM_STATUS_ACTIVE |
+ 1 |
+ MVM_STATUS_ACTIVE is an active MVM. |
+
+
+
+
+
+ ServiceClass
+ ServiceClass specifies the service tier of a MVM; higher value = higher tier.
Only certain combinations with Availability are valid.
+
+
+ | Name | Number | Description |
+
+
+
+
+ | SERVICE_CLASS_UNSPECIFIED |
+ 0 |
+ SERVICE_CLASS_UNSPECIFIED is not specified. |
+
+
+
+ | SERVICE_CLASS_SZ1 |
+ 1 |
+ SERVICE_CLASS_SZ1 is service class SZ1. |
+
+
+
+ | SERVICE_CLASS_SZ2 |
+ 2 |
+ SERVICE_CLASS_SZ2 is service class SZ2. |
+
+
+
+ | SERVICE_CLASS_SZ3 |
+ 3 |
+ SERVICE_CLASS_SZ3 is service class SZ3. |
+
+
+
+
+
+
+
+
+
+ MVMService
+ MVMService provides managed VM (MVM) operations.
+
+
+
+
+
+
+
fits/api/mvm/v1/os.proto
Top
+
+
+
+
+ OS
+ OS is the definition of an available OS for MVM instances.
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ Uuid of this OS. |
+
+
+
+ | title |
+ string |
+ |
+ Title of the OS. |
+
+
+
+ | type |
+ OSType |
+ |
+ Type of the OS. |
+
+
+
+
+
+
+
+
+
+ OSServiceListRequest
+ OSServiceListRequest is the request payload for a OS list request.
+
+
+
+
+
+ OSServiceListResponse
+ OSServiceListResponse is the response payload for a OS list request
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | operating_systems |
+ OS |
+ repeated |
+ The available operating systems. |
+
+
+
+
+
+
+
+
+
+
+
+ OSType
+ OSType specifies the type of an operating system.
+
+
+ | Name | Number | Description |
+
+
+
+
+ | OS_TYPE_UNSPECIFIED |
+ 0 |
+ OS_TYPE_UNSPECIFIED is not specified. |
+
+
+
+ | OS_TYPE_LINUX |
+ 1 |
+ OS_TYPE_LINUX is a Linux operating system. |
+
+
+
+ | OS_TYPE_WINDOWS |
+ 2 |
+ OS_TYPE_WINDOWS is a Windows operating system. |
+
+
+
+
+
+
+
+
+
+ OSService
+ OSService lists operating systems available for managed VM (MVM) instances.
+
+
+
+
+
+
+
fits/api/mvm/v1/stagetype.proto
Top
+
+
+
+
+ StageType
+ StageType is the definition of available stage types. (Development, Test, Integration, Production)
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | uuid |
+ string |
+ |
+ Uuid of this stage type |
+
+
+
+ | title |
+ string |
+ |
+ title of the stage type |
+
+
+
+
+
+
+
+
+
+ StageTypeServiceListRequest
+ StageTypeServiceListRequest is the request payload for a stage type list request.
+
+
+
+
+
+ StageTypeServiceListResponse
+ StageTypeServiceListResponse is the response payload for a stage type list request
+
+
+
+
+ | Field | Type | Label | Description |
+
+
+
+
+ | stage_types |
+ StageType |
+ repeated |
+ The available stage types |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ StageTypeService
+ TODO: this type may be completely removed, as VLANs could be project-scoped
StageTypeService lists stage types available for managed VM (MVM) instances.
+
+
+
+
+
fits/api/v1/health.proto
Top
diff --git a/generate/generate.go b/generate/generate.go
index 1137ced..2b65ecf 100644
--- a/generate/generate.go
+++ b/generate/generate.go
@@ -38,8 +38,9 @@ var (
)
type api struct {
- Name string
- Services []struct {
+ Name string
+ ConnectName string
+ Services []struct {
Name string
FileName string
}
@@ -254,11 +255,15 @@ func svcs(root string) (map[string]api, error) {
_, name, _ := strings.Cut(*fd.Package, "fits.")
name = strings.ReplaceAll(name, ".", "")
+ segs := strings.Split(*fd.Package, ".")
+ connectName := strings.Join(segs[len(segs)-2:], "")
+
a, ok := result[name]
if !ok {
a = api{
- Name: name,
- Path: path.Dir(strings.TrimPrefix(filename, root)),
+ Name: name,
+ ConnectName: connectName,
+ Path: path.Dir(strings.TrimPrefix(filename, root)),
}
}
for _, serviceDesc := range fd.GetService() {
diff --git a/generate/go_client.tpl b/generate/go_client.tpl
index 1609533..a3feb49 100644
--- a/generate/go_client.tpl
+++ b/generate/go_client.tpl
@@ -6,7 +6,7 @@ import (
compress "github.com/klauspost/connect-compress/v2"
{{ range $name, $api := . -}}
- "github.com/fi-ts/api/go{{ $api.Path }}/{{ $api.Name }}connect"
+ "github.com/fi-ts/api/go{{ $api.Path }}/{{ $api.ConnectName }}connect"
{{ end }}
)
@@ -24,13 +24,13 @@ type (
{{ range $name, $api := . -}}
{{ $name | title }} interface {
{{ range $svc := $api.Services -}}
- {{ $svc.Name | trimSuffix "Service" }}() {{ $name }}connect.{{ $svc.Name }}Client
+ {{ $svc.Name | trimSuffix "Service" }}() {{ $api.ConnectName }}connect.{{ $svc.Name }}Client
{{ end }}
}
{{ $name }} struct {
{{ range $svc := $api.Services -}}
- {{ $svc.Name | lower }} {{ $name }}connect.{{ $svc.Name }}Client
+ {{ $svc.Name | lower }} {{ $api.ConnectName }}connect.{{ $svc.Name }}Client
{{ end }}
}
@@ -41,7 +41,7 @@ type (
func (c *client) {{ $name | title }}() {{ $name | title }} {
a := &{{ $name }}{
{{ range $svc := $api.Services -}}
- {{ $svc.Name | lower }}: {{ $name }}connect.New{{ $svc.Name }}Client(
+ {{ $svc.Name | lower }}: {{ $api.ConnectName }}connect.New{{ $svc.Name }}Client(
c.config.HttpClient(),
c.config.BaseURL,
connect.WithInterceptors(c.interceptors...),
@@ -53,7 +53,7 @@ func (c *client) {{ $name | title }}() {{ $name | title }} {
}
{{ range $svc := $api.Services -}}
-func (c *{{ $name }} ) {{ $svc.Name | trimSuffix "Service" }}() {{ $name }}connect.{{ $svc.Name }}Client {
+func (c *{{ $name }} ) {{ $svc.Name | trimSuffix "Service" }}() {{ $api.ConnectName }}connect.{{ $svc.Name }}Client {
return c.{{ $svc.Name | lower }}
}
{{ end }}
diff --git a/generate/python_client.tpl b/generate/python_client.tpl
index 9783e0e..0633dac 100644
--- a/generate/python_client.tpl
+++ b/generate/python_client.tpl
@@ -4,7 +4,7 @@ import pyqwest
{{ range $name, $api := . -}}
{{ range $svc := $api.Services -}}
-import fits.{{ $name | trimSuffix "v1" }}.v1.{{ $svc.FileName | trimSuffix ".proto" | lower }}_connect as {{ $name | trimSuffix "v1" }}_{{ $svc.FileName | trimSuffix ".proto" | lower }}_connect
+import {{ $api.Path | trimPrefix "/" | replace "/" "." }}.{{ $svc.FileName | trimSuffix ".proto" | lower }}_connect as {{ $api.Path | trimPrefix "/" | replace "/" "_" }}_{{ $svc.FileName | trimSuffix ".proto" | lower }}_connect
{{ end }}
{{ end }}
@@ -35,6 +35,6 @@ class Client:
{{ range $svc := $api.Services }}
def {{ $svc.FileName | trimSuffix ".proto" | lower }}(self):
- return {{ $name | trimSuffix "v1" }}_{{ $svc.FileName | trimSuffix ".proto" | lower }}_connect.{{ $svc.Name }}ClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return {{ $api.Path | trimPrefix "/" | replace "/" "_" }}_{{ $svc.FileName | trimSuffix ".proto" | lower }}_connect.{{ $svc.Name }}ClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
{{ end }}
{{ end }}
diff --git a/go.mod b/go.mod
index bb7f83f..3dadd34 100644
--- a/go.mod
+++ b/go.mod
@@ -12,6 +12,7 @@ require (
github.com/google/go-cmp v0.7.0
github.com/klauspost/connect-compress/v2 v2.1.1
github.com/stretchr/testify v1.12.1
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20260831171406-18b4a7587f8a
google.golang.org/grpc v1.83.2
google.golang.org/protobuf v1.36.12
)
@@ -22,11 +23,9 @@ require (
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/klauspost/compress v1.19.2 // indirect
github.com/minio/minlz v1.2.0 // indirect
- github.com/stretchr/objx v0.5.3 // indirect
go.yaml.in/yaml/v3 v3.0.5 // indirect
golang.org/x/exp v0.0.0-20260824195058-e88cd73687aa // indirect
golang.org/x/sys v0.47.0 // indirect
golang.org/x/text v0.41.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260831171406-18b4a7587f8a // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20260831171406-18b4a7587f8a // indirect
)
diff --git a/go.sum b/go.sum
index ad566c1..2bd2adc 100644
--- a/go.sum
+++ b/go.sum
@@ -30,8 +30,6 @@ github.com/minio/minlz v1.2.0 h1:6IOBuiHg04QxvbFfgFLT/9sMaO/UhL7S+ApW1mK8q5A=
github.com/minio/minlz v1.2.0/go.mod h1:Ls9H7nlkASeCcdl5thjVD5Eraj6z+zGa7xtq57jIKD4=
github.com/rodaine/protogofakeit v0.1.1 h1:ZKouljuRM3A+TArppfBqnH8tGZHOwM/pjvtXe9DaXH8=
github.com/rodaine/protogofakeit v0.1.1/go.mod h1:pXn/AstBYMaSfc1/RqH3N82pBuxtWgejz1AlYpY1mI0=
-github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
-github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE=
github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg=
go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw=
diff --git a/go/client/client.go b/go/client/client.go
index 76e642c..9f7a9ae 100755
--- a/go/client/client.go
+++ b/go/client/client.go
@@ -5,11 +5,13 @@ import (
"connectrpc.com/connect"
compress "github.com/klauspost/connect-compress/v2"
+ "github.com/fi-ts/api/go/fits/api/mvm/v1/mvmv1connect"
"github.com/fi-ts/api/go/fits/api/v1/apiv1connect"
)
type (
Client interface {
+ Apimvmv1() Apimvmv1
Apiv1() Apiv1
}
client struct {
@@ -17,6 +19,22 @@ type (
interceptors []connect.Interceptor
}
+ Apimvmv1 interface {
+ Location() mvmv1connect.LocationServiceClient
+ MVM() mvmv1connect.MVMServiceClient
+ OS() mvmv1connect.OSServiceClient
+ StageType() mvmv1connect.StageTypeServiceClient
+ VLAN() mvmv1connect.VLANServiceClient
+ }
+
+ apimvmv1 struct {
+ locationservice mvmv1connect.LocationServiceClient
+ mvmservice mvmv1connect.MVMServiceClient
+ osservice mvmv1connect.OSServiceClient
+ stagetypeservice mvmv1connect.StageTypeServiceClient
+ vlanservice mvmv1connect.VLANServiceClient
+ }
+
Apiv1 interface {
Health() apiv1connect.HealthServiceClient
IP() apiv1connect.IPServiceClient
@@ -38,6 +56,58 @@ type (
}
)
+func (c *client) Apimvmv1() Apimvmv1 {
+ a := &apimvmv1{
+ locationservice: mvmv1connect.NewLocationServiceClient(
+ c.config.HttpClient(),
+ c.config.BaseURL,
+ connect.WithInterceptors(c.interceptors...),
+ compress.WithAll(compress.LevelBalanced),
+ ),
+ mvmservice: mvmv1connect.NewMVMServiceClient(
+ c.config.HttpClient(),
+ c.config.BaseURL,
+ connect.WithInterceptors(c.interceptors...),
+ compress.WithAll(compress.LevelBalanced),
+ ),
+ osservice: mvmv1connect.NewOSServiceClient(
+ c.config.HttpClient(),
+ c.config.BaseURL,
+ connect.WithInterceptors(c.interceptors...),
+ compress.WithAll(compress.LevelBalanced),
+ ),
+ stagetypeservice: mvmv1connect.NewStageTypeServiceClient(
+ c.config.HttpClient(),
+ c.config.BaseURL,
+ connect.WithInterceptors(c.interceptors...),
+ compress.WithAll(compress.LevelBalanced),
+ ),
+ vlanservice: mvmv1connect.NewVLANServiceClient(
+ c.config.HttpClient(),
+ c.config.BaseURL,
+ connect.WithInterceptors(c.interceptors...),
+ compress.WithAll(compress.LevelBalanced),
+ ),
+ }
+ return a
+}
+
+func (c *apimvmv1) Location() mvmv1connect.LocationServiceClient {
+ return c.locationservice
+}
+func (c *apimvmv1) MVM() mvmv1connect.MVMServiceClient {
+ return c.mvmservice
+}
+func (c *apimvmv1) OS() mvmv1connect.OSServiceClient {
+ return c.osservice
+}
+func (c *apimvmv1) StageType() mvmv1connect.StageTypeServiceClient {
+ return c.stagetypeservice
+}
+func (c *apimvmv1) VLAN() mvmv1connect.VLANServiceClient {
+ return c.vlanservice
+}
+
func (c *client) Apiv1() Apiv1 {
a := &apiv1{
healthservice: apiv1connect.NewHealthServiceClient(
diff --git a/go/errorutil/errors.go b/go/errorutil/errors.go
index 3dd854a..baecd69 100644
--- a/go/errorutil/errors.go
+++ b/go/errorutil/errors.go
@@ -6,6 +6,7 @@ import (
"strings"
"connectrpc.com/connect"
+ "google.golang.org/genproto/googleapis/rpc/errdetails"
"google.golang.org/grpc/status"
"github.com/google/go-cmp/cmp"
@@ -222,6 +223,56 @@ func WrapConnectErr(c connect.Code, underlying error) *connect.Error {
return connect.NewError(c, underlying)
}
+// ValidationError describes a single validation problem reported by an
+// upstream API (e.g. an HTTP 422 body from nulink).
+type ValidationError struct {
+ // Loc is the path of the offending field within the upstream request,
+ // e.g. ["body", "serviceclass"].
+ Loc []string
+ // Msg is a human readable description of the problem.
+ Msg string
+ // Type is the upstream error type, e.g. "value_error".
+ Type string
+}
+
+// UpstreamValidation builds an InvalidArgument connect.Error for upstream
+// validation rejections (HTTP 422). It attaches the standard google.rpc error
+// details so clients can render per-field problems uniformly:
+//
+// - BadRequest with one FieldViolation per error (field = dotted loc path,
+// description = upstream message)
+// - ErrorInfo identifying the upstream domain and the error type
+//
+// The top-level message stays generic; the structured content lives in the
+// details. This mirrors how buf.validate failures surface locally, so clients
+// see one uniform shape for "your input was wrong" regardless of which layer
+// rejected it.
+func UpstreamValidation(domain, op string, errs []ValidationError) *connect.Error {
+ err := connect.NewError(connect.CodeInvalidArgument,
+ fmt.Errorf("%s rejected %s with %d validation error(s)", domain, op, len(errs)))
+ if len(errs) == 0 {
+ return err
+ }
+
+ violations := make([]*errdetails.BadRequest_FieldViolation, 0, len(errs))
+ for _, e := range errs {
+ violations = append(violations, &errdetails.BadRequest_FieldViolation{
+ Field: strings.Join(e.Loc, "."),
+ Description: e.Msg,
+ })
+ }
+ if d, derr := connect.NewErrorDetail(&errdetails.BadRequest{FieldViolations: violations}); derr == nil {
+ err.AddDetail(d)
+ }
+ if d, derr := connect.NewErrorDetail(&errdetails.ErrorInfo{
+ Reason: strings.ToUpper(errs[0].Type),
+ Domain: domain,
+ }); derr == nil {
+ err.AddDetail(d)
+ }
+ return err
+}
+
// ConnectErrorComparer returns a go-cmp Option for comparing *connect.Error values.
// Two errors are considered equal if they have the same error string and the same Connect code.
func ConnectErrorComparer() cmp.Option {
diff --git a/go/fits/api/mvm/v1/location.pb.go b/go/fits/api/mvm/v1/location.pb.go
new file mode 100644
index 0000000..138b411
--- /dev/null
+++ b/go/fits/api/mvm/v1/location.pb.go
@@ -0,0 +1,240 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.36.12
+// protoc (unknown)
+// source: fits/api/mvm/v1/location.proto
+
+package mvmv1
+
+import (
+ _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ _ "github.com/fi-ts/api/go/fits/api/v1"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+ unsafe "unsafe"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Location is the definition of an available datacenter location for MVM instances.
+type Location struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Uuid of this location
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // title of the location
+ Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Location) Reset() {
+ *x = Location{}
+ mi := &file_fits_api_mvm_v1_location_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Location) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Location) ProtoMessage() {}
+
+func (x *Location) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_location_proto_msgTypes[0]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Location.ProtoReflect.Descriptor instead.
+func (*Location) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_location_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Location) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *Location) GetTitle() string {
+ if x != nil {
+ return x.Title
+ }
+ return ""
+}
+
+// LocationServiceListRequest is the request payload for a location list request.
+type LocationServiceListRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Tenant to list available locations for
+ Tenant string `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *LocationServiceListRequest) Reset() {
+ *x = LocationServiceListRequest{}
+ mi := &file_fits_api_mvm_v1_location_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *LocationServiceListRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LocationServiceListRequest) ProtoMessage() {}
+
+func (x *LocationServiceListRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_location_proto_msgTypes[1]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use LocationServiceListRequest.ProtoReflect.Descriptor instead.
+func (*LocationServiceListRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_location_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *LocationServiceListRequest) GetTenant() string {
+ if x != nil {
+ return x.Tenant
+ }
+ return ""
+}
+
+// LocationServiceListResponse is the response payload for a location list request.
+type LocationServiceListResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The available locations
+ Locations []*Location `protobuf:"bytes,1,rep,name=locations,proto3" json:"locations,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *LocationServiceListResponse) Reset() {
+ *x = LocationServiceListResponse{}
+ mi := &file_fits_api_mvm_v1_location_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *LocationServiceListResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LocationServiceListResponse) ProtoMessage() {}
+
+func (x *LocationServiceListResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_location_proto_msgTypes[2]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use LocationServiceListResponse.ProtoReflect.Descriptor instead.
+func (*LocationServiceListResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_location_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *LocationServiceListResponse) GetLocations() []*Location {
+ if x != nil {
+ return x.Locations
+ }
+ return nil
+}
+
+var File_fits_api_mvm_v1_location_proto protoreflect.FileDescriptor
+
+const file_fits_api_mvm_v1_location_proto_rawDesc = "" +
+ "\n" +
+ "\x1efits/api/mvm/v1/location.proto\x12\x0ffits.api.mvm.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"K\n" +
+ "\bLocation\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n" +
+ "\x05title\x18\x02 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x05title\"A\n" +
+ "\x1aLocationServiceListRequest\x12#\n" +
+ "\x06tenant\x18\x01 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenant\"V\n" +
+ "\x1bLocationServiceListResponse\x127\n" +
+ "\tlocations\x18\x01 \x03(\v2\x19.fits.api.mvm.v1.LocationR\tlocations2\x81\x01\n" +
+ "\x0fLocationService\x12n\n" +
+ "\x04List\x12+.fits.api.mvm.v1.LocationServiceListRequest\x1a,.fits.api.mvm.v1.LocationServiceListResponse\"\v\xc2\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02B\xb2\x01\n" +
+ "\x13com.fits.api.mvm.v1B\rLocationProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03FAM\xaa\x02\x0fFits.Api.Mvm.V1\xca\x02\x0fFits\\Api\\Mvm\\V1\xe2\x02\x1bFits\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12Fits::Api::Mvm::V1b\x06proto3"
+
+var (
+ file_fits_api_mvm_v1_location_proto_rawDescOnce sync.Once
+ file_fits_api_mvm_v1_location_proto_rawDescData []byte
+)
+
+func file_fits_api_mvm_v1_location_proto_rawDescGZIP() []byte {
+ file_fits_api_mvm_v1_location_proto_rawDescOnce.Do(func() {
+ file_fits_api_mvm_v1_location_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_location_proto_rawDesc), len(file_fits_api_mvm_v1_location_proto_rawDesc)))
+ })
+ return file_fits_api_mvm_v1_location_proto_rawDescData
+}
+
+var file_fits_api_mvm_v1_location_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_fits_api_mvm_v1_location_proto_goTypes = []any{
+ (*Location)(nil), // 0: fits.api.mvm.v1.Location
+ (*LocationServiceListRequest)(nil), // 1: fits.api.mvm.v1.LocationServiceListRequest
+ (*LocationServiceListResponse)(nil), // 2: fits.api.mvm.v1.LocationServiceListResponse
+}
+var file_fits_api_mvm_v1_location_proto_depIdxs = []int32{
+ 0, // 0: fits.api.mvm.v1.LocationServiceListResponse.locations:type_name -> fits.api.mvm.v1.Location
+ 1, // 1: fits.api.mvm.v1.LocationService.List:input_type -> fits.api.mvm.v1.LocationServiceListRequest
+ 2, // 2: fits.api.mvm.v1.LocationService.List:output_type -> fits.api.mvm.v1.LocationServiceListResponse
+ 2, // [2:3] is the sub-list for method output_type
+ 1, // [1:2] is the sub-list for method input_type
+ 1, // [1:1] is the sub-list for extension type_name
+ 1, // [1:1] is the sub-list for extension extendee
+ 0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_fits_api_mvm_v1_location_proto_init() }
+func file_fits_api_mvm_v1_location_proto_init() {
+ if File_fits_api_mvm_v1_location_proto != nil {
+ return
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_location_proto_rawDesc), len(file_fits_api_mvm_v1_location_proto_rawDesc)),
+ NumEnums: 0,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_fits_api_mvm_v1_location_proto_goTypes,
+ DependencyIndexes: file_fits_api_mvm_v1_location_proto_depIdxs,
+ MessageInfos: file_fits_api_mvm_v1_location_proto_msgTypes,
+ }.Build()
+ File_fits_api_mvm_v1_location_proto = out.File
+ file_fits_api_mvm_v1_location_proto_goTypes = nil
+ file_fits_api_mvm_v1_location_proto_depIdxs = nil
+}
diff --git a/go/fits/api/mvm/v1/mvm.pb.go b/go/fits/api/mvm/v1/mvm.pb.go
new file mode 100644
index 0000000..2ea7bbe
--- /dev/null
+++ b/go/fits/api/mvm/v1/mvm.pb.go
@@ -0,0 +1,3392 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.36.12
+// protoc (unknown)
+// source: fits/api/mvm/v1/mvm.proto
+
+package mvmv1
+
+import (
+ _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ v1 "github.com/fi-ts/api/go/fits/api/v1"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+ unsafe "unsafe"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Availability specifies the availability level of a MVM; higher value = higher availability.
+type Availability int32
+
+const (
+ // AVAILABILITY_UNSPECIFIED is not specified.
+ Availability_AVAILABILITY_UNSPECIFIED Availability = 0
+ // AVAILABILITY_V0 is availability level V0.
+ Availability_AVAILABILITY_V0 Availability = 1
+ // AVAILABILITY_V1 is availability level V1.
+ Availability_AVAILABILITY_V1 Availability = 2
+ // AVAILABILITY_V2 is availability level V2.
+ Availability_AVAILABILITY_V2 Availability = 3
+ // AVAILABILITY_V3 is availability level V3.
+ Availability_AVAILABILITY_V3 Availability = 4
+)
+
+// Enum value maps for Availability.
+var (
+ Availability_name = map[int32]string{
+ 0: "AVAILABILITY_UNSPECIFIED",
+ 1: "AVAILABILITY_V0",
+ 2: "AVAILABILITY_V1",
+ 3: "AVAILABILITY_V2",
+ 4: "AVAILABILITY_V3",
+ }
+ Availability_value = map[string]int32{
+ "AVAILABILITY_UNSPECIFIED": 0,
+ "AVAILABILITY_V0": 1,
+ "AVAILABILITY_V1": 2,
+ "AVAILABILITY_V2": 3,
+ "AVAILABILITY_V3": 4,
+ }
+)
+
+func (x Availability) Enum() *Availability {
+ p := new(Availability)
+ *p = x
+ return p
+}
+
+func (x Availability) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Availability) Descriptor() protoreflect.EnumDescriptor {
+ return file_fits_api_mvm_v1_mvm_proto_enumTypes[0].Descriptor()
+}
+
+func (Availability) Type() protoreflect.EnumType {
+ return &file_fits_api_mvm_v1_mvm_proto_enumTypes[0]
+}
+
+func (x Availability) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Availability.Descriptor instead.
+func (Availability) EnumDescriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{0}
+}
+
+// ServiceClass specifies the service tier of a MVM; higher value = higher tier.
+// Only certain combinations with Availability are valid.
+type ServiceClass int32
+
+const (
+ // SERVICE_CLASS_UNSPECIFIED is not specified.
+ ServiceClass_SERVICE_CLASS_UNSPECIFIED ServiceClass = 0
+ // SERVICE_CLASS_SZ1 is service class SZ1.
+ ServiceClass_SERVICE_CLASS_SZ1 ServiceClass = 1
+ // SERVICE_CLASS_SZ2 is service class SZ2.
+ ServiceClass_SERVICE_CLASS_SZ2 ServiceClass = 2
+ // SERVICE_CLASS_SZ3 is service class SZ3.
+ ServiceClass_SERVICE_CLASS_SZ3 ServiceClass = 3
+)
+
+// Enum value maps for ServiceClass.
+var (
+ ServiceClass_name = map[int32]string{
+ 0: "SERVICE_CLASS_UNSPECIFIED",
+ 1: "SERVICE_CLASS_SZ1",
+ 2: "SERVICE_CLASS_SZ2",
+ 3: "SERVICE_CLASS_SZ3",
+ }
+ ServiceClass_value = map[string]int32{
+ "SERVICE_CLASS_UNSPECIFIED": 0,
+ "SERVICE_CLASS_SZ1": 1,
+ "SERVICE_CLASS_SZ2": 2,
+ "SERVICE_CLASS_SZ3": 3,
+ }
+)
+
+func (x ServiceClass) Enum() *ServiceClass {
+ p := new(ServiceClass)
+ *p = x
+ return p
+}
+
+func (x ServiceClass) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ServiceClass) Descriptor() protoreflect.EnumDescriptor {
+ return file_fits_api_mvm_v1_mvm_proto_enumTypes[1].Descriptor()
+}
+
+func (ServiceClass) Type() protoreflect.EnumType {
+ return &file_fits_api_mvm_v1_mvm_proto_enumTypes[1]
+}
+
+func (x ServiceClass) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ServiceClass.Descriptor instead.
+func (ServiceClass) EnumDescriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{1}
+}
+
+// MVMStatus specifies the status of a MVM.
+type MVMStatus int32
+
+const (
+ // MVM_STATUS_UNSPECIFIED is not specified.
+ MVMStatus_MVM_STATUS_UNSPECIFIED MVMStatus = 0
+ // MVM_STATUS_ACTIVE is an active MVM.
+ MVMStatus_MVM_STATUS_ACTIVE MVMStatus = 1
+)
+
+// Enum value maps for MVMStatus.
+var (
+ MVMStatus_name = map[int32]string{
+ 0: "MVM_STATUS_UNSPECIFIED",
+ 1: "MVM_STATUS_ACTIVE",
+ }
+ MVMStatus_value = map[string]int32{
+ "MVM_STATUS_UNSPECIFIED": 0,
+ "MVM_STATUS_ACTIVE": 1,
+ }
+)
+
+func (x MVMStatus) Enum() *MVMStatus {
+ p := new(MVMStatus)
+ *p = x
+ return p
+}
+
+func (x MVMStatus) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (MVMStatus) Descriptor() protoreflect.EnumDescriptor {
+ return file_fits_api_mvm_v1_mvm_proto_enumTypes[2].Descriptor()
+}
+
+func (MVMStatus) Type() protoreflect.EnumType {
+ return &file_fits_api_mvm_v1_mvm_proto_enumTypes[2]
+}
+
+func (x MVMStatus) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use MVMStatus.Descriptor instead.
+func (MVMStatus) EnumDescriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{2}
+}
+
+// DiskType classifies a MVM disk by its lifecycle rules.
+// The upstream (nulink) API returns every disk of a MVM, including the
+// backend-provisioned OS disk, so that oversized OS disks stay billable.
+//
+// Lifecycle per kind:
+// - OS: provisioned by the backend and never part of create/add
+// requests; resizable via UpdateDisk, never deletable.
+// - SYSTEM: exactly one per MVM (drive letter F on Windows, mount point
+// /appdata on Linux), whose letter/mount point is fixed; must be
+// included in the create request; resizable via UpdateDisk, never
+// deletable.
+// - DATA: fully controllable (letter/mount point, size, auto-extend)
+// and deletable; may be included at creation or added later via
+// AddDisk.
+//
+// Whether auto-extend is supported for OS and SYSTEM disks is not yet
+// known; only DATA disks are documented as supporting it.
+//
+// These rules are enforced by the upstream (nulink) API at creation and
+// edit time (e.g. duplicate drive letters, deleting a system disk);
+// fco-api does not re-validate them locally and surfaces upstream
+// violations as InvalidArgument errors. Use the Validate* RPCs to
+// pre-check a request against the upstream rules.
+type DiskType int32
+
+const (
+ // DISK_TYPE_UNSPECIFIED is not specified.
+ DiskType_DISK_TYPE_UNSPECIFIED DiskType = 0
+ // DISK_TYPE_OS is the operating system disk; provisioned by the backend,
+ // resizable, never deletable.
+ DiskType_DISK_TYPE_OS DiskType = 1
+ // DISK_TYPE_SYSTEM is the additional system disk (volume F on Windows,
+ // /appdata on Linux); the letter/mount point is fixed, the size is
+ // resizable, never deletable.
+ DiskType_DISK_TYPE_SYSTEM DiskType = 2
+ // DISK_TYPE_DATA is a user-managed data disk; fully controllable and
+ // deletable.
+ DiskType_DISK_TYPE_DATA DiskType = 3
+)
+
+// Enum value maps for DiskType.
+var (
+ DiskType_name = map[int32]string{
+ 0: "DISK_TYPE_UNSPECIFIED",
+ 1: "DISK_TYPE_OS",
+ 2: "DISK_TYPE_SYSTEM",
+ 3: "DISK_TYPE_DATA",
+ }
+ DiskType_value = map[string]int32{
+ "DISK_TYPE_UNSPECIFIED": 0,
+ "DISK_TYPE_OS": 1,
+ "DISK_TYPE_SYSTEM": 2,
+ "DISK_TYPE_DATA": 3,
+ }
+)
+
+func (x DiskType) Enum() *DiskType {
+ p := new(DiskType)
+ *p = x
+ return p
+}
+
+func (x DiskType) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DiskType) Descriptor() protoreflect.EnumDescriptor {
+ return file_fits_api_mvm_v1_mvm_proto_enumTypes[3].Descriptor()
+}
+
+func (DiskType) Type() protoreflect.EnumType {
+ return &file_fits_api_mvm_v1_mvm_proto_enumTypes[3]
+}
+
+func (x DiskType) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DiskType.Descriptor instead.
+func (DiskType) EnumDescriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{3}
+}
+
+// Linux-specific MVM details.
+type LinuxDetails struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Disks configured on the Linux MVM.
+ Disks []*LinuxDisk `protobuf:"bytes,1,rep,name=disks,proto3" json:"disks,omitempty"`
+ // UUID of the LDAP directory the MVM is integrated with.
+ LdapUuid string `protobuf:"bytes,2,opt,name=ldap_uuid,json=ldapUuid,proto3" json:"ldap_uuid,omitempty"`
+ // Linux-specific FQDN, derived from the name at creation or generated by the backend.
+ LdapFqdn string `protobuf:"bytes,3,opt,name=ldap_fqdn,json=ldapFqdn,proto3" json:"ldap_fqdn,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *LinuxDetails) Reset() {
+ *x = LinuxDetails{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *LinuxDetails) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LinuxDetails) ProtoMessage() {}
+
+func (x *LinuxDetails) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[0]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use LinuxDetails.ProtoReflect.Descriptor instead.
+func (*LinuxDetails) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *LinuxDetails) GetDisks() []*LinuxDisk {
+ if x != nil {
+ return x.Disks
+ }
+ return nil
+}
+
+func (x *LinuxDetails) GetLdapUuid() string {
+ if x != nil {
+ return x.LdapUuid
+ }
+ return ""
+}
+
+func (x *LinuxDetails) GetLdapFqdn() string {
+ if x != nil {
+ return x.LdapFqdn
+ }
+ return ""
+}
+
+// Windows-specific MVM details.
+type WindowsDetails struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Disks configured on the Windows MVM.
+ Disks []*WindowsDisk `protobuf:"bytes,1,rep,name=disks,proto3" json:"disks,omitempty"`
+ // UUID of the Windows domain the MVM has joined.
+ DomainUuid string `protobuf:"bytes,2,opt,name=domain_uuid,json=domainUuid,proto3" json:"domain_uuid,omitempty"`
+ // Windows-specific FQDN, derived from the name at creation or generated by the backend.
+ DomainFqdn string `protobuf:"bytes,3,opt,name=domain_fqdn,json=domainFqdn,proto3" json:"domain_fqdn,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *WindowsDetails) Reset() {
+ *x = WindowsDetails{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *WindowsDetails) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WindowsDetails) ProtoMessage() {}
+
+func (x *WindowsDetails) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[1]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use WindowsDetails.ProtoReflect.Descriptor instead.
+func (*WindowsDetails) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *WindowsDetails) GetDisks() []*WindowsDisk {
+ if x != nil {
+ return x.Disks
+ }
+ return nil
+}
+
+func (x *WindowsDetails) GetDomainUuid() string {
+ if x != nil {
+ return x.DomainUuid
+ }
+ return ""
+}
+
+func (x *WindowsDetails) GetDomainFqdn() string {
+ if x != nil {
+ return x.DomainFqdn
+ }
+ return ""
+}
+
+// A network interface of a MVM. IPv4 only; IPv6 is not yet supported.
+type NetworkInterface struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of this interface.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // IPv4 address assigned to this interface.
+ Ipaddress string `protobuf:"bytes,2,opt,name=ipaddress,proto3" json:"ipaddress,omitempty"`
+ // MAC address of this interface.
+ Macaddress string `protobuf:"bytes,3,opt,name=macaddress,proto3" json:"macaddress,omitempty"` // TODO: add validation
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *NetworkInterface) Reset() {
+ *x = NetworkInterface{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *NetworkInterface) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NetworkInterface) ProtoMessage() {}
+
+func (x *NetworkInterface) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[2]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use NetworkInterface.ProtoReflect.Descriptor instead.
+func (*NetworkInterface) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *NetworkInterface) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *NetworkInterface) GetIpaddress() string {
+ if x != nil {
+ return x.Ipaddress
+ }
+ return ""
+}
+
+func (x *NetworkInterface) GetMacaddress() string {
+ if x != nil {
+ return x.Macaddress
+ }
+ return ""
+}
+
+// ManagedVM is a managed VM instance as returned by the API.
+type ManagedVM struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of this MVM.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // Metadata for this MVM.
+ // TODO: dates are available in the nulink db but not passed through yet.
+ Meta *v1.Meta `protobuf:"bytes,2,opt,name=meta,proto3" json:"meta,omitempty"`
+ // FQDN of the MVM, derived from the name at creation or generated by the backend.
+ Fqdn string `protobuf:"bytes,3,opt,name=fqdn,proto3" json:"fqdn,omitempty"`
+ // Tenant this MVM belongs to.
+ Tenant string `protobuf:"bytes,4,opt,name=tenant,proto3" json:"tenant,omitempty"`
+ // UUID of the project this MVM belongs to.
+ ProjectUuid string `protobuf:"bytes,5,opt,name=project_uuid,json=projectUuid,proto3" json:"project_uuid,omitempty"`
+ // UUID of the OS image installed on the MVM; resolve the title via the OS endpoint.
+ OsUuid string `protobuf:"bytes,6,opt,name=os_uuid,json=osUuid,proto3" json:"os_uuid,omitempty"`
+ // UUID of the datacenter location.
+ LocationUuid string `protobuf:"bytes,7,opt,name=location_uuid,json=locationUuid,proto3" json:"location_uuid,omitempty"`
+ // TODO: Contact UUID – not yet implemented; open discussion with FCN (#23).
+ ContactUuid string `protobuf:"bytes,8,opt,name=contact_uuid,json=contactUuid,proto3" json:"contact_uuid,omitempty"`
+ // Number of CPU cores.
+ Cpu uint32 `protobuf:"varint,9,opt,name=cpu,proto3" json:"cpu,omitempty"`
+ // RAM in GB.
+ Ram uint32 `protobuf:"varint,10,opt,name=ram,proto3" json:"ram,omitempty"`
+ // Whether backup is enabled.
+ // TODO: the upstream (nulink) list/get models do not expose this; always false.
+ Backup bool `protobuf:"varint,11,opt,name=backup,proto3" json:"backup,omitempty"`
+ // Status of the MVM.
+ Status MVMStatus `protobuf:"varint,12,opt,name=status,proto3,enum=fits.api.mvm.v1.MVMStatus" json:"status,omitempty"`
+ // Additional information about the current status.
+ StatusInfo string `protobuf:"bytes,13,opt,name=status_info,json=statusInfo,proto3" json:"status_info,omitempty"`
+ // Availability level.
+ Availability Availability `protobuf:"varint,14,opt,name=availability,proto3,enum=fits.api.mvm.v1.Availability" json:"availability,omitempty"`
+ // Service class.
+ Serviceclass ServiceClass `protobuf:"varint,15,opt,name=serviceclass,proto3,enum=fits.api.mvm.v1.ServiceClass" json:"serviceclass,omitempty"`
+ // OS-specific configuration.
+ //
+ // Types that are valid to be assigned to Details:
+ //
+ // *ManagedVM_WindowsDetails
+ // *ManagedVM_LinuxDetails
+ Details isManagedVM_Details `protobuf_oneof:"details"`
+ // Network interfaces attached to the MVM (IPv4 only).
+ Interfaces []*NetworkInterface `protobuf:"bytes,18,rep,name=interfaces,proto3" json:"interfaces,omitempty"`
+ // VLAN the MVM is attached to.
+ // TODO: not exposed by the upstream (nulink) MVM records yet; always unset.
+ Vlan *VLAN `protobuf:"bytes,19,opt,name=vlan,proto3" json:"vlan,omitempty"`
+ // Internal reference number provided by the user, e.g. a ticket ID.
+ OrderNumber string `protobuf:"bytes,20,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ManagedVM) Reset() {
+ *x = ManagedVM{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ManagedVM) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ManagedVM) ProtoMessage() {}
+
+func (x *ManagedVM) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[3]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ManagedVM.ProtoReflect.Descriptor instead.
+func (*ManagedVM) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ManagedVM) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetMeta() *v1.Meta {
+ if x != nil {
+ return x.Meta
+ }
+ return nil
+}
+
+func (x *ManagedVM) GetFqdn() string {
+ if x != nil {
+ return x.Fqdn
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetTenant() string {
+ if x != nil {
+ return x.Tenant
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetProjectUuid() string {
+ if x != nil {
+ return x.ProjectUuid
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetOsUuid() string {
+ if x != nil {
+ return x.OsUuid
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetLocationUuid() string {
+ if x != nil {
+ return x.LocationUuid
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetContactUuid() string {
+ if x != nil {
+ return x.ContactUuid
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetCpu() uint32 {
+ if x != nil {
+ return x.Cpu
+ }
+ return 0
+}
+
+func (x *ManagedVM) GetRam() uint32 {
+ if x != nil {
+ return x.Ram
+ }
+ return 0
+}
+
+func (x *ManagedVM) GetBackup() bool {
+ if x != nil {
+ return x.Backup
+ }
+ return false
+}
+
+func (x *ManagedVM) GetStatus() MVMStatus {
+ if x != nil {
+ return x.Status
+ }
+ return MVMStatus_MVM_STATUS_UNSPECIFIED
+}
+
+func (x *ManagedVM) GetStatusInfo() string {
+ if x != nil {
+ return x.StatusInfo
+ }
+ return ""
+}
+
+func (x *ManagedVM) GetAvailability() Availability {
+ if x != nil {
+ return x.Availability
+ }
+ return Availability_AVAILABILITY_UNSPECIFIED
+}
+
+func (x *ManagedVM) GetServiceclass() ServiceClass {
+ if x != nil {
+ return x.Serviceclass
+ }
+ return ServiceClass_SERVICE_CLASS_UNSPECIFIED
+}
+
+func (x *ManagedVM) GetDetails() isManagedVM_Details {
+ if x != nil {
+ return x.Details
+ }
+ return nil
+}
+
+func (x *ManagedVM) GetWindowsDetails() *WindowsDetails {
+ if x != nil {
+ if x, ok := x.Details.(*ManagedVM_WindowsDetails); ok {
+ return x.WindowsDetails
+ }
+ }
+ return nil
+}
+
+func (x *ManagedVM) GetLinuxDetails() *LinuxDetails {
+ if x != nil {
+ if x, ok := x.Details.(*ManagedVM_LinuxDetails); ok {
+ return x.LinuxDetails
+ }
+ }
+ return nil
+}
+
+func (x *ManagedVM) GetInterfaces() []*NetworkInterface {
+ if x != nil {
+ return x.Interfaces
+ }
+ return nil
+}
+
+func (x *ManagedVM) GetVlan() *VLAN {
+ if x != nil {
+ return x.Vlan
+ }
+ return nil
+}
+
+func (x *ManagedVM) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+type isManagedVM_Details interface {
+ isManagedVM_Details()
+}
+
+type ManagedVM_WindowsDetails struct {
+ // Windows-specific settings (domain + disks).
+ WindowsDetails *WindowsDetails `protobuf:"bytes,16,opt,name=windows_details,json=windowsDetails,proto3,oneof"`
+}
+
+type ManagedVM_LinuxDetails struct {
+ // Linux-specific settings (LDAP + disks).
+ LinuxDetails *LinuxDetails `protobuf:"bytes,17,opt,name=linux_details,json=linuxDetails,proto3,oneof"`
+}
+
+func (*ManagedVM_WindowsDetails) isManagedVM_Details() {}
+
+func (*ManagedVM_LinuxDetails) isManagedVM_Details() {}
+
+// Request to get a MVM by UUID.
+type MVMServiceGetRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM.
+ Uuid *string `protobuf:"bytes,1,opt,name=uuid,proto3,oneof" json:"uuid,omitempty"`
+ // Tenant of the MVM.
+ Tenant string `protobuf:"bytes,2,opt,name=tenant,proto3" json:"tenant,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceGetRequest) Reset() {
+ *x = MVMServiceGetRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceGetRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceGetRequest) ProtoMessage() {}
+
+func (x *MVMServiceGetRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[4]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceGetRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceGetRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *MVMServiceGetRequest) GetUuid() string {
+ if x != nil && x.Uuid != nil {
+ return *x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceGetRequest) GetTenant() string {
+ if x != nil {
+ return x.Tenant
+ }
+ return ""
+}
+
+// Response containing the requested MVM.
+type MVMServiceGetResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The MVM.
+ Mvm *ManagedVM `protobuf:"bytes,1,opt,name=mvm,proto3" json:"mvm,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceGetResponse) Reset() {
+ *x = MVMServiceGetResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceGetResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceGetResponse) ProtoMessage() {}
+
+func (x *MVMServiceGetResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[5]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceGetResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceGetResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *MVMServiceGetResponse) GetMvm() *ManagedVM {
+ if x != nil {
+ return x.Mvm
+ }
+ return nil
+}
+
+// Windows-specific create request parts.
+type MVMServiceCreateWindowsRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the Windows domain the MVM should join.
+ DomainUuid string `protobuf:"bytes,1,opt,name=domain_uuid,json=domainUuid,proto3" json:"domain_uuid,omitempty"`
+ // Disks for the Windows MVM, excluding the OS disk; must contain exactly
+ // one system disk plus any number of data disks (see DiskType).
+ Disks []*WindowsDisk `protobuf:"bytes,2,rep,name=disks,proto3" json:"disks,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceCreateWindowsRequest) Reset() {
+ *x = MVMServiceCreateWindowsRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceCreateWindowsRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceCreateWindowsRequest) ProtoMessage() {}
+
+func (x *MVMServiceCreateWindowsRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[6]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceCreateWindowsRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceCreateWindowsRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *MVMServiceCreateWindowsRequest) GetDomainUuid() string {
+ if x != nil {
+ return x.DomainUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateWindowsRequest) GetDisks() []*WindowsDisk {
+ if x != nil {
+ return x.Disks
+ }
+ return nil
+}
+
+// Linux-specific create request parts.
+type MVMServiceCreateLinuxRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the LDAP directory the MVM should integrate with.
+ LdapUuid string `protobuf:"bytes,1,opt,name=ldap_uuid,json=ldapUuid,proto3" json:"ldap_uuid,omitempty"`
+ // Disks for the Linux MVM, excluding the OS disk; must contain exactly
+ // one system disk plus any number of data disks (see DiskType).
+ Disks []*LinuxDisk `protobuf:"bytes,2,rep,name=disks,proto3" json:"disks,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceCreateLinuxRequest) Reset() {
+ *x = MVMServiceCreateLinuxRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceCreateLinuxRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceCreateLinuxRequest) ProtoMessage() {}
+
+func (x *MVMServiceCreateLinuxRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[7]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceCreateLinuxRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceCreateLinuxRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *MVMServiceCreateLinuxRequest) GetLdapUuid() string {
+ if x != nil {
+ return x.LdapUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateLinuxRequest) GetDisks() []*LinuxDisk {
+ if x != nil {
+ return x.Disks
+ }
+ return nil
+}
+
+// Request to create a new MVM instance.
+type MVMServiceCreateRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the project this MVM belongs to.
+ ProjectUuid string `protobuf:"bytes,1,opt,name=project_uuid,json=projectUuid,proto3" json:"project_uuid,omitempty"`
+ // Optional name; the FQDN is derived from it.
+ Name *string `protobuf:"bytes,2,opt,name=name,proto3,oneof" json:"name,omitempty"`
+ // UUID of the operating system image to install.
+ OsUuid string `protobuf:"bytes,3,opt,name=os_uuid,json=osUuid,proto3" json:"os_uuid,omitempty"`
+ // UUID of the VLAN network to attach the MVM to.
+ VlanUuid string `protobuf:"bytes,4,opt,name=vlan_uuid,json=vlanUuid,proto3" json:"vlan_uuid,omitempty"`
+ // UUID of the datacenter location; the MVM is scheduled into one data center within it.
+ LocationUuid string `protobuf:"bytes,5,opt,name=location_uuid,json=locationUuid,proto3" json:"location_uuid,omitempty"`
+ // TODO: Contact UUID – open discussion with FCN; may become a dedicated /contact endpoint.
+ ContactUuid string `protobuf:"bytes,6,opt,name=contact_uuid,json=contactUuid,proto3" json:"contact_uuid,omitempty"`
+ // Number of CPU cores.
+ Cpu uint32 `protobuf:"varint,7,opt,name=cpu,proto3" json:"cpu,omitempty"`
+ // RAM in GB. Must be a power of 2.
+ Ram uint32 `protobuf:"varint,8,opt,name=ram,proto3" json:"ram,omitempty"`
+ // Internal reference number provided by the user, e.g. a ticket ID.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,9,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ // Optional key-value labels for accounting purposes.
+ // (e.g. contract number, transaction number, technical key, accounting key).
+ Labels *v1.Labels `protobuf:"bytes,10,opt,name=labels,proto3" json:"labels,omitempty"`
+ // Whether backup is enabled.
+ Backup bool `protobuf:"varint,11,opt,name=backup,proto3" json:"backup,omitempty"`
+ // Availability level.
+ Availability Availability `protobuf:"varint,12,opt,name=availability,proto3,enum=fits.api.mvm.v1.Availability" json:"availability,omitempty"`
+ // Service class; only certain combinations with availability are valid.
+ Serviceclass ServiceClass `protobuf:"varint,13,opt,name=serviceclass,proto3,enum=fits.api.mvm.v1.ServiceClass" json:"serviceclass,omitempty"`
+ // OS type and its configuration.
+ //
+ // Types that are valid to be assigned to Mvmtype:
+ //
+ // *MVMServiceCreateRequest_Windows
+ // *MVMServiceCreateRequest_Linux
+ Mvmtype isMVMServiceCreateRequest_Mvmtype `protobuf_oneof:"mvmtype"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceCreateRequest) Reset() {
+ *x = MVMServiceCreateRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceCreateRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceCreateRequest) ProtoMessage() {}
+
+func (x *MVMServiceCreateRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[8]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceCreateRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceCreateRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *MVMServiceCreateRequest) GetProjectUuid() string {
+ if x != nil {
+ return x.ProjectUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateRequest) GetName() string {
+ if x != nil && x.Name != nil {
+ return *x.Name
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateRequest) GetOsUuid() string {
+ if x != nil {
+ return x.OsUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateRequest) GetVlanUuid() string {
+ if x != nil {
+ return x.VlanUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateRequest) GetLocationUuid() string {
+ if x != nil {
+ return x.LocationUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateRequest) GetContactUuid() string {
+ if x != nil {
+ return x.ContactUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateRequest) GetCpu() uint32 {
+ if x != nil {
+ return x.Cpu
+ }
+ return 0
+}
+
+func (x *MVMServiceCreateRequest) GetRam() uint32 {
+ if x != nil {
+ return x.Ram
+ }
+ return 0
+}
+
+func (x *MVMServiceCreateRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+func (x *MVMServiceCreateRequest) GetLabels() *v1.Labels {
+ if x != nil {
+ return x.Labels
+ }
+ return nil
+}
+
+func (x *MVMServiceCreateRequest) GetBackup() bool {
+ if x != nil {
+ return x.Backup
+ }
+ return false
+}
+
+func (x *MVMServiceCreateRequest) GetAvailability() Availability {
+ if x != nil {
+ return x.Availability
+ }
+ return Availability_AVAILABILITY_UNSPECIFIED
+}
+
+func (x *MVMServiceCreateRequest) GetServiceclass() ServiceClass {
+ if x != nil {
+ return x.Serviceclass
+ }
+ return ServiceClass_SERVICE_CLASS_UNSPECIFIED
+}
+
+func (x *MVMServiceCreateRequest) GetMvmtype() isMVMServiceCreateRequest_Mvmtype {
+ if x != nil {
+ return x.Mvmtype
+ }
+ return nil
+}
+
+func (x *MVMServiceCreateRequest) GetWindows() *MVMServiceCreateWindowsRequest {
+ if x != nil {
+ if x, ok := x.Mvmtype.(*MVMServiceCreateRequest_Windows); ok {
+ return x.Windows
+ }
+ }
+ return nil
+}
+
+func (x *MVMServiceCreateRequest) GetLinux() *MVMServiceCreateLinuxRequest {
+ if x != nil {
+ if x, ok := x.Mvmtype.(*MVMServiceCreateRequest_Linux); ok {
+ return x.Linux
+ }
+ }
+ return nil
+}
+
+type isMVMServiceCreateRequest_Mvmtype interface {
+ isMVMServiceCreateRequest_Mvmtype()
+}
+
+type MVMServiceCreateRequest_Windows struct {
+ // Windows-specific settings (domain + disk).
+ Windows *MVMServiceCreateWindowsRequest `protobuf:"bytes,14,opt,name=windows,proto3,oneof"`
+}
+
+type MVMServiceCreateRequest_Linux struct {
+ // Linux-specific settings (LDAP + disk).
+ Linux *MVMServiceCreateLinuxRequest `protobuf:"bytes,15,opt,name=linux,proto3,oneof"`
+}
+
+func (*MVMServiceCreateRequest_Windows) isMVMServiceCreateRequest_Mvmtype() {}
+
+func (*MVMServiceCreateRequest_Linux) isMVMServiceCreateRequest_Mvmtype() {}
+
+// Disk configuration for a Linux MVM. See DiskType for the kinds of disks
+// (os, system, data) and their lifecycle rules.
+type LinuxDisk struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the disk; set for existing disks, unset for new ones.
+ Uuid *string `protobuf:"bytes,1,opt,name=uuid,proto3,oneof" json:"uuid,omitempty"`
+ // Label (name) of the disk.
+ Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+ // Whether the disk grows automatically when space runs low.
+ AutoExtend bool `protobuf:"varint,3,opt,name=auto_extend,json=autoExtend,proto3" json:"auto_extend,omitempty"`
+ // Size of the disk in GB; defaults to 50 when unset.
+ Size *uint64 `protobuf:"varint,4,opt,name=size,proto3,oneof" json:"size,omitempty"`
+ // Mount point (e.g. "/data"). Fixed to "/appdata" for the system disk;
+ // free-form for data disks.
+ MountPoint *string `protobuf:"bytes,5,opt,name=mount_point,json=mountPoint,proto3,oneof" json:"mount_point,omitempty"`
+ // Kind of the disk; determines which operations are allowed on it.
+ // Provided by the client in create/add requests and populated by the
+ // API in responses.
+ // TODO: talk to FCE that we will provide the disk type in create/add
+ // requests.
+ DiskType *DiskType `protobuf:"varint,6,opt,name=disk_type,json=diskType,proto3,enum=fits.api.mvm.v1.DiskType,oneof" json:"disk_type,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *LinuxDisk) Reset() {
+ *x = LinuxDisk{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *LinuxDisk) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LinuxDisk) ProtoMessage() {}
+
+func (x *LinuxDisk) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[9]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use LinuxDisk.ProtoReflect.Descriptor instead.
+func (*LinuxDisk) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *LinuxDisk) GetUuid() string {
+ if x != nil && x.Uuid != nil {
+ return *x.Uuid
+ }
+ return ""
+}
+
+func (x *LinuxDisk) GetLabel() string {
+ if x != nil {
+ return x.Label
+ }
+ return ""
+}
+
+func (x *LinuxDisk) GetAutoExtend() bool {
+ if x != nil {
+ return x.AutoExtend
+ }
+ return false
+}
+
+func (x *LinuxDisk) GetSize() uint64 {
+ if x != nil && x.Size != nil {
+ return *x.Size
+ }
+ return 0
+}
+
+func (x *LinuxDisk) GetMountPoint() string {
+ if x != nil && x.MountPoint != nil {
+ return *x.MountPoint
+ }
+ return ""
+}
+
+func (x *LinuxDisk) GetDiskType() DiskType {
+ if x != nil && x.DiskType != nil {
+ return *x.DiskType
+ }
+ return DiskType_DISK_TYPE_UNSPECIFIED
+}
+
+// Disk configuration for a Windows MVM. See DiskType for the kinds of
+// disks (os, system, data) and their lifecycle rules.
+type WindowsDisk struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the disk; set for existing disks, unset for new ones.
+ Uuid *string `protobuf:"bytes,1,opt,name=uuid,proto3,oneof" json:"uuid,omitempty"`
+ // Label (name) of the disk.
+ Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+ // Whether the disk grows automatically when space runs low.
+ AutoExtend bool `protobuf:"varint,3,opt,name=auto_extend,json=autoExtend,proto3" json:"auto_extend,omitempty"`
+ // Size of the disk in GB; defaults to 50 when unset.
+ Size *uint64 `protobuf:"varint,4,opt,name=size,proto3,oneof" json:"size,omitempty"`
+ // Drive letter (e.g. "D"). Fixed to "F" for the system disk; free-form
+ // for data disks.
+ Driveletter *string `protobuf:"bytes,5,opt,name=driveletter,proto3,oneof" json:"driveletter,omitempty"`
+ // Kind of the disk; determines which operations are allowed on it.
+ // Provided by the client in create/add requests and populated by the
+ // API in responses.
+ // TODO: talk to FCE that we will provide the disk type in create/add
+ // requests.
+ DiskType *DiskType `protobuf:"varint,6,opt,name=disk_type,json=diskType,proto3,enum=fits.api.mvm.v1.DiskType,oneof" json:"disk_type,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *WindowsDisk) Reset() {
+ *x = WindowsDisk{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *WindowsDisk) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WindowsDisk) ProtoMessage() {}
+
+func (x *WindowsDisk) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[10]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use WindowsDisk.ProtoReflect.Descriptor instead.
+func (*WindowsDisk) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *WindowsDisk) GetUuid() string {
+ if x != nil && x.Uuid != nil {
+ return *x.Uuid
+ }
+ return ""
+}
+
+func (x *WindowsDisk) GetLabel() string {
+ if x != nil {
+ return x.Label
+ }
+ return ""
+}
+
+func (x *WindowsDisk) GetAutoExtend() bool {
+ if x != nil {
+ return x.AutoExtend
+ }
+ return false
+}
+
+func (x *WindowsDisk) GetSize() uint64 {
+ if x != nil && x.Size != nil {
+ return *x.Size
+ }
+ return 0
+}
+
+func (x *WindowsDisk) GetDriveletter() string {
+ if x != nil && x.Driveletter != nil {
+ return *x.Driveletter
+ }
+ return ""
+}
+
+func (x *WindowsDisk) GetDiskType() DiskType {
+ if x != nil && x.DiskType != nil {
+ return *x.DiskType
+ }
+ return DiskType_DISK_TYPE_UNSPECIFIED
+}
+
+// Response for Create; an empty response means the MVM was accepted.
+type MVMServiceCreateResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceCreateResponse) Reset() {
+ *x = MVMServiceCreateResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[11]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceCreateResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceCreateResponse) ProtoMessage() {}
+
+func (x *MVMServiceCreateResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[11]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceCreateResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceCreateResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{11}
+}
+
+// Request to change a mutable property of an existing MVM.
+// Exactly one action must be set; each maps onto its own upstream endpoint.
+// TODO: the oneof mirrors the upstream constraint (nulink has one endpoint per
+// action); combined changes would need
+// server-side fan-out without rollback.
+// TODO: clarify async semantics — this is a queued "request to update", not an
+//
+// immediate update (e.g. disk changes are applied overnight). Consider
+// renaming to reflect that.
+//
+// TODO: differentiate between fire-and-forget and queued actions in the API.
+// TODO: is it possible to expose the pending-change queue (list/cancel) to the caller?
+// TODO: clarify who enqueues the request and whether a pending change blocks
+//
+// further edits (e.g. after AddDisk, until the change executes).
+type MVMServiceUpdateRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM to update.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,3,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ // Timestamp and strategy for this update.
+ UpdateMeta *v1.UpdateMeta `protobuf:"bytes,4,opt,name=update_meta,json=updateMeta,proto3" json:"update_meta,omitempty"`
+ // The change to apply.
+ //
+ // Types that are valid to be assigned to Action:
+ //
+ // *MVMServiceUpdateRequest_PerformanceClass
+ // *MVMServiceUpdateRequest_ServiceClass
+ // *MVMServiceUpdateRequest_Contact
+ Action isMVMServiceUpdateRequest_Action `protobuf_oneof:"action"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceUpdateRequest) Reset() {
+ *x = MVMServiceUpdateRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[12]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceUpdateRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceUpdateRequest) ProtoMessage() {}
+
+func (x *MVMServiceUpdateRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[12]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceUpdateRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceUpdateRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *MVMServiceUpdateRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceUpdateRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceUpdateRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+func (x *MVMServiceUpdateRequest) GetUpdateMeta() *v1.UpdateMeta {
+ if x != nil {
+ return x.UpdateMeta
+ }
+ return nil
+}
+
+func (x *MVMServiceUpdateRequest) GetAction() isMVMServiceUpdateRequest_Action {
+ if x != nil {
+ return x.Action
+ }
+ return nil
+}
+
+func (x *MVMServiceUpdateRequest) GetPerformanceClass() *PerformanceClassChange {
+ if x != nil {
+ if x, ok := x.Action.(*MVMServiceUpdateRequest_PerformanceClass); ok {
+ return x.PerformanceClass
+ }
+ }
+ return nil
+}
+
+func (x *MVMServiceUpdateRequest) GetServiceClass() *ServiceClassChange {
+ if x != nil {
+ if x, ok := x.Action.(*MVMServiceUpdateRequest_ServiceClass); ok {
+ return x.ServiceClass
+ }
+ }
+ return nil
+}
+
+func (x *MVMServiceUpdateRequest) GetContact() *ContactChange {
+ if x != nil {
+ if x, ok := x.Action.(*MVMServiceUpdateRequest_Contact); ok {
+ return x.Contact
+ }
+ }
+ return nil
+}
+
+type isMVMServiceUpdateRequest_Action interface {
+ isMVMServiceUpdateRequest_Action()
+}
+
+type MVMServiceUpdateRequest_PerformanceClass struct {
+ // Change the CPU/RAM performance class.
+ PerformanceClass *PerformanceClassChange `protobuf:"bytes,5,opt,name=performance_class,json=performanceClass,proto3,oneof"`
+}
+
+type MVMServiceUpdateRequest_ServiceClass struct {
+ // Change the service class.
+ ServiceClass *ServiceClassChange `protobuf:"bytes,6,opt,name=service_class,json=serviceClass,proto3,oneof"`
+}
+
+type MVMServiceUpdateRequest_Contact struct {
+ // Change the contact person.
+ Contact *ContactChange `protobuf:"bytes,7,opt,name=contact,proto3,oneof"`
+}
+
+func (*MVMServiceUpdateRequest_PerformanceClass) isMVMServiceUpdateRequest_Action() {}
+
+func (*MVMServiceUpdateRequest_ServiceClass) isMVMServiceUpdateRequest_Action() {}
+
+func (*MVMServiceUpdateRequest_Contact) isMVMServiceUpdateRequest_Action() {}
+
+// PerformanceClassChange is the payload for changing a MVM's CPU and RAM.
+type PerformanceClassChange struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Number of vCPUs (1-64).
+ Cpu uint32 `protobuf:"varint,1,opt,name=cpu,proto3" json:"cpu,omitempty"`
+ // RAM size in GB.
+ Ram uint32 `protobuf:"varint,2,opt,name=ram,proto3" json:"ram,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *PerformanceClassChange) Reset() {
+ *x = PerformanceClassChange{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[13]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *PerformanceClassChange) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PerformanceClassChange) ProtoMessage() {}
+
+func (x *PerformanceClassChange) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[13]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PerformanceClassChange.ProtoReflect.Descriptor instead.
+func (*PerformanceClassChange) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *PerformanceClassChange) GetCpu() uint32 {
+ if x != nil {
+ return x.Cpu
+ }
+ return 0
+}
+
+func (x *PerformanceClassChange) GetRam() uint32 {
+ if x != nil {
+ return x.Ram
+ }
+ return 0
+}
+
+// ServiceClassChange is the payload for changing a MVM's service class.
+type ServiceClassChange struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Target service class.
+ Serviceclass ServiceClass `protobuf:"varint,1,opt,name=serviceclass,proto3,enum=fits.api.mvm.v1.ServiceClass" json:"serviceclass,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ServiceClassChange) Reset() {
+ *x = ServiceClassChange{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[14]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ServiceClassChange) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ServiceClassChange) ProtoMessage() {}
+
+func (x *ServiceClassChange) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[14]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ServiceClassChange.ProtoReflect.Descriptor instead.
+func (*ServiceClassChange) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *ServiceClassChange) GetServiceclass() ServiceClass {
+ if x != nil {
+ return x.Serviceclass
+ }
+ return ServiceClass_SERVICE_CLASS_UNSPECIFIED
+}
+
+// ContactChange is the payload for changing a MVM's contact person.
+type ContactChange struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the new contact.
+ ContactUuid string `protobuf:"bytes,1,opt,name=contact_uuid,json=contactUuid,proto3" json:"contact_uuid,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ContactChange) Reset() {
+ *x = ContactChange{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[15]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ContactChange) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContactChange) ProtoMessage() {}
+
+func (x *ContactChange) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[15]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ContactChange.ProtoReflect.Descriptor instead.
+func (*ContactChange) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *ContactChange) GetContactUuid() string {
+ if x != nil {
+ return x.ContactUuid
+ }
+ return ""
+}
+
+// Response for Update; an empty response means the change was accepted.
+type MVMServiceUpdateResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceUpdateResponse) Reset() {
+ *x = MVMServiceUpdateResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[16]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceUpdateResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceUpdateResponse) ProtoMessage() {}
+
+func (x *MVMServiceUpdateResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[16]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceUpdateResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceUpdateResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{16}
+}
+
+// Request to list MVMs.
+type MVMServiceListRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Tenant of the MVMs.
+ Tenant *string `protobuf:"bytes,1,opt,name=tenant,proto3,oneof" json:"tenant,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceListRequest) Reset() {
+ *x = MVMServiceListRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[17]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceListRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceListRequest) ProtoMessage() {}
+
+func (x *MVMServiceListRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[17]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceListRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceListRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *MVMServiceListRequest) GetTenant() string {
+ if x != nil && x.Tenant != nil {
+ return *x.Tenant
+ }
+ return ""
+}
+
+// Response containing the list of MVMs.
+type MVMServiceListResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The MVM instances.
+ Mvms []*ManagedVM `protobuf:"bytes,1,rep,name=mvms,proto3" json:"mvms,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceListResponse) Reset() {
+ *x = MVMServiceListResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[18]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceListResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceListResponse) ProtoMessage() {}
+
+func (x *MVMServiceListResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[18]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceListResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceListResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *MVMServiceListResponse) GetMvms() []*ManagedVM {
+ if x != nil {
+ return x.Mvms
+ }
+ return nil
+}
+
+// Request to cancel a MVM instance.
+type MVMServiceDeleteRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
+ // UUID of the MVM to delete.
+ Uuid string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,3,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceDeleteRequest) Reset() {
+ *x = MVMServiceDeleteRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[19]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceDeleteRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceDeleteRequest) ProtoMessage() {}
+
+func (x *MVMServiceDeleteRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[19]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceDeleteRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *MVMServiceDeleteRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+// Response for Delete; an empty response means the cancellation was accepted.
+type MVMServiceDeleteResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceDeleteResponse) Reset() {
+ *x = MVMServiceDeleteResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[20]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceDeleteResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceDeleteResponse) ProtoMessage() {}
+
+func (x *MVMServiceDeleteResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[20]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceDeleteResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceDeleteResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{20}
+}
+
+// Request to validate a MVM create without creating anything.
+type MVMServiceValidateCreateRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The create request to validate.
+ Create *MVMServiceCreateRequest `protobuf:"bytes,1,opt,name=create,proto3" json:"create,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateCreateRequest) Reset() {
+ *x = MVMServiceValidateCreateRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[21]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateCreateRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateCreateRequest) ProtoMessage() {}
+
+func (x *MVMServiceValidateCreateRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[21]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateCreateRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateCreateRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *MVMServiceValidateCreateRequest) GetCreate() *MVMServiceCreateRequest {
+ if x != nil {
+ return x.Create
+ }
+ return nil
+}
+
+// Response for ValidateCreate; violations are returned as an InvalidArgument error.
+type MVMServiceValidateCreateResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateCreateResponse) Reset() {
+ *x = MVMServiceValidateCreateResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[22]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateCreateResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateCreateResponse) ProtoMessage() {}
+
+func (x *MVMServiceValidateCreateResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[22]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateCreateResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateCreateResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{22}
+}
+
+// Request to validate an AddDisk without ordering anything.
+type MVMServiceValidateAddDiskRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The add disk request to validate.
+ AddDisk *MVMServiceAddDiskRequest `protobuf:"bytes,1,opt,name=add_disk,json=addDisk,proto3" json:"add_disk,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateAddDiskRequest) Reset() {
+ *x = MVMServiceValidateAddDiskRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[23]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateAddDiskRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateAddDiskRequest) ProtoMessage() {}
+
+func (x *MVMServiceValidateAddDiskRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[23]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateAddDiskRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateAddDiskRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *MVMServiceValidateAddDiskRequest) GetAddDisk() *MVMServiceAddDiskRequest {
+ if x != nil {
+ return x.AddDisk
+ }
+ return nil
+}
+
+// Response for ValidateAddDisk; violations are returned as an InvalidArgument error.
+type MVMServiceValidateAddDiskResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateAddDiskResponse) Reset() {
+ *x = MVMServiceValidateAddDiskResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[24]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateAddDiskResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateAddDiskResponse) ProtoMessage() {}
+
+func (x *MVMServiceValidateAddDiskResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[24]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateAddDiskResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateAddDiskResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{24}
+}
+
+// Request to validate an UpdateDisk without changing anything.
+type MVMServiceValidateUpdateDiskRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The update disk request to validate.
+ UpdateDisk *MVMServiceUpdateDiskRequest `protobuf:"bytes,1,opt,name=update_disk,json=updateDisk,proto3" json:"update_disk,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateUpdateDiskRequest) Reset() {
+ *x = MVMServiceValidateUpdateDiskRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[25]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateUpdateDiskRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateUpdateDiskRequest) ProtoMessage() {}
+
+func (x *MVMServiceValidateUpdateDiskRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[25]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateUpdateDiskRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateUpdateDiskRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *MVMServiceValidateUpdateDiskRequest) GetUpdateDisk() *MVMServiceUpdateDiskRequest {
+ if x != nil {
+ return x.UpdateDisk
+ }
+ return nil
+}
+
+// Response for ValidateUpdateDisk; violations are returned as an InvalidArgument error.
+type MVMServiceValidateUpdateDiskResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateUpdateDiskResponse) Reset() {
+ *x = MVMServiceValidateUpdateDiskResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[26]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateUpdateDiskResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateUpdateDiskResponse) ProtoMessage() {}
+
+func (x *MVMServiceValidateUpdateDiskResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[26]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateUpdateDiskResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateUpdateDiskResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{26}
+}
+
+// Response for AddDisk.
+type MVMServiceAddDiskResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceAddDiskResponse) Reset() {
+ *x = MVMServiceAddDiskResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[27]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceAddDiskResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceAddDiskResponse) ProtoMessage() {}
+
+func (x *MVMServiceAddDiskResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[27]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceAddDiskResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceAddDiskResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{27}
+}
+
+// Response for UpdateDisk.
+type MVMServiceUpdateDiskResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceUpdateDiskResponse) Reset() {
+ *x = MVMServiceUpdateDiskResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[28]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceUpdateDiskResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceUpdateDiskResponse) ProtoMessage() {}
+
+func (x *MVMServiceUpdateDiskResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[28]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceUpdateDiskResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceUpdateDiskResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{28}
+}
+
+// Response for DeleteDisk.
+type MVMServiceDeleteDiskResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceDeleteDiskResponse) Reset() {
+ *x = MVMServiceDeleteDiskResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[29]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceDeleteDiskResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceDeleteDiskResponse) ProtoMessage() {}
+
+func (x *MVMServiceDeleteDiskResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[29]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceDeleteDiskResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceDeleteDiskResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{29}
+}
+
+// Request to order an additional data disk for a MVM.
+type MVMServiceAddDiskRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM to attach the disk to.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,3,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ // OS-specific disk specification; must match the MVM's OS type.
+ //
+ // Types that are valid to be assigned to Disk:
+ //
+ // *MVMServiceAddDiskRequest_Linux
+ // *MVMServiceAddDiskRequest_Windows
+ Disk isMVMServiceAddDiskRequest_Disk `protobuf_oneof:"disk"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceAddDiskRequest) Reset() {
+ *x = MVMServiceAddDiskRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[30]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceAddDiskRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceAddDiskRequest) ProtoMessage() {}
+
+func (x *MVMServiceAddDiskRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[30]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceAddDiskRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceAddDiskRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *MVMServiceAddDiskRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceAddDiskRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceAddDiskRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+func (x *MVMServiceAddDiskRequest) GetDisk() isMVMServiceAddDiskRequest_Disk {
+ if x != nil {
+ return x.Disk
+ }
+ return nil
+}
+
+func (x *MVMServiceAddDiskRequest) GetLinux() *LinuxDisk {
+ if x != nil {
+ if x, ok := x.Disk.(*MVMServiceAddDiskRequest_Linux); ok {
+ return x.Linux
+ }
+ }
+ return nil
+}
+
+func (x *MVMServiceAddDiskRequest) GetWindows() *WindowsDisk {
+ if x != nil {
+ if x, ok := x.Disk.(*MVMServiceAddDiskRequest_Windows); ok {
+ return x.Windows
+ }
+ }
+ return nil
+}
+
+type isMVMServiceAddDiskRequest_Disk interface {
+ isMVMServiceAddDiskRequest_Disk()
+}
+
+type MVMServiceAddDiskRequest_Linux struct {
+ // Linux data disk.
+ Linux *LinuxDisk `protobuf:"bytes,4,opt,name=linux,proto3,oneof"`
+}
+
+type MVMServiceAddDiskRequest_Windows struct {
+ // Windows data disk.
+ Windows *WindowsDisk `protobuf:"bytes,5,opt,name=windows,proto3,oneof"`
+}
+
+func (*MVMServiceAddDiskRequest_Linux) isMVMServiceAddDiskRequest_Disk() {}
+
+func (*MVMServiceAddDiskRequest_Windows) isMVMServiceAddDiskRequest_Disk() {}
+
+// Request to change an existing disk; only size and auto-extend are
+// mutable (see DiskType for applicability per disk kind).
+type MVMServiceUpdateDiskRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM the disk belongs to.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // UUID of the disk to change.
+ DiskUuid string `protobuf:"bytes,2,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,4,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ // New auto-extend behavior; unset keeps the current value.
+ AutoExtend *bool `protobuf:"varint,5,opt,name=auto_extend,json=autoExtend,proto3,oneof" json:"auto_extend,omitempty"`
+ // New size of the disk in GB; unset keeps the current value.
+ Size *uint64 `protobuf:"varint,6,opt,name=size,proto3,oneof" json:"size,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceUpdateDiskRequest) Reset() {
+ *x = MVMServiceUpdateDiskRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[31]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceUpdateDiskRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceUpdateDiskRequest) ProtoMessage() {}
+
+func (x *MVMServiceUpdateDiskRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[31]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceUpdateDiskRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceUpdateDiskRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *MVMServiceUpdateDiskRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceUpdateDiskRequest) GetDiskUuid() string {
+ if x != nil {
+ return x.DiskUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceUpdateDiskRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceUpdateDiskRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+func (x *MVMServiceUpdateDiskRequest) GetAutoExtend() bool {
+ if x != nil && x.AutoExtend != nil {
+ return *x.AutoExtend
+ }
+ return false
+}
+
+func (x *MVMServiceUpdateDiskRequest) GetSize() uint64 {
+ if x != nil && x.Size != nil {
+ return *x.Size
+ }
+ return 0
+}
+
+// Request to cancel a data disk; OS and system disks are rejected by the
+// upstream.
+type MVMServiceDeleteDiskRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM the disk belongs to.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // UUID of the disk to cancel.
+ DiskUuid string `protobuf:"bytes,2,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,4,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceDeleteDiskRequest) Reset() {
+ *x = MVMServiceDeleteDiskRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[32]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceDeleteDiskRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceDeleteDiskRequest) ProtoMessage() {}
+
+func (x *MVMServiceDeleteDiskRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[32]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceDeleteDiskRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceDeleteDiskRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *MVMServiceDeleteDiskRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteDiskRequest) GetDiskUuid() string {
+ if x != nil {
+ return x.DiskUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteDiskRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteDiskRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+// Response for AddNetworkInterface.
+type MVMServiceAddNetworkInterfaceResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceAddNetworkInterfaceResponse) Reset() {
+ *x = MVMServiceAddNetworkInterfaceResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[33]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceAddNetworkInterfaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceAddNetworkInterfaceResponse) ProtoMessage() {}
+
+func (x *MVMServiceAddNetworkInterfaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[33]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceAddNetworkInterfaceResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceAddNetworkInterfaceResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{33}
+}
+
+// Response for MoveNetworkInterface.
+type MVMServiceMoveNetworkInterfaceResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceMoveNetworkInterfaceResponse) Reset() {
+ *x = MVMServiceMoveNetworkInterfaceResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[34]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceMoveNetworkInterfaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceMoveNetworkInterfaceResponse) ProtoMessage() {}
+
+func (x *MVMServiceMoveNetworkInterfaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[34]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceMoveNetworkInterfaceResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceMoveNetworkInterfaceResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{34}
+}
+
+// Response for DeleteNetworkInterface.
+type MVMServiceDeleteNetworkInterfaceResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceResponse) Reset() {
+ *x = MVMServiceDeleteNetworkInterfaceResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[35]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceDeleteNetworkInterfaceResponse) ProtoMessage() {}
+
+func (x *MVMServiceDeleteNetworkInterfaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[35]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceDeleteNetworkInterfaceResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceDeleteNetworkInterfaceResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{35}
+}
+
+// Request to order an additional network interface for a MVM.
+// Nulink treats interface and IP as a 1:1 relation; move and delete
+// operate on the interface_uuid.
+type MVMServiceAddNetworkInterfaceRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM to attach the interface to.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,3,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceAddNetworkInterfaceRequest) Reset() {
+ *x = MVMServiceAddNetworkInterfaceRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[36]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceAddNetworkInterfaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceAddNetworkInterfaceRequest) ProtoMessage() {}
+
+func (x *MVMServiceAddNetworkInterfaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[36]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceAddNetworkInterfaceRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceAddNetworkInterfaceRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *MVMServiceAddNetworkInterfaceRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceAddNetworkInterfaceRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceAddNetworkInterfaceRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+// Request to move a network interface from one MVM to another.
+type MVMServiceMoveNetworkInterfaceRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM the interface currently belongs to.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // UUID of the network interface holding the IP.
+ InterfaceUuid string `protobuf:"bytes,2,opt,name=interface_uuid,json=interfaceUuid,proto3" json:"interface_uuid,omitempty"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,4,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ // UUID of the MVM to move the interface to.
+ TargetMvmUuid string `protobuf:"bytes,5,opt,name=target_mvm_uuid,json=targetMvmUuid,proto3" json:"target_mvm_uuid,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) Reset() {
+ *x = MVMServiceMoveNetworkInterfaceRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[37]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceMoveNetworkInterfaceRequest) ProtoMessage() {}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[37]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceMoveNetworkInterfaceRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceMoveNetworkInterfaceRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) GetInterfaceUuid() string {
+ if x != nil {
+ return x.InterfaceUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+func (x *MVMServiceMoveNetworkInterfaceRequest) GetTargetMvmUuid() string {
+ if x != nil {
+ return x.TargetMvmUuid
+ }
+ return ""
+}
+
+// Request to delete a network interface from a MVM.
+type MVMServiceDeleteNetworkInterfaceRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // UUID of the MVM the interface belongs to.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // UUID of the network interface holding the IP.
+ InterfaceUuid string `protobuf:"bytes,2,opt,name=interface_uuid,json=interfaceUuid,proto3" json:"interface_uuid,omitempty"`
+ // Project the MVM belongs to.
+ Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"`
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ OrderNumber string `protobuf:"bytes,4,opt,name=order_number,json=orderNumber,proto3" json:"order_number,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceRequest) Reset() {
+ *x = MVMServiceDeleteNetworkInterfaceRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[38]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceDeleteNetworkInterfaceRequest) ProtoMessage() {}
+
+func (x *MVMServiceDeleteNetworkInterfaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[38]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceDeleteNetworkInterfaceRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceDeleteNetworkInterfaceRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceRequest) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceRequest) GetInterfaceUuid() string {
+ if x != nil {
+ return x.InterfaceUuid
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceRequest) GetProject() string {
+ if x != nil {
+ return x.Project
+ }
+ return ""
+}
+
+func (x *MVMServiceDeleteNetworkInterfaceRequest) GetOrderNumber() string {
+ if x != nil {
+ return x.OrderNumber
+ }
+ return ""
+}
+
+// Request to validate an AddNetworkInterface without ordering anything.
+type MVMServiceValidateAddNetworkInterfaceRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The add network interface request to validate.
+ AddNetworkInterface *MVMServiceAddNetworkInterfaceRequest `protobuf:"bytes,1,opt,name=add_network_interface,json=addNetworkInterface,proto3" json:"add_network_interface,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateAddNetworkInterfaceRequest) Reset() {
+ *x = MVMServiceValidateAddNetworkInterfaceRequest{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[39]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateAddNetworkInterfaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateAddNetworkInterfaceRequest) ProtoMessage() {}
+
+func (x *MVMServiceValidateAddNetworkInterfaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[39]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateAddNetworkInterfaceRequest.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateAddNetworkInterfaceRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{39}
+}
+
+func (x *MVMServiceValidateAddNetworkInterfaceRequest) GetAddNetworkInterface() *MVMServiceAddNetworkInterfaceRequest {
+ if x != nil {
+ return x.AddNetworkInterface
+ }
+ return nil
+}
+
+// Response for ValidateAddNetworkInterface; violations are returned as an InvalidArgument error.
+type MVMServiceValidateAddNetworkInterfaceResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MVMServiceValidateAddNetworkInterfaceResponse) Reset() {
+ *x = MVMServiceValidateAddNetworkInterfaceResponse{}
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[40]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MVMServiceValidateAddNetworkInterfaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MVMServiceValidateAddNetworkInterfaceResponse) ProtoMessage() {}
+
+func (x *MVMServiceValidateAddNetworkInterfaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_mvm_proto_msgTypes[40]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MVMServiceValidateAddNetworkInterfaceResponse.ProtoReflect.Descriptor instead.
+func (*MVMServiceValidateAddNetworkInterfaceResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_mvm_proto_rawDescGZIP(), []int{40}
+}
+
+var File_fits_api_mvm_v1_mvm_proto protoreflect.FileDescriptor
+
+const file_fits_api_mvm_v1_mvm_proto_rawDesc = "" +
+ "\n" +
+ "\x19fits/api/mvm/v1/mvm.proto\x12\x0ffits.api.mvm.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1afits/api/mvm/v1/vlan.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\x91\x01\n" +
+ "\fLinuxDetails\x120\n" +
+ "\x05disks\x18\x01 \x03(\v2\x1a.fits.api.mvm.v1.LinuxDiskR\x05disks\x12%\n" +
+ "\tldap_uuid\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\bldapUuid\x12(\n" +
+ "\tldap_fqdn\x18\x03 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\bldapFqdn\"\x9d\x01\n" +
+ "\x0eWindowsDetails\x122\n" +
+ "\x05disks\x18\x01 \x03(\v2\x1c.fits.api.mvm.v1.WindowsDiskR\x05disks\x12)\n" +
+ "\vdomain_uuid\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\n" +
+ "domainUuid\x12,\n" +
+ "\vdomain_fqdn\x18\x03 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\n" +
+ "domainFqdn\"{\n" +
+ "\x10NetworkInterface\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12)\n" +
+ "\tipaddress\x18\x02 \x01(\tB\v\xbaH\br\x06賮\xb1\x02\x01R\tipaddress\x12\x1e\n" +
+ "\n" +
+ "macaddress\x18\x03 \x01(\tR\n" +
+ "macaddress\"\xac\a\n" +
+ "\tManagedVM\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12%\n" +
+ "\x04meta\x18\x02 \x01(\v2\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n" +
+ "\x04fqdn\x18\x03 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x04fqdn\x12#\n" +
+ "\x06tenant\x18\x04 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenant\x12+\n" +
+ "\fproject_uuid\x18\x05 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\vprojectUuid\x12!\n" +
+ "\aos_uuid\x18\x06 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06osUuid\x12-\n" +
+ "\rlocation_uuid\x18\a \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\flocationUuid\x12+\n" +
+ "\fcontact_uuid\x18\b \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\vcontactUuid\x12\x10\n" +
+ "\x03cpu\x18\t \x01(\rR\x03cpu\x12\x10\n" +
+ "\x03ram\x18\n" +
+ " \x01(\rR\x03ram\x12\x16\n" +
+ "\x06backup\x18\v \x01(\bR\x06backup\x12<\n" +
+ "\x06status\x18\f \x01(\x0e2\x1a.fits.api.mvm.v1.MVMStatusB\b\xbaH\x05\x82\x01\x02\x10\x01R\x06status\x12\x1f\n" +
+ "\vstatus_info\x18\r \x01(\tR\n" +
+ "statusInfo\x12K\n" +
+ "\favailability\x18\x0e \x01(\x0e2\x1d.fits.api.mvm.v1.AvailabilityB\b\xbaH\x05\x82\x01\x02\x10\x01R\favailability\x12K\n" +
+ "\fserviceclass\x18\x0f \x01(\x0e2\x1d.fits.api.mvm.v1.ServiceClassB\b\xbaH\x05\x82\x01\x02\x10\x01R\fserviceclass\x12J\n" +
+ "\x0fwindows_details\x18\x10 \x01(\v2\x1f.fits.api.mvm.v1.WindowsDetailsH\x00R\x0ewindowsDetails\x12D\n" +
+ "\rlinux_details\x18\x11 \x01(\v2\x1d.fits.api.mvm.v1.LinuxDetailsH\x00R\flinuxDetails\x12A\n" +
+ "\n" +
+ "interfaces\x18\x12 \x03(\v2!.fits.api.mvm.v1.NetworkInterfaceR\n" +
+ "interfaces\x12)\n" +
+ "\x04vlan\x18\x13 \x01(\v2\x15.fits.api.mvm.v1.VLANR\x04vlan\x12!\n" +
+ "\forder_number\x18\x14 \x01(\tR\vorderNumberB\x10\n" +
+ "\adetails\x12\x05\xbaH\x02\b\x01\"g\n" +
+ "\x14MVMServiceGetRequest\x12!\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12#\n" +
+ "\x06tenant\x18\x02 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenantB\a\n" +
+ "\x05_uuid\"E\n" +
+ "\x15MVMServiceGetResponse\x12,\n" +
+ "\x03mvm\x18\x01 \x01(\v2\x1a.fits.api.mvm.v1.ManagedVMR\x03mvm\"\x89\x01\n" +
+ "\x1eMVMServiceCreateWindowsRequest\x12)\n" +
+ "\vdomain_uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\n" +
+ "domainUuid\x12<\n" +
+ "\x05disks\x18\x02 \x03(\v2\x1c.fits.api.mvm.v1.WindowsDiskB\b\xbaH\x05\x92\x01\x02\b\x01R\x05disks\"\x81\x01\n" +
+ "\x1cMVMServiceCreateLinuxRequest\x12%\n" +
+ "\tldap_uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\bldapUuid\x12:\n" +
+ "\x05disks\x18\x02 \x03(\v2\x1a.fits.api.mvm.v1.LinuxDiskB\b\xbaH\x05\x92\x01\x02\b\x01R\x05disks\"\xe7\x05\n" +
+ "\x17MVMServiceCreateRequest\x12+\n" +
+ "\fproject_uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\vprojectUuid\x12$\n" +
+ "\x04name\x18\x02 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12!\n" +
+ "\aos_uuid\x18\x03 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x06osUuid\x12%\n" +
+ "\tvlan_uuid\x18\x04 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\bvlanUuid\x12-\n" +
+ "\rlocation_uuid\x18\x05 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\flocationUuid\x12+\n" +
+ "\fcontact_uuid\x18\x06 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\vcontactUuid\x12\x10\n" +
+ "\x03cpu\x18\a \x01(\rR\x03cpu\x12\x10\n" +
+ "\x03ram\x18\b \x01(\rR\x03ram\x12!\n" +
+ "\forder_number\x18\t \x01(\tR\vorderNumber\x12+\n" +
+ "\x06labels\x18\n" +
+ " \x01(\v2\x13.fits.api.v1.LabelsR\x06labels\x12\x16\n" +
+ "\x06backup\x18\v \x01(\bR\x06backup\x12K\n" +
+ "\favailability\x18\f \x01(\x0e2\x1d.fits.api.mvm.v1.AvailabilityB\b\xbaH\x05\x82\x01\x02\x10\x01R\favailability\x12K\n" +
+ "\fserviceclass\x18\r \x01(\x0e2\x1d.fits.api.mvm.v1.ServiceClassB\b\xbaH\x05\x82\x01\x02\x10\x01R\fserviceclass\x12K\n" +
+ "\awindows\x18\x0e \x01(\v2/.fits.api.mvm.v1.MVMServiceCreateWindowsRequestH\x00R\awindows\x12E\n" +
+ "\x05linux\x18\x0f \x01(\v2-.fits.api.mvm.v1.MVMServiceCreateLinuxRequestH\x00R\x05linuxB\x10\n" +
+ "\amvmtype\x12\x05\xbaH\x02\b\x01B\a\n" +
+ "\x05_name\"\x9b\x02\n" +
+ "\tLinuxDisk\x12!\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12\x14\n" +
+ "\x05label\x18\x02 \x01(\tR\x05label\x12\x1f\n" +
+ "\vauto_extend\x18\x03 \x01(\bR\n" +
+ "autoExtend\x12\x17\n" +
+ "\x04size\x18\x04 \x01(\x04H\x01R\x04size\x88\x01\x01\x12$\n" +
+ "\vmount_point\x18\x05 \x01(\tH\x02R\n" +
+ "mountPoint\x88\x01\x01\x12E\n" +
+ "\tdisk_type\x18\x06 \x01(\x0e2\x19.fits.api.mvm.v1.DiskTypeB\b\xbaH\x05\x82\x01\x02\x10\x01H\x03R\bdiskType\x88\x01\x01B\a\n" +
+ "\x05_uuidB\a\n" +
+ "\x05_sizeB\x0e\n" +
+ "\f_mount_pointB\f\n" +
+ "\n" +
+ "_disk_type\"\x9e\x02\n" +
+ "\vWindowsDisk\x12!\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12\x14\n" +
+ "\x05label\x18\x02 \x01(\tR\x05label\x12\x1f\n" +
+ "\vauto_extend\x18\x03 \x01(\bR\n" +
+ "autoExtend\x12\x17\n" +
+ "\x04size\x18\x04 \x01(\x04H\x01R\x04size\x88\x01\x01\x12%\n" +
+ "\vdriveletter\x18\x05 \x01(\tH\x02R\vdriveletter\x88\x01\x01\x12E\n" +
+ "\tdisk_type\x18\x06 \x01(\x0e2\x19.fits.api.mvm.v1.DiskTypeB\b\xbaH\x05\x82\x01\x02\x10\x01H\x03R\bdiskType\x88\x01\x01B\a\n" +
+ "\x05_uuidB\a\n" +
+ "\x05_sizeB\x0e\n" +
+ "\f_driveletterB\f\n" +
+ "\n" +
+ "_disk_type\"\x1a\n" +
+ "\x18MVMServiceCreateResponse\"\xb1\x03\n" +
+ "\x17MVMServiceUpdateRequest\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\"\n" +
+ "\aproject\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12!\n" +
+ "\forder_number\x18\x03 \x01(\tR\vorderNumber\x12@\n" +
+ "\vupdate_meta\x18\x04 \x01(\v2\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\n" +
+ "updateMeta\x12V\n" +
+ "\x11performance_class\x18\x05 \x01(\v2'.fits.api.mvm.v1.PerformanceClassChangeH\x00R\x10performanceClass\x12J\n" +
+ "\rservice_class\x18\x06 \x01(\v2#.fits.api.mvm.v1.ServiceClassChangeH\x00R\fserviceClass\x12:\n" +
+ "\acontact\x18\a \x01(\v2\x1e.fits.api.mvm.v1.ContactChangeH\x00R\acontactB\x0f\n" +
+ "\x06action\x12\x05\xbaH\x02\b\x01\"P\n" +
+ "\x16PerformanceClassChange\x12\x1b\n" +
+ "\x03cpu\x18\x01 \x01(\rB\t\xbaH\x06*\x04\x18@(\x01R\x03cpu\x12\x19\n" +
+ "\x03ram\x18\x02 \x01(\rB\a\xbaH\x04*\x02 \x00R\x03ram\"a\n" +
+ "\x12ServiceClassChange\x12K\n" +
+ "\fserviceclass\x18\x01 \x01(\x0e2\x1d.fits.api.mvm.v1.ServiceClassB\b\xbaH\x05\x82\x01\x02\x10\x01R\fserviceclass\"<\n" +
+ "\rContactChange\x12+\n" +
+ "\fcontact_uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\vcontactUuid\"\x1a\n" +
+ "\x18MVMServiceUpdateResponse\"L\n" +
+ "\x15MVMServiceListRequest\x12(\n" +
+ "\x06tenant\x18\x01 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x06tenant\x88\x01\x01B\t\n" +
+ "\a_tenant\"H\n" +
+ "\x16MVMServiceListResponse\x12.\n" +
+ "\x04mvms\x18\x01 \x03(\v2\x1a.fits.api.mvm.v1.ManagedVMR\x04mvms\"~\n" +
+ "\x17MVMServiceDeleteRequest\x12\"\n" +
+ "\aproject\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12\x1c\n" +
+ "\x04uuid\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n" +
+ "\forder_number\x18\x03 \x01(\tR\vorderNumber\"\x1a\n" +
+ "\x18MVMServiceDeleteResponse\"k\n" +
+ "\x1fMVMServiceValidateCreateRequest\x12H\n" +
+ "\x06create\x18\x01 \x01(\v2(.fits.api.mvm.v1.MVMServiceCreateRequestB\x06\xbaH\x03\xc8\x01\x01R\x06create\"\"\n" +
+ " MVMServiceValidateCreateResponse\"p\n" +
+ " MVMServiceValidateAddDiskRequest\x12L\n" +
+ "\badd_disk\x18\x01 \x01(\v2).fits.api.mvm.v1.MVMServiceAddDiskRequestB\x06\xbaH\x03\xc8\x01\x01R\aaddDisk\"#\n" +
+ "!MVMServiceValidateAddDiskResponse\"|\n" +
+ "#MVMServiceValidateUpdateDiskRequest\x12U\n" +
+ "\vupdate_disk\x18\x01 \x01(\v2,.fits.api.mvm.v1.MVMServiceUpdateDiskRequestB\x06\xbaH\x03\xc8\x01\x01R\n" +
+ "updateDisk\"&\n" +
+ "$MVMServiceValidateUpdateDiskResponse\"\x1b\n" +
+ "\x19MVMServiceAddDiskResponse\"\x1e\n" +
+ "\x1cMVMServiceUpdateDiskResponse\"\x1e\n" +
+ "\x1cMVMServiceDeleteDiskResponse\"\xfc\x01\n" +
+ "\x18MVMServiceAddDiskRequest\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\"\n" +
+ "\aproject\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12!\n" +
+ "\forder_number\x18\x03 \x01(\tR\vorderNumber\x122\n" +
+ "\x05linux\x18\x04 \x01(\v2\x1a.fits.api.mvm.v1.LinuxDiskH\x00R\x05linux\x128\n" +
+ "\awindows\x18\x05 \x01(\v2\x1c.fits.api.mvm.v1.WindowsDiskH\x00R\awindowsB\r\n" +
+ "\x04disk\x12\x05\xbaH\x02\b\x01\"\x81\x02\n" +
+ "\x1bMVMServiceUpdateDiskRequest\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12%\n" +
+ "\tdisk_uuid\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\bdiskUuid\x12\"\n" +
+ "\aproject\x18\x03 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12!\n" +
+ "\forder_number\x18\x04 \x01(\tR\vorderNumber\x12$\n" +
+ "\vauto_extend\x18\x05 \x01(\bH\x00R\n" +
+ "autoExtend\x88\x01\x01\x12\x17\n" +
+ "\x04size\x18\x06 \x01(\x04H\x01R\x04size\x88\x01\x01B\x0e\n" +
+ "\f_auto_extendB\a\n" +
+ "\x05_size\"\xa9\x01\n" +
+ "\x1bMVMServiceDeleteDiskRequest\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12%\n" +
+ "\tdisk_uuid\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\bdiskUuid\x12\"\n" +
+ "\aproject\x18\x03 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12!\n" +
+ "\forder_number\x18\x04 \x01(\tR\vorderNumber\"'\n" +
+ "%MVMServiceAddNetworkInterfaceResponse\"(\n" +
+ "&MVMServiceMoveNetworkInterfaceResponse\"*\n" +
+ "(MVMServiceDeleteNetworkInterfaceResponse\"\x8b\x01\n" +
+ "$MVMServiceAddNetworkInterfaceRequest\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\"\n" +
+ "\aproject\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12!\n" +
+ "\forder_number\x18\x03 \x01(\tR\vorderNumber\"\xef\x01\n" +
+ "%MVMServiceMoveNetworkInterfaceRequest\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12/\n" +
+ "\x0einterface_uuid\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\rinterfaceUuid\x12\"\n" +
+ "\aproject\x18\x03 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12!\n" +
+ "\forder_number\x18\x04 \x01(\tR\vorderNumber\x120\n" +
+ "\x0ftarget_mvm_uuid\x18\x05 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\rtargetMvmUuid\"\xbf\x01\n" +
+ "'MVMServiceDeleteNetworkInterfaceRequest\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12/\n" +
+ "\x0einterface_uuid\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\rinterfaceUuid\x12\"\n" +
+ "\aproject\x18\x03 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\aproject\x12!\n" +
+ "\forder_number\x18\x04 \x01(\tR\vorderNumber\"\xa1\x01\n" +
+ ",MVMServiceValidateAddNetworkInterfaceRequest\x12q\n" +
+ "\x15add_network_interface\x18\x01 \x01(\v25.fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequestB\x06\xbaH\x03\xc8\x01\x01R\x13addNetworkInterface\"/\n" +
+ "-MVMServiceValidateAddNetworkInterfaceResponse*\xa6\x01\n" +
+ "\fAvailability\x12\"\n" +
+ "\x18AVAILABILITY_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x1b\n" +
+ "\x0fAVAILABILITY_V0\x10\x01\x1a\x06\x82\xb2\x19\x02V0\x12\x1b\n" +
+ "\x0fAVAILABILITY_V1\x10\x02\x1a\x06\x82\xb2\x19\x02V1\x12\x1b\n" +
+ "\x0fAVAILABILITY_V2\x10\x03\x1a\x06\x82\xb2\x19\x02V2\x12\x1b\n" +
+ "\x0fAVAILABILITY_V3\x10\x04\x1a\x06\x82\xb2\x19\x02V3*\x93\x01\n" +
+ "\fServiceClass\x12#\n" +
+ "\x19SERVICE_CLASS_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x1e\n" +
+ "\x11SERVICE_CLASS_SZ1\x10\x01\x1a\a\x82\xb2\x19\x03SZ1\x12\x1e\n" +
+ "\x11SERVICE_CLASS_SZ2\x10\x02\x1a\a\x82\xb2\x19\x03SZ2\x12\x1e\n" +
+ "\x11SERVICE_CLASS_SZ3\x10\x03\x1a\a\x82\xb2\x19\x03SZ3*P\n" +
+ "\tMVMStatus\x12 \n" +
+ "\x16MVM_STATUS_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12!\n" +
+ "\x11MVM_STATUS_ACTIVE\x10\x01\x1a\n" +
+ "\x82\xb2\x19\x06active*\x85\x01\n" +
+ "\bDiskType\x12\x1f\n" +
+ "\x15DISK_TYPE_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x18\n" +
+ "\fDISK_TYPE_OS\x10\x01\x1a\x06\x82\xb2\x19\x02os\x12 \n" +
+ "\x10DISK_TYPE_SYSTEM\x10\x02\x1a\n" +
+ "\x82\xb2\x19\x06system\x12\x1c\n" +
+ "\x0eDISK_TYPE_DATA\x10\x03\x1a\b\x82\xb2\x19\x04data2\xfd\x0e\n" +
+ "\n" +
+ "MVMService\x12a\n" +
+ "\x03Get\x12%.fits.api.mvm.v1.MVMServiceGetRequest\x1a&.fits.api.mvm.v1.MVMServiceGetResponse\"\v\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n" +
+ "\x06Create\x12(.fits.api.mvm.v1.MVMServiceCreateRequest\x1a).fits.api.mvm.v1.MVMServiceCreateResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12i\n" +
+ "\x06Update\x12(.fits.api.mvm.v1.MVMServiceUpdateRequest\x1a).fits.api.mvm.v1.MVMServiceUpdateResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12d\n" +
+ "\x04List\x12&.fits.api.mvm.v1.MVMServiceListRequest\x1a'.fits.api.mvm.v1.MVMServiceListResponse\"\v\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n" +
+ "\x06Delete\x12(.fits.api.mvm.v1.MVMServiceDeleteRequest\x1a).fits.api.mvm.v1.MVMServiceDeleteResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12l\n" +
+ "\aAddDisk\x12).fits.api.mvm.v1.MVMServiceAddDiskRequest\x1a*.fits.api.mvm.v1.MVMServiceAddDiskResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12u\n" +
+ "\n" +
+ "UpdateDisk\x12,.fits.api.mvm.v1.MVMServiceUpdateDiskRequest\x1a-.fits.api.mvm.v1.MVMServiceUpdateDiskResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12u\n" +
+ "\n" +
+ "DeleteDisk\x12,.fits.api.mvm.v1.MVMServiceDeleteDiskRequest\x1a-.fits.api.mvm.v1.MVMServiceDeleteDiskResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x90\x01\n" +
+ "\x13AddNetworkInterface\x125.fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest\x1a6.fits.api.mvm.v1.MVMServiceAddNetworkInterfaceResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x93\x01\n" +
+ "\x14MoveNetworkInterface\x126.fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceRequest\x1a7.fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x99\x01\n" +
+ "\x16DeleteNetworkInterface\x128.fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceRequest\x1a9.fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x81\x01\n" +
+ "\x0eValidateCreate\x120.fits.api.mvm.v1.MVMServiceValidateCreateRequest\x1a1.fits.api.mvm.v1.MVMServiceValidateCreateResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02\x12\x84\x01\n" +
+ "\x0fValidateAddDisk\x121.fits.api.mvm.v1.MVMServiceValidateAddDiskRequest\x1a2.fits.api.mvm.v1.MVMServiceValidateAddDiskResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02\x12\x8d\x01\n" +
+ "\x12ValidateUpdateDisk\x124.fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest\x1a5.fits.api.mvm.v1.MVMServiceValidateUpdateDiskResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02\x12\xa8\x01\n" +
+ "\x1bValidateAddNetworkInterface\x12=.fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest\x1a>.fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceResponse\"\n" +
+ "\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02B\xad\x01\n" +
+ "\x13com.fits.api.mvm.v1B\bMvmProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03FAM\xaa\x02\x0fFits.Api.Mvm.V1\xca\x02\x0fFits\\Api\\Mvm\\V1\xe2\x02\x1bFits\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12Fits::Api::Mvm::V1b\x06proto3"
+
+var (
+ file_fits_api_mvm_v1_mvm_proto_rawDescOnce sync.Once
+ file_fits_api_mvm_v1_mvm_proto_rawDescData []byte
+)
+
+func file_fits_api_mvm_v1_mvm_proto_rawDescGZIP() []byte {
+ file_fits_api_mvm_v1_mvm_proto_rawDescOnce.Do(func() {
+ file_fits_api_mvm_v1_mvm_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_mvm_proto_rawDesc), len(file_fits_api_mvm_v1_mvm_proto_rawDesc)))
+ })
+ return file_fits_api_mvm_v1_mvm_proto_rawDescData
+}
+
+var file_fits_api_mvm_v1_mvm_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_fits_api_mvm_v1_mvm_proto_msgTypes = make([]protoimpl.MessageInfo, 41)
+var file_fits_api_mvm_v1_mvm_proto_goTypes = []any{
+ (Availability)(0), // 0: fits.api.mvm.v1.Availability
+ (ServiceClass)(0), // 1: fits.api.mvm.v1.ServiceClass
+ (MVMStatus)(0), // 2: fits.api.mvm.v1.MVMStatus
+ (DiskType)(0), // 3: fits.api.mvm.v1.DiskType
+ (*LinuxDetails)(nil), // 4: fits.api.mvm.v1.LinuxDetails
+ (*WindowsDetails)(nil), // 5: fits.api.mvm.v1.WindowsDetails
+ (*NetworkInterface)(nil), // 6: fits.api.mvm.v1.NetworkInterface
+ (*ManagedVM)(nil), // 7: fits.api.mvm.v1.ManagedVM
+ (*MVMServiceGetRequest)(nil), // 8: fits.api.mvm.v1.MVMServiceGetRequest
+ (*MVMServiceGetResponse)(nil), // 9: fits.api.mvm.v1.MVMServiceGetResponse
+ (*MVMServiceCreateWindowsRequest)(nil), // 10: fits.api.mvm.v1.MVMServiceCreateWindowsRequest
+ (*MVMServiceCreateLinuxRequest)(nil), // 11: fits.api.mvm.v1.MVMServiceCreateLinuxRequest
+ (*MVMServiceCreateRequest)(nil), // 12: fits.api.mvm.v1.MVMServiceCreateRequest
+ (*LinuxDisk)(nil), // 13: fits.api.mvm.v1.LinuxDisk
+ (*WindowsDisk)(nil), // 14: fits.api.mvm.v1.WindowsDisk
+ (*MVMServiceCreateResponse)(nil), // 15: fits.api.mvm.v1.MVMServiceCreateResponse
+ (*MVMServiceUpdateRequest)(nil), // 16: fits.api.mvm.v1.MVMServiceUpdateRequest
+ (*PerformanceClassChange)(nil), // 17: fits.api.mvm.v1.PerformanceClassChange
+ (*ServiceClassChange)(nil), // 18: fits.api.mvm.v1.ServiceClassChange
+ (*ContactChange)(nil), // 19: fits.api.mvm.v1.ContactChange
+ (*MVMServiceUpdateResponse)(nil), // 20: fits.api.mvm.v1.MVMServiceUpdateResponse
+ (*MVMServiceListRequest)(nil), // 21: fits.api.mvm.v1.MVMServiceListRequest
+ (*MVMServiceListResponse)(nil), // 22: fits.api.mvm.v1.MVMServiceListResponse
+ (*MVMServiceDeleteRequest)(nil), // 23: fits.api.mvm.v1.MVMServiceDeleteRequest
+ (*MVMServiceDeleteResponse)(nil), // 24: fits.api.mvm.v1.MVMServiceDeleteResponse
+ (*MVMServiceValidateCreateRequest)(nil), // 25: fits.api.mvm.v1.MVMServiceValidateCreateRequest
+ (*MVMServiceValidateCreateResponse)(nil), // 26: fits.api.mvm.v1.MVMServiceValidateCreateResponse
+ (*MVMServiceValidateAddDiskRequest)(nil), // 27: fits.api.mvm.v1.MVMServiceValidateAddDiskRequest
+ (*MVMServiceValidateAddDiskResponse)(nil), // 28: fits.api.mvm.v1.MVMServiceValidateAddDiskResponse
+ (*MVMServiceValidateUpdateDiskRequest)(nil), // 29: fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest
+ (*MVMServiceValidateUpdateDiskResponse)(nil), // 30: fits.api.mvm.v1.MVMServiceValidateUpdateDiskResponse
+ (*MVMServiceAddDiskResponse)(nil), // 31: fits.api.mvm.v1.MVMServiceAddDiskResponse
+ (*MVMServiceUpdateDiskResponse)(nil), // 32: fits.api.mvm.v1.MVMServiceUpdateDiskResponse
+ (*MVMServiceDeleteDiskResponse)(nil), // 33: fits.api.mvm.v1.MVMServiceDeleteDiskResponse
+ (*MVMServiceAddDiskRequest)(nil), // 34: fits.api.mvm.v1.MVMServiceAddDiskRequest
+ (*MVMServiceUpdateDiskRequest)(nil), // 35: fits.api.mvm.v1.MVMServiceUpdateDiskRequest
+ (*MVMServiceDeleteDiskRequest)(nil), // 36: fits.api.mvm.v1.MVMServiceDeleteDiskRequest
+ (*MVMServiceAddNetworkInterfaceResponse)(nil), // 37: fits.api.mvm.v1.MVMServiceAddNetworkInterfaceResponse
+ (*MVMServiceMoveNetworkInterfaceResponse)(nil), // 38: fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceResponse
+ (*MVMServiceDeleteNetworkInterfaceResponse)(nil), // 39: fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceResponse
+ (*MVMServiceAddNetworkInterfaceRequest)(nil), // 40: fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest
+ (*MVMServiceMoveNetworkInterfaceRequest)(nil), // 41: fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceRequest
+ (*MVMServiceDeleteNetworkInterfaceRequest)(nil), // 42: fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceRequest
+ (*MVMServiceValidateAddNetworkInterfaceRequest)(nil), // 43: fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest
+ (*MVMServiceValidateAddNetworkInterfaceResponse)(nil), // 44: fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceResponse
+ (*v1.Meta)(nil), // 45: fits.api.v1.Meta
+ (*VLAN)(nil), // 46: fits.api.mvm.v1.VLAN
+ (*v1.Labels)(nil), // 47: fits.api.v1.Labels
+ (*v1.UpdateMeta)(nil), // 48: fits.api.v1.UpdateMeta
+}
+var file_fits_api_mvm_v1_mvm_proto_depIdxs = []int32{
+ 13, // 0: fits.api.mvm.v1.LinuxDetails.disks:type_name -> fits.api.mvm.v1.LinuxDisk
+ 14, // 1: fits.api.mvm.v1.WindowsDetails.disks:type_name -> fits.api.mvm.v1.WindowsDisk
+ 45, // 2: fits.api.mvm.v1.ManagedVM.meta:type_name -> fits.api.v1.Meta
+ 2, // 3: fits.api.mvm.v1.ManagedVM.status:type_name -> fits.api.mvm.v1.MVMStatus
+ 0, // 4: fits.api.mvm.v1.ManagedVM.availability:type_name -> fits.api.mvm.v1.Availability
+ 1, // 5: fits.api.mvm.v1.ManagedVM.serviceclass:type_name -> fits.api.mvm.v1.ServiceClass
+ 5, // 6: fits.api.mvm.v1.ManagedVM.windows_details:type_name -> fits.api.mvm.v1.WindowsDetails
+ 4, // 7: fits.api.mvm.v1.ManagedVM.linux_details:type_name -> fits.api.mvm.v1.LinuxDetails
+ 6, // 8: fits.api.mvm.v1.ManagedVM.interfaces:type_name -> fits.api.mvm.v1.NetworkInterface
+ 46, // 9: fits.api.mvm.v1.ManagedVM.vlan:type_name -> fits.api.mvm.v1.VLAN
+ 7, // 10: fits.api.mvm.v1.MVMServiceGetResponse.mvm:type_name -> fits.api.mvm.v1.ManagedVM
+ 14, // 11: fits.api.mvm.v1.MVMServiceCreateWindowsRequest.disks:type_name -> fits.api.mvm.v1.WindowsDisk
+ 13, // 12: fits.api.mvm.v1.MVMServiceCreateLinuxRequest.disks:type_name -> fits.api.mvm.v1.LinuxDisk
+ 47, // 13: fits.api.mvm.v1.MVMServiceCreateRequest.labels:type_name -> fits.api.v1.Labels
+ 0, // 14: fits.api.mvm.v1.MVMServiceCreateRequest.availability:type_name -> fits.api.mvm.v1.Availability
+ 1, // 15: fits.api.mvm.v1.MVMServiceCreateRequest.serviceclass:type_name -> fits.api.mvm.v1.ServiceClass
+ 10, // 16: fits.api.mvm.v1.MVMServiceCreateRequest.windows:type_name -> fits.api.mvm.v1.MVMServiceCreateWindowsRequest
+ 11, // 17: fits.api.mvm.v1.MVMServiceCreateRequest.linux:type_name -> fits.api.mvm.v1.MVMServiceCreateLinuxRequest
+ 3, // 18: fits.api.mvm.v1.LinuxDisk.disk_type:type_name -> fits.api.mvm.v1.DiskType
+ 3, // 19: fits.api.mvm.v1.WindowsDisk.disk_type:type_name -> fits.api.mvm.v1.DiskType
+ 48, // 20: fits.api.mvm.v1.MVMServiceUpdateRequest.update_meta:type_name -> fits.api.v1.UpdateMeta
+ 17, // 21: fits.api.mvm.v1.MVMServiceUpdateRequest.performance_class:type_name -> fits.api.mvm.v1.PerformanceClassChange
+ 18, // 22: fits.api.mvm.v1.MVMServiceUpdateRequest.service_class:type_name -> fits.api.mvm.v1.ServiceClassChange
+ 19, // 23: fits.api.mvm.v1.MVMServiceUpdateRequest.contact:type_name -> fits.api.mvm.v1.ContactChange
+ 1, // 24: fits.api.mvm.v1.ServiceClassChange.serviceclass:type_name -> fits.api.mvm.v1.ServiceClass
+ 7, // 25: fits.api.mvm.v1.MVMServiceListResponse.mvms:type_name -> fits.api.mvm.v1.ManagedVM
+ 12, // 26: fits.api.mvm.v1.MVMServiceValidateCreateRequest.create:type_name -> fits.api.mvm.v1.MVMServiceCreateRequest
+ 34, // 27: fits.api.mvm.v1.MVMServiceValidateAddDiskRequest.add_disk:type_name -> fits.api.mvm.v1.MVMServiceAddDiskRequest
+ 35, // 28: fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest.update_disk:type_name -> fits.api.mvm.v1.MVMServiceUpdateDiskRequest
+ 13, // 29: fits.api.mvm.v1.MVMServiceAddDiskRequest.linux:type_name -> fits.api.mvm.v1.LinuxDisk
+ 14, // 30: fits.api.mvm.v1.MVMServiceAddDiskRequest.windows:type_name -> fits.api.mvm.v1.WindowsDisk
+ 40, // 31: fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest.add_network_interface:type_name -> fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest
+ 8, // 32: fits.api.mvm.v1.MVMService.Get:input_type -> fits.api.mvm.v1.MVMServiceGetRequest
+ 12, // 33: fits.api.mvm.v1.MVMService.Create:input_type -> fits.api.mvm.v1.MVMServiceCreateRequest
+ 16, // 34: fits.api.mvm.v1.MVMService.Update:input_type -> fits.api.mvm.v1.MVMServiceUpdateRequest
+ 21, // 35: fits.api.mvm.v1.MVMService.List:input_type -> fits.api.mvm.v1.MVMServiceListRequest
+ 23, // 36: fits.api.mvm.v1.MVMService.Delete:input_type -> fits.api.mvm.v1.MVMServiceDeleteRequest
+ 34, // 37: fits.api.mvm.v1.MVMService.AddDisk:input_type -> fits.api.mvm.v1.MVMServiceAddDiskRequest
+ 35, // 38: fits.api.mvm.v1.MVMService.UpdateDisk:input_type -> fits.api.mvm.v1.MVMServiceUpdateDiskRequest
+ 36, // 39: fits.api.mvm.v1.MVMService.DeleteDisk:input_type -> fits.api.mvm.v1.MVMServiceDeleteDiskRequest
+ 40, // 40: fits.api.mvm.v1.MVMService.AddNetworkInterface:input_type -> fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest
+ 41, // 41: fits.api.mvm.v1.MVMService.MoveNetworkInterface:input_type -> fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceRequest
+ 42, // 42: fits.api.mvm.v1.MVMService.DeleteNetworkInterface:input_type -> fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceRequest
+ 25, // 43: fits.api.mvm.v1.MVMService.ValidateCreate:input_type -> fits.api.mvm.v1.MVMServiceValidateCreateRequest
+ 27, // 44: fits.api.mvm.v1.MVMService.ValidateAddDisk:input_type -> fits.api.mvm.v1.MVMServiceValidateAddDiskRequest
+ 29, // 45: fits.api.mvm.v1.MVMService.ValidateUpdateDisk:input_type -> fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest
+ 43, // 46: fits.api.mvm.v1.MVMService.ValidateAddNetworkInterface:input_type -> fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest
+ 9, // 47: fits.api.mvm.v1.MVMService.Get:output_type -> fits.api.mvm.v1.MVMServiceGetResponse
+ 15, // 48: fits.api.mvm.v1.MVMService.Create:output_type -> fits.api.mvm.v1.MVMServiceCreateResponse
+ 20, // 49: fits.api.mvm.v1.MVMService.Update:output_type -> fits.api.mvm.v1.MVMServiceUpdateResponse
+ 22, // 50: fits.api.mvm.v1.MVMService.List:output_type -> fits.api.mvm.v1.MVMServiceListResponse
+ 24, // 51: fits.api.mvm.v1.MVMService.Delete:output_type -> fits.api.mvm.v1.MVMServiceDeleteResponse
+ 31, // 52: fits.api.mvm.v1.MVMService.AddDisk:output_type -> fits.api.mvm.v1.MVMServiceAddDiskResponse
+ 32, // 53: fits.api.mvm.v1.MVMService.UpdateDisk:output_type -> fits.api.mvm.v1.MVMServiceUpdateDiskResponse
+ 33, // 54: fits.api.mvm.v1.MVMService.DeleteDisk:output_type -> fits.api.mvm.v1.MVMServiceDeleteDiskResponse
+ 37, // 55: fits.api.mvm.v1.MVMService.AddNetworkInterface:output_type -> fits.api.mvm.v1.MVMServiceAddNetworkInterfaceResponse
+ 38, // 56: fits.api.mvm.v1.MVMService.MoveNetworkInterface:output_type -> fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceResponse
+ 39, // 57: fits.api.mvm.v1.MVMService.DeleteNetworkInterface:output_type -> fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceResponse
+ 26, // 58: fits.api.mvm.v1.MVMService.ValidateCreate:output_type -> fits.api.mvm.v1.MVMServiceValidateCreateResponse
+ 28, // 59: fits.api.mvm.v1.MVMService.ValidateAddDisk:output_type -> fits.api.mvm.v1.MVMServiceValidateAddDiskResponse
+ 30, // 60: fits.api.mvm.v1.MVMService.ValidateUpdateDisk:output_type -> fits.api.mvm.v1.MVMServiceValidateUpdateDiskResponse
+ 44, // 61: fits.api.mvm.v1.MVMService.ValidateAddNetworkInterface:output_type -> fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceResponse
+ 47, // [47:62] is the sub-list for method output_type
+ 32, // [32:47] is the sub-list for method input_type
+ 32, // [32:32] is the sub-list for extension type_name
+ 32, // [32:32] is the sub-list for extension extendee
+ 0, // [0:32] is the sub-list for field type_name
+}
+
+func init() { file_fits_api_mvm_v1_mvm_proto_init() }
+func file_fits_api_mvm_v1_mvm_proto_init() {
+ if File_fits_api_mvm_v1_mvm_proto != nil {
+ return
+ }
+ file_fits_api_mvm_v1_vlan_proto_init()
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[3].OneofWrappers = []any{
+ (*ManagedVM_WindowsDetails)(nil),
+ (*ManagedVM_LinuxDetails)(nil),
+ }
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[4].OneofWrappers = []any{}
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[8].OneofWrappers = []any{
+ (*MVMServiceCreateRequest_Windows)(nil),
+ (*MVMServiceCreateRequest_Linux)(nil),
+ }
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[9].OneofWrappers = []any{}
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[10].OneofWrappers = []any{}
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[12].OneofWrappers = []any{
+ (*MVMServiceUpdateRequest_PerformanceClass)(nil),
+ (*MVMServiceUpdateRequest_ServiceClass)(nil),
+ (*MVMServiceUpdateRequest_Contact)(nil),
+ }
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[17].OneofWrappers = []any{}
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[30].OneofWrappers = []any{
+ (*MVMServiceAddDiskRequest_Linux)(nil),
+ (*MVMServiceAddDiskRequest_Windows)(nil),
+ }
+ file_fits_api_mvm_v1_mvm_proto_msgTypes[31].OneofWrappers = []any{}
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_mvm_proto_rawDesc), len(file_fits_api_mvm_v1_mvm_proto_rawDesc)),
+ NumEnums: 4,
+ NumMessages: 41,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_fits_api_mvm_v1_mvm_proto_goTypes,
+ DependencyIndexes: file_fits_api_mvm_v1_mvm_proto_depIdxs,
+ EnumInfos: file_fits_api_mvm_v1_mvm_proto_enumTypes,
+ MessageInfos: file_fits_api_mvm_v1_mvm_proto_msgTypes,
+ }.Build()
+ File_fits_api_mvm_v1_mvm_proto = out.File
+ file_fits_api_mvm_v1_mvm_proto_goTypes = nil
+ file_fits_api_mvm_v1_mvm_proto_depIdxs = nil
+}
diff --git a/go/fits/api/mvm/v1/mvmv1connect/location.connect.go b/go/fits/api/mvm/v1/mvmv1connect/location.connect.go
new file mode 100644
index 0000000..7bca223
--- /dev/null
+++ b/go/fits/api/mvm/v1/mvmv1connect/location.connect.go
@@ -0,0 +1,114 @@
+// Code generated by protoc-gen-connect-go. DO NOT EDIT.
+//
+// Source: fits/api/mvm/v1/location.proto
+
+package mvmv1connect
+
+import (
+ connect "connectrpc.com/connect"
+ context "context"
+ errors "errors"
+ v1 "github.com/fi-ts/api/go/fits/api/mvm/v1"
+ http "net/http"
+ strings "strings"
+)
+
+// This is a compile-time assertion to ensure that this generated file and the connect package are
+// compatible. If you get a compiler error that this constant is not defined, this code was
+// generated with a version of connect newer than the one compiled into your binary. You can fix the
+// problem by either regenerating this code with an older version of connect or updating the connect
+// version compiled into your binary.
+const _ = connect.IsAtLeastVersion1_13_0
+
+const (
+ // LocationServiceName is the fully-qualified name of the LocationService service.
+ LocationServiceName = "fits.api.mvm.v1.LocationService"
+)
+
+// These constants are the fully-qualified names of the RPCs defined in this package. They're
+// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route.
+//
+// Note that these are different from the fully-qualified method names used by
+// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
+// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
+// period.
+const (
+ // LocationServiceListProcedure is the fully-qualified name of the LocationService's List RPC.
+ LocationServiceListProcedure = "/fits.api.mvm.v1.LocationService/List"
+)
+
+// LocationServiceClient is a client for the fits.api.mvm.v1.LocationService service.
+type LocationServiceClient interface {
+ // Returns a list of all datacenter locations available for a tenant.
+ List(context.Context, *v1.LocationServiceListRequest) (*v1.LocationServiceListResponse, error)
+}
+
+// NewLocationServiceClient constructs a client for the fits.api.mvm.v1.LocationService service. By
+// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses,
+// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the
+// connect.WithGRPC() or connect.WithGRPCWeb() options.
+//
+// The URL supplied here should be the base URL for the Connect or gRPC server (for example,
+// http://api.acme.com or https://acme.com/grpc).
+func NewLocationServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) LocationServiceClient {
+ baseURL = strings.TrimRight(baseURL, "/")
+ locationServiceMethods := v1.File_fits_api_mvm_v1_location_proto.Services().ByName("LocationService").Methods()
+ return &locationServiceClient{
+ list: connect.NewClient[v1.LocationServiceListRequest, v1.LocationServiceListResponse](
+ httpClient,
+ baseURL+LocationServiceListProcedure,
+ connect.WithSchema(locationServiceMethods.ByName("List")),
+ connect.WithClientOptions(opts...),
+ ),
+ }
+}
+
+// locationServiceClient implements LocationServiceClient.
+type locationServiceClient struct {
+ list *connect.Client[v1.LocationServiceListRequest, v1.LocationServiceListResponse]
+}
+
+// List calls fits.api.mvm.v1.LocationService.List.
+func (c *locationServiceClient) List(ctx context.Context, req *v1.LocationServiceListRequest) (*v1.LocationServiceListResponse, error) {
+ response, err := c.list.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// LocationServiceHandler is an implementation of the fits.api.mvm.v1.LocationService service.
+type LocationServiceHandler interface {
+ // Returns a list of all datacenter locations available for a tenant.
+ List(context.Context, *v1.LocationServiceListRequest) (*v1.LocationServiceListResponse, error)
+}
+
+// NewLocationServiceHandler builds an HTTP handler from the service implementation. It returns the
+// path on which to mount the handler and the handler itself.
+//
+// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
+// and JSON codecs. They also support gzip compression.
+func NewLocationServiceHandler(svc LocationServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) {
+ locationServiceMethods := v1.File_fits_api_mvm_v1_location_proto.Services().ByName("LocationService").Methods()
+ locationServiceListHandler := connect.NewUnaryHandlerSimple(
+ LocationServiceListProcedure,
+ svc.List,
+ connect.WithSchema(locationServiceMethods.ByName("List")),
+ connect.WithHandlerOptions(opts...),
+ )
+ return "/fits.api.mvm.v1.LocationService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ case LocationServiceListProcedure:
+ locationServiceListHandler.ServeHTTP(w, r)
+ default:
+ http.NotFound(w, r)
+ }
+ })
+}
+
+// UnimplementedLocationServiceHandler returns CodeUnimplemented from all methods.
+type UnimplementedLocationServiceHandler struct{}
+
+func (UnimplementedLocationServiceHandler) List(context.Context, *v1.LocationServiceListRequest) (*v1.LocationServiceListResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.LocationService.List is not implemented"))
+}
diff --git a/go/fits/api/mvm/v1/mvmv1connect/mvm.connect.go b/go/fits/api/mvm/v1/mvmv1connect/mvm.connect.go
new file mode 100644
index 0000000..383fe8d
--- /dev/null
+++ b/go/fits/api/mvm/v1/mvmv1connect/mvm.connect.go
@@ -0,0 +1,603 @@
+// Code generated by protoc-gen-connect-go. DO NOT EDIT.
+//
+// Source: fits/api/mvm/v1/mvm.proto
+
+package mvmv1connect
+
+import (
+ connect "connectrpc.com/connect"
+ context "context"
+ errors "errors"
+ v1 "github.com/fi-ts/api/go/fits/api/mvm/v1"
+ http "net/http"
+ strings "strings"
+)
+
+// This is a compile-time assertion to ensure that this generated file and the connect package are
+// compatible. If you get a compiler error that this constant is not defined, this code was
+// generated with a version of connect newer than the one compiled into your binary. You can fix the
+// problem by either regenerating this code with an older version of connect or updating the connect
+// version compiled into your binary.
+const _ = connect.IsAtLeastVersion1_13_0
+
+const (
+ // MVMServiceName is the fully-qualified name of the MVMService service.
+ MVMServiceName = "fits.api.mvm.v1.MVMService"
+)
+
+// These constants are the fully-qualified names of the RPCs defined in this package. They're
+// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route.
+//
+// Note that these are different from the fully-qualified method names used by
+// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
+// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
+// period.
+const (
+ // MVMServiceGetProcedure is the fully-qualified name of the MVMService's Get RPC.
+ MVMServiceGetProcedure = "/fits.api.mvm.v1.MVMService/Get"
+ // MVMServiceCreateProcedure is the fully-qualified name of the MVMService's Create RPC.
+ MVMServiceCreateProcedure = "/fits.api.mvm.v1.MVMService/Create"
+ // MVMServiceUpdateProcedure is the fully-qualified name of the MVMService's Update RPC.
+ MVMServiceUpdateProcedure = "/fits.api.mvm.v1.MVMService/Update"
+ // MVMServiceListProcedure is the fully-qualified name of the MVMService's List RPC.
+ MVMServiceListProcedure = "/fits.api.mvm.v1.MVMService/List"
+ // MVMServiceDeleteProcedure is the fully-qualified name of the MVMService's Delete RPC.
+ MVMServiceDeleteProcedure = "/fits.api.mvm.v1.MVMService/Delete"
+ // MVMServiceAddDiskProcedure is the fully-qualified name of the MVMService's AddDisk RPC.
+ MVMServiceAddDiskProcedure = "/fits.api.mvm.v1.MVMService/AddDisk"
+ // MVMServiceUpdateDiskProcedure is the fully-qualified name of the MVMService's UpdateDisk RPC.
+ MVMServiceUpdateDiskProcedure = "/fits.api.mvm.v1.MVMService/UpdateDisk"
+ // MVMServiceDeleteDiskProcedure is the fully-qualified name of the MVMService's DeleteDisk RPC.
+ MVMServiceDeleteDiskProcedure = "/fits.api.mvm.v1.MVMService/DeleteDisk"
+ // MVMServiceAddNetworkInterfaceProcedure is the fully-qualified name of the MVMService's
+ // AddNetworkInterface RPC.
+ MVMServiceAddNetworkInterfaceProcedure = "/fits.api.mvm.v1.MVMService/AddNetworkInterface"
+ // MVMServiceMoveNetworkInterfaceProcedure is the fully-qualified name of the MVMService's
+ // MoveNetworkInterface RPC.
+ MVMServiceMoveNetworkInterfaceProcedure = "/fits.api.mvm.v1.MVMService/MoveNetworkInterface"
+ // MVMServiceDeleteNetworkInterfaceProcedure is the fully-qualified name of the MVMService's
+ // DeleteNetworkInterface RPC.
+ MVMServiceDeleteNetworkInterfaceProcedure = "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface"
+ // MVMServiceValidateCreateProcedure is the fully-qualified name of the MVMService's ValidateCreate
+ // RPC.
+ MVMServiceValidateCreateProcedure = "/fits.api.mvm.v1.MVMService/ValidateCreate"
+ // MVMServiceValidateAddDiskProcedure is the fully-qualified name of the MVMService's
+ // ValidateAddDisk RPC.
+ MVMServiceValidateAddDiskProcedure = "/fits.api.mvm.v1.MVMService/ValidateAddDisk"
+ // MVMServiceValidateUpdateDiskProcedure is the fully-qualified name of the MVMService's
+ // ValidateUpdateDisk RPC.
+ MVMServiceValidateUpdateDiskProcedure = "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk"
+ // MVMServiceValidateAddNetworkInterfaceProcedure is the fully-qualified name of the MVMService's
+ // ValidateAddNetworkInterface RPC.
+ MVMServiceValidateAddNetworkInterfaceProcedure = "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface"
+)
+
+// MVMServiceClient is a client for the fits.api.mvm.v1.MVMService service.
+type MVMServiceClient interface {
+ // Returns the MVM with the specified UUID.
+ Get(context.Context, *v1.MVMServiceGetRequest) (*v1.MVMServiceGetResponse, error)
+ // Creates a new MVM.
+ Create(context.Context, *v1.MVMServiceCreateRequest) (*v1.MVMServiceCreateResponse, error)
+ // Updates a MVM.
+ Update(context.Context, *v1.MVMServiceUpdateRequest) (*v1.MVMServiceUpdateResponse, error)
+ // Returns the list of all MVMs.
+ List(context.Context, *v1.MVMServiceListRequest) (*v1.MVMServiceListResponse, error)
+ // Deletes a MVM.
+ Delete(context.Context, *v1.MVMServiceDeleteRequest) (*v1.MVMServiceDeleteResponse, error)
+ // Orders an additional data disk for a MVM. System disks are ordered at
+ // MVM creation and cannot be added later.
+ AddDisk(context.Context, *v1.MVMServiceAddDiskRequest) (*v1.MVMServiceAddDiskResponse, error)
+ // Changes the size or auto-extend behavior of an existing disk; see
+ // DiskType for which operations apply per disk kind.
+ UpdateDisk(context.Context, *v1.MVMServiceUpdateDiskRequest) (*v1.MVMServiceUpdateDiskResponse, error)
+ // Cancels a data disk. OS and system disks cannot be deleted.
+ DeleteDisk(context.Context, *v1.MVMServiceDeleteDiskRequest) (*v1.MVMServiceDeleteDiskResponse, error)
+ // Orders an additional network interface for a MVM.
+ AddNetworkInterface(context.Context, *v1.MVMServiceAddNetworkInterfaceRequest) (*v1.MVMServiceAddNetworkInterfaceResponse, error)
+ // Moves a network interface from one MVM to another.
+ MoveNetworkInterface(context.Context, *v1.MVMServiceMoveNetworkInterfaceRequest) (*v1.MVMServiceMoveNetworkInterfaceResponse, error)
+ // Deletes a network interface from a MVM.
+ DeleteNetworkInterface(context.Context, *v1.MVMServiceDeleteNetworkInterfaceRequest) (*v1.MVMServiceDeleteNetworkInterfaceResponse, error)
+ // Validates a MVM create request without creating anything. Intended for
+ // form pre-checks; the create endpoint validates again before executing.
+ ValidateCreate(context.Context, *v1.MVMServiceValidateCreateRequest) (*v1.MVMServiceValidateCreateResponse, error)
+ // Validates an AddDisk request without ordering anything.
+ ValidateAddDisk(context.Context, *v1.MVMServiceValidateAddDiskRequest) (*v1.MVMServiceValidateAddDiskResponse, error)
+ // Validates an UpdateDisk request without changing anything.
+ ValidateUpdateDisk(context.Context, *v1.MVMServiceValidateUpdateDiskRequest) (*v1.MVMServiceValidateUpdateDiskResponse, error)
+ // Validates an AddNetworkInterface request without ordering anything.
+ ValidateAddNetworkInterface(context.Context, *v1.MVMServiceValidateAddNetworkInterfaceRequest) (*v1.MVMServiceValidateAddNetworkInterfaceResponse, error)
+}
+
+// NewMVMServiceClient constructs a client for the fits.api.mvm.v1.MVMService service. By default,
+// it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, and
+// sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC()
+// or connect.WithGRPCWeb() options.
+//
+// The URL supplied here should be the base URL for the Connect or gRPC server (for example,
+// http://api.acme.com or https://acme.com/grpc).
+func NewMVMServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) MVMServiceClient {
+ baseURL = strings.TrimRight(baseURL, "/")
+ mVMServiceMethods := v1.File_fits_api_mvm_v1_mvm_proto.Services().ByName("MVMService").Methods()
+ return &mVMServiceClient{
+ get: connect.NewClient[v1.MVMServiceGetRequest, v1.MVMServiceGetResponse](
+ httpClient,
+ baseURL+MVMServiceGetProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("Get")),
+ connect.WithClientOptions(opts...),
+ ),
+ create: connect.NewClient[v1.MVMServiceCreateRequest, v1.MVMServiceCreateResponse](
+ httpClient,
+ baseURL+MVMServiceCreateProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("Create")),
+ connect.WithClientOptions(opts...),
+ ),
+ update: connect.NewClient[v1.MVMServiceUpdateRequest, v1.MVMServiceUpdateResponse](
+ httpClient,
+ baseURL+MVMServiceUpdateProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("Update")),
+ connect.WithClientOptions(opts...),
+ ),
+ list: connect.NewClient[v1.MVMServiceListRequest, v1.MVMServiceListResponse](
+ httpClient,
+ baseURL+MVMServiceListProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("List")),
+ connect.WithClientOptions(opts...),
+ ),
+ delete: connect.NewClient[v1.MVMServiceDeleteRequest, v1.MVMServiceDeleteResponse](
+ httpClient,
+ baseURL+MVMServiceDeleteProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("Delete")),
+ connect.WithClientOptions(opts...),
+ ),
+ addDisk: connect.NewClient[v1.MVMServiceAddDiskRequest, v1.MVMServiceAddDiskResponse](
+ httpClient,
+ baseURL+MVMServiceAddDiskProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("AddDisk")),
+ connect.WithClientOptions(opts...),
+ ),
+ updateDisk: connect.NewClient[v1.MVMServiceUpdateDiskRequest, v1.MVMServiceUpdateDiskResponse](
+ httpClient,
+ baseURL+MVMServiceUpdateDiskProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("UpdateDisk")),
+ connect.WithClientOptions(opts...),
+ ),
+ deleteDisk: connect.NewClient[v1.MVMServiceDeleteDiskRequest, v1.MVMServiceDeleteDiskResponse](
+ httpClient,
+ baseURL+MVMServiceDeleteDiskProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("DeleteDisk")),
+ connect.WithClientOptions(opts...),
+ ),
+ addNetworkInterface: connect.NewClient[v1.MVMServiceAddNetworkInterfaceRequest, v1.MVMServiceAddNetworkInterfaceResponse](
+ httpClient,
+ baseURL+MVMServiceAddNetworkInterfaceProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("AddNetworkInterface")),
+ connect.WithClientOptions(opts...),
+ ),
+ moveNetworkInterface: connect.NewClient[v1.MVMServiceMoveNetworkInterfaceRequest, v1.MVMServiceMoveNetworkInterfaceResponse](
+ httpClient,
+ baseURL+MVMServiceMoveNetworkInterfaceProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("MoveNetworkInterface")),
+ connect.WithClientOptions(opts...),
+ ),
+ deleteNetworkInterface: connect.NewClient[v1.MVMServiceDeleteNetworkInterfaceRequest, v1.MVMServiceDeleteNetworkInterfaceResponse](
+ httpClient,
+ baseURL+MVMServiceDeleteNetworkInterfaceProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("DeleteNetworkInterface")),
+ connect.WithClientOptions(opts...),
+ ),
+ validateCreate: connect.NewClient[v1.MVMServiceValidateCreateRequest, v1.MVMServiceValidateCreateResponse](
+ httpClient,
+ baseURL+MVMServiceValidateCreateProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateCreate")),
+ connect.WithClientOptions(opts...),
+ ),
+ validateAddDisk: connect.NewClient[v1.MVMServiceValidateAddDiskRequest, v1.MVMServiceValidateAddDiskResponse](
+ httpClient,
+ baseURL+MVMServiceValidateAddDiskProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateAddDisk")),
+ connect.WithClientOptions(opts...),
+ ),
+ validateUpdateDisk: connect.NewClient[v1.MVMServiceValidateUpdateDiskRequest, v1.MVMServiceValidateUpdateDiskResponse](
+ httpClient,
+ baseURL+MVMServiceValidateUpdateDiskProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateUpdateDisk")),
+ connect.WithClientOptions(opts...),
+ ),
+ validateAddNetworkInterface: connect.NewClient[v1.MVMServiceValidateAddNetworkInterfaceRequest, v1.MVMServiceValidateAddNetworkInterfaceResponse](
+ httpClient,
+ baseURL+MVMServiceValidateAddNetworkInterfaceProcedure,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateAddNetworkInterface")),
+ connect.WithClientOptions(opts...),
+ ),
+ }
+}
+
+// mVMServiceClient implements MVMServiceClient.
+type mVMServiceClient struct {
+ get *connect.Client[v1.MVMServiceGetRequest, v1.MVMServiceGetResponse]
+ create *connect.Client[v1.MVMServiceCreateRequest, v1.MVMServiceCreateResponse]
+ update *connect.Client[v1.MVMServiceUpdateRequest, v1.MVMServiceUpdateResponse]
+ list *connect.Client[v1.MVMServiceListRequest, v1.MVMServiceListResponse]
+ delete *connect.Client[v1.MVMServiceDeleteRequest, v1.MVMServiceDeleteResponse]
+ addDisk *connect.Client[v1.MVMServiceAddDiskRequest, v1.MVMServiceAddDiskResponse]
+ updateDisk *connect.Client[v1.MVMServiceUpdateDiskRequest, v1.MVMServiceUpdateDiskResponse]
+ deleteDisk *connect.Client[v1.MVMServiceDeleteDiskRequest, v1.MVMServiceDeleteDiskResponse]
+ addNetworkInterface *connect.Client[v1.MVMServiceAddNetworkInterfaceRequest, v1.MVMServiceAddNetworkInterfaceResponse]
+ moveNetworkInterface *connect.Client[v1.MVMServiceMoveNetworkInterfaceRequest, v1.MVMServiceMoveNetworkInterfaceResponse]
+ deleteNetworkInterface *connect.Client[v1.MVMServiceDeleteNetworkInterfaceRequest, v1.MVMServiceDeleteNetworkInterfaceResponse]
+ validateCreate *connect.Client[v1.MVMServiceValidateCreateRequest, v1.MVMServiceValidateCreateResponse]
+ validateAddDisk *connect.Client[v1.MVMServiceValidateAddDiskRequest, v1.MVMServiceValidateAddDiskResponse]
+ validateUpdateDisk *connect.Client[v1.MVMServiceValidateUpdateDiskRequest, v1.MVMServiceValidateUpdateDiskResponse]
+ validateAddNetworkInterface *connect.Client[v1.MVMServiceValidateAddNetworkInterfaceRequest, v1.MVMServiceValidateAddNetworkInterfaceResponse]
+}
+
+// Get calls fits.api.mvm.v1.MVMService.Get.
+func (c *mVMServiceClient) Get(ctx context.Context, req *v1.MVMServiceGetRequest) (*v1.MVMServiceGetResponse, error) {
+ response, err := c.get.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// Create calls fits.api.mvm.v1.MVMService.Create.
+func (c *mVMServiceClient) Create(ctx context.Context, req *v1.MVMServiceCreateRequest) (*v1.MVMServiceCreateResponse, error) {
+ response, err := c.create.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// Update calls fits.api.mvm.v1.MVMService.Update.
+func (c *mVMServiceClient) Update(ctx context.Context, req *v1.MVMServiceUpdateRequest) (*v1.MVMServiceUpdateResponse, error) {
+ response, err := c.update.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// List calls fits.api.mvm.v1.MVMService.List.
+func (c *mVMServiceClient) List(ctx context.Context, req *v1.MVMServiceListRequest) (*v1.MVMServiceListResponse, error) {
+ response, err := c.list.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// Delete calls fits.api.mvm.v1.MVMService.Delete.
+func (c *mVMServiceClient) Delete(ctx context.Context, req *v1.MVMServiceDeleteRequest) (*v1.MVMServiceDeleteResponse, error) {
+ response, err := c.delete.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// AddDisk calls fits.api.mvm.v1.MVMService.AddDisk.
+func (c *mVMServiceClient) AddDisk(ctx context.Context, req *v1.MVMServiceAddDiskRequest) (*v1.MVMServiceAddDiskResponse, error) {
+ response, err := c.addDisk.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// UpdateDisk calls fits.api.mvm.v1.MVMService.UpdateDisk.
+func (c *mVMServiceClient) UpdateDisk(ctx context.Context, req *v1.MVMServiceUpdateDiskRequest) (*v1.MVMServiceUpdateDiskResponse, error) {
+ response, err := c.updateDisk.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// DeleteDisk calls fits.api.mvm.v1.MVMService.DeleteDisk.
+func (c *mVMServiceClient) DeleteDisk(ctx context.Context, req *v1.MVMServiceDeleteDiskRequest) (*v1.MVMServiceDeleteDiskResponse, error) {
+ response, err := c.deleteDisk.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// AddNetworkInterface calls fits.api.mvm.v1.MVMService.AddNetworkInterface.
+func (c *mVMServiceClient) AddNetworkInterface(ctx context.Context, req *v1.MVMServiceAddNetworkInterfaceRequest) (*v1.MVMServiceAddNetworkInterfaceResponse, error) {
+ response, err := c.addNetworkInterface.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// MoveNetworkInterface calls fits.api.mvm.v1.MVMService.MoveNetworkInterface.
+func (c *mVMServiceClient) MoveNetworkInterface(ctx context.Context, req *v1.MVMServiceMoveNetworkInterfaceRequest) (*v1.MVMServiceMoveNetworkInterfaceResponse, error) {
+ response, err := c.moveNetworkInterface.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// DeleteNetworkInterface calls fits.api.mvm.v1.MVMService.DeleteNetworkInterface.
+func (c *mVMServiceClient) DeleteNetworkInterface(ctx context.Context, req *v1.MVMServiceDeleteNetworkInterfaceRequest) (*v1.MVMServiceDeleteNetworkInterfaceResponse, error) {
+ response, err := c.deleteNetworkInterface.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// ValidateCreate calls fits.api.mvm.v1.MVMService.ValidateCreate.
+func (c *mVMServiceClient) ValidateCreate(ctx context.Context, req *v1.MVMServiceValidateCreateRequest) (*v1.MVMServiceValidateCreateResponse, error) {
+ response, err := c.validateCreate.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// ValidateAddDisk calls fits.api.mvm.v1.MVMService.ValidateAddDisk.
+func (c *mVMServiceClient) ValidateAddDisk(ctx context.Context, req *v1.MVMServiceValidateAddDiskRequest) (*v1.MVMServiceValidateAddDiskResponse, error) {
+ response, err := c.validateAddDisk.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// ValidateUpdateDisk calls fits.api.mvm.v1.MVMService.ValidateUpdateDisk.
+func (c *mVMServiceClient) ValidateUpdateDisk(ctx context.Context, req *v1.MVMServiceValidateUpdateDiskRequest) (*v1.MVMServiceValidateUpdateDiskResponse, error) {
+ response, err := c.validateUpdateDisk.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// ValidateAddNetworkInterface calls fits.api.mvm.v1.MVMService.ValidateAddNetworkInterface.
+func (c *mVMServiceClient) ValidateAddNetworkInterface(ctx context.Context, req *v1.MVMServiceValidateAddNetworkInterfaceRequest) (*v1.MVMServiceValidateAddNetworkInterfaceResponse, error) {
+ response, err := c.validateAddNetworkInterface.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// MVMServiceHandler is an implementation of the fits.api.mvm.v1.MVMService service.
+type MVMServiceHandler interface {
+ // Returns the MVM with the specified UUID.
+ Get(context.Context, *v1.MVMServiceGetRequest) (*v1.MVMServiceGetResponse, error)
+ // Creates a new MVM.
+ Create(context.Context, *v1.MVMServiceCreateRequest) (*v1.MVMServiceCreateResponse, error)
+ // Updates a MVM.
+ Update(context.Context, *v1.MVMServiceUpdateRequest) (*v1.MVMServiceUpdateResponse, error)
+ // Returns the list of all MVMs.
+ List(context.Context, *v1.MVMServiceListRequest) (*v1.MVMServiceListResponse, error)
+ // Deletes a MVM.
+ Delete(context.Context, *v1.MVMServiceDeleteRequest) (*v1.MVMServiceDeleteResponse, error)
+ // Orders an additional data disk for a MVM. System disks are ordered at
+ // MVM creation and cannot be added later.
+ AddDisk(context.Context, *v1.MVMServiceAddDiskRequest) (*v1.MVMServiceAddDiskResponse, error)
+ // Changes the size or auto-extend behavior of an existing disk; see
+ // DiskType for which operations apply per disk kind.
+ UpdateDisk(context.Context, *v1.MVMServiceUpdateDiskRequest) (*v1.MVMServiceUpdateDiskResponse, error)
+ // Cancels a data disk. OS and system disks cannot be deleted.
+ DeleteDisk(context.Context, *v1.MVMServiceDeleteDiskRequest) (*v1.MVMServiceDeleteDiskResponse, error)
+ // Orders an additional network interface for a MVM.
+ AddNetworkInterface(context.Context, *v1.MVMServiceAddNetworkInterfaceRequest) (*v1.MVMServiceAddNetworkInterfaceResponse, error)
+ // Moves a network interface from one MVM to another.
+ MoveNetworkInterface(context.Context, *v1.MVMServiceMoveNetworkInterfaceRequest) (*v1.MVMServiceMoveNetworkInterfaceResponse, error)
+ // Deletes a network interface from a MVM.
+ DeleteNetworkInterface(context.Context, *v1.MVMServiceDeleteNetworkInterfaceRequest) (*v1.MVMServiceDeleteNetworkInterfaceResponse, error)
+ // Validates a MVM create request without creating anything. Intended for
+ // form pre-checks; the create endpoint validates again before executing.
+ ValidateCreate(context.Context, *v1.MVMServiceValidateCreateRequest) (*v1.MVMServiceValidateCreateResponse, error)
+ // Validates an AddDisk request without ordering anything.
+ ValidateAddDisk(context.Context, *v1.MVMServiceValidateAddDiskRequest) (*v1.MVMServiceValidateAddDiskResponse, error)
+ // Validates an UpdateDisk request without changing anything.
+ ValidateUpdateDisk(context.Context, *v1.MVMServiceValidateUpdateDiskRequest) (*v1.MVMServiceValidateUpdateDiskResponse, error)
+ // Validates an AddNetworkInterface request without ordering anything.
+ ValidateAddNetworkInterface(context.Context, *v1.MVMServiceValidateAddNetworkInterfaceRequest) (*v1.MVMServiceValidateAddNetworkInterfaceResponse, error)
+}
+
+// NewMVMServiceHandler builds an HTTP handler from the service implementation. It returns the path
+// on which to mount the handler and the handler itself.
+//
+// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
+// and JSON codecs. They also support gzip compression.
+func NewMVMServiceHandler(svc MVMServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) {
+ mVMServiceMethods := v1.File_fits_api_mvm_v1_mvm_proto.Services().ByName("MVMService").Methods()
+ mVMServiceGetHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceGetProcedure,
+ svc.Get,
+ connect.WithSchema(mVMServiceMethods.ByName("Get")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceCreateHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceCreateProcedure,
+ svc.Create,
+ connect.WithSchema(mVMServiceMethods.ByName("Create")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceUpdateHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceUpdateProcedure,
+ svc.Update,
+ connect.WithSchema(mVMServiceMethods.ByName("Update")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceListHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceListProcedure,
+ svc.List,
+ connect.WithSchema(mVMServiceMethods.ByName("List")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceDeleteHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceDeleteProcedure,
+ svc.Delete,
+ connect.WithSchema(mVMServiceMethods.ByName("Delete")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceAddDiskHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceAddDiskProcedure,
+ svc.AddDisk,
+ connect.WithSchema(mVMServiceMethods.ByName("AddDisk")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceUpdateDiskHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceUpdateDiskProcedure,
+ svc.UpdateDisk,
+ connect.WithSchema(mVMServiceMethods.ByName("UpdateDisk")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceDeleteDiskHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceDeleteDiskProcedure,
+ svc.DeleteDisk,
+ connect.WithSchema(mVMServiceMethods.ByName("DeleteDisk")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceAddNetworkInterfaceHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceAddNetworkInterfaceProcedure,
+ svc.AddNetworkInterface,
+ connect.WithSchema(mVMServiceMethods.ByName("AddNetworkInterface")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceMoveNetworkInterfaceHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceMoveNetworkInterfaceProcedure,
+ svc.MoveNetworkInterface,
+ connect.WithSchema(mVMServiceMethods.ByName("MoveNetworkInterface")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceDeleteNetworkInterfaceHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceDeleteNetworkInterfaceProcedure,
+ svc.DeleteNetworkInterface,
+ connect.WithSchema(mVMServiceMethods.ByName("DeleteNetworkInterface")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceValidateCreateHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceValidateCreateProcedure,
+ svc.ValidateCreate,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateCreate")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceValidateAddDiskHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceValidateAddDiskProcedure,
+ svc.ValidateAddDisk,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateAddDisk")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceValidateUpdateDiskHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceValidateUpdateDiskProcedure,
+ svc.ValidateUpdateDisk,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateUpdateDisk")),
+ connect.WithHandlerOptions(opts...),
+ )
+ mVMServiceValidateAddNetworkInterfaceHandler := connect.NewUnaryHandlerSimple(
+ MVMServiceValidateAddNetworkInterfaceProcedure,
+ svc.ValidateAddNetworkInterface,
+ connect.WithSchema(mVMServiceMethods.ByName("ValidateAddNetworkInterface")),
+ connect.WithHandlerOptions(opts...),
+ )
+ return "/fits.api.mvm.v1.MVMService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ case MVMServiceGetProcedure:
+ mVMServiceGetHandler.ServeHTTP(w, r)
+ case MVMServiceCreateProcedure:
+ mVMServiceCreateHandler.ServeHTTP(w, r)
+ case MVMServiceUpdateProcedure:
+ mVMServiceUpdateHandler.ServeHTTP(w, r)
+ case MVMServiceListProcedure:
+ mVMServiceListHandler.ServeHTTP(w, r)
+ case MVMServiceDeleteProcedure:
+ mVMServiceDeleteHandler.ServeHTTP(w, r)
+ case MVMServiceAddDiskProcedure:
+ mVMServiceAddDiskHandler.ServeHTTP(w, r)
+ case MVMServiceUpdateDiskProcedure:
+ mVMServiceUpdateDiskHandler.ServeHTTP(w, r)
+ case MVMServiceDeleteDiskProcedure:
+ mVMServiceDeleteDiskHandler.ServeHTTP(w, r)
+ case MVMServiceAddNetworkInterfaceProcedure:
+ mVMServiceAddNetworkInterfaceHandler.ServeHTTP(w, r)
+ case MVMServiceMoveNetworkInterfaceProcedure:
+ mVMServiceMoveNetworkInterfaceHandler.ServeHTTP(w, r)
+ case MVMServiceDeleteNetworkInterfaceProcedure:
+ mVMServiceDeleteNetworkInterfaceHandler.ServeHTTP(w, r)
+ case MVMServiceValidateCreateProcedure:
+ mVMServiceValidateCreateHandler.ServeHTTP(w, r)
+ case MVMServiceValidateAddDiskProcedure:
+ mVMServiceValidateAddDiskHandler.ServeHTTP(w, r)
+ case MVMServiceValidateUpdateDiskProcedure:
+ mVMServiceValidateUpdateDiskHandler.ServeHTTP(w, r)
+ case MVMServiceValidateAddNetworkInterfaceProcedure:
+ mVMServiceValidateAddNetworkInterfaceHandler.ServeHTTP(w, r)
+ default:
+ http.NotFound(w, r)
+ }
+ })
+}
+
+// UnimplementedMVMServiceHandler returns CodeUnimplemented from all methods.
+type UnimplementedMVMServiceHandler struct{}
+
+func (UnimplementedMVMServiceHandler) Get(context.Context, *v1.MVMServiceGetRequest) (*v1.MVMServiceGetResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.Get is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) Create(context.Context, *v1.MVMServiceCreateRequest) (*v1.MVMServiceCreateResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.Create is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) Update(context.Context, *v1.MVMServiceUpdateRequest) (*v1.MVMServiceUpdateResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.Update is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) List(context.Context, *v1.MVMServiceListRequest) (*v1.MVMServiceListResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.List is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) Delete(context.Context, *v1.MVMServiceDeleteRequest) (*v1.MVMServiceDeleteResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.Delete is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) AddDisk(context.Context, *v1.MVMServiceAddDiskRequest) (*v1.MVMServiceAddDiskResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.AddDisk is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) UpdateDisk(context.Context, *v1.MVMServiceUpdateDiskRequest) (*v1.MVMServiceUpdateDiskResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.UpdateDisk is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) DeleteDisk(context.Context, *v1.MVMServiceDeleteDiskRequest) (*v1.MVMServiceDeleteDiskResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.DeleteDisk is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) AddNetworkInterface(context.Context, *v1.MVMServiceAddNetworkInterfaceRequest) (*v1.MVMServiceAddNetworkInterfaceResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.AddNetworkInterface is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) MoveNetworkInterface(context.Context, *v1.MVMServiceMoveNetworkInterfaceRequest) (*v1.MVMServiceMoveNetworkInterfaceResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.MoveNetworkInterface is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) DeleteNetworkInterface(context.Context, *v1.MVMServiceDeleteNetworkInterfaceRequest) (*v1.MVMServiceDeleteNetworkInterfaceResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.DeleteNetworkInterface is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) ValidateCreate(context.Context, *v1.MVMServiceValidateCreateRequest) (*v1.MVMServiceValidateCreateResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.ValidateCreate is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) ValidateAddDisk(context.Context, *v1.MVMServiceValidateAddDiskRequest) (*v1.MVMServiceValidateAddDiskResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.ValidateAddDisk is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) ValidateUpdateDisk(context.Context, *v1.MVMServiceValidateUpdateDiskRequest) (*v1.MVMServiceValidateUpdateDiskResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.ValidateUpdateDisk is not implemented"))
+}
+
+func (UnimplementedMVMServiceHandler) ValidateAddNetworkInterface(context.Context, *v1.MVMServiceValidateAddNetworkInterfaceRequest) (*v1.MVMServiceValidateAddNetworkInterfaceResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.MVMService.ValidateAddNetworkInterface is not implemented"))
+}
diff --git a/go/fits/api/mvm/v1/mvmv1connect/os.connect.go b/go/fits/api/mvm/v1/mvmv1connect/os.connect.go
new file mode 100644
index 0000000..ab4dae1
--- /dev/null
+++ b/go/fits/api/mvm/v1/mvmv1connect/os.connect.go
@@ -0,0 +1,114 @@
+// Code generated by protoc-gen-connect-go. DO NOT EDIT.
+//
+// Source: fits/api/mvm/v1/os.proto
+
+package mvmv1connect
+
+import (
+ connect "connectrpc.com/connect"
+ context "context"
+ errors "errors"
+ v1 "github.com/fi-ts/api/go/fits/api/mvm/v1"
+ http "net/http"
+ strings "strings"
+)
+
+// This is a compile-time assertion to ensure that this generated file and the connect package are
+// compatible. If you get a compiler error that this constant is not defined, this code was
+// generated with a version of connect newer than the one compiled into your binary. You can fix the
+// problem by either regenerating this code with an older version of connect or updating the connect
+// version compiled into your binary.
+const _ = connect.IsAtLeastVersion1_13_0
+
+const (
+ // OSServiceName is the fully-qualified name of the OSService service.
+ OSServiceName = "fits.api.mvm.v1.OSService"
+)
+
+// These constants are the fully-qualified names of the RPCs defined in this package. They're
+// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route.
+//
+// Note that these are different from the fully-qualified method names used by
+// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
+// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
+// period.
+const (
+ // OSServiceListProcedure is the fully-qualified name of the OSService's List RPC.
+ OSServiceListProcedure = "/fits.api.mvm.v1.OSService/List"
+)
+
+// OSServiceClient is a client for the fits.api.mvm.v1.OSService service.
+type OSServiceClient interface {
+ // Returns a list of all operating systems.
+ List(context.Context, *v1.OSServiceListRequest) (*v1.OSServiceListResponse, error)
+}
+
+// NewOSServiceClient constructs a client for the fits.api.mvm.v1.OSService service. By default, it
+// uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, and sends
+// uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or
+// connect.WithGRPCWeb() options.
+//
+// The URL supplied here should be the base URL for the Connect or gRPC server (for example,
+// http://api.acme.com or https://acme.com/grpc).
+func NewOSServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) OSServiceClient {
+ baseURL = strings.TrimRight(baseURL, "/")
+ oSServiceMethods := v1.File_fits_api_mvm_v1_os_proto.Services().ByName("OSService").Methods()
+ return &oSServiceClient{
+ list: connect.NewClient[v1.OSServiceListRequest, v1.OSServiceListResponse](
+ httpClient,
+ baseURL+OSServiceListProcedure,
+ connect.WithSchema(oSServiceMethods.ByName("List")),
+ connect.WithClientOptions(opts...),
+ ),
+ }
+}
+
+// oSServiceClient implements OSServiceClient.
+type oSServiceClient struct {
+ list *connect.Client[v1.OSServiceListRequest, v1.OSServiceListResponse]
+}
+
+// List calls fits.api.mvm.v1.OSService.List.
+func (c *oSServiceClient) List(ctx context.Context, req *v1.OSServiceListRequest) (*v1.OSServiceListResponse, error) {
+ response, err := c.list.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// OSServiceHandler is an implementation of the fits.api.mvm.v1.OSService service.
+type OSServiceHandler interface {
+ // Returns a list of all operating systems.
+ List(context.Context, *v1.OSServiceListRequest) (*v1.OSServiceListResponse, error)
+}
+
+// NewOSServiceHandler builds an HTTP handler from the service implementation. It returns the path
+// on which to mount the handler and the handler itself.
+//
+// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
+// and JSON codecs. They also support gzip compression.
+func NewOSServiceHandler(svc OSServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) {
+ oSServiceMethods := v1.File_fits_api_mvm_v1_os_proto.Services().ByName("OSService").Methods()
+ oSServiceListHandler := connect.NewUnaryHandlerSimple(
+ OSServiceListProcedure,
+ svc.List,
+ connect.WithSchema(oSServiceMethods.ByName("List")),
+ connect.WithHandlerOptions(opts...),
+ )
+ return "/fits.api.mvm.v1.OSService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ case OSServiceListProcedure:
+ oSServiceListHandler.ServeHTTP(w, r)
+ default:
+ http.NotFound(w, r)
+ }
+ })
+}
+
+// UnimplementedOSServiceHandler returns CodeUnimplemented from all methods.
+type UnimplementedOSServiceHandler struct{}
+
+func (UnimplementedOSServiceHandler) List(context.Context, *v1.OSServiceListRequest) (*v1.OSServiceListResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.OSService.List is not implemented"))
+}
diff --git a/go/fits/api/mvm/v1/mvmv1connect/stagetype.connect.go b/go/fits/api/mvm/v1/mvmv1connect/stagetype.connect.go
new file mode 100644
index 0000000..84a92af
--- /dev/null
+++ b/go/fits/api/mvm/v1/mvmv1connect/stagetype.connect.go
@@ -0,0 +1,114 @@
+// Code generated by protoc-gen-connect-go. DO NOT EDIT.
+//
+// Source: fits/api/mvm/v1/stagetype.proto
+
+package mvmv1connect
+
+import (
+ connect "connectrpc.com/connect"
+ context "context"
+ errors "errors"
+ v1 "github.com/fi-ts/api/go/fits/api/mvm/v1"
+ http "net/http"
+ strings "strings"
+)
+
+// This is a compile-time assertion to ensure that this generated file and the connect package are
+// compatible. If you get a compiler error that this constant is not defined, this code was
+// generated with a version of connect newer than the one compiled into your binary. You can fix the
+// problem by either regenerating this code with an older version of connect or updating the connect
+// version compiled into your binary.
+const _ = connect.IsAtLeastVersion1_13_0
+
+const (
+ // StageTypeServiceName is the fully-qualified name of the StageTypeService service.
+ StageTypeServiceName = "fits.api.mvm.v1.StageTypeService"
+)
+
+// These constants are the fully-qualified names of the RPCs defined in this package. They're
+// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route.
+//
+// Note that these are different from the fully-qualified method names used by
+// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
+// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
+// period.
+const (
+ // StageTypeServiceListProcedure is the fully-qualified name of the StageTypeService's List RPC.
+ StageTypeServiceListProcedure = "/fits.api.mvm.v1.StageTypeService/List"
+)
+
+// StageTypeServiceClient is a client for the fits.api.mvm.v1.StageTypeService service.
+type StageTypeServiceClient interface {
+ // Returns a list of all stage types available for a tenant.
+ List(context.Context, *v1.StageTypeServiceListRequest) (*v1.StageTypeServiceListResponse, error)
+}
+
+// NewStageTypeServiceClient constructs a client for the fits.api.mvm.v1.StageTypeService service.
+// By default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped
+// responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the
+// connect.WithGRPC() or connect.WithGRPCWeb() options.
+//
+// The URL supplied here should be the base URL for the Connect or gRPC server (for example,
+// http://api.acme.com or https://acme.com/grpc).
+func NewStageTypeServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) StageTypeServiceClient {
+ baseURL = strings.TrimRight(baseURL, "/")
+ stageTypeServiceMethods := v1.File_fits_api_mvm_v1_stagetype_proto.Services().ByName("StageTypeService").Methods()
+ return &stageTypeServiceClient{
+ list: connect.NewClient[v1.StageTypeServiceListRequest, v1.StageTypeServiceListResponse](
+ httpClient,
+ baseURL+StageTypeServiceListProcedure,
+ connect.WithSchema(stageTypeServiceMethods.ByName("List")),
+ connect.WithClientOptions(opts...),
+ ),
+ }
+}
+
+// stageTypeServiceClient implements StageTypeServiceClient.
+type stageTypeServiceClient struct {
+ list *connect.Client[v1.StageTypeServiceListRequest, v1.StageTypeServiceListResponse]
+}
+
+// List calls fits.api.mvm.v1.StageTypeService.List.
+func (c *stageTypeServiceClient) List(ctx context.Context, req *v1.StageTypeServiceListRequest) (*v1.StageTypeServiceListResponse, error) {
+ response, err := c.list.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// StageTypeServiceHandler is an implementation of the fits.api.mvm.v1.StageTypeService service.
+type StageTypeServiceHandler interface {
+ // Returns a list of all stage types available for a tenant.
+ List(context.Context, *v1.StageTypeServiceListRequest) (*v1.StageTypeServiceListResponse, error)
+}
+
+// NewStageTypeServiceHandler builds an HTTP handler from the service implementation. It returns the
+// path on which to mount the handler and the handler itself.
+//
+// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
+// and JSON codecs. They also support gzip compression.
+func NewStageTypeServiceHandler(svc StageTypeServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) {
+ stageTypeServiceMethods := v1.File_fits_api_mvm_v1_stagetype_proto.Services().ByName("StageTypeService").Methods()
+ stageTypeServiceListHandler := connect.NewUnaryHandlerSimple(
+ StageTypeServiceListProcedure,
+ svc.List,
+ connect.WithSchema(stageTypeServiceMethods.ByName("List")),
+ connect.WithHandlerOptions(opts...),
+ )
+ return "/fits.api.mvm.v1.StageTypeService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ case StageTypeServiceListProcedure:
+ stageTypeServiceListHandler.ServeHTTP(w, r)
+ default:
+ http.NotFound(w, r)
+ }
+ })
+}
+
+// UnimplementedStageTypeServiceHandler returns CodeUnimplemented from all methods.
+type UnimplementedStageTypeServiceHandler struct{}
+
+func (UnimplementedStageTypeServiceHandler) List(context.Context, *v1.StageTypeServiceListRequest) (*v1.StageTypeServiceListResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.StageTypeService.List is not implemented"))
+}
diff --git a/go/fits/api/mvm/v1/mvmv1connect/vlan.connect.go b/go/fits/api/mvm/v1/mvmv1connect/vlan.connect.go
new file mode 100644
index 0000000..820b019
--- /dev/null
+++ b/go/fits/api/mvm/v1/mvmv1connect/vlan.connect.go
@@ -0,0 +1,114 @@
+// Code generated by protoc-gen-connect-go. DO NOT EDIT.
+//
+// Source: fits/api/mvm/v1/vlan.proto
+
+package mvmv1connect
+
+import (
+ connect "connectrpc.com/connect"
+ context "context"
+ errors "errors"
+ v1 "github.com/fi-ts/api/go/fits/api/mvm/v1"
+ http "net/http"
+ strings "strings"
+)
+
+// This is a compile-time assertion to ensure that this generated file and the connect package are
+// compatible. If you get a compiler error that this constant is not defined, this code was
+// generated with a version of connect newer than the one compiled into your binary. You can fix the
+// problem by either regenerating this code with an older version of connect or updating the connect
+// version compiled into your binary.
+const _ = connect.IsAtLeastVersion1_13_0
+
+const (
+ // VLANServiceName is the fully-qualified name of the VLANService service.
+ VLANServiceName = "fits.api.mvm.v1.VLANService"
+)
+
+// These constants are the fully-qualified names of the RPCs defined in this package. They're
+// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route.
+//
+// Note that these are different from the fully-qualified method names used by
+// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
+// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
+// period.
+const (
+ // VLANServiceListProcedure is the fully-qualified name of the VLANService's List RPC.
+ VLANServiceListProcedure = "/fits.api.mvm.v1.VLANService/List"
+)
+
+// VLANServiceClient is a client for the fits.api.mvm.v1.VLANService service.
+type VLANServiceClient interface {
+ // Returns a list of all VLANs available for a tenant.
+ List(context.Context, *v1.VLANServiceListRequest) (*v1.VLANServiceListResponse, error)
+}
+
+// NewVLANServiceClient constructs a client for the fits.api.mvm.v1.VLANService service. By default,
+// it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, and
+// sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC()
+// or connect.WithGRPCWeb() options.
+//
+// The URL supplied here should be the base URL for the Connect or gRPC server (for example,
+// http://api.acme.com or https://acme.com/grpc).
+func NewVLANServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) VLANServiceClient {
+ baseURL = strings.TrimRight(baseURL, "/")
+ vLANServiceMethods := v1.File_fits_api_mvm_v1_vlan_proto.Services().ByName("VLANService").Methods()
+ return &vLANServiceClient{
+ list: connect.NewClient[v1.VLANServiceListRequest, v1.VLANServiceListResponse](
+ httpClient,
+ baseURL+VLANServiceListProcedure,
+ connect.WithSchema(vLANServiceMethods.ByName("List")),
+ connect.WithClientOptions(opts...),
+ ),
+ }
+}
+
+// vLANServiceClient implements VLANServiceClient.
+type vLANServiceClient struct {
+ list *connect.Client[v1.VLANServiceListRequest, v1.VLANServiceListResponse]
+}
+
+// List calls fits.api.mvm.v1.VLANService.List.
+func (c *vLANServiceClient) List(ctx context.Context, req *v1.VLANServiceListRequest) (*v1.VLANServiceListResponse, error) {
+ response, err := c.list.CallUnary(ctx, connect.NewRequest(req))
+ if response != nil {
+ return response.Msg, err
+ }
+ return nil, err
+}
+
+// VLANServiceHandler is an implementation of the fits.api.mvm.v1.VLANService service.
+type VLANServiceHandler interface {
+ // Returns a list of all VLANs available for a tenant.
+ List(context.Context, *v1.VLANServiceListRequest) (*v1.VLANServiceListResponse, error)
+}
+
+// NewVLANServiceHandler builds an HTTP handler from the service implementation. It returns the path
+// on which to mount the handler and the handler itself.
+//
+// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
+// and JSON codecs. They also support gzip compression.
+func NewVLANServiceHandler(svc VLANServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) {
+ vLANServiceMethods := v1.File_fits_api_mvm_v1_vlan_proto.Services().ByName("VLANService").Methods()
+ vLANServiceListHandler := connect.NewUnaryHandlerSimple(
+ VLANServiceListProcedure,
+ svc.List,
+ connect.WithSchema(vLANServiceMethods.ByName("List")),
+ connect.WithHandlerOptions(opts...),
+ )
+ return "/fits.api.mvm.v1.VLANService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ case VLANServiceListProcedure:
+ vLANServiceListHandler.ServeHTTP(w, r)
+ default:
+ http.NotFound(w, r)
+ }
+ })
+}
+
+// UnimplementedVLANServiceHandler returns CodeUnimplemented from all methods.
+type UnimplementedVLANServiceHandler struct{}
+
+func (UnimplementedVLANServiceHandler) List(context.Context, *v1.VLANServiceListRequest) (*v1.VLANServiceListResponse, error) {
+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("fits.api.mvm.v1.VLANService.List is not implemented"))
+}
diff --git a/go/fits/api/mvm/v1/os.pb.go b/go/fits/api/mvm/v1/os.pb.go
new file mode 100644
index 0000000..b238630
--- /dev/null
+++ b/go/fits/api/mvm/v1/os.pb.go
@@ -0,0 +1,301 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.36.12
+// protoc (unknown)
+// source: fits/api/mvm/v1/os.proto
+
+package mvmv1
+
+import (
+ _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ _ "github.com/fi-ts/api/go/fits/api/v1"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+ unsafe "unsafe"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// OSType specifies the type of an operating system.
+type OSType int32
+
+const (
+ // OS_TYPE_UNSPECIFIED is not specified.
+ OSType_OS_TYPE_UNSPECIFIED OSType = 0
+ // OS_TYPE_LINUX is a Linux operating system.
+ OSType_OS_TYPE_LINUX OSType = 1
+ // OS_TYPE_WINDOWS is a Windows operating system.
+ OSType_OS_TYPE_WINDOWS OSType = 2
+)
+
+// Enum value maps for OSType.
+var (
+ OSType_name = map[int32]string{
+ 0: "OS_TYPE_UNSPECIFIED",
+ 1: "OS_TYPE_LINUX",
+ 2: "OS_TYPE_WINDOWS",
+ }
+ OSType_value = map[string]int32{
+ "OS_TYPE_UNSPECIFIED": 0,
+ "OS_TYPE_LINUX": 1,
+ "OS_TYPE_WINDOWS": 2,
+ }
+)
+
+func (x OSType) Enum() *OSType {
+ p := new(OSType)
+ *p = x
+ return p
+}
+
+func (x OSType) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (OSType) Descriptor() protoreflect.EnumDescriptor {
+ return file_fits_api_mvm_v1_os_proto_enumTypes[0].Descriptor()
+}
+
+func (OSType) Type() protoreflect.EnumType {
+ return &file_fits_api_mvm_v1_os_proto_enumTypes[0]
+}
+
+func (x OSType) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use OSType.Descriptor instead.
+func (OSType) EnumDescriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_os_proto_rawDescGZIP(), []int{0}
+}
+
+// OS is the definition of an available OS for MVM instances.
+type OS struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Uuid of this OS.
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // Title of the OS.
+ Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
+ // Type of the OS.
+ Type OSType `protobuf:"varint,3,opt,name=type,proto3,enum=fits.api.mvm.v1.OSType" json:"type,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *OS) Reset() {
+ *x = OS{}
+ mi := &file_fits_api_mvm_v1_os_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *OS) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OS) ProtoMessage() {}
+
+func (x *OS) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_os_proto_msgTypes[0]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use OS.ProtoReflect.Descriptor instead.
+func (*OS) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_os_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *OS) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *OS) GetTitle() string {
+ if x != nil {
+ return x.Title
+ }
+ return ""
+}
+
+func (x *OS) GetType() OSType {
+ if x != nil {
+ return x.Type
+ }
+ return OSType_OS_TYPE_UNSPECIFIED
+}
+
+// OSServiceListRequest is the request payload for a OS list request.
+type OSServiceListRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *OSServiceListRequest) Reset() {
+ *x = OSServiceListRequest{}
+ mi := &file_fits_api_mvm_v1_os_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *OSServiceListRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OSServiceListRequest) ProtoMessage() {}
+
+func (x *OSServiceListRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_os_proto_msgTypes[1]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use OSServiceListRequest.ProtoReflect.Descriptor instead.
+func (*OSServiceListRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_os_proto_rawDescGZIP(), []int{1}
+}
+
+// OSServiceListResponse is the response payload for a OS list request
+type OSServiceListResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The available operating systems.
+ OperatingSystems []*OS `protobuf:"bytes,1,rep,name=operating_systems,json=operatingSystems,proto3" json:"operating_systems,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *OSServiceListResponse) Reset() {
+ *x = OSServiceListResponse{}
+ mi := &file_fits_api_mvm_v1_os_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *OSServiceListResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OSServiceListResponse) ProtoMessage() {}
+
+func (x *OSServiceListResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_os_proto_msgTypes[2]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use OSServiceListResponse.ProtoReflect.Descriptor instead.
+func (*OSServiceListResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_os_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *OSServiceListResponse) GetOperatingSystems() []*OS {
+ if x != nil {
+ return x.OperatingSystems
+ }
+ return nil
+}
+
+var File_fits_api_mvm_v1_os_proto protoreflect.FileDescriptor
+
+const file_fits_api_mvm_v1_os_proto_rawDesc = "" +
+ "\n" +
+ "\x18fits/api/mvm/v1/os.proto\x12\x0ffits.api.mvm.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"r\n" +
+ "\x02OS\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n" +
+ "\x05title\x18\x02 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x05title\x12+\n" +
+ "\x04type\x18\x03 \x01(\x0e2\x17.fits.api.mvm.v1.OSTypeR\x04type\"\x16\n" +
+ "\x14OSServiceListRequest\"Y\n" +
+ "\x15OSServiceListResponse\x12@\n" +
+ "\x11operating_systems\x18\x01 \x03(\v2\x13.fits.api.mvm.v1.OSR\x10operatingSystems*g\n" +
+ "\x06OSType\x12\x1d\n" +
+ "\x13OS_TYPE_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x1c\n" +
+ "\rOS_TYPE_LINUX\x10\x01\x1a\t\x82\xb2\x19\x05linux\x12 \n" +
+ "\x0fOS_TYPE_WINDOWS\x10\x02\x1a\v\x82\xb2\x19\awindows2l\n" +
+ "\tOSService\x12_\n" +
+ "\x04List\x12%.fits.api.mvm.v1.OSServiceListRequest\x1a&.fits.api.mvm.v1.OSServiceListResponse\"\b\xd8\xf3\x18\x02\xe0\xf3\x18\x02B\xac\x01\n" +
+ "\x13com.fits.api.mvm.v1B\aOsProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03FAM\xaa\x02\x0fFits.Api.Mvm.V1\xca\x02\x0fFits\\Api\\Mvm\\V1\xe2\x02\x1bFits\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12Fits::Api::Mvm::V1b\x06proto3"
+
+var (
+ file_fits_api_mvm_v1_os_proto_rawDescOnce sync.Once
+ file_fits_api_mvm_v1_os_proto_rawDescData []byte
+)
+
+func file_fits_api_mvm_v1_os_proto_rawDescGZIP() []byte {
+ file_fits_api_mvm_v1_os_proto_rawDescOnce.Do(func() {
+ file_fits_api_mvm_v1_os_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_os_proto_rawDesc), len(file_fits_api_mvm_v1_os_proto_rawDesc)))
+ })
+ return file_fits_api_mvm_v1_os_proto_rawDescData
+}
+
+var file_fits_api_mvm_v1_os_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_fits_api_mvm_v1_os_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_fits_api_mvm_v1_os_proto_goTypes = []any{
+ (OSType)(0), // 0: fits.api.mvm.v1.OSType
+ (*OS)(nil), // 1: fits.api.mvm.v1.OS
+ (*OSServiceListRequest)(nil), // 2: fits.api.mvm.v1.OSServiceListRequest
+ (*OSServiceListResponse)(nil), // 3: fits.api.mvm.v1.OSServiceListResponse
+}
+var file_fits_api_mvm_v1_os_proto_depIdxs = []int32{
+ 0, // 0: fits.api.mvm.v1.OS.type:type_name -> fits.api.mvm.v1.OSType
+ 1, // 1: fits.api.mvm.v1.OSServiceListResponse.operating_systems:type_name -> fits.api.mvm.v1.OS
+ 2, // 2: fits.api.mvm.v1.OSService.List:input_type -> fits.api.mvm.v1.OSServiceListRequest
+ 3, // 3: fits.api.mvm.v1.OSService.List:output_type -> fits.api.mvm.v1.OSServiceListResponse
+ 3, // [3:4] is the sub-list for method output_type
+ 2, // [2:3] is the sub-list for method input_type
+ 2, // [2:2] is the sub-list for extension type_name
+ 2, // [2:2] is the sub-list for extension extendee
+ 0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_fits_api_mvm_v1_os_proto_init() }
+func file_fits_api_mvm_v1_os_proto_init() {
+ if File_fits_api_mvm_v1_os_proto != nil {
+ return
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_os_proto_rawDesc), len(file_fits_api_mvm_v1_os_proto_rawDesc)),
+ NumEnums: 1,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_fits_api_mvm_v1_os_proto_goTypes,
+ DependencyIndexes: file_fits_api_mvm_v1_os_proto_depIdxs,
+ EnumInfos: file_fits_api_mvm_v1_os_proto_enumTypes,
+ MessageInfos: file_fits_api_mvm_v1_os_proto_msgTypes,
+ }.Build()
+ File_fits_api_mvm_v1_os_proto = out.File
+ file_fits_api_mvm_v1_os_proto_goTypes = nil
+ file_fits_api_mvm_v1_os_proto_depIdxs = nil
+}
diff --git a/go/fits/api/mvm/v1/stagetype.pb.go b/go/fits/api/mvm/v1/stagetype.pb.go
new file mode 100644
index 0000000..6a37d05
--- /dev/null
+++ b/go/fits/api/mvm/v1/stagetype.pb.go
@@ -0,0 +1,231 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.36.12
+// protoc (unknown)
+// source: fits/api/mvm/v1/stagetype.proto
+
+package mvmv1
+
+import (
+ _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ _ "github.com/fi-ts/api/go/fits/api/v1"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+ unsafe "unsafe"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// StageType is the definition of available stage types. (Development, Test, Integration, Production)
+type StageType struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Uuid of this stage type
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // title of the stage type
+ Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *StageType) Reset() {
+ *x = StageType{}
+ mi := &file_fits_api_mvm_v1_stagetype_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *StageType) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StageType) ProtoMessage() {}
+
+func (x *StageType) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_stagetype_proto_msgTypes[0]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StageType.ProtoReflect.Descriptor instead.
+func (*StageType) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_stagetype_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *StageType) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *StageType) GetTitle() string {
+ if x != nil {
+ return x.Title
+ }
+ return ""
+}
+
+// StageTypeServiceListRequest is the request payload for a stage type list request.
+type StageTypeServiceListRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *StageTypeServiceListRequest) Reset() {
+ *x = StageTypeServiceListRequest{}
+ mi := &file_fits_api_mvm_v1_stagetype_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *StageTypeServiceListRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StageTypeServiceListRequest) ProtoMessage() {}
+
+func (x *StageTypeServiceListRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_stagetype_proto_msgTypes[1]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StageTypeServiceListRequest.ProtoReflect.Descriptor instead.
+func (*StageTypeServiceListRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_stagetype_proto_rawDescGZIP(), []int{1}
+}
+
+// StageTypeServiceListResponse is the response payload for a stage type list request
+type StageTypeServiceListResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The available stage types
+ StageTypes []*StageType `protobuf:"bytes,1,rep,name=stage_types,json=stageTypes,proto3" json:"stage_types,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *StageTypeServiceListResponse) Reset() {
+ *x = StageTypeServiceListResponse{}
+ mi := &file_fits_api_mvm_v1_stagetype_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *StageTypeServiceListResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StageTypeServiceListResponse) ProtoMessage() {}
+
+func (x *StageTypeServiceListResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_stagetype_proto_msgTypes[2]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StageTypeServiceListResponse.ProtoReflect.Descriptor instead.
+func (*StageTypeServiceListResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_stagetype_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *StageTypeServiceListResponse) GetStageTypes() []*StageType {
+ if x != nil {
+ return x.StageTypes
+ }
+ return nil
+}
+
+var File_fits_api_mvm_v1_stagetype_proto protoreflect.FileDescriptor
+
+const file_fits_api_mvm_v1_stagetype_proto_rawDesc = "" +
+ "\n" +
+ "\x1ffits/api/mvm/v1/stagetype.proto\x12\x0ffits.api.mvm.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"L\n" +
+ "\tStageType\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n" +
+ "\x05title\x18\x02 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x05title\"\x1d\n" +
+ "\x1bStageTypeServiceListRequest\"[\n" +
+ "\x1cStageTypeServiceListResponse\x12;\n" +
+ "\vstage_types\x18\x01 \x03(\v2\x1a.fits.api.mvm.v1.StageTypeR\n" +
+ "stageTypes2\x84\x01\n" +
+ "\x10StageTypeService\x12p\n" +
+ "\x04List\x12,.fits.api.mvm.v1.StageTypeServiceListRequest\x1a-.fits.api.mvm.v1.StageTypeServiceListResponse\"\v\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02B\xb3\x01\n" +
+ "\x13com.fits.api.mvm.v1B\x0eStagetypeProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03FAM\xaa\x02\x0fFits.Api.Mvm.V1\xca\x02\x0fFits\\Api\\Mvm\\V1\xe2\x02\x1bFits\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12Fits::Api::Mvm::V1b\x06proto3"
+
+var (
+ file_fits_api_mvm_v1_stagetype_proto_rawDescOnce sync.Once
+ file_fits_api_mvm_v1_stagetype_proto_rawDescData []byte
+)
+
+func file_fits_api_mvm_v1_stagetype_proto_rawDescGZIP() []byte {
+ file_fits_api_mvm_v1_stagetype_proto_rawDescOnce.Do(func() {
+ file_fits_api_mvm_v1_stagetype_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_stagetype_proto_rawDesc), len(file_fits_api_mvm_v1_stagetype_proto_rawDesc)))
+ })
+ return file_fits_api_mvm_v1_stagetype_proto_rawDescData
+}
+
+var file_fits_api_mvm_v1_stagetype_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_fits_api_mvm_v1_stagetype_proto_goTypes = []any{
+ (*StageType)(nil), // 0: fits.api.mvm.v1.StageType
+ (*StageTypeServiceListRequest)(nil), // 1: fits.api.mvm.v1.StageTypeServiceListRequest
+ (*StageTypeServiceListResponse)(nil), // 2: fits.api.mvm.v1.StageTypeServiceListResponse
+}
+var file_fits_api_mvm_v1_stagetype_proto_depIdxs = []int32{
+ 0, // 0: fits.api.mvm.v1.StageTypeServiceListResponse.stage_types:type_name -> fits.api.mvm.v1.StageType
+ 1, // 1: fits.api.mvm.v1.StageTypeService.List:input_type -> fits.api.mvm.v1.StageTypeServiceListRequest
+ 2, // 2: fits.api.mvm.v1.StageTypeService.List:output_type -> fits.api.mvm.v1.StageTypeServiceListResponse
+ 2, // [2:3] is the sub-list for method output_type
+ 1, // [1:2] is the sub-list for method input_type
+ 1, // [1:1] is the sub-list for extension type_name
+ 1, // [1:1] is the sub-list for extension extendee
+ 0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_fits_api_mvm_v1_stagetype_proto_init() }
+func file_fits_api_mvm_v1_stagetype_proto_init() {
+ if File_fits_api_mvm_v1_stagetype_proto != nil {
+ return
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_stagetype_proto_rawDesc), len(file_fits_api_mvm_v1_stagetype_proto_rawDesc)),
+ NumEnums: 0,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_fits_api_mvm_v1_stagetype_proto_goTypes,
+ DependencyIndexes: file_fits_api_mvm_v1_stagetype_proto_depIdxs,
+ MessageInfos: file_fits_api_mvm_v1_stagetype_proto_msgTypes,
+ }.Build()
+ File_fits_api_mvm_v1_stagetype_proto = out.File
+ file_fits_api_mvm_v1_stagetype_proto_goTypes = nil
+ file_fits_api_mvm_v1_stagetype_proto_depIdxs = nil
+}
diff --git a/go/fits/api/mvm/v1/vlan.pb.go b/go/fits/api/mvm/v1/vlan.pb.go
new file mode 100644
index 0000000..f7591b2
--- /dev/null
+++ b/go/fits/api/mvm/v1/vlan.pb.go
@@ -0,0 +1,298 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.36.12
+// protoc (unknown)
+// source: fits/api/mvm/v1/vlan.proto
+
+package mvmv1
+
+import (
+ _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ _ "github.com/fi-ts/api/go/fits/api/v1"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+ unsafe "unsafe"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// VLAN is a VLAN that a MVM can be connected to.
+type VLAN struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Uuid of this VLAN
+ Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+ // Id of this VLAN
+ // This is not a foreign key, this is the actual ID of the VLAN the network interface is attached to.
+ VlanId int32 `protobuf:"varint,2,opt,name=vlan_id,json=vlanId,proto3" json:"vlan_id,omitempty"`
+ // Title of the subnet this VLAN belongs to
+ SubnetTitle string `protobuf:"bytes,3,opt,name=subnet_title,json=subnetTitle,proto3" json:"subnet_title,omitempty"`
+ // CIDR of the subnet this VLAN belongs to
+ SubnetCidr string `protobuf:"bytes,4,opt,name=subnet_cidr,json=subnetCidr,proto3" json:"subnet_cidr,omitempty"`
+ // TODO instead of the pod title, could we have the location_uuid?
+ LocationUuid *string `protobuf:"bytes,10,opt,name=location_uuid,json=locationUuid,proto3,oneof" json:"location_uuid,omitempty"`
+ // TODO: instead of a stage type, this should be mapped to a project.
+ // TODO: this would have to be re-mapped in the customer onboarding
+ // Uuid of the stage type of this VLAN
+ StageTypeUuid string `protobuf:"bytes,11,opt,name=stage_type_uuid,json=stageTypeUuid,proto3" json:"stage_type_uuid,omitempty"`
+ // Tenant this VLAN belongs to.
+ Tenant string `protobuf:"bytes,12,opt,name=tenant,proto3" json:"tenant,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *VLAN) Reset() {
+ *x = VLAN{}
+ mi := &file_fits_api_mvm_v1_vlan_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *VLAN) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VLAN) ProtoMessage() {}
+
+func (x *VLAN) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_vlan_proto_msgTypes[0]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use VLAN.ProtoReflect.Descriptor instead.
+func (*VLAN) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_vlan_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *VLAN) GetUuid() string {
+ if x != nil {
+ return x.Uuid
+ }
+ return ""
+}
+
+func (x *VLAN) GetVlanId() int32 {
+ if x != nil {
+ return x.VlanId
+ }
+ return 0
+}
+
+func (x *VLAN) GetSubnetTitle() string {
+ if x != nil {
+ return x.SubnetTitle
+ }
+ return ""
+}
+
+func (x *VLAN) GetSubnetCidr() string {
+ if x != nil {
+ return x.SubnetCidr
+ }
+ return ""
+}
+
+func (x *VLAN) GetLocationUuid() string {
+ if x != nil && x.LocationUuid != nil {
+ return *x.LocationUuid
+ }
+ return ""
+}
+
+func (x *VLAN) GetStageTypeUuid() string {
+ if x != nil {
+ return x.StageTypeUuid
+ }
+ return ""
+}
+
+func (x *VLAN) GetTenant() string {
+ if x != nil {
+ return x.Tenant
+ }
+ return ""
+}
+
+// VLANServiceListRequest is the request payload for a VLAN list request.
+type VLANServiceListRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Tenant to list available VLANs for
+ // TODO should be filtered by project instead, see https://github.com/fi-ts/fco-apiserver/issues/39
+ Tenant string `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *VLANServiceListRequest) Reset() {
+ *x = VLANServiceListRequest{}
+ mi := &file_fits_api_mvm_v1_vlan_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *VLANServiceListRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VLANServiceListRequest) ProtoMessage() {}
+
+func (x *VLANServiceListRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_vlan_proto_msgTypes[1]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use VLANServiceListRequest.ProtoReflect.Descriptor instead.
+func (*VLANServiceListRequest) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_vlan_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *VLANServiceListRequest) GetTenant() string {
+ if x != nil {
+ return x.Tenant
+ }
+ return ""
+}
+
+// VLANServiceListResponse is the response payload for a VLAN list request
+type VLANServiceListResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // The available VLANs
+ Vlans []*VLAN `protobuf:"bytes,1,rep,name=vlans,proto3" json:"vlans,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *VLANServiceListResponse) Reset() {
+ *x = VLANServiceListResponse{}
+ mi := &file_fits_api_mvm_v1_vlan_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *VLANServiceListResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VLANServiceListResponse) ProtoMessage() {}
+
+func (x *VLANServiceListResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_fits_api_mvm_v1_vlan_proto_msgTypes[2]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use VLANServiceListResponse.ProtoReflect.Descriptor instead.
+func (*VLANServiceListResponse) Descriptor() ([]byte, []int) {
+ return file_fits_api_mvm_v1_vlan_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *VLANServiceListResponse) GetVlans() []*VLAN {
+ if x != nil {
+ return x.Vlans
+ }
+ return nil
+}
+
+var File_fits_api_mvm_v1_vlan_proto protoreflect.FileDescriptor
+
+const file_fits_api_mvm_v1_vlan_proto_rawDesc = "" +
+ "\n" +
+ "\x1afits/api/mvm/v1/vlan.proto\x12\x0ffits.api.mvm.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xb8\x02\n" +
+ "\x04VLAN\x12\x1c\n" +
+ "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\x17\n" +
+ "\avlan_id\x18\x02 \x01(\x05R\x06vlanId\x12.\n" +
+ "\fsubnet_title\x18\x03 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\vsubnetTitle\x12,\n" +
+ "\vsubnet_cidr\x18\x04 \x01(\tB\v\xbaH\br\x06\xf8\xb3\xae\xb1\x02\x01R\n" +
+ "subnetCidr\x122\n" +
+ "\rlocation_uuid\x18\n" +
+ " \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01H\x00R\flocationUuid\x88\x01\x01\x120\n" +
+ "\x0fstage_type_uuid\x18\v \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\rstageTypeUuid\x12#\n" +
+ "\x06tenant\x18\f \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenantB\x10\n" +
+ "\x0e_location_uuid\"=\n" +
+ "\x16VLANServiceListRequest\x12#\n" +
+ "\x06tenant\x18\x01 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenant\"F\n" +
+ "\x17VLANServiceListResponse\x12+\n" +
+ "\x05vlans\x18\x01 \x03(\v2\x15.fits.api.mvm.v1.VLANR\x05vlans2u\n" +
+ "\vVLANService\x12f\n" +
+ "\x04List\x12'.fits.api.mvm.v1.VLANServiceListRequest\x1a(.fits.api.mvm.v1.VLANServiceListResponse\"\v\xc2\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02B\xae\x01\n" +
+ "\x13com.fits.api.mvm.v1B\tVlanProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03FAM\xaa\x02\x0fFits.Api.Mvm.V1\xca\x02\x0fFits\\Api\\Mvm\\V1\xe2\x02\x1bFits\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12Fits::Api::Mvm::V1b\x06proto3"
+
+var (
+ file_fits_api_mvm_v1_vlan_proto_rawDescOnce sync.Once
+ file_fits_api_mvm_v1_vlan_proto_rawDescData []byte
+)
+
+func file_fits_api_mvm_v1_vlan_proto_rawDescGZIP() []byte {
+ file_fits_api_mvm_v1_vlan_proto_rawDescOnce.Do(func() {
+ file_fits_api_mvm_v1_vlan_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_vlan_proto_rawDesc), len(file_fits_api_mvm_v1_vlan_proto_rawDesc)))
+ })
+ return file_fits_api_mvm_v1_vlan_proto_rawDescData
+}
+
+var file_fits_api_mvm_v1_vlan_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_fits_api_mvm_v1_vlan_proto_goTypes = []any{
+ (*VLAN)(nil), // 0: fits.api.mvm.v1.VLAN
+ (*VLANServiceListRequest)(nil), // 1: fits.api.mvm.v1.VLANServiceListRequest
+ (*VLANServiceListResponse)(nil), // 2: fits.api.mvm.v1.VLANServiceListResponse
+}
+var file_fits_api_mvm_v1_vlan_proto_depIdxs = []int32{
+ 0, // 0: fits.api.mvm.v1.VLANServiceListResponse.vlans:type_name -> fits.api.mvm.v1.VLAN
+ 1, // 1: fits.api.mvm.v1.VLANService.List:input_type -> fits.api.mvm.v1.VLANServiceListRequest
+ 2, // 2: fits.api.mvm.v1.VLANService.List:output_type -> fits.api.mvm.v1.VLANServiceListResponse
+ 2, // [2:3] is the sub-list for method output_type
+ 1, // [1:2] is the sub-list for method input_type
+ 1, // [1:1] is the sub-list for extension type_name
+ 1, // [1:1] is the sub-list for extension extendee
+ 0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_fits_api_mvm_v1_vlan_proto_init() }
+func file_fits_api_mvm_v1_vlan_proto_init() {
+ if File_fits_api_mvm_v1_vlan_proto != nil {
+ return
+ }
+ file_fits_api_mvm_v1_vlan_proto_msgTypes[0].OneofWrappers = []any{}
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: unsafe.Slice(unsafe.StringData(file_fits_api_mvm_v1_vlan_proto_rawDesc), len(file_fits_api_mvm_v1_vlan_proto_rawDesc)),
+ NumEnums: 0,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_fits_api_mvm_v1_vlan_proto_goTypes,
+ DependencyIndexes: file_fits_api_mvm_v1_vlan_proto_depIdxs,
+ MessageInfos: file_fits_api_mvm_v1_vlan_proto_msgTypes,
+ }.Build()
+ File_fits_api_mvm_v1_vlan_proto = out.File
+ file_fits_api_mvm_v1_vlan_proto_goTypes = nil
+ file_fits_api_mvm_v1_vlan_proto_depIdxs = nil
+}
diff --git a/go/fits/api/v1/predefined_rules.pb.go b/go/fits/api/v1/predefined_rules.pb.go
index 534ebe2..a0dd2ba 100644
--- a/go/fits/api/v1/predefined_rules.pb.go
+++ b/go/fits/api/v1/predefined_rules.pb.go
@@ -86,6 +86,14 @@ var file_fits_api_v1_predefined_rules_proto_extTypes = []protoimpl.ExtensionInfo
Tag: "varint,80048958,opt,name=trimmed",
Filename: "fits/api/v1/predefined_rules.proto",
},
+ {
+ ExtendedType: (*validate.StringRules)(nil),
+ ExtensionType: (*bool)(nil),
+ Field: 80048959,
+ Name: "fits.api.v1.is_ipv4_cidr",
+ Tag: "varint,80048959,opt,name=is_ipv4_cidr",
+ Filename: "fits/api/v1/predefined_rules.proto",
+ },
{
ExtendedType: (*validate.RepeatedRules)(nil),
ExtensionType: (*bool)(nil),
@@ -170,6 +178,10 @@ var (
//
// optional bool trimmed = 80048958;
E_Trimmed = &file_fits_api_v1_predefined_rules_proto_extTypes[7]
+ // IsIpv4Cidr validates if the given string is a valid IPv4 CIDR, e.g. 10.0.0.0/24
+ //
+ // optional bool is_ipv4_cidr = 80048959;
+ E_IsIpv4Cidr = &file_fits_api_v1_predefined_rules_proto_extTypes[8]
)
// Extension fields to validate.RepeatedRules.
@@ -177,19 +189,19 @@ var (
// Prefixes validates if a slice of prefixes in string form are valid
//
// optional bool prefixes = 80058951;
- E_Prefixes = &file_fits_api_v1_predefined_rules_proto_extTypes[8]
+ E_Prefixes = &file_fits_api_v1_predefined_rules_proto_extTypes[9]
// Ips validates if a slice of ips in string form are valid
//
// optional bool ips = 80058952;
- E_Ips = &file_fits_api_v1_predefined_rules_proto_extTypes[9]
+ E_Ips = &file_fits_api_v1_predefined_rules_proto_extTypes[10]
// AreHostAndPort validates if a slice of strings are all in the form of :
//
// optional bool are_host_and_port = 80058953;
- E_AreHostAndPort = &file_fits_api_v1_predefined_rules_proto_extTypes[10]
+ E_AreHostAndPort = &file_fits_api_v1_predefined_rules_proto_extTypes[11]
// All Trimmed enforces all strings to be trimmed, e.g. no whitespaces at the begin and end
//
// optional bool all_trimmed = 80058954;
- E_AllTrimmed = &file_fits_api_v1_predefined_rules_proto_extTypes[11]
+ E_AllTrimmed = &file_fits_api_v1_predefined_rules_proto_extTypes[12]
)
// Extension fields to validate.MapRules.
@@ -197,11 +209,11 @@ var (
// Keys and Values trimmed enforces all map keys and values to be trimmed, e.g. no whitespaces at the begin and end
//
// optional bool keys_and_values_trimmed = 80068951;
- E_KeysAndValuesTrimmed = &file_fits_api_v1_predefined_rules_proto_extTypes[12]
+ E_KeysAndValuesTrimmed = &file_fits_api_v1_predefined_rules_proto_extTypes[13]
// Keys trimmed enforces all map keys and values to be trimmed, e.g. no whitespaces at the begin and end
//
// optional bool keys_trimmed = 80068952;
- E_KeysTrimmed = &file_fits_api_v1_predefined_rules_proto_extTypes[13]
+ E_KeysTrimmed = &file_fits_api_v1_predefined_rules_proto_extTypes[14]
)
var File_fits_api_v1_predefined_rules_proto protoreflect.FileDescriptor
@@ -235,7 +247,11 @@ const file_fits_api_v1_predefined_rules_proto_rawDesc = "" +
"\rvalid_address\x12&must be a valid IP address or hostname\x1a this.isIp() || this.isHostname()R\x0eisIpOrHostname:\x9d\x01\n" +
"\atrimmed\x12\x19.buf.validate.StringRules\x18\xbe\xe6\x95& \x01(\bBe\xc2Hb\n" +
"`\n" +
- "\x0estring.trimmed\x12+value must not start or end with whitespace\x1a!this.trim().size() == this.size()R\atrimmed:\x8f\x01\n" +
+ "\x0estring.trimmed\x12+value must not start or end with whitespace\x1a!this.trim().size() == this.size()R\atrimmed:\xb1\x01\n" +
+ "\fis_ipv4_cidr\x12\x19.buf.validate.StringRules\x18\xbf\xe6\x95& \x01(\bBq\xc2Hn\n" +
+ "l\n" +
+ "\x13string.is_ipv4_cidr\x12+must be a valid IPv4 CIDR, e.g. 10.0.0.0/24\x1a(this.isIpPrefix() && !this.contains(':')R\n" +
+ "isIpv4Cidr:\x8f\x01\n" +
"\bprefixes\x12\x1b.buf.validate.RepeatedRules\x18Ǵ\x96& \x01(\bBS\xc2HP\n" +
"N\n" +
"\x11repeated.prefixes\x12\x1cgiven prefixes must be valid\x1a\x1bthis.all(m, m.isIpPrefix())R\bprefixes:u\n" +
@@ -271,16 +287,17 @@ var file_fits_api_v1_predefined_rules_proto_depIdxs = []int32{
0, // 5: fits.api.v1.is_uri:extendee -> buf.validate.StringRules
0, // 6: fits.api.v1.is_ip_or_hostname:extendee -> buf.validate.StringRules
0, // 7: fits.api.v1.trimmed:extendee -> buf.validate.StringRules
- 1, // 8: fits.api.v1.prefixes:extendee -> buf.validate.RepeatedRules
- 1, // 9: fits.api.v1.ips:extendee -> buf.validate.RepeatedRules
- 1, // 10: fits.api.v1.are_host_and_port:extendee -> buf.validate.RepeatedRules
- 1, // 11: fits.api.v1.all_trimmed:extendee -> buf.validate.RepeatedRules
- 2, // 12: fits.api.v1.keys_and_values_trimmed:extendee -> buf.validate.MapRules
- 2, // 13: fits.api.v1.keys_trimmed:extendee -> buf.validate.MapRules
- 14, // [14:14] is the sub-list for method output_type
- 14, // [14:14] is the sub-list for method input_type
- 14, // [14:14] is the sub-list for extension type_name
- 0, // [0:14] is the sub-list for extension extendee
+ 0, // 8: fits.api.v1.is_ipv4_cidr:extendee -> buf.validate.StringRules
+ 1, // 9: fits.api.v1.prefixes:extendee -> buf.validate.RepeatedRules
+ 1, // 10: fits.api.v1.ips:extendee -> buf.validate.RepeatedRules
+ 1, // 11: fits.api.v1.are_host_and_port:extendee -> buf.validate.RepeatedRules
+ 1, // 12: fits.api.v1.all_trimmed:extendee -> buf.validate.RepeatedRules
+ 2, // 13: fits.api.v1.keys_and_values_trimmed:extendee -> buf.validate.MapRules
+ 2, // 14: fits.api.v1.keys_trimmed:extendee -> buf.validate.MapRules
+ 15, // [15:15] is the sub-list for method output_type
+ 15, // [15:15] is the sub-list for method input_type
+ 15, // [15:15] is the sub-list for extension type_name
+ 0, // [0:15] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
@@ -296,7 +313,7 @@ func file_fits_api_v1_predefined_rules_proto_init() {
RawDescriptor: unsafe.Slice(unsafe.StringData(file_fits_api_v1_predefined_rules_proto_rawDesc), len(file_fits_api_v1_predefined_rules_proto_rawDesc)),
NumEnums: 0,
NumMessages: 0,
- NumExtensions: 14,
+ NumExtensions: 15,
NumServices: 0,
},
GoTypes: file_fits_api_v1_predefined_rules_proto_goTypes,
diff --git a/go/fits/api/v1/project.pb.go b/go/fits/api/v1/project.pb.go
index cf9d970..6cccd2e 100644
--- a/go/fits/api/v1/project.pb.go
+++ b/go/fits/api/v1/project.pb.go
@@ -10,7 +10,6 @@ import (
_ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
- _ "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
unsafe "unsafe"
@@ -688,7 +687,7 @@ var File_fits_api_v1_project_proto protoreflect.FileDescriptor
const file_fits_api_v1_project_proto_rawDesc = "" +
"\n" +
- "\x19fits/api/v1/project.proto\x12\vfits.api.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xdf\x01\n" +
+ "\x19fits/api/v1/project.proto\x12\vfits.api.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xdf\x01\n" +
"\aProject\x12\x12\n" +
"\x04uuid\x18\x01 \x01(\tR\x04uuid\x12%\n" +
"\x04meta\x18\x02 \x01(\v2\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n" +
diff --git a/go/fits/api/v1/tenant.pb.go b/go/fits/api/v1/tenant.pb.go
index 7280b07..333d4fb 100644
--- a/go/fits/api/v1/tenant.pb.go
+++ b/go/fits/api/v1/tenant.pb.go
@@ -10,7 +10,6 @@ import (
_ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
- _ "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
unsafe "unsafe"
@@ -695,7 +694,7 @@ var File_fits_api_v1_tenant_proto protoreflect.FileDescriptor
const file_fits_api_v1_tenant_proto_rawDesc = "" +
"\n" +
- "\x18fits/api/v1/tenant.proto\x12\vfits.api.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xe9\x01\n" +
+ "\x18fits/api/v1/tenant.proto\x12\vfits.api.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xe9\x01\n" +
"\x06Tenant\x12\x14\n" +
"\x05login\x18\x01 \x01(\tR\x05login\x12%\n" +
"\x04meta\x18\x02 \x01(\v2\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n" +
diff --git a/go/permissions/servicepermissions.go b/go/permissions/servicepermissions.go
index 0a5bb6d..95decb7 100755
--- a/go/permissions/servicepermissions.go
+++ b/go/permissions/servicepermissions.go
@@ -8,6 +8,11 @@ import (
func GetServices() []string {
return []string{
+ "fits.api.mvm.v1.LocationService",
+ "fits.api.mvm.v1.MVMService",
+ "fits.api.mvm.v1.OSService",
+ "fits.api.mvm.v1.StageTypeService",
+ "fits.api.mvm.v1.VLANService",
"fits.api.v1.HealthService",
"fits.api.v1.IPService",
"fits.api.v1.MethodService",
@@ -24,19 +29,25 @@ func GetServicePermissions() *ServicePermissions {
Admin: Admin{},
Tenant: Tenant{
v1.TenantRole_TENANT_ROLE_OWNER: map[string]struct{}{
- "/fits.api.v1.ProjectService/Create": {},
- "/fits.api.v1.TenantService/Delete": {},
- "/fits.api.v1.TenantService/Get": {},
- "/fits.api.v1.TenantService/Update": {},
+ "/fits.api.mvm.v1.LocationService/List": {},
+ "/fits.api.mvm.v1.VLANService/List": {},
+ "/fits.api.v1.ProjectService/Create": {},
+ "/fits.api.v1.TenantService/Delete": {},
+ "/fits.api.v1.TenantService/Get": {},
+ "/fits.api.v1.TenantService/Update": {},
},
v1.TenantRole_TENANT_ROLE_EDITOR: map[string]struct{}{
- "/fits.api.v1.ProjectService/Create": {},
- "/fits.api.v1.TenantService/Delete": {},
- "/fits.api.v1.TenantService/Get": {},
- "/fits.api.v1.TenantService/Update": {},
+ "/fits.api.mvm.v1.LocationService/List": {},
+ "/fits.api.mvm.v1.VLANService/List": {},
+ "/fits.api.v1.ProjectService/Create": {},
+ "/fits.api.v1.TenantService/Delete": {},
+ "/fits.api.v1.TenantService/Get": {},
+ "/fits.api.v1.TenantService/Update": {},
},
v1.TenantRole_TENANT_ROLE_VIEWER: map[string]struct{}{
- "/fits.api.v1.TenantService/Get": {},
+ "/fits.api.mvm.v1.LocationService/List": {},
+ "/fits.api.mvm.v1.VLANService/List": {},
+ "/fits.api.v1.TenantService/Get": {},
},
v1.TenantRole_TENANT_ROLE_GUEST: map[string]struct{}{
"/fits.api.v1.TenantService/Get": {},
@@ -44,32 +55,86 @@ func GetServicePermissions() *ServicePermissions {
},
Project: Project{
v1.ProjectRole_PROJECT_ROLE_OWNER: map[string]struct{}{
- "/fits.api.v1.IPService/Create": {},
- "/fits.api.v1.IPService/Delete": {},
- "/fits.api.v1.IPService/Get": {},
- "/fits.api.v1.IPService/List": {},
- "/fits.api.v1.IPService/Update": {},
- "/fits.api.v1.ProjectService/Delete": {},
- "/fits.api.v1.ProjectService/Get": {},
- "/fits.api.v1.ProjectService/Update": {},
+ "/fits.api.mvm.v1.MVMService/AddDisk": {},
+ "/fits.api.mvm.v1.MVMService/AddNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Create": {},
+ "/fits.api.mvm.v1.MVMService/Delete": {},
+ "/fits.api.mvm.v1.MVMService/DeleteDisk": {},
+ "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Get": {},
+ "/fits.api.mvm.v1.MVMService/List": {},
+ "/fits.api.mvm.v1.MVMService/MoveNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Update": {},
+ "/fits.api.mvm.v1.MVMService/UpdateDisk": {},
+ "/fits.api.mvm.v1.MVMService/ValidateAddDisk": {},
+ "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/ValidateCreate": {},
+ "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk": {},
+ "/fits.api.mvm.v1.StageTypeService/List": {},
+ "/fits.api.v1.IPService/Create": {},
+ "/fits.api.v1.IPService/Delete": {},
+ "/fits.api.v1.IPService/Get": {},
+ "/fits.api.v1.IPService/List": {},
+ "/fits.api.v1.IPService/Update": {},
+ "/fits.api.v1.ProjectService/Delete": {},
+ "/fits.api.v1.ProjectService/Get": {},
+ "/fits.api.v1.ProjectService/Update": {},
},
v1.ProjectRole_PROJECT_ROLE_EDITOR: map[string]struct{}{
- "/fits.api.v1.IPService/Create": {},
- "/fits.api.v1.IPService/Delete": {},
- "/fits.api.v1.IPService/Get": {},
- "/fits.api.v1.IPService/List": {},
- "/fits.api.v1.IPService/Update": {},
- "/fits.api.v1.ProjectService/Get": {},
- "/fits.api.v1.ProjectService/Update": {},
+ "/fits.api.mvm.v1.MVMService/AddDisk": {},
+ "/fits.api.mvm.v1.MVMService/AddNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Create": {},
+ "/fits.api.mvm.v1.MVMService/Delete": {},
+ "/fits.api.mvm.v1.MVMService/DeleteDisk": {},
+ "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Get": {},
+ "/fits.api.mvm.v1.MVMService/List": {},
+ "/fits.api.mvm.v1.MVMService/MoveNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Update": {},
+ "/fits.api.mvm.v1.MVMService/UpdateDisk": {},
+ "/fits.api.mvm.v1.MVMService/ValidateAddDisk": {},
+ "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/ValidateCreate": {},
+ "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk": {},
+ "/fits.api.mvm.v1.StageTypeService/List": {},
+ "/fits.api.v1.IPService/Create": {},
+ "/fits.api.v1.IPService/Delete": {},
+ "/fits.api.v1.IPService/Get": {},
+ "/fits.api.v1.IPService/List": {},
+ "/fits.api.v1.IPService/Update": {},
+ "/fits.api.v1.ProjectService/Get": {},
+ "/fits.api.v1.ProjectService/Update": {},
},
v1.ProjectRole_PROJECT_ROLE_VIEWER: map[string]struct{}{
- "/fits.api.v1.IPService/Get": {},
- "/fits.api.v1.IPService/List": {},
- "/fits.api.v1.ProjectService/Get": {},
+ "/fits.api.mvm.v1.MVMService/Get": {},
+ "/fits.api.mvm.v1.MVMService/List": {},
+ "/fits.api.mvm.v1.StageTypeService/List": {},
+ "/fits.api.v1.IPService/Get": {},
+ "/fits.api.v1.IPService/List": {},
+ "/fits.api.v1.ProjectService/Get": {},
},
},
},
Methods: map[string]struct{}{
+ "/fits.api.mvm.v1.LocationService/List": {},
+ "/fits.api.mvm.v1.MVMService/AddDisk": {},
+ "/fits.api.mvm.v1.MVMService/AddNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Create": {},
+ "/fits.api.mvm.v1.MVMService/Delete": {},
+ "/fits.api.mvm.v1.MVMService/DeleteDisk": {},
+ "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Get": {},
+ "/fits.api.mvm.v1.MVMService/List": {},
+ "/fits.api.mvm.v1.MVMService/MoveNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/Update": {},
+ "/fits.api.mvm.v1.MVMService/UpdateDisk": {},
+ "/fits.api.mvm.v1.MVMService/ValidateAddDisk": {},
+ "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface": {},
+ "/fits.api.mvm.v1.MVMService/ValidateCreate": {},
+ "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk": {},
+ "/fits.api.mvm.v1.OSService/List": {},
+ "/fits.api.mvm.v1.StageTypeService/List": {},
+ "/fits.api.mvm.v1.VLANService/List": {},
"/fits.api.v1.HealthService/Get": {},
"/fits.api.v1.IPService/Create": {},
"/fits.api.v1.IPService/Delete": {},
@@ -107,6 +172,7 @@ func GetServicePermissions() *ServicePermissions {
"/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo": true,
},
Self: map[string]bool{
+ "/fits.api.mvm.v1.OSService/List": true,
"/fits.api.v1.MethodService/TokenScopedList": true,
"/fits.api.v1.ProjectService/List": true,
"/fits.api.v1.TenantService/Create": true,
@@ -120,48 +186,85 @@ func GetServicePermissions() *ServicePermissions {
},
Admin: map[string]bool{},
Tenant: map[string]bool{
- "/fits.api.v1.ProjectService/Create": true,
- "/fits.api.v1.TenantService/Delete": true,
- "/fits.api.v1.TenantService/Get": true,
- "/fits.api.v1.TenantService/Update": true,
+ "/fits.api.mvm.v1.LocationService/List": true,
+ "/fits.api.mvm.v1.VLANService/List": true,
+ "/fits.api.v1.ProjectService/Create": true,
+ "/fits.api.v1.TenantService/Delete": true,
+ "/fits.api.v1.TenantService/Get": true,
+ "/fits.api.v1.TenantService/Update": true,
},
Project: map[string]bool{
- "/fits.api.v1.IPService/Create": true,
- "/fits.api.v1.IPService/Delete": true,
- "/fits.api.v1.IPService/Get": true,
- "/fits.api.v1.IPService/List": true,
- "/fits.api.v1.IPService/Update": true,
- "/fits.api.v1.ProjectService/Delete": true,
- "/fits.api.v1.ProjectService/Get": true,
- "/fits.api.v1.ProjectService/Update": true,
+ "/fits.api.mvm.v1.MVMService/AddDisk": true,
+ "/fits.api.mvm.v1.MVMService/AddNetworkInterface": true,
+ "/fits.api.mvm.v1.MVMService/Create": true,
+ "/fits.api.mvm.v1.MVMService/Delete": true,
+ "/fits.api.mvm.v1.MVMService/DeleteDisk": true,
+ "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface": true,
+ "/fits.api.mvm.v1.MVMService/Get": true,
+ "/fits.api.mvm.v1.MVMService/List": true,
+ "/fits.api.mvm.v1.MVMService/MoveNetworkInterface": true,
+ "/fits.api.mvm.v1.MVMService/Update": true,
+ "/fits.api.mvm.v1.MVMService/UpdateDisk": true,
+ "/fits.api.mvm.v1.MVMService/ValidateAddDisk": true,
+ "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface": true,
+ "/fits.api.mvm.v1.MVMService/ValidateCreate": true,
+ "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk": true,
+ "/fits.api.mvm.v1.StageTypeService/List": true,
+ "/fits.api.v1.IPService/Create": true,
+ "/fits.api.v1.IPService/Delete": true,
+ "/fits.api.v1.IPService/Get": true,
+ "/fits.api.v1.IPService/List": true,
+ "/fits.api.v1.IPService/Update": true,
+ "/fits.api.v1.ProjectService/Delete": true,
+ "/fits.api.v1.ProjectService/Get": true,
+ "/fits.api.v1.ProjectService/Update": true,
},
},
Auditable: map[string]bool{
- "/fits.api.v1.HealthService/Get": false,
- "/fits.api.v1.IPService/Create": true,
- "/fits.api.v1.IPService/Delete": true,
- "/fits.api.v1.IPService/Get": false,
- "/fits.api.v1.IPService/List": false,
- "/fits.api.v1.IPService/Update": true,
- "/fits.api.v1.MethodService/List": false,
- "/fits.api.v1.MethodService/TokenScopedList": false,
- "/fits.api.v1.ProjectService/Create": true,
- "/fits.api.v1.ProjectService/Delete": true,
- "/fits.api.v1.ProjectService/Get": false,
- "/fits.api.v1.ProjectService/List": false,
- "/fits.api.v1.ProjectService/Update": true,
- "/fits.api.v1.TenantService/Create": true,
- "/fits.api.v1.TenantService/Delete": true,
- "/fits.api.v1.TenantService/Get": false,
- "/fits.api.v1.TenantService/List": false,
- "/fits.api.v1.TenantService/Update": true,
- "/fits.api.v1.TokenService/Create": true,
- "/fits.api.v1.TokenService/Get": true,
- "/fits.api.v1.TokenService/List": true,
- "/fits.api.v1.TokenService/Refresh": true,
- "/fits.api.v1.TokenService/Revoke": true,
- "/fits.api.v1.TokenService/Update": true,
- "/fits.api.v1.VersionService/Get": false,
+ "/fits.api.mvm.v1.LocationService/List": false,
+ "/fits.api.mvm.v1.MVMService/AddDisk": true,
+ "/fits.api.mvm.v1.MVMService/AddNetworkInterface": true,
+ "/fits.api.mvm.v1.MVMService/Create": true,
+ "/fits.api.mvm.v1.MVMService/Delete": true,
+ "/fits.api.mvm.v1.MVMService/DeleteDisk": true,
+ "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface": true,
+ "/fits.api.mvm.v1.MVMService/Get": false,
+ "/fits.api.mvm.v1.MVMService/List": false,
+ "/fits.api.mvm.v1.MVMService/MoveNetworkInterface": true,
+ "/fits.api.mvm.v1.MVMService/Update": true,
+ "/fits.api.mvm.v1.MVMService/UpdateDisk": true,
+ "/fits.api.mvm.v1.MVMService/ValidateAddDisk": false,
+ "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface": false,
+ "/fits.api.mvm.v1.MVMService/ValidateCreate": false,
+ "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk": false,
+ "/fits.api.mvm.v1.OSService/List": false,
+ "/fits.api.mvm.v1.StageTypeService/List": false,
+ "/fits.api.mvm.v1.VLANService/List": false,
+ "/fits.api.v1.HealthService/Get": false,
+ "/fits.api.v1.IPService/Create": true,
+ "/fits.api.v1.IPService/Delete": true,
+ "/fits.api.v1.IPService/Get": false,
+ "/fits.api.v1.IPService/List": false,
+ "/fits.api.v1.IPService/Update": true,
+ "/fits.api.v1.MethodService/List": false,
+ "/fits.api.v1.MethodService/TokenScopedList": false,
+ "/fits.api.v1.ProjectService/Create": true,
+ "/fits.api.v1.ProjectService/Delete": true,
+ "/fits.api.v1.ProjectService/Get": false,
+ "/fits.api.v1.ProjectService/List": false,
+ "/fits.api.v1.ProjectService/Update": true,
+ "/fits.api.v1.TenantService/Create": true,
+ "/fits.api.v1.TenantService/Delete": true,
+ "/fits.api.v1.TenantService/Get": false,
+ "/fits.api.v1.TenantService/List": false,
+ "/fits.api.v1.TenantService/Update": true,
+ "/fits.api.v1.TokenService/Create": true,
+ "/fits.api.v1.TokenService/Get": true,
+ "/fits.api.v1.TokenService/List": true,
+ "/fits.api.v1.TokenService/Refresh": true,
+ "/fits.api.v1.TokenService/Revoke": true,
+ "/fits.api.v1.TokenService/Update": true,
+ "/fits.api.v1.VersionService/Get": false,
},
}
}
diff --git a/js/client.d.ts b/js/client.d.ts
index 4806da2..fa349b1 100644
--- a/js/client.d.ts
+++ b/js/client.d.ts
@@ -7,6 +7,7 @@ import { ProjectService as Apiv1ProjectService } from "./fits/api/v1/project_pb"
import { TenantService as Apiv1TenantService } from "./fits/api/v1/tenant_pb";
import { TokenService as Apiv1TokenService } from "./fits/api/v1/token_pb";
import { VersionService as Apiv1VersionService } from "./fits/api/v1/version_pb";
+import { VMService as Apivmv1VMService } from "./fits/api/vm/v1/vm_pb";
export interface ClientConfig {
baseUrl: string;
token?: string;
@@ -14,6 +15,7 @@ export interface ClientConfig {
}
export interface Client {
apiv1(): Apiv1;
+ apivmv1(): Apivmv1;
}
export interface Apiv1 {
health(): ConnectClient;
@@ -24,4 +26,7 @@ export interface Apiv1 {
token(): ConnectClient;
version(): ConnectClient;
}
+export interface Apivmv1 {
+ vm(): ConnectClient;
+}
export declare function newClient(config: ClientConfig): Client;
diff --git a/js/client.js b/js/client.js
index ee27671..efe1155 100644
--- a/js/client.js
+++ b/js/client.js
@@ -17,6 +17,7 @@ import { ProjectService as Apiv1ProjectService } from "./fits/api/v1/project_pb"
import { TenantService as Apiv1TenantService } from "./fits/api/v1/tenant_pb";
import { TokenService as Apiv1TokenService } from "./fits/api/v1/token_pb";
import { VersionService as Apiv1VersionService } from "./fits/api/v1/version_pb";
+import { VMService as Apivmv1VMService } from "./fits/api/vm/v1/vm_pb";
function authInterceptor(token) {
return (next) => (req) => __awaiter(this, void 0, void 0, function* () {
req.header.set("Authorization", `Bearer ${token}`);
@@ -51,6 +52,12 @@ class ClientImpl {
}
return this._apiv1;
}
+ apivmv1() {
+ if (!this._apivmv1) {
+ this._apivmv1 = new Apivmv1Impl(this.transport);
+ }
+ return this._apivmv1;
+ }
}
class Apiv1Impl {
constructor(transport) {
@@ -99,3 +106,14 @@ class Apiv1Impl {
return this._version;
}
}
+class Apivmv1Impl {
+ constructor(transport) {
+ this.transport = transport;
+ }
+ vm() {
+ if (!this._vm) {
+ this._vm = createClient(Apivmv1VMService, this.transport);
+ }
+ return this._vm;
+ }
+}
diff --git a/js/client.ts b/js/client.ts
index 4113e7b..3e4becc 100755
--- a/js/client.ts
+++ b/js/client.ts
@@ -5,6 +5,18 @@ import type { Client as ConnectClient } from "@connectrpc/connect";
import { createConnectTransport } from "@connectrpc/connect-web";
+import { LocationService as Apimvmv1LocationService } from "./fits/api/mvm/v1/location_pb";
+
+import { MVMService as Apimvmv1MVMService } from "./fits/api/mvm/v1/mvm_pb";
+
+import { OSService as Apimvmv1OSService } from "./fits/api/mvm/v1/os_pb";
+
+import { StageTypeService as Apimvmv1StageTypeService } from "./fits/api/mvm/v1/stagetype_pb";
+
+import { VLANService as Apimvmv1VLANService } from "./fits/api/mvm/v1/vlan_pb";
+
+
+
import { HealthService as Apiv1HealthService } from "./fits/api/v1/health_pb";
import { IPService as Apiv1IPService } from "./fits/api/v1/ip_pb";
@@ -29,11 +41,28 @@ export interface ClientConfig {
export interface Client {
+ apimvmv1(): Apimvmv1;
+
apiv1(): Apiv1;
}
+export interface Apimvmv1 {
+
+ location(): ConnectClient;
+
+ mvm(): ConnectClient;
+
+ os(): ConnectClient;
+
+ stageType(): ConnectClient;
+
+ vlan(): ConnectClient;
+
+}
+
+
export interface Apiv1 {
health(): ConnectClient;
@@ -88,6 +117,8 @@ class ClientImpl implements Client {
private transport: Transport;
+ private _apimvmv1?: Apimvmv1Impl;
+
private _apiv1?: Apiv1Impl;
@@ -96,6 +127,13 @@ class ClientImpl implements Client {
}
+ apimvmv1(): Apimvmv1 {
+ if (!this._apimvmv1) {
+ this._apimvmv1 = new Apimvmv1Impl(this.transport);
+ }
+ return this._apimvmv1;
+ }
+
apiv1(): Apiv1 {
if (!this._apiv1) {
this._apiv1 = new Apiv1Impl(this.transport);
@@ -106,6 +144,64 @@ class ClientImpl implements Client {
}
+class Apimvmv1Impl implements Apimvmv1 {
+ private transport: Transport;
+
+
+ private _location?: ConnectClient;
+
+ private _mvm?: ConnectClient;
+
+ private _os?: ConnectClient;
+
+ private _stageType?: ConnectClient;
+
+ private _vlan?: ConnectClient;
+
+
+ constructor(transport: Transport) {
+ this.transport = transport;
+ }
+
+
+ location(): ConnectClient {
+ if (!this._location) {
+ this._location = createClient(Apimvmv1LocationService, this.transport);
+ }
+ return this._location;
+ }
+
+ mvm(): ConnectClient {
+ if (!this._mvm) {
+ this._mvm = createClient(Apimvmv1MVMService, this.transport);
+ }
+ return this._mvm;
+ }
+
+ os(): ConnectClient {
+ if (!this._os) {
+ this._os = createClient(Apimvmv1OSService, this.transport);
+ }
+ return this._os;
+ }
+
+ stageType(): ConnectClient {
+ if (!this._stageType) {
+ this._stageType = createClient(Apimvmv1StageTypeService, this.transport);
+ }
+ return this._stageType;
+ }
+
+ vlan(): ConnectClient {
+ if (!this._vlan) {
+ this._vlan = createClient(Apimvmv1VLANService, this.transport);
+ }
+ return this._vlan;
+ }
+
+}
+
+
class Apiv1Impl implements Apiv1 {
private transport: Transport;
diff --git a/js/fits/api/mvm/v1/location_pb.ts b/js/fits/api/mvm/v1/location_pb.ts
new file mode 100644
index 0000000..c6d44b1
--- /dev/null
+++ b/js/fits/api/mvm/v1/location_pb.ts
@@ -0,0 +1,106 @@
+// @generated by protoc-gen-es v2.14.1 with parameter "target=ts"
+// @generated from file fits/api/mvm/v1/location.proto (package fits.api.mvm.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
+import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb";
+import { file_fits_api_v1_common } from "../../v1/common_pb";
+import { file_fits_api_v1_predefined_rules } from "../../v1/predefined_rules_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file fits/api/mvm/v1/location.proto.
+ */
+export const file_fits_api_mvm_v1_location: GenFile = /*@__PURE__*/
+ fileDesc("Ch5maXRzL2FwaS9tdm0vdjEvbG9jYXRpb24ucHJvdG8SD2ZpdHMuYXBpLm12bS52MSI+CghMb2NhdGlvbhIWCgR1dWlkGAEgASgJQgi6SAVyA7ABARIaCgV0aXRsZRgCIAEoCUILukgIcgbAs66xAgEiOQoaTG9jYXRpb25TZXJ2aWNlTGlzdFJlcXVlc3QSGwoGdGVuYW50GAEgASgJQgu6SAhyBsCzrrECASJLChtMb2NhdGlvblNlcnZpY2VMaXN0UmVzcG9uc2USLAoJbG9jYXRpb25zGAEgAygLMhkuZml0cy5hcGkubXZtLnYxLkxvY2F0aW9uMoEBCg9Mb2NhdGlvblNlcnZpY2USbgoETGlzdBIrLmZpdHMuYXBpLm12bS52MS5Mb2NhdGlvblNlcnZpY2VMaXN0UmVxdWVzdBosLmZpdHMuYXBpLm12bS52MS5Mb2NhdGlvblNlcnZpY2VMaXN0UmVzcG9uc2UiC8LzGAMBAgPg8xgCQrIBChNjb20uZml0cy5hcGkubXZtLnYxQg1Mb2NhdGlvblByb3RvUAFaLWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL212bS92MTttdm12MaICA0ZBTaoCD0ZpdHMuQXBpLk12bS5WMcoCD0ZpdHNcQXBpXE12bVxWMeICG0ZpdHNcQXBpXE12bVxWMVxHUEJNZXRhZGF0YeoCEkZpdHM6OkFwaTo6TXZtOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
+
+/**
+ * Location is the definition of an available datacenter location for MVM instances.
+ *
+ * @generated from message fits.api.mvm.v1.Location
+ */
+export type Location = Message<"fits.api.mvm.v1.Location"> & {
+ /**
+ * Uuid of this location
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * title of the location
+ *
+ * @generated from field: string title = 2;
+ */
+ title: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.Location.
+ * Use `create(LocationSchema)` to create a new message.
+ */
+export const LocationSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_location, 0);
+
+/**
+ * LocationServiceListRequest is the request payload for a location list request.
+ *
+ * @generated from message fits.api.mvm.v1.LocationServiceListRequest
+ */
+export type LocationServiceListRequest = Message<"fits.api.mvm.v1.LocationServiceListRequest"> & {
+ /**
+ * Tenant to list available locations for
+ *
+ * @generated from field: string tenant = 1;
+ */
+ tenant: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.LocationServiceListRequest.
+ * Use `create(LocationServiceListRequestSchema)` to create a new message.
+ */
+export const LocationServiceListRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_location, 1);
+
+/**
+ * LocationServiceListResponse is the response payload for a location list request.
+ *
+ * @generated from message fits.api.mvm.v1.LocationServiceListResponse
+ */
+export type LocationServiceListResponse = Message<"fits.api.mvm.v1.LocationServiceListResponse"> & {
+ /**
+ * The available locations
+ *
+ * @generated from field: repeated fits.api.mvm.v1.Location locations = 1;
+ */
+ locations: Location[];
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.LocationServiceListResponse.
+ * Use `create(LocationServiceListResponseSchema)` to create a new message.
+ */
+export const LocationServiceListResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_location, 2);
+
+/**
+ * LocationService lists datacenter locations available for managed VM (MVM) instances, scoped per tenant.
+ *
+ * @generated from service fits.api.mvm.v1.LocationService
+ */
+export const LocationService: GenService<{
+ /**
+ * Returns a list of all datacenter locations available for a tenant.
+ *
+ * @generated from rpc fits.api.mvm.v1.LocationService.List
+ */
+ list: {
+ methodKind: "unary";
+ input: typeof LocationServiceListRequestSchema;
+ output: typeof LocationServiceListResponseSchema;
+ },
+}> = /*@__PURE__*/
+ serviceDesc(file_fits_api_mvm_v1_location, 0);
+
diff --git a/js/fits/api/mvm/v1/mvm_pb.ts b/js/fits/api/mvm/v1/mvm_pb.ts
new file mode 100644
index 0000000..c32a60c
--- /dev/null
+++ b/js/fits/api/mvm/v1/mvm_pb.ts
@@ -0,0 +1,1804 @@
+// @generated by protoc-gen-es v2.14.1 with parameter "target=ts"
+// @generated from file fits/api/mvm/v1/mvm.proto (package fits.api.mvm.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
+import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb";
+import type { VLAN } from "./vlan_pb";
+import { file_fits_api_mvm_v1_vlan } from "./vlan_pb";
+import type { Labels, Meta, UpdateMeta } from "../../v1/common_pb";
+import { file_fits_api_v1_common } from "../../v1/common_pb";
+import { file_fits_api_v1_predefined_rules } from "../../v1/predefined_rules_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file fits/api/mvm/v1/mvm.proto.
+ */
+export const file_fits_api_mvm_v1_mvm: GenFile = /*@__PURE__*/
+ fileDesc("ChlmaXRzL2FwaS9tdm0vdjEvbXZtLnByb3RvEg9maXRzLmFwaS5tdm0udjEidgoMTGludXhEZXRhaWxzEikKBWRpc2tzGAEgAygLMhouZml0cy5hcGkubXZtLnYxLkxpbnV4RGlzaxIbCglsZGFwX3V1aWQYAiABKAlCCLpIBXIDsAEBEh4KCWxkYXBfZnFkbhgDIAEoCUILukgIcgbAs66xAgEifgoOV2luZG93c0RldGFpbHMSKwoFZGlza3MYASADKAsyHC5maXRzLmFwaS5tdm0udjEuV2luZG93c0Rpc2sSHQoLZG9tYWluX3V1aWQYAiABKAlCCLpIBXIDsAEBEiAKC2RvbWFpbl9mcWRuGAMgASgJQgu6SAhyBsCzrrECASJeChBOZXR3b3JrSW50ZXJmYWNlEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEh4KCWlwYWRkcmVzcxgCIAEoCUILukgIcgbos66xAgESEgoKbWFjYWRkcmVzcxgDIAEoCSLjBQoJTWFuYWdlZFZNEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBGZxZG4YAyABKAlCC7pICHIGwLOusQIBEhsKBnRlbmFudBgEIAEoCUILukgIcgbAs66xAgESHgoMcHJvamVjdF91dWlkGAUgASgJQgi6SAVyA7ABARIZCgdvc191dWlkGAYgASgJQgi6SAVyA7ABARIfCg1sb2NhdGlvbl91dWlkGAcgASgJQgi6SAVyA7ABARIeCgxjb250YWN0X3V1aWQYCCABKAlCCLpIBXIDsAEBEgsKA2NwdRgJIAEoDRILCgNyYW0YCiABKA0SDgoGYmFja3VwGAsgASgIEjQKBnN0YXR1cxgMIAEoDjIaLmZpdHMuYXBpLm12bS52MS5NVk1TdGF0dXNCCLpIBYIBAhABEhMKC3N0YXR1c19pbmZvGA0gASgJEj0KDGF2YWlsYWJpbGl0eRgOIAEoDjIdLmZpdHMuYXBpLm12bS52MS5BdmFpbGFiaWxpdHlCCLpIBYIBAhABEj0KDHNlcnZpY2VjbGFzcxgPIAEoDjIdLmZpdHMuYXBpLm12bS52MS5TZXJ2aWNlQ2xhc3NCCLpIBYIBAhABEjoKD3dpbmRvd3NfZGV0YWlscxgQIAEoCzIfLmZpdHMuYXBpLm12bS52MS5XaW5kb3dzRGV0YWlsc0gAEjYKDWxpbnV4X2RldGFpbHMYESABKAsyHS5maXRzLmFwaS5tdm0udjEuTGludXhEZXRhaWxzSAASNQoKaW50ZXJmYWNlcxgSIAMoCzIhLmZpdHMuYXBpLm12bS52MS5OZXR3b3JrSW50ZXJmYWNlEiMKBHZsYW4YEyABKAsyFS5maXRzLmFwaS5tdm0udjEuVkxBThIUCgxvcmRlcl9udW1iZXIYFCABKAlCEAoHZGV0YWlscxIFukgCCAEiWQoUTVZNU2VydmljZUdldFJlcXVlc3QSGwoEdXVpZBgBIAEoCUIIukgFcgOwAQFIAIgBARIbCgZ0ZW5hbnQYAiABKAlCC7pICHIGwLOusQIBQgcKBV91dWlkIkAKFU1WTVNlcnZpY2VHZXRSZXNwb25zZRInCgNtdm0YASABKAsyGi5maXRzLmFwaS5tdm0udjEuTWFuYWdlZFZNInYKHk1WTVNlcnZpY2VDcmVhdGVXaW5kb3dzUmVxdWVzdBIdCgtkb21haW5fdXVpZBgBIAEoCUIIukgFcgOwAQESNQoFZGlza3MYAiADKAsyHC5maXRzLmFwaS5tdm0udjEuV2luZG93c0Rpc2tCCLpIBZIBAggBInAKHE1WTVNlcnZpY2VDcmVhdGVMaW51eFJlcXVlc3QSGwoJbGRhcF91dWlkGAEgASgJQgi6SAVyA7ABARIzCgVkaXNrcxgCIAMoCzIaLmZpdHMuYXBpLm12bS52MS5MaW51eERpc2tCCLpIBZIBAggBItQEChdNVk1TZXJ2aWNlQ3JlYXRlUmVxdWVzdBIeCgxwcm9qZWN0X3V1aWQYASABKAlCCLpIBXIDsAEBEh4KBG5hbWUYAiABKAlCC7pICHIGwLOusQIBSAGIAQESGQoHb3NfdXVpZBgDIAEoCUIIukgFcgOwAQESGwoJdmxhbl91dWlkGAQgASgJQgi6SAVyA7ABARIfCg1sb2NhdGlvbl91dWlkGAUgASgJQgi6SAVyA7ABARIeCgxjb250YWN0X3V1aWQYBiABKAlCCLpIBXIDsAEBEgsKA2NwdRgHIAEoDRILCgNyYW0YCCABKA0SFAoMb3JkZXJfbnVtYmVyGAkgASgJEiMKBmxhYmVscxgKIAEoCzITLmZpdHMuYXBpLnYxLkxhYmVscxIOCgZiYWNrdXAYCyABKAgSPQoMYXZhaWxhYmlsaXR5GAwgASgOMh0uZml0cy5hcGkubXZtLnYxLkF2YWlsYWJpbGl0eUIIukgFggECEAESPQoMc2VydmljZWNsYXNzGA0gASgOMh0uZml0cy5hcGkubXZtLnYxLlNlcnZpY2VDbGFzc0IIukgFggECEAESQgoHd2luZG93cxgOIAEoCzIvLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlQ3JlYXRlV2luZG93c1JlcXVlc3RIABI+CgVsaW51eBgPIAEoCzItLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlQ3JlYXRlTGludXhSZXF1ZXN0SABCEAoHbXZtdHlwZRIFukgCCAFCBwoFX25hbWUi5gEKCUxpbnV4RGlzaxIbCgR1dWlkGAEgASgJQgi6SAVyA7ABAUgAiAEBEg0KBWxhYmVsGAIgASgJEhMKC2F1dG9fZXh0ZW5kGAMgASgIEhEKBHNpemUYBCABKARIAYgBARIYCgttb3VudF9wb2ludBgFIAEoCUgCiAEBEjsKCWRpc2tfdHlwZRgGIAEoDjIZLmZpdHMuYXBpLm12bS52MS5EaXNrVHlwZUIIukgFggECEAFIA4gBAUIHCgVfdXVpZEIHCgVfc2l6ZUIOCgxfbW91bnRfcG9pbnRCDAoKX2Rpc2tfdHlwZSLoAQoLV2luZG93c0Rpc2sSGwoEdXVpZBgBIAEoCUIIukgFcgOwAQFIAIgBARINCgVsYWJlbBgCIAEoCRITCgthdXRvX2V4dGVuZBgDIAEoCBIRCgRzaXplGAQgASgESAGIAQESGAoLZHJpdmVsZXR0ZXIYBSABKAlIAogBARI7CglkaXNrX3R5cGUYBiABKA4yGS5maXRzLmFwaS5tdm0udjEuRGlza1R5cGVCCLpIBYIBAhABSAOIAQFCBwoFX3V1aWRCBwoFX3NpemVCDgoMX2RyaXZlbGV0dGVyQgwKCl9kaXNrX3R5cGUiGgoYTVZNU2VydmljZUNyZWF0ZVJlc3BvbnNlIuACChdNVk1TZXJ2aWNlVXBkYXRlUmVxdWVzdBIWCgR1dWlkGAEgASgJQgi6SAVyA7ABARIZCgdwcm9qZWN0GAIgASgJQgi6SAVyA7ABARIUCgxvcmRlcl9udW1iZXIYAyABKAkSNAoLdXBkYXRlX21ldGEYBCABKAsyFy5maXRzLmFwaS52MS5VcGRhdGVNZXRhQga6SAPIAQESRAoRcGVyZm9ybWFuY2VfY2xhc3MYBSABKAsyJy5maXRzLmFwaS5tdm0udjEuUGVyZm9ybWFuY2VDbGFzc0NoYW5nZUgAEjwKDXNlcnZpY2VfY2xhc3MYBiABKAsyIy5maXRzLmFwaS5tdm0udjEuU2VydmljZUNsYXNzQ2hhbmdlSAASMQoHY29udGFjdBgHIAEoCzIeLmZpdHMuYXBpLm12bS52MS5Db250YWN0Q2hhbmdlSABCDwoGYWN0aW9uEgW6SAIIASJGChZQZXJmb3JtYW5jZUNsYXNzQ2hhbmdlEhYKA2NwdRgBIAEoDUIJukgGKgQYQCgBEhQKA3JhbRgCIAEoDUIHukgEKgIgACJTChJTZXJ2aWNlQ2xhc3NDaGFuZ2USPQoMc2VydmljZWNsYXNzGAEgASgOMh0uZml0cy5hcGkubXZtLnYxLlNlcnZpY2VDbGFzc0IIukgFggECEAEiLwoNQ29udGFjdENoYW5nZRIeCgxjb250YWN0X3V1aWQYASABKAlCCLpIBXIDsAEBIhoKGE1WTVNlcnZpY2VVcGRhdGVSZXNwb25zZSJEChVNVk1TZXJ2aWNlTGlzdFJlcXVlc3QSIAoGdGVuYW50GAEgASgJQgu6SAhyBsCzrrECAUgAiAEBQgkKB190ZW5hbnQiQgoWTVZNU2VydmljZUxpc3RSZXNwb25zZRIoCgRtdm1zGAEgAygLMhouZml0cy5hcGkubXZtLnYxLk1hbmFnZWRWTSJiChdNVk1TZXJ2aWNlRGVsZXRlUmVxdWVzdBIZCgdwcm9qZWN0GAEgASgJQgi6SAVyA7ABARIWCgR1dWlkGAIgASgJQgi6SAVyA7ABARIUCgxvcmRlcl9udW1iZXIYAyABKAkiGgoYTVZNU2VydmljZURlbGV0ZVJlc3BvbnNlImMKH01WTVNlcnZpY2VWYWxpZGF0ZUNyZWF0ZVJlcXVlc3QSQAoGY3JlYXRlGAEgASgLMiguZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VDcmVhdGVSZXF1ZXN0Qga6SAPIAQEiIgogTVZNU2VydmljZVZhbGlkYXRlQ3JlYXRlUmVzcG9uc2UiZwogTVZNU2VydmljZVZhbGlkYXRlQWRkRGlza1JlcXVlc3QSQwoIYWRkX2Rpc2sYASABKAsyKS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZUFkZERpc2tSZXF1ZXN0Qga6SAPIAQEiIwohTVZNU2VydmljZVZhbGlkYXRlQWRkRGlza1Jlc3BvbnNlInAKI01WTVNlcnZpY2VWYWxpZGF0ZVVwZGF0ZURpc2tSZXF1ZXN0EkkKC3VwZGF0ZV9kaXNrGAEgASgLMiwuZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VVcGRhdGVEaXNrUmVxdWVzdEIGukgDyAEBIiYKJE1WTVNlcnZpY2VWYWxpZGF0ZVVwZGF0ZURpc2tSZXNwb25zZSIbChlNVk1TZXJ2aWNlQWRkRGlza1Jlc3BvbnNlIh4KHE1WTVNlcnZpY2VVcGRhdGVEaXNrUmVzcG9uc2UiHgocTVZNU2VydmljZURlbGV0ZURpc2tSZXNwb25zZSLQAQoYTVZNU2VydmljZUFkZERpc2tSZXF1ZXN0EhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEhkKB3Byb2plY3QYAiABKAlCCLpIBXIDsAEBEhQKDG9yZGVyX251bWJlchgDIAEoCRIrCgVsaW51eBgEIAEoCzIaLmZpdHMuYXBpLm12bS52MS5MaW51eERpc2tIABIvCgd3aW5kb3dzGAUgASgLMhwuZml0cy5hcGkubXZtLnYxLldpbmRvd3NEaXNrSABCDQoEZGlzaxIFukgCCAEiyQEKG01WTVNlcnZpY2VVcGRhdGVEaXNrUmVxdWVzdBIWCgR1dWlkGAEgASgJQgi6SAVyA7ABARIbCglkaXNrX3V1aWQYAiABKAlCCLpIBXIDsAEBEhkKB3Byb2plY3QYAyABKAlCCLpIBXIDsAEBEhQKDG9yZGVyX251bWJlchgEIAEoCRIYCgthdXRvX2V4dGVuZBgFIAEoCEgAiAEBEhEKBHNpemUYBiABKARIAYgBAUIOCgxfYXV0b19leHRlbmRCBwoFX3NpemUigwEKG01WTVNlcnZpY2VEZWxldGVEaXNrUmVxdWVzdBIWCgR1dWlkGAEgASgJQgi6SAVyA7ABARIbCglkaXNrX3V1aWQYAiABKAlCCLpIBXIDsAEBEhkKB3Byb2plY3QYAyABKAlCCLpIBXIDsAEBEhQKDG9yZGVyX251bWJlchgEIAEoCSInCiVNVk1TZXJ2aWNlQWRkTmV0d29ya0ludGVyZmFjZVJlc3BvbnNlIigKJk1WTVNlcnZpY2VNb3ZlTmV0d29ya0ludGVyZmFjZVJlc3BvbnNlIioKKE1WTVNlcnZpY2VEZWxldGVOZXR3b3JrSW50ZXJmYWNlUmVzcG9uc2UibwokTVZNU2VydmljZUFkZE5ldHdvcmtJbnRlcmZhY2VSZXF1ZXN0EhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEhkKB3Byb2plY3QYAiABKAlCCLpIBXIDsAEBEhQKDG9yZGVyX251bWJlchgDIAEoCSK1AQolTVZNU2VydmljZU1vdmVOZXR3b3JrSW50ZXJmYWNlUmVxdWVzdBIWCgR1dWlkGAEgASgJQgi6SAVyA7ABARIgCg5pbnRlcmZhY2VfdXVpZBgCIAEoCUIIukgFcgOwAQESGQoHcHJvamVjdBgDIAEoCUIIukgFcgOwAQESFAoMb3JkZXJfbnVtYmVyGAQgASgJEiEKD3RhcmdldF9tdm1fdXVpZBgFIAEoCUIIukgFcgOwAQEilAEKJ01WTVNlcnZpY2VEZWxldGVOZXR3b3JrSW50ZXJmYWNlUmVxdWVzdBIWCgR1dWlkGAEgASgJQgi6SAVyA7ABARIgCg5pbnRlcmZhY2VfdXVpZBgCIAEoCUIIukgFcgOwAQESGQoHcHJvamVjdBgDIAEoCUIIukgFcgOwAQESFAoMb3JkZXJfbnVtYmVyGAQgASgJIowBCixNVk1TZXJ2aWNlVmFsaWRhdGVBZGROZXR3b3JrSW50ZXJmYWNlUmVxdWVzdBJcChVhZGRfbmV0d29ya19pbnRlcmZhY2UYASABKAsyNS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZUFkZE5ldHdvcmtJbnRlcmZhY2VSZXF1ZXN0Qga6SAPIAQEiLwotTVZNU2VydmljZVZhbGlkYXRlQWRkTmV0d29ya0ludGVyZmFjZVJlc3BvbnNlKqYBCgxBdmFpbGFiaWxpdHkSIgoYQVZBSUxBQklMSVRZX1VOU1BFQ0lGSUVEEAAaBIKyGQASGwoPQVZBSUxBQklMSVRZX1YwEAEaBoKyGQJWMBIbCg9BVkFJTEFCSUxJVFlfVjEQAhoGgrIZAlYxEhsKD0FWQUlMQUJJTElUWV9WMhADGgaCshkCVjISGwoPQVZBSUxBQklMSVRZX1YzEAQaBoKyGQJWMyqTAQoMU2VydmljZUNsYXNzEiMKGVNFUlZJQ0VfQ0xBU1NfVU5TUEVDSUZJRUQQABoEgrIZABIeChFTRVJWSUNFX0NMQVNTX1NaMRABGgeCshkDU1oxEh4KEVNFUlZJQ0VfQ0xBU1NfU1oyEAIaB4KyGQNTWjISHgoRU0VSVklDRV9DTEFTU19TWjMQAxoHgrIZA1NaMypQCglNVk1TdGF0dXMSIAoWTVZNX1NUQVRVU19VTlNQRUNJRklFRBAAGgSCshkAEiEKEU1WTV9TVEFUVVNfQUNUSVZFEAEaCoKyGQZhY3RpdmUqhQEKCERpc2tUeXBlEh8KFURJU0tfVFlQRV9VTlNQRUNJRklFRBAAGgSCshkAEhgKDERJU0tfVFlQRV9PUxABGgaCshkCb3MSIAoQRElTS19UWVBFX1NZU1RFTRACGgqCshkGc3lzdGVtEhwKDkRJU0tfVFlQRV9EQVRBEAMaCIKyGQRkYXRhMv0OCgpNVk1TZXJ2aWNlEmEKA0dldBIlLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlR2V0UmVxdWVzdBomLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlR2V0UmVzcG9uc2UiC8rzGAMBAgPg8xgCEmkKBkNyZWF0ZRIoLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlQ3JlYXRlUmVxdWVzdBopLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCsrzGAIBAuDzGAESaQoGVXBkYXRlEiguZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VVcGRhdGVSZXF1ZXN0GikuZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VVcGRhdGVSZXNwb25zZSIKyvMYAgEC4PMYARJkCgRMaXN0EiYuZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VMaXN0UmVxdWVzdBonLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlTGlzdFJlc3BvbnNlIgvK8xgDAQID4PMYAhJpCgZEZWxldGUSKC5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZURlbGV0ZVJlcXVlc3QaKS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZURlbGV0ZVJlc3BvbnNlIgrK8xgCAQLg8xgBEmwKB0FkZERpc2sSKS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZUFkZERpc2tSZXF1ZXN0GiouZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VBZGREaXNrUmVzcG9uc2UiCsrzGAIBAuDzGAESdQoKVXBkYXRlRGlzaxIsLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlVXBkYXRlRGlza1JlcXVlc3QaLS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZVVwZGF0ZURpc2tSZXNwb25zZSIKyvMYAgEC4PMYARJ1CgpEZWxldGVEaXNrEiwuZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VEZWxldGVEaXNrUmVxdWVzdBotLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlRGVsZXRlRGlza1Jlc3BvbnNlIgrK8xgCAQLg8xgBEpABChNBZGROZXR3b3JrSW50ZXJmYWNlEjUuZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VBZGROZXR3b3JrSW50ZXJmYWNlUmVxdWVzdBo2LmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlQWRkTmV0d29ya0ludGVyZmFjZVJlc3BvbnNlIgrK8xgCAQLg8xgBEpMBChRNb3ZlTmV0d29ya0ludGVyZmFjZRI2LmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlTW92ZU5ldHdvcmtJbnRlcmZhY2VSZXF1ZXN0GjcuZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VNb3ZlTmV0d29ya0ludGVyZmFjZVJlc3BvbnNlIgrK8xgCAQLg8xgBEpkBChZEZWxldGVOZXR3b3JrSW50ZXJmYWNlEjguZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VEZWxldGVOZXR3b3JrSW50ZXJmYWNlUmVxdWVzdBo5LmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlRGVsZXRlTmV0d29ya0ludGVyZmFjZVJlc3BvbnNlIgrK8xgCAQLg8xgBEoEBCg5WYWxpZGF0ZUNyZWF0ZRIwLmZpdHMuYXBpLm12bS52MS5NVk1TZXJ2aWNlVmFsaWRhdGVDcmVhdGVSZXF1ZXN0GjEuZml0cy5hcGkubXZtLnYxLk1WTVNlcnZpY2VWYWxpZGF0ZUNyZWF0ZVJlc3BvbnNlIgrK8xgCAQLg8xgCEoQBCg9WYWxpZGF0ZUFkZERpc2sSMS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZVZhbGlkYXRlQWRkRGlza1JlcXVlc3QaMi5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZVZhbGlkYXRlQWRkRGlza1Jlc3BvbnNlIgrK8xgCAQLg8xgCEo0BChJWYWxpZGF0ZVVwZGF0ZURpc2sSNC5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZVZhbGlkYXRlVXBkYXRlRGlza1JlcXVlc3QaNS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZVZhbGlkYXRlVXBkYXRlRGlza1Jlc3BvbnNlIgrK8xgCAQLg8xgCEqgBChtWYWxpZGF0ZUFkZE5ldHdvcmtJbnRlcmZhY2USPS5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZVZhbGlkYXRlQWRkTmV0d29ya0ludGVyZmFjZVJlcXVlc3QaPi5maXRzLmFwaS5tdm0udjEuTVZNU2VydmljZVZhbGlkYXRlQWRkTmV0d29ya0ludGVyZmFjZVJlc3BvbnNlIgrK8xgCAQLg8xgCQq0BChNjb20uZml0cy5hcGkubXZtLnYxQghNdm1Qcm90b1ABWi1naXRodWIuY29tL2ZpLXRzL2FwaS9nby9maXRzL2FwaS9tdm0vdjE7bXZtdjGiAgNGQU2qAg9GaXRzLkFwaS5Ndm0uVjHKAg9GaXRzXEFwaVxNdm1cVjHiAhtGaXRzXEFwaVxNdm1cVjFcR1BCTWV0YWRhdGHqAhJGaXRzOjpBcGk6Ok12bTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_fits_api_mvm_v1_vlan, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
+
+/**
+ * Linux-specific MVM details.
+ *
+ * @generated from message fits.api.mvm.v1.LinuxDetails
+ */
+export type LinuxDetails = Message<"fits.api.mvm.v1.LinuxDetails"> & {
+ /**
+ * Disks configured on the Linux MVM.
+ *
+ * @generated from field: repeated fits.api.mvm.v1.LinuxDisk disks = 1;
+ */
+ disks: LinuxDisk[];
+
+ /**
+ * UUID of the LDAP directory the MVM is integrated with.
+ *
+ * @generated from field: string ldap_uuid = 2;
+ */
+ ldapUuid: string;
+
+ /**
+ * Linux-specific FQDN, derived from the name at creation or generated by the backend.
+ *
+ * @generated from field: string ldap_fqdn = 3;
+ */
+ ldapFqdn: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.LinuxDetails.
+ * Use `create(LinuxDetailsSchema)` to create a new message.
+ */
+export const LinuxDetailsSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 0);
+
+/**
+ * Windows-specific MVM details.
+ *
+ * @generated from message fits.api.mvm.v1.WindowsDetails
+ */
+export type WindowsDetails = Message<"fits.api.mvm.v1.WindowsDetails"> & {
+ /**
+ * Disks configured on the Windows MVM.
+ *
+ * @generated from field: repeated fits.api.mvm.v1.WindowsDisk disks = 1;
+ */
+ disks: WindowsDisk[];
+
+ /**
+ * UUID of the Windows domain the MVM has joined.
+ *
+ * @generated from field: string domain_uuid = 2;
+ */
+ domainUuid: string;
+
+ /**
+ * Windows-specific FQDN, derived from the name at creation or generated by the backend.
+ *
+ * @generated from field: string domain_fqdn = 3;
+ */
+ domainFqdn: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.WindowsDetails.
+ * Use `create(WindowsDetailsSchema)` to create a new message.
+ */
+export const WindowsDetailsSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 1);
+
+/**
+ * A network interface of a MVM. IPv4 only; IPv6 is not yet supported.
+ *
+ * @generated from message fits.api.mvm.v1.NetworkInterface
+ */
+export type NetworkInterface = Message<"fits.api.mvm.v1.NetworkInterface"> & {
+ /**
+ * UUID of this interface.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * IPv4 address assigned to this interface.
+ *
+ * @generated from field: string ipaddress = 2;
+ */
+ ipaddress: string;
+
+ /**
+ * MAC address of this interface.
+ *
+ * TODO: add validation
+ *
+ * @generated from field: string macaddress = 3;
+ */
+ macaddress: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.NetworkInterface.
+ * Use `create(NetworkInterfaceSchema)` to create a new message.
+ */
+export const NetworkInterfaceSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 2);
+
+/**
+ * ManagedVM is a managed VM instance as returned by the API.
+ *
+ * @generated from message fits.api.mvm.v1.ManagedVM
+ */
+export type ManagedVM = Message<"fits.api.mvm.v1.ManagedVM"> & {
+ /**
+ * UUID of this MVM.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * Metadata for this MVM.
+ * TODO: dates are available in the nulink db but not passed through yet.
+ *
+ * @generated from field: fits.api.v1.Meta meta = 2;
+ */
+ meta?: Meta | undefined;
+
+ /**
+ * FQDN of the MVM, derived from the name at creation or generated by the backend.
+ *
+ * @generated from field: string fqdn = 3;
+ */
+ fqdn: string;
+
+ /**
+ * Tenant this MVM belongs to.
+ *
+ * @generated from field: string tenant = 4;
+ */
+ tenant: string;
+
+ /**
+ * UUID of the project this MVM belongs to.
+ *
+ * @generated from field: string project_uuid = 5;
+ */
+ projectUuid: string;
+
+ /**
+ * UUID of the OS image installed on the MVM; resolve the title via the OS endpoint.
+ *
+ * @generated from field: string os_uuid = 6;
+ */
+ osUuid: string;
+
+ /**
+ * UUID of the datacenter location.
+ *
+ * @generated from field: string location_uuid = 7;
+ */
+ locationUuid: string;
+
+ /**
+ * TODO: Contact UUID – not yet implemented; open discussion with FCN (#23).
+ *
+ * @generated from field: string contact_uuid = 8;
+ */
+ contactUuid: string;
+
+ /**
+ * Number of CPU cores.
+ *
+ * @generated from field: uint32 cpu = 9;
+ */
+ cpu: number;
+
+ /**
+ * RAM in GB.
+ *
+ * @generated from field: uint32 ram = 10;
+ */
+ ram: number;
+
+ /**
+ * Whether backup is enabled.
+ * TODO: the upstream (nulink) list/get models do not expose this; always false.
+ *
+ * @generated from field: bool backup = 11;
+ */
+ backup: boolean;
+
+ /**
+ * Status of the MVM.
+ *
+ * @generated from field: fits.api.mvm.v1.MVMStatus status = 12;
+ */
+ status: MVMStatus;
+
+ /**
+ * Additional information about the current status.
+ *
+ * @generated from field: string status_info = 13;
+ */
+ statusInfo: string;
+
+ /**
+ * Availability level.
+ *
+ * @generated from field: fits.api.mvm.v1.Availability availability = 14;
+ */
+ availability: Availability;
+
+ /**
+ * Service class.
+ *
+ * @generated from field: fits.api.mvm.v1.ServiceClass serviceclass = 15;
+ */
+ serviceclass: ServiceClass;
+
+ /**
+ * OS-specific configuration.
+ *
+ * @generated from oneof fits.api.mvm.v1.ManagedVM.details
+ */
+ details: {
+ /**
+ * Windows-specific settings (domain + disks).
+ *
+ * @generated from field: fits.api.mvm.v1.WindowsDetails windows_details = 16;
+ */
+ value: WindowsDetails;
+ case: "windowsDetails";
+ } | {
+ /**
+ * Linux-specific settings (LDAP + disks).
+ *
+ * @generated from field: fits.api.mvm.v1.LinuxDetails linux_details = 17;
+ */
+ value: LinuxDetails;
+ case: "linuxDetails";
+ } | { case: undefined; value?: undefined };
+
+ /**
+ * Network interfaces attached to the MVM (IPv4 only).
+ *
+ * @generated from field: repeated fits.api.mvm.v1.NetworkInterface interfaces = 18;
+ */
+ interfaces: NetworkInterface[];
+
+ /**
+ * VLAN the MVM is attached to.
+ * TODO: not exposed by the upstream (nulink) MVM records yet; always unset.
+ *
+ * @generated from field: fits.api.mvm.v1.VLAN vlan = 19;
+ */
+ vlan?: VLAN | undefined;
+
+ /**
+ * Internal reference number provided by the user, e.g. a ticket ID.
+ *
+ * @generated from field: string order_number = 20;
+ */
+ orderNumber: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.ManagedVM.
+ * Use `create(ManagedVMSchema)` to create a new message.
+ */
+export const ManagedVMSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 3);
+
+/**
+ * Request to get a MVM by UUID.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceGetRequest
+ */
+export type MVMServiceGetRequest = Message<"fits.api.mvm.v1.MVMServiceGetRequest"> & {
+ /**
+ * UUID of the MVM.
+ *
+ * @generated from field: optional string uuid = 1;
+ */
+ uuid?: string | undefined;
+
+ /**
+ * Tenant of the MVM.
+ *
+ * @generated from field: string tenant = 2;
+ */
+ tenant: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceGetRequest.
+ * Use `create(MVMServiceGetRequestSchema)` to create a new message.
+ */
+export const MVMServiceGetRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 4);
+
+/**
+ * Response containing the requested MVM.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceGetResponse
+ */
+export type MVMServiceGetResponse = Message<"fits.api.mvm.v1.MVMServiceGetResponse"> & {
+ /**
+ * The MVM.
+ *
+ * @generated from field: fits.api.mvm.v1.ManagedVM mvm = 1;
+ */
+ mvm?: ManagedVM | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceGetResponse.
+ * Use `create(MVMServiceGetResponseSchema)` to create a new message.
+ */
+export const MVMServiceGetResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 5);
+
+/**
+ * Windows-specific create request parts.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceCreateWindowsRequest
+ */
+export type MVMServiceCreateWindowsRequest = Message<"fits.api.mvm.v1.MVMServiceCreateWindowsRequest"> & {
+ /**
+ * UUID of the Windows domain the MVM should join.
+ *
+ * @generated from field: string domain_uuid = 1;
+ */
+ domainUuid: string;
+
+ /**
+ * Disks for the Windows MVM, excluding the OS disk; must contain exactly
+ * one system disk plus any number of data disks (see DiskType).
+ *
+ * @generated from field: repeated fits.api.mvm.v1.WindowsDisk disks = 2;
+ */
+ disks: WindowsDisk[];
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceCreateWindowsRequest.
+ * Use `create(MVMServiceCreateWindowsRequestSchema)` to create a new message.
+ */
+export const MVMServiceCreateWindowsRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 6);
+
+/**
+ * Linux-specific create request parts.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceCreateLinuxRequest
+ */
+export type MVMServiceCreateLinuxRequest = Message<"fits.api.mvm.v1.MVMServiceCreateLinuxRequest"> & {
+ /**
+ * UUID of the LDAP directory the MVM should integrate with.
+ *
+ * @generated from field: string ldap_uuid = 1;
+ */
+ ldapUuid: string;
+
+ /**
+ * Disks for the Linux MVM, excluding the OS disk; must contain exactly
+ * one system disk plus any number of data disks (see DiskType).
+ *
+ * @generated from field: repeated fits.api.mvm.v1.LinuxDisk disks = 2;
+ */
+ disks: LinuxDisk[];
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceCreateLinuxRequest.
+ * Use `create(MVMServiceCreateLinuxRequestSchema)` to create a new message.
+ */
+export const MVMServiceCreateLinuxRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 7);
+
+/**
+ * Request to create a new MVM instance.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceCreateRequest
+ */
+export type MVMServiceCreateRequest = Message<"fits.api.mvm.v1.MVMServiceCreateRequest"> & {
+ /**
+ * UUID of the project this MVM belongs to.
+ *
+ * @generated from field: string project_uuid = 1;
+ */
+ projectUuid: string;
+
+ /**
+ * Optional name; the FQDN is derived from it.
+ *
+ * @generated from field: optional string name = 2;
+ */
+ name?: string | undefined;
+
+ /**
+ * UUID of the operating system image to install.
+ *
+ * @generated from field: string os_uuid = 3;
+ */
+ osUuid: string;
+
+ /**
+ * UUID of the VLAN network to attach the MVM to.
+ *
+ * @generated from field: string vlan_uuid = 4;
+ */
+ vlanUuid: string;
+
+ /**
+ * UUID of the datacenter location; the MVM is scheduled into one data center within it.
+ *
+ * @generated from field: string location_uuid = 5;
+ */
+ locationUuid: string;
+
+ /**
+ * TODO: Contact UUID – open discussion with FCN; may become a dedicated /contact endpoint.
+ *
+ * @generated from field: string contact_uuid = 6;
+ */
+ contactUuid: string;
+
+ /**
+ * Number of CPU cores.
+ *
+ * @generated from field: uint32 cpu = 7;
+ */
+ cpu: number;
+
+ /**
+ * RAM in GB. Must be a power of 2.
+ *
+ * @generated from field: uint32 ram = 8;
+ */
+ ram: number;
+
+ /**
+ * Internal reference number provided by the user, e.g. a ticket ID.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 9;
+ */
+ orderNumber: string;
+
+ /**
+ * Optional key-value labels for accounting purposes.
+ * (e.g. contract number, transaction number, technical key, accounting key).
+ *
+ * @generated from field: fits.api.v1.Labels labels = 10;
+ */
+ labels?: Labels | undefined;
+
+ /**
+ * Whether backup is enabled.
+ *
+ * @generated from field: bool backup = 11;
+ */
+ backup: boolean;
+
+ /**
+ * Availability level.
+ *
+ * @generated from field: fits.api.mvm.v1.Availability availability = 12;
+ */
+ availability: Availability;
+
+ /**
+ * Service class; only certain combinations with availability are valid.
+ *
+ * @generated from field: fits.api.mvm.v1.ServiceClass serviceclass = 13;
+ */
+ serviceclass: ServiceClass;
+
+ /**
+ * OS type and its configuration.
+ *
+ * @generated from oneof fits.api.mvm.v1.MVMServiceCreateRequest.mvmtype
+ */
+ mvmtype: {
+ /**
+ * Windows-specific settings (domain + disk).
+ *
+ * @generated from field: fits.api.mvm.v1.MVMServiceCreateWindowsRequest windows = 14;
+ */
+ value: MVMServiceCreateWindowsRequest;
+ case: "windows";
+ } | {
+ /**
+ * Linux-specific settings (LDAP + disk).
+ *
+ * @generated from field: fits.api.mvm.v1.MVMServiceCreateLinuxRequest linux = 15;
+ */
+ value: MVMServiceCreateLinuxRequest;
+ case: "linux";
+ } | { case: undefined; value?: undefined };
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceCreateRequest.
+ * Use `create(MVMServiceCreateRequestSchema)` to create a new message.
+ */
+export const MVMServiceCreateRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 8);
+
+/**
+ * Disk configuration for a Linux MVM. See DiskType for the kinds of disks
+ * (os, system, data) and their lifecycle rules.
+ *
+ * @generated from message fits.api.mvm.v1.LinuxDisk
+ */
+export type LinuxDisk = Message<"fits.api.mvm.v1.LinuxDisk"> & {
+ /**
+ * UUID of the disk; set for existing disks, unset for new ones.
+ *
+ * @generated from field: optional string uuid = 1;
+ */
+ uuid?: string | undefined;
+
+ /**
+ * Label (name) of the disk.
+ *
+ * @generated from field: string label = 2;
+ */
+ label: string;
+
+ /**
+ * Whether the disk grows automatically when space runs low.
+ *
+ * @generated from field: bool auto_extend = 3;
+ */
+ autoExtend: boolean;
+
+ /**
+ * Size of the disk in GB; defaults to 50 when unset.
+ *
+ * @generated from field: optional uint64 size = 4;
+ */
+ size?: bigint | undefined;
+
+ /**
+ * Mount point (e.g. "/data"). Fixed to "/appdata" for the system disk;
+ * free-form for data disks.
+ *
+ * @generated from field: optional string mount_point = 5;
+ */
+ mountPoint?: string | undefined;
+
+ /**
+ * Kind of the disk; determines which operations are allowed on it.
+ * Provided by the client in create/add requests and populated by the
+ * API in responses.
+ * TODO: talk to FCE that we will provide the disk type in create/add
+ * requests.
+ *
+ * @generated from field: optional fits.api.mvm.v1.DiskType disk_type = 6;
+ */
+ diskType?: DiskType | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.LinuxDisk.
+ * Use `create(LinuxDiskSchema)` to create a new message.
+ */
+export const LinuxDiskSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 9);
+
+/**
+ * Disk configuration for a Windows MVM. See DiskType for the kinds of
+ * disks (os, system, data) and their lifecycle rules.
+ *
+ * @generated from message fits.api.mvm.v1.WindowsDisk
+ */
+export type WindowsDisk = Message<"fits.api.mvm.v1.WindowsDisk"> & {
+ /**
+ * UUID of the disk; set for existing disks, unset for new ones.
+ *
+ * @generated from field: optional string uuid = 1;
+ */
+ uuid?: string | undefined;
+
+ /**
+ * Label (name) of the disk.
+ *
+ * @generated from field: string label = 2;
+ */
+ label: string;
+
+ /**
+ * Whether the disk grows automatically when space runs low.
+ *
+ * @generated from field: bool auto_extend = 3;
+ */
+ autoExtend: boolean;
+
+ /**
+ * Size of the disk in GB; defaults to 50 when unset.
+ *
+ * @generated from field: optional uint64 size = 4;
+ */
+ size?: bigint | undefined;
+
+ /**
+ * Drive letter (e.g. "D"). Fixed to "F" for the system disk; free-form
+ * for data disks.
+ *
+ * @generated from field: optional string driveletter = 5;
+ */
+ driveletter?: string | undefined;
+
+ /**
+ * Kind of the disk; determines which operations are allowed on it.
+ * Provided by the client in create/add requests and populated by the
+ * API in responses.
+ * TODO: talk to FCE that we will provide the disk type in create/add
+ * requests.
+ *
+ * @generated from field: optional fits.api.mvm.v1.DiskType disk_type = 6;
+ */
+ diskType?: DiskType | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.WindowsDisk.
+ * Use `create(WindowsDiskSchema)` to create a new message.
+ */
+export const WindowsDiskSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 10);
+
+/**
+ * Response for Create; an empty response means the MVM was accepted.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceCreateResponse
+ */
+export type MVMServiceCreateResponse = Message<"fits.api.mvm.v1.MVMServiceCreateResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceCreateResponse.
+ * Use `create(MVMServiceCreateResponseSchema)` to create a new message.
+ */
+export const MVMServiceCreateResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 11);
+
+/**
+ * Request to change a mutable property of an existing MVM.
+ * Exactly one action must be set; each maps onto its own upstream endpoint.
+ * TODO: the oneof mirrors the upstream constraint (nulink has one endpoint per
+ * action); combined changes would need
+ * server-side fan-out without rollback.
+ * TODO: clarify async semantics — this is a queued "request to update", not an
+ * immediate update (e.g. disk changes are applied overnight). Consider
+ * renaming to reflect that.
+ * TODO: differentiate between fire-and-forget and queued actions in the API.
+ * TODO: is it possible to expose the pending-change queue (list/cancel) to the caller?
+ * TODO: clarify who enqueues the request and whether a pending change blocks
+ * further edits (e.g. after AddDisk, until the change executes).
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceUpdateRequest
+ */
+export type MVMServiceUpdateRequest = Message<"fits.api.mvm.v1.MVMServiceUpdateRequest"> & {
+ /**
+ * UUID of the MVM to update.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 2;
+ */
+ project: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 3;
+ */
+ orderNumber: string;
+
+ /**
+ * Timestamp and strategy for this update.
+ *
+ * @generated from field: fits.api.v1.UpdateMeta update_meta = 4;
+ */
+ updateMeta?: UpdateMeta | undefined;
+
+ /**
+ * The change to apply.
+ *
+ * @generated from oneof fits.api.mvm.v1.MVMServiceUpdateRequest.action
+ */
+ action: {
+ /**
+ * Change the CPU/RAM performance class.
+ *
+ * @generated from field: fits.api.mvm.v1.PerformanceClassChange performance_class = 5;
+ */
+ value: PerformanceClassChange;
+ case: "performanceClass";
+ } | {
+ /**
+ * Change the service class.
+ *
+ * @generated from field: fits.api.mvm.v1.ServiceClassChange service_class = 6;
+ */
+ value: ServiceClassChange;
+ case: "serviceClass";
+ } | {
+ /**
+ * Change the contact person.
+ *
+ * @generated from field: fits.api.mvm.v1.ContactChange contact = 7;
+ */
+ value: ContactChange;
+ case: "contact";
+ } | { case: undefined; value?: undefined };
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceUpdateRequest.
+ * Use `create(MVMServiceUpdateRequestSchema)` to create a new message.
+ */
+export const MVMServiceUpdateRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 12);
+
+/**
+ * PerformanceClassChange is the payload for changing a MVM's CPU and RAM.
+ *
+ * @generated from message fits.api.mvm.v1.PerformanceClassChange
+ */
+export type PerformanceClassChange = Message<"fits.api.mvm.v1.PerformanceClassChange"> & {
+ /**
+ * Number of vCPUs (1-64).
+ *
+ * @generated from field: uint32 cpu = 1;
+ */
+ cpu: number;
+
+ /**
+ * RAM size in GB.
+ *
+ * @generated from field: uint32 ram = 2;
+ */
+ ram: number;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.PerformanceClassChange.
+ * Use `create(PerformanceClassChangeSchema)` to create a new message.
+ */
+export const PerformanceClassChangeSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 13);
+
+/**
+ * ServiceClassChange is the payload for changing a MVM's service class.
+ *
+ * @generated from message fits.api.mvm.v1.ServiceClassChange
+ */
+export type ServiceClassChange = Message<"fits.api.mvm.v1.ServiceClassChange"> & {
+ /**
+ * Target service class.
+ *
+ * @generated from field: fits.api.mvm.v1.ServiceClass serviceclass = 1;
+ */
+ serviceclass: ServiceClass;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.ServiceClassChange.
+ * Use `create(ServiceClassChangeSchema)` to create a new message.
+ */
+export const ServiceClassChangeSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 14);
+
+/**
+ * ContactChange is the payload for changing a MVM's contact person.
+ *
+ * @generated from message fits.api.mvm.v1.ContactChange
+ */
+export type ContactChange = Message<"fits.api.mvm.v1.ContactChange"> & {
+ /**
+ * UUID of the new contact.
+ *
+ * @generated from field: string contact_uuid = 1;
+ */
+ contactUuid: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.ContactChange.
+ * Use `create(ContactChangeSchema)` to create a new message.
+ */
+export const ContactChangeSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 15);
+
+/**
+ * Response for Update; an empty response means the change was accepted.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceUpdateResponse
+ */
+export type MVMServiceUpdateResponse = Message<"fits.api.mvm.v1.MVMServiceUpdateResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceUpdateResponse.
+ * Use `create(MVMServiceUpdateResponseSchema)` to create a new message.
+ */
+export const MVMServiceUpdateResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 16);
+
+/**
+ * Request to list MVMs.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceListRequest
+ */
+export type MVMServiceListRequest = Message<"fits.api.mvm.v1.MVMServiceListRequest"> & {
+ /**
+ * Tenant of the MVMs.
+ *
+ * @generated from field: optional string tenant = 1;
+ */
+ tenant?: string | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceListRequest.
+ * Use `create(MVMServiceListRequestSchema)` to create a new message.
+ */
+export const MVMServiceListRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 17);
+
+/**
+ * Response containing the list of MVMs.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceListResponse
+ */
+export type MVMServiceListResponse = Message<"fits.api.mvm.v1.MVMServiceListResponse"> & {
+ /**
+ * The MVM instances.
+ *
+ * @generated from field: repeated fits.api.mvm.v1.ManagedVM mvms = 1;
+ */
+ mvms: ManagedVM[];
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceListResponse.
+ * Use `create(MVMServiceListResponseSchema)` to create a new message.
+ */
+export const MVMServiceListResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 18);
+
+/**
+ * Request to cancel a MVM instance.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceDeleteRequest
+ */
+export type MVMServiceDeleteRequest = Message<"fits.api.mvm.v1.MVMServiceDeleteRequest"> & {
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 1;
+ */
+ project: string;
+
+ /**
+ * UUID of the MVM to delete.
+ *
+ * @generated from field: string uuid = 2;
+ */
+ uuid: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 3;
+ */
+ orderNumber: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceDeleteRequest.
+ * Use `create(MVMServiceDeleteRequestSchema)` to create a new message.
+ */
+export const MVMServiceDeleteRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 19);
+
+/**
+ * Response for Delete; an empty response means the cancellation was accepted.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceDeleteResponse
+ */
+export type MVMServiceDeleteResponse = Message<"fits.api.mvm.v1.MVMServiceDeleteResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceDeleteResponse.
+ * Use `create(MVMServiceDeleteResponseSchema)` to create a new message.
+ */
+export const MVMServiceDeleteResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 20);
+
+/**
+ * Request to validate a MVM create without creating anything.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateCreateRequest
+ */
+export type MVMServiceValidateCreateRequest = Message<"fits.api.mvm.v1.MVMServiceValidateCreateRequest"> & {
+ /**
+ * The create request to validate.
+ *
+ * @generated from field: fits.api.mvm.v1.MVMServiceCreateRequest create = 1;
+ */
+ create?: MVMServiceCreateRequest | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateCreateRequest.
+ * Use `create(MVMServiceValidateCreateRequestSchema)` to create a new message.
+ */
+export const MVMServiceValidateCreateRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 21);
+
+/**
+ * Response for ValidateCreate; violations are returned as an InvalidArgument error.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateCreateResponse
+ */
+export type MVMServiceValidateCreateResponse = Message<"fits.api.mvm.v1.MVMServiceValidateCreateResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateCreateResponse.
+ * Use `create(MVMServiceValidateCreateResponseSchema)` to create a new message.
+ */
+export const MVMServiceValidateCreateResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 22);
+
+/**
+ * Request to validate an AddDisk without ordering anything.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateAddDiskRequest
+ */
+export type MVMServiceValidateAddDiskRequest = Message<"fits.api.mvm.v1.MVMServiceValidateAddDiskRequest"> & {
+ /**
+ * The add disk request to validate.
+ *
+ * @generated from field: fits.api.mvm.v1.MVMServiceAddDiskRequest add_disk = 1;
+ */
+ addDisk?: MVMServiceAddDiskRequest | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateAddDiskRequest.
+ * Use `create(MVMServiceValidateAddDiskRequestSchema)` to create a new message.
+ */
+export const MVMServiceValidateAddDiskRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 23);
+
+/**
+ * Response for ValidateAddDisk; violations are returned as an InvalidArgument error.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateAddDiskResponse
+ */
+export type MVMServiceValidateAddDiskResponse = Message<"fits.api.mvm.v1.MVMServiceValidateAddDiskResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateAddDiskResponse.
+ * Use `create(MVMServiceValidateAddDiskResponseSchema)` to create a new message.
+ */
+export const MVMServiceValidateAddDiskResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 24);
+
+/**
+ * Request to validate an UpdateDisk without changing anything.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest
+ */
+export type MVMServiceValidateUpdateDiskRequest = Message<"fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest"> & {
+ /**
+ * The update disk request to validate.
+ *
+ * @generated from field: fits.api.mvm.v1.MVMServiceUpdateDiskRequest update_disk = 1;
+ */
+ updateDisk?: MVMServiceUpdateDiskRequest | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest.
+ * Use `create(MVMServiceValidateUpdateDiskRequestSchema)` to create a new message.
+ */
+export const MVMServiceValidateUpdateDiskRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 25);
+
+/**
+ * Response for ValidateUpdateDisk; violations are returned as an InvalidArgument error.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateUpdateDiskResponse
+ */
+export type MVMServiceValidateUpdateDiskResponse = Message<"fits.api.mvm.v1.MVMServiceValidateUpdateDiskResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateUpdateDiskResponse.
+ * Use `create(MVMServiceValidateUpdateDiskResponseSchema)` to create a new message.
+ */
+export const MVMServiceValidateUpdateDiskResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 26);
+
+/**
+ * Response for AddDisk.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceAddDiskResponse
+ */
+export type MVMServiceAddDiskResponse = Message<"fits.api.mvm.v1.MVMServiceAddDiskResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceAddDiskResponse.
+ * Use `create(MVMServiceAddDiskResponseSchema)` to create a new message.
+ */
+export const MVMServiceAddDiskResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 27);
+
+/**
+ * Response for UpdateDisk.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceUpdateDiskResponse
+ */
+export type MVMServiceUpdateDiskResponse = Message<"fits.api.mvm.v1.MVMServiceUpdateDiskResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceUpdateDiskResponse.
+ * Use `create(MVMServiceUpdateDiskResponseSchema)` to create a new message.
+ */
+export const MVMServiceUpdateDiskResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 28);
+
+/**
+ * Response for DeleteDisk.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceDeleteDiskResponse
+ */
+export type MVMServiceDeleteDiskResponse = Message<"fits.api.mvm.v1.MVMServiceDeleteDiskResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceDeleteDiskResponse.
+ * Use `create(MVMServiceDeleteDiskResponseSchema)` to create a new message.
+ */
+export const MVMServiceDeleteDiskResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 29);
+
+/**
+ * Request to order an additional data disk for a MVM.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceAddDiskRequest
+ */
+export type MVMServiceAddDiskRequest = Message<"fits.api.mvm.v1.MVMServiceAddDiskRequest"> & {
+ /**
+ * UUID of the MVM to attach the disk to.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 2;
+ */
+ project: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 3;
+ */
+ orderNumber: string;
+
+ /**
+ * OS-specific disk specification; must match the MVM's OS type.
+ *
+ * @generated from oneof fits.api.mvm.v1.MVMServiceAddDiskRequest.disk
+ */
+ disk: {
+ /**
+ * Linux data disk.
+ *
+ * @generated from field: fits.api.mvm.v1.LinuxDisk linux = 4;
+ */
+ value: LinuxDisk;
+ case: "linux";
+ } | {
+ /**
+ * Windows data disk.
+ *
+ * @generated from field: fits.api.mvm.v1.WindowsDisk windows = 5;
+ */
+ value: WindowsDisk;
+ case: "windows";
+ } | { case: undefined; value?: undefined };
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceAddDiskRequest.
+ * Use `create(MVMServiceAddDiskRequestSchema)` to create a new message.
+ */
+export const MVMServiceAddDiskRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 30);
+
+/**
+ * Request to change an existing disk; only size and auto-extend are
+ * mutable (see DiskType for applicability per disk kind).
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceUpdateDiskRequest
+ */
+export type MVMServiceUpdateDiskRequest = Message<"fits.api.mvm.v1.MVMServiceUpdateDiskRequest"> & {
+ /**
+ * UUID of the MVM the disk belongs to.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * UUID of the disk to change.
+ *
+ * @generated from field: string disk_uuid = 2;
+ */
+ diskUuid: string;
+
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 3;
+ */
+ project: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 4;
+ */
+ orderNumber: string;
+
+ /**
+ * New auto-extend behavior; unset keeps the current value.
+ *
+ * @generated from field: optional bool auto_extend = 5;
+ */
+ autoExtend?: boolean | undefined;
+
+ /**
+ * New size of the disk in GB; unset keeps the current value.
+ *
+ * @generated from field: optional uint64 size = 6;
+ */
+ size?: bigint | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceUpdateDiskRequest.
+ * Use `create(MVMServiceUpdateDiskRequestSchema)` to create a new message.
+ */
+export const MVMServiceUpdateDiskRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 31);
+
+/**
+ * Request to cancel a data disk; OS and system disks are rejected by the
+ * upstream.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceDeleteDiskRequest
+ */
+export type MVMServiceDeleteDiskRequest = Message<"fits.api.mvm.v1.MVMServiceDeleteDiskRequest"> & {
+ /**
+ * UUID of the MVM the disk belongs to.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * UUID of the disk to cancel.
+ *
+ * @generated from field: string disk_uuid = 2;
+ */
+ diskUuid: string;
+
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 3;
+ */
+ project: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 4;
+ */
+ orderNumber: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceDeleteDiskRequest.
+ * Use `create(MVMServiceDeleteDiskRequestSchema)` to create a new message.
+ */
+export const MVMServiceDeleteDiskRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 32);
+
+/**
+ * Response for AddNetworkInterface.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceAddNetworkInterfaceResponse
+ */
+export type MVMServiceAddNetworkInterfaceResponse = Message<"fits.api.mvm.v1.MVMServiceAddNetworkInterfaceResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceAddNetworkInterfaceResponse.
+ * Use `create(MVMServiceAddNetworkInterfaceResponseSchema)` to create a new message.
+ */
+export const MVMServiceAddNetworkInterfaceResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 33);
+
+/**
+ * Response for MoveNetworkInterface.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceResponse
+ */
+export type MVMServiceMoveNetworkInterfaceResponse = Message<"fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceResponse.
+ * Use `create(MVMServiceMoveNetworkInterfaceResponseSchema)` to create a new message.
+ */
+export const MVMServiceMoveNetworkInterfaceResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 34);
+
+/**
+ * Response for DeleteNetworkInterface.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceResponse
+ */
+export type MVMServiceDeleteNetworkInterfaceResponse = Message<"fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceResponse.
+ * Use `create(MVMServiceDeleteNetworkInterfaceResponseSchema)` to create a new message.
+ */
+export const MVMServiceDeleteNetworkInterfaceResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 35);
+
+/**
+ * Request to order an additional network interface for a MVM.
+ * Nulink treats interface and IP as a 1:1 relation; move and delete
+ * operate on the interface_uuid.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest
+ */
+export type MVMServiceAddNetworkInterfaceRequest = Message<"fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest"> & {
+ /**
+ * UUID of the MVM to attach the interface to.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 2;
+ */
+ project: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 3;
+ */
+ orderNumber: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest.
+ * Use `create(MVMServiceAddNetworkInterfaceRequestSchema)` to create a new message.
+ */
+export const MVMServiceAddNetworkInterfaceRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 36);
+
+/**
+ * Request to move a network interface from one MVM to another.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceRequest
+ */
+export type MVMServiceMoveNetworkInterfaceRequest = Message<"fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceRequest"> & {
+ /**
+ * UUID of the MVM the interface currently belongs to.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * UUID of the network interface holding the IP.
+ *
+ * @generated from field: string interface_uuid = 2;
+ */
+ interfaceUuid: string;
+
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 3;
+ */
+ project: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 4;
+ */
+ orderNumber: string;
+
+ /**
+ * UUID of the MVM to move the interface to.
+ *
+ * @generated from field: string target_mvm_uuid = 5;
+ */
+ targetMvmUuid: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceRequest.
+ * Use `create(MVMServiceMoveNetworkInterfaceRequestSchema)` to create a new message.
+ */
+export const MVMServiceMoveNetworkInterfaceRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 37);
+
+/**
+ * Request to delete a network interface from a MVM.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceRequest
+ */
+export type MVMServiceDeleteNetworkInterfaceRequest = Message<"fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceRequest"> & {
+ /**
+ * UUID of the MVM the interface belongs to.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * UUID of the network interface holding the IP.
+ *
+ * @generated from field: string interface_uuid = 2;
+ */
+ interfaceUuid: string;
+
+ /**
+ * Project the MVM belongs to.
+ *
+ * @generated from field: string project = 3;
+ */
+ project: string;
+
+ /**
+ * Order reference for this operation.
+ * TODO: can this be optional?
+ *
+ * @generated from field: string order_number = 4;
+ */
+ orderNumber: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceRequest.
+ * Use `create(MVMServiceDeleteNetworkInterfaceRequestSchema)` to create a new message.
+ */
+export const MVMServiceDeleteNetworkInterfaceRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 38);
+
+/**
+ * Request to validate an AddNetworkInterface without ordering anything.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest
+ */
+export type MVMServiceValidateAddNetworkInterfaceRequest = Message<"fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest"> & {
+ /**
+ * The add network interface request to validate.
+ *
+ * @generated from field: fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest add_network_interface = 1;
+ */
+ addNetworkInterface?: MVMServiceAddNetworkInterfaceRequest | undefined;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest.
+ * Use `create(MVMServiceValidateAddNetworkInterfaceRequestSchema)` to create a new message.
+ */
+export const MVMServiceValidateAddNetworkInterfaceRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 39);
+
+/**
+ * Response for ValidateAddNetworkInterface; violations are returned as an InvalidArgument error.
+ *
+ * @generated from message fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceResponse
+ */
+export type MVMServiceValidateAddNetworkInterfaceResponse = Message<"fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceResponse"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceResponse.
+ * Use `create(MVMServiceValidateAddNetworkInterfaceResponseSchema)` to create a new message.
+ */
+export const MVMServiceValidateAddNetworkInterfaceResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_mvm, 40);
+
+/**
+ * Availability specifies the availability level of a MVM; higher value = higher availability.
+ *
+ * @generated from enum fits.api.mvm.v1.Availability
+ */
+export enum Availability {
+ /**
+ * AVAILABILITY_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: AVAILABILITY_UNSPECIFIED = 0;
+ */
+ UNSPECIFIED = 0,
+
+ /**
+ * AVAILABILITY_V0 is availability level V0.
+ *
+ * @generated from enum value: AVAILABILITY_V0 = 1;
+ */
+ V0 = 1,
+
+ /**
+ * AVAILABILITY_V1 is availability level V1.
+ *
+ * @generated from enum value: AVAILABILITY_V1 = 2;
+ */
+ V1 = 2,
+
+ /**
+ * AVAILABILITY_V2 is availability level V2.
+ *
+ * @generated from enum value: AVAILABILITY_V2 = 3;
+ */
+ V2 = 3,
+
+ /**
+ * AVAILABILITY_V3 is availability level V3.
+ *
+ * @generated from enum value: AVAILABILITY_V3 = 4;
+ */
+ V3 = 4,
+}
+
+/**
+ * Describes the enum fits.api.mvm.v1.Availability.
+ */
+export const AvailabilitySchema: GenEnum = /*@__PURE__*/
+ enumDesc(file_fits_api_mvm_v1_mvm, 0);
+
+/**
+ * ServiceClass specifies the service tier of a MVM; higher value = higher tier.
+ * Only certain combinations with Availability are valid.
+ *
+ * @generated from enum fits.api.mvm.v1.ServiceClass
+ */
+export enum ServiceClass {
+ /**
+ * SERVICE_CLASS_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: SERVICE_CLASS_UNSPECIFIED = 0;
+ */
+ UNSPECIFIED = 0,
+
+ /**
+ * SERVICE_CLASS_SZ1 is service class SZ1.
+ *
+ * @generated from enum value: SERVICE_CLASS_SZ1 = 1;
+ */
+ SZ1 = 1,
+
+ /**
+ * SERVICE_CLASS_SZ2 is service class SZ2.
+ *
+ * @generated from enum value: SERVICE_CLASS_SZ2 = 2;
+ */
+ SZ2 = 2,
+
+ /**
+ * SERVICE_CLASS_SZ3 is service class SZ3.
+ *
+ * @generated from enum value: SERVICE_CLASS_SZ3 = 3;
+ */
+ SZ3 = 3,
+}
+
+/**
+ * Describes the enum fits.api.mvm.v1.ServiceClass.
+ */
+export const ServiceClassSchema: GenEnum = /*@__PURE__*/
+ enumDesc(file_fits_api_mvm_v1_mvm, 1);
+
+/**
+ * MVMStatus specifies the status of a MVM.
+ *
+ * @generated from enum fits.api.mvm.v1.MVMStatus
+ */
+export enum MVMStatus {
+ /**
+ * MVM_STATUS_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: MVM_STATUS_UNSPECIFIED = 0;
+ */
+ MVM_STATUS_UNSPECIFIED = 0,
+
+ /**
+ * MVM_STATUS_ACTIVE is an active MVM.
+ *
+ * @generated from enum value: MVM_STATUS_ACTIVE = 1;
+ */
+ MVM_STATUS_ACTIVE = 1,
+}
+
+/**
+ * Describes the enum fits.api.mvm.v1.MVMStatus.
+ */
+export const MVMStatusSchema: GenEnum = /*@__PURE__*/
+ enumDesc(file_fits_api_mvm_v1_mvm, 2);
+
+/**
+ * DiskType classifies a MVM disk by its lifecycle rules.
+ * The upstream (nulink) API returns every disk of a MVM, including the
+ * backend-provisioned OS disk, so that oversized OS disks stay billable.
+ *
+ * Lifecycle per kind:
+ * - OS: provisioned by the backend and never part of create/add
+ * requests; resizable via UpdateDisk, never deletable.
+ * - SYSTEM: exactly one per MVM (drive letter F on Windows, mount point
+ * /appdata on Linux), whose letter/mount point is fixed; must be
+ * included in the create request; resizable via UpdateDisk, never
+ * deletable.
+ * - DATA: fully controllable (letter/mount point, size, auto-extend)
+ * and deletable; may be included at creation or added later via
+ * AddDisk.
+ *
+ * Whether auto-extend is supported for OS and SYSTEM disks is not yet
+ * known; only DATA disks are documented as supporting it.
+ *
+ * These rules are enforced by the upstream (nulink) API at creation and
+ * edit time (e.g. duplicate drive letters, deleting a system disk);
+ * fco-api does not re-validate them locally and surfaces upstream
+ * violations as InvalidArgument errors. Use the Validate* RPCs to
+ * pre-check a request against the upstream rules.
+ *
+ * @generated from enum fits.api.mvm.v1.DiskType
+ */
+export enum DiskType {
+ /**
+ * DISK_TYPE_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: DISK_TYPE_UNSPECIFIED = 0;
+ */
+ UNSPECIFIED = 0,
+
+ /**
+ * DISK_TYPE_OS is the operating system disk; provisioned by the backend,
+ * resizable, never deletable.
+ *
+ * @generated from enum value: DISK_TYPE_OS = 1;
+ */
+ OS = 1,
+
+ /**
+ * DISK_TYPE_SYSTEM is the additional system disk (volume F on Windows,
+ * /appdata on Linux); the letter/mount point is fixed, the size is
+ * resizable, never deletable.
+ *
+ * @generated from enum value: DISK_TYPE_SYSTEM = 2;
+ */
+ SYSTEM = 2,
+
+ /**
+ * DISK_TYPE_DATA is a user-managed data disk; fully controllable and
+ * deletable.
+ *
+ * @generated from enum value: DISK_TYPE_DATA = 3;
+ */
+ DATA = 3,
+}
+
+/**
+ * Describes the enum fits.api.mvm.v1.DiskType.
+ */
+export const DiskTypeSchema: GenEnum = /*@__PURE__*/
+ enumDesc(file_fits_api_mvm_v1_mvm, 3);
+
+/**
+ * MVMService provides managed VM (MVM) operations.
+ *
+ * @generated from service fits.api.mvm.v1.MVMService
+ */
+export const MVMService: GenService<{
+ /**
+ * Returns the MVM with the specified UUID.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.Get
+ */
+ get: {
+ methodKind: "unary";
+ input: typeof MVMServiceGetRequestSchema;
+ output: typeof MVMServiceGetResponseSchema;
+ },
+ /**
+ * Creates a new MVM.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.Create
+ */
+ create: {
+ methodKind: "unary";
+ input: typeof MVMServiceCreateRequestSchema;
+ output: typeof MVMServiceCreateResponseSchema;
+ },
+ /**
+ * Updates a MVM.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.Update
+ */
+ update: {
+ methodKind: "unary";
+ input: typeof MVMServiceUpdateRequestSchema;
+ output: typeof MVMServiceUpdateResponseSchema;
+ },
+ /**
+ * Returns the list of all MVMs.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.List
+ */
+ list: {
+ methodKind: "unary";
+ input: typeof MVMServiceListRequestSchema;
+ output: typeof MVMServiceListResponseSchema;
+ },
+ /**
+ * Deletes a MVM.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.Delete
+ */
+ delete: {
+ methodKind: "unary";
+ input: typeof MVMServiceDeleteRequestSchema;
+ output: typeof MVMServiceDeleteResponseSchema;
+ },
+ /**
+ * Orders an additional data disk for a MVM. System disks are ordered at
+ * MVM creation and cannot be added later.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.AddDisk
+ */
+ addDisk: {
+ methodKind: "unary";
+ input: typeof MVMServiceAddDiskRequestSchema;
+ output: typeof MVMServiceAddDiskResponseSchema;
+ },
+ /**
+ * Changes the size or auto-extend behavior of an existing disk; see
+ * DiskType for which operations apply per disk kind.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.UpdateDisk
+ */
+ updateDisk: {
+ methodKind: "unary";
+ input: typeof MVMServiceUpdateDiskRequestSchema;
+ output: typeof MVMServiceUpdateDiskResponseSchema;
+ },
+ /**
+ * Cancels a data disk. OS and system disks cannot be deleted.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.DeleteDisk
+ */
+ deleteDisk: {
+ methodKind: "unary";
+ input: typeof MVMServiceDeleteDiskRequestSchema;
+ output: typeof MVMServiceDeleteDiskResponseSchema;
+ },
+ /**
+ * Orders an additional network interface for a MVM.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.AddNetworkInterface
+ */
+ addNetworkInterface: {
+ methodKind: "unary";
+ input: typeof MVMServiceAddNetworkInterfaceRequestSchema;
+ output: typeof MVMServiceAddNetworkInterfaceResponseSchema;
+ },
+ /**
+ * Moves a network interface from one MVM to another.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.MoveNetworkInterface
+ */
+ moveNetworkInterface: {
+ methodKind: "unary";
+ input: typeof MVMServiceMoveNetworkInterfaceRequestSchema;
+ output: typeof MVMServiceMoveNetworkInterfaceResponseSchema;
+ },
+ /**
+ * Deletes a network interface from a MVM.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.DeleteNetworkInterface
+ */
+ deleteNetworkInterface: {
+ methodKind: "unary";
+ input: typeof MVMServiceDeleteNetworkInterfaceRequestSchema;
+ output: typeof MVMServiceDeleteNetworkInterfaceResponseSchema;
+ },
+ /**
+ * Validates a MVM create request without creating anything. Intended for
+ * form pre-checks; the create endpoint validates again before executing.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.ValidateCreate
+ */
+ validateCreate: {
+ methodKind: "unary";
+ input: typeof MVMServiceValidateCreateRequestSchema;
+ output: typeof MVMServiceValidateCreateResponseSchema;
+ },
+ /**
+ * Validates an AddDisk request without ordering anything.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.ValidateAddDisk
+ */
+ validateAddDisk: {
+ methodKind: "unary";
+ input: typeof MVMServiceValidateAddDiskRequestSchema;
+ output: typeof MVMServiceValidateAddDiskResponseSchema;
+ },
+ /**
+ * Validates an UpdateDisk request without changing anything.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.ValidateUpdateDisk
+ */
+ validateUpdateDisk: {
+ methodKind: "unary";
+ input: typeof MVMServiceValidateUpdateDiskRequestSchema;
+ output: typeof MVMServiceValidateUpdateDiskResponseSchema;
+ },
+ /**
+ * Validates an AddNetworkInterface request without ordering anything.
+ *
+ * @generated from rpc fits.api.mvm.v1.MVMService.ValidateAddNetworkInterface
+ */
+ validateAddNetworkInterface: {
+ methodKind: "unary";
+ input: typeof MVMServiceValidateAddNetworkInterfaceRequestSchema;
+ output: typeof MVMServiceValidateAddNetworkInterfaceResponseSchema;
+ },
+}> = /*@__PURE__*/
+ serviceDesc(file_fits_api_mvm_v1_mvm, 0);
+
diff --git a/js/fits/api/mvm/v1/os_pb.ts b/js/fits/api/mvm/v1/os_pb.ts
new file mode 100644
index 0000000..8fead4b
--- /dev/null
+++ b/js/fits/api/mvm/v1/os_pb.ts
@@ -0,0 +1,141 @@
+// @generated by protoc-gen-es v2.14.1 with parameter "target=ts"
+// @generated from file fits/api/mvm/v1/os.proto (package fits.api.mvm.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
+import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb";
+import { file_fits_api_v1_common } from "../../v1/common_pb";
+import { file_fits_api_v1_predefined_rules } from "../../v1/predefined_rules_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file fits/api/mvm/v1/os.proto.
+ */
+export const file_fits_api_mvm_v1_os: GenFile = /*@__PURE__*/
+ fileDesc("ChhmaXRzL2FwaS9tdm0vdjEvb3MucHJvdG8SD2ZpdHMuYXBpLm12bS52MSJfCgJPUxIWCgR1dWlkGAEgASgJQgi6SAVyA7ABARIaCgV0aXRsZRgCIAEoCUILukgIcgbAs66xAgESJQoEdHlwZRgDIAEoDjIXLmZpdHMuYXBpLm12bS52MS5PU1R5cGUiFgoUT1NTZXJ2aWNlTGlzdFJlcXVlc3QiRwoVT1NTZXJ2aWNlTGlzdFJlc3BvbnNlEi4KEW9wZXJhdGluZ19zeXN0ZW1zGAEgAygLMhMuZml0cy5hcGkubXZtLnYxLk9TKmcKBk9TVHlwZRIdChNPU19UWVBFX1VOU1BFQ0lGSUVEEAAaBIKyGQASHAoNT1NfVFlQRV9MSU5VWBABGgmCshkFbGludXgSIAoPT1NfVFlQRV9XSU5ET1dTEAIaC4KyGQd3aW5kb3dzMmwKCU9TU2VydmljZRJfCgRMaXN0EiUuZml0cy5hcGkubXZtLnYxLk9TU2VydmljZUxpc3RSZXF1ZXN0GiYuZml0cy5hcGkubXZtLnYxLk9TU2VydmljZUxpc3RSZXNwb25zZSII2PMYAuDzGAJCrAEKE2NvbS5maXRzLmFwaS5tdm0udjFCB09zUHJvdG9QAVotZ2l0aHViLmNvbS9maS10cy9hcGkvZ28vZml0cy9hcGkvbXZtL3YxO212bXYxogIDRkFNqgIPRml0cy5BcGkuTXZtLlYxygIPRml0c1xBcGlcTXZtXFYx4gIbRml0c1xBcGlcTXZtXFYxXEdQQk1ldGFkYXRh6gISRml0czo6QXBpOjpNdm06OlYxYgZwcm90bzM", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
+
+/**
+ * OS is the definition of an available OS for MVM instances.
+ *
+ * @generated from message fits.api.mvm.v1.OS
+ */
+export type OS = Message<"fits.api.mvm.v1.OS"> & {
+ /**
+ * Uuid of this OS.
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * Title of the OS.
+ *
+ * @generated from field: string title = 2;
+ */
+ title: string;
+
+ /**
+ * Type of the OS.
+ *
+ * @generated from field: fits.api.mvm.v1.OSType type = 3;
+ */
+ type: OSType;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.OS.
+ * Use `create(OSSchema)` to create a new message.
+ */
+export const OSSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_os, 0);
+
+/**
+ * OSServiceListRequest is the request payload for a OS list request.
+ *
+ * @generated from message fits.api.mvm.v1.OSServiceListRequest
+ */
+export type OSServiceListRequest = Message<"fits.api.mvm.v1.OSServiceListRequest"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.OSServiceListRequest.
+ * Use `create(OSServiceListRequestSchema)` to create a new message.
+ */
+export const OSServiceListRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_os, 1);
+
+/**
+ * OSServiceListResponse is the response payload for a OS list request
+ *
+ * @generated from message fits.api.mvm.v1.OSServiceListResponse
+ */
+export type OSServiceListResponse = Message<"fits.api.mvm.v1.OSServiceListResponse"> & {
+ /**
+ * The available operating systems.
+ *
+ * @generated from field: repeated fits.api.mvm.v1.OS operating_systems = 1;
+ */
+ operatingSystems: OS[];
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.OSServiceListResponse.
+ * Use `create(OSServiceListResponseSchema)` to create a new message.
+ */
+export const OSServiceListResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_os, 2);
+
+/**
+ * OSType specifies the type of an operating system.
+ *
+ * @generated from enum fits.api.mvm.v1.OSType
+ */
+export enum OSType {
+ /**
+ * OS_TYPE_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: OS_TYPE_UNSPECIFIED = 0;
+ */
+ OS_TYPE_UNSPECIFIED = 0,
+
+ /**
+ * OS_TYPE_LINUX is a Linux operating system.
+ *
+ * @generated from enum value: OS_TYPE_LINUX = 1;
+ */
+ OS_TYPE_LINUX = 1,
+
+ /**
+ * OS_TYPE_WINDOWS is a Windows operating system.
+ *
+ * @generated from enum value: OS_TYPE_WINDOWS = 2;
+ */
+ OS_TYPE_WINDOWS = 2,
+}
+
+/**
+ * Describes the enum fits.api.mvm.v1.OSType.
+ */
+export const OSTypeSchema: GenEnum = /*@__PURE__*/
+ enumDesc(file_fits_api_mvm_v1_os, 0);
+
+/**
+ * OSService lists operating systems available for managed VM (MVM) instances.
+ *
+ * @generated from service fits.api.mvm.v1.OSService
+ */
+export const OSService: GenService<{
+ /**
+ * Returns a list of all operating systems.
+ *
+ * @generated from rpc fits.api.mvm.v1.OSService.List
+ */
+ list: {
+ methodKind: "unary";
+ input: typeof OSServiceListRequestSchema;
+ output: typeof OSServiceListResponseSchema;
+ },
+}> = /*@__PURE__*/
+ serviceDesc(file_fits_api_mvm_v1_os, 0);
+
diff --git a/js/fits/api/mvm/v1/stagetype_pb.ts b/js/fits/api/mvm/v1/stagetype_pb.ts
new file mode 100644
index 0000000..b6d3e0c
--- /dev/null
+++ b/js/fits/api/mvm/v1/stagetype_pb.ts
@@ -0,0 +1,101 @@
+// @generated by protoc-gen-es v2.14.1 with parameter "target=ts"
+// @generated from file fits/api/mvm/v1/stagetype.proto (package fits.api.mvm.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
+import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb";
+import { file_fits_api_v1_common } from "../../v1/common_pb";
+import { file_fits_api_v1_predefined_rules } from "../../v1/predefined_rules_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file fits/api/mvm/v1/stagetype.proto.
+ */
+export const file_fits_api_mvm_v1_stagetype: GenFile = /*@__PURE__*/
+ fileDesc("Ch9maXRzL2FwaS9tdm0vdjEvc3RhZ2V0eXBlLnByb3RvEg9maXRzLmFwaS5tdm0udjEiPwoJU3RhZ2VUeXBlEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEhoKBXRpdGxlGAIgASgJQgu6SAhyBsCzrrECASIdChtTdGFnZVR5cGVTZXJ2aWNlTGlzdFJlcXVlc3QiTwocU3RhZ2VUeXBlU2VydmljZUxpc3RSZXNwb25zZRIvCgtzdGFnZV90eXBlcxgBIAMoCzIaLmZpdHMuYXBpLm12bS52MS5TdGFnZVR5cGUyhAEKEFN0YWdlVHlwZVNlcnZpY2UScAoETGlzdBIsLmZpdHMuYXBpLm12bS52MS5TdGFnZVR5cGVTZXJ2aWNlTGlzdFJlcXVlc3QaLS5maXRzLmFwaS5tdm0udjEuU3RhZ2VUeXBlU2VydmljZUxpc3RSZXNwb25zZSILyvMYAwECA+DzGAJCswEKE2NvbS5maXRzLmFwaS5tdm0udjFCDlN0YWdldHlwZVByb3RvUAFaLWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL212bS92MTttdm12MaICA0ZBTaoCD0ZpdHMuQXBpLk12bS5WMcoCD0ZpdHNcQXBpXE12bVxWMeICG0ZpdHNcQXBpXE12bVxWMVxHUEJNZXRhZGF0YeoCEkZpdHM6OkFwaTo6TXZtOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
+
+/**
+ * StageType is the definition of available stage types. (Development, Test, Integration, Production)
+ *
+ * @generated from message fits.api.mvm.v1.StageType
+ */
+export type StageType = Message<"fits.api.mvm.v1.StageType"> & {
+ /**
+ * Uuid of this stage type
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * title of the stage type
+ *
+ * @generated from field: string title = 2;
+ */
+ title: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.StageType.
+ * Use `create(StageTypeSchema)` to create a new message.
+ */
+export const StageTypeSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_stagetype, 0);
+
+/**
+ * StageTypeServiceListRequest is the request payload for a stage type list request.
+ *
+ * @generated from message fits.api.mvm.v1.StageTypeServiceListRequest
+ */
+export type StageTypeServiceListRequest = Message<"fits.api.mvm.v1.StageTypeServiceListRequest"> & {
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.StageTypeServiceListRequest.
+ * Use `create(StageTypeServiceListRequestSchema)` to create a new message.
+ */
+export const StageTypeServiceListRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_stagetype, 1);
+
+/**
+ * StageTypeServiceListResponse is the response payload for a stage type list request
+ *
+ * @generated from message fits.api.mvm.v1.StageTypeServiceListResponse
+ */
+export type StageTypeServiceListResponse = Message<"fits.api.mvm.v1.StageTypeServiceListResponse"> & {
+ /**
+ * The available stage types
+ *
+ * @generated from field: repeated fits.api.mvm.v1.StageType stage_types = 1;
+ */
+ stageTypes: StageType[];
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.StageTypeServiceListResponse.
+ * Use `create(StageTypeServiceListResponseSchema)` to create a new message.
+ */
+export const StageTypeServiceListResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_stagetype, 2);
+
+/**
+ * TODO: this type may be completely removed, as VLANs could be project-scoped
+ * StageTypeService lists stage types available for managed VM (MVM) instances.
+ *
+ * @generated from service fits.api.mvm.v1.StageTypeService
+ */
+export const StageTypeService: GenService<{
+ /**
+ * Returns a list of all stage types available for a tenant.
+ *
+ * @generated from rpc fits.api.mvm.v1.StageTypeService.List
+ */
+ list: {
+ methodKind: "unary";
+ input: typeof StageTypeServiceListRequestSchema;
+ output: typeof StageTypeServiceListResponseSchema;
+ },
+}> = /*@__PURE__*/
+ serviceDesc(file_fits_api_mvm_v1_stagetype, 0);
+
diff --git a/js/fits/api/mvm/v1/vlan_pb.ts b/js/fits/api/mvm/v1/vlan_pb.ts
new file mode 100644
index 0000000..c44c8cb
--- /dev/null
+++ b/js/fits/api/mvm/v1/vlan_pb.ts
@@ -0,0 +1,145 @@
+// @generated by protoc-gen-es v2.14.1 with parameter "target=ts"
+// @generated from file fits/api/mvm/v1/vlan.proto (package fits.api.mvm.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
+import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../../buf/validate/validate_pb";
+import { file_fits_api_v1_common } from "../../v1/common_pb";
+import { file_fits_api_v1_predefined_rules } from "../../v1/predefined_rules_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file fits/api/mvm/v1/vlan.proto.
+ */
+export const file_fits_api_mvm_v1_vlan: GenFile = /*@__PURE__*/
+ fileDesc("ChpmaXRzL2FwaS9tdm0vdjEvdmxhbi5wcm90bxIPZml0cy5hcGkubXZtLnYxIuwBCgRWTEFOEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEg8KB3ZsYW5faWQYAiABKAUSIQoMc3VibmV0X3RpdGxlGAMgASgJQgu6SAhyBsCzrrECARIgCgtzdWJuZXRfY2lkchgEIAEoCUILukgIcgb4s66xAgESJAoNbG9jYXRpb25fdXVpZBgKIAEoCUIIukgFcgOwAQFIAIgBARIhCg9zdGFnZV90eXBlX3V1aWQYCyABKAlCCLpIBXIDsAEBEhsKBnRlbmFudBgMIAEoCUILukgIcgbAs66xAgFCEAoOX2xvY2F0aW9uX3V1aWQiNQoWVkxBTlNlcnZpY2VMaXN0UmVxdWVzdBIbCgZ0ZW5hbnQYASABKAlCC7pICHIGwLOusQIBIj8KF1ZMQU5TZXJ2aWNlTGlzdFJlc3BvbnNlEiQKBXZsYW5zGAEgAygLMhUuZml0cy5hcGkubXZtLnYxLlZMQU4ydQoLVkxBTlNlcnZpY2USZgoETGlzdBInLmZpdHMuYXBpLm12bS52MS5WTEFOU2VydmljZUxpc3RSZXF1ZXN0GiguZml0cy5hcGkubXZtLnYxLlZMQU5TZXJ2aWNlTGlzdFJlc3BvbnNlIgvC8xgDAQID4PMYAkKuAQoTY29tLmZpdHMuYXBpLm12bS52MUIJVmxhblByb3RvUAFaLWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL212bS92MTttdm12MaICA0ZBTaoCD0ZpdHMuQXBpLk12bS5WMcoCD0ZpdHNcQXBpXE12bVxWMeICG0ZpdHNcQXBpXE12bVxWMVxHUEJNZXRhZGF0YeoCEkZpdHM6OkFwaTo6TXZtOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
+
+/**
+ * VLAN is a VLAN that a MVM can be connected to.
+ *
+ * @generated from message fits.api.mvm.v1.VLAN
+ */
+export type VLAN = Message<"fits.api.mvm.v1.VLAN"> & {
+ /**
+ * Uuid of this VLAN
+ *
+ * @generated from field: string uuid = 1;
+ */
+ uuid: string;
+
+ /**
+ * Id of this VLAN
+ * This is not a foreign key, this is the actual ID of the VLAN the network interface is attached to.
+ *
+ * @generated from field: int32 vlan_id = 2;
+ */
+ vlanId: number;
+
+ /**
+ * Title of the subnet this VLAN belongs to
+ *
+ * @generated from field: string subnet_title = 3;
+ */
+ subnetTitle: string;
+
+ /**
+ * CIDR of the subnet this VLAN belongs to
+ *
+ * @generated from field: string subnet_cidr = 4;
+ */
+ subnetCidr: string;
+
+ /**
+ * TODO instead of the pod title, could we have the location_uuid?
+ *
+ * @generated from field: optional string location_uuid = 10;
+ */
+ locationUuid?: string | undefined;
+
+ /**
+ * TODO: instead of a stage type, this should be mapped to a project.
+ * TODO: this would have to be re-mapped in the customer onboarding
+ * Uuid of the stage type of this VLAN
+ *
+ * @generated from field: string stage_type_uuid = 11;
+ */
+ stageTypeUuid: string;
+
+ /**
+ * Tenant this VLAN belongs to.
+ *
+ * @generated from field: string tenant = 12;
+ */
+ tenant: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.VLAN.
+ * Use `create(VLANSchema)` to create a new message.
+ */
+export const VLANSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_vlan, 0);
+
+/**
+ * VLANServiceListRequest is the request payload for a VLAN list request.
+ *
+ * @generated from message fits.api.mvm.v1.VLANServiceListRequest
+ */
+export type VLANServiceListRequest = Message<"fits.api.mvm.v1.VLANServiceListRequest"> & {
+ /**
+ * Tenant to list available VLANs for
+ * TODO should be filtered by project instead, see https://github.com/fi-ts/fco-apiserver/issues/39
+ *
+ * @generated from field: string tenant = 1;
+ */
+ tenant: string;
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.VLANServiceListRequest.
+ * Use `create(VLANServiceListRequestSchema)` to create a new message.
+ */
+export const VLANServiceListRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_vlan, 1);
+
+/**
+ * VLANServiceListResponse is the response payload for a VLAN list request
+ *
+ * @generated from message fits.api.mvm.v1.VLANServiceListResponse
+ */
+export type VLANServiceListResponse = Message<"fits.api.mvm.v1.VLANServiceListResponse"> & {
+ /**
+ * The available VLANs
+ *
+ * @generated from field: repeated fits.api.mvm.v1.VLAN vlans = 1;
+ */
+ vlans: VLAN[];
+};
+
+/**
+ * Describes the message fits.api.mvm.v1.VLANServiceListResponse.
+ * Use `create(VLANServiceListResponseSchema)` to create a new message.
+ */
+export const VLANServiceListResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_fits_api_mvm_v1_vlan, 2);
+
+/**
+ * VLANService lists VLANs available for managed VM (MVM) instances.
+ *
+ * @generated from service fits.api.mvm.v1.VLANService
+ */
+export const VLANService: GenService<{
+ /**
+ * Returns a list of all VLANs available for a tenant.
+ *
+ * @generated from rpc fits.api.mvm.v1.VLANService.List
+ */
+ list: {
+ methodKind: "unary";
+ input: typeof VLANServiceListRequestSchema;
+ output: typeof VLANServiceListResponseSchema;
+ },
+}> = /*@__PURE__*/
+ serviceDesc(file_fits_api_mvm_v1_vlan, 0);
+
diff --git a/js/fits/api/v1/predefined_rules_pb.ts b/js/fits/api/v1/predefined_rules_pb.ts
index 695cce4..14f2918 100644
--- a/js/fits/api/v1/predefined_rules_pb.ts
+++ b/js/fits/api/v1/predefined_rules_pb.ts
@@ -11,7 +11,7 @@ import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
* Describes the file fits/api/v1/predefined_rules.proto.
*/
export const file_fits_api_v1_predefined_rules: GenFile = /*@__PURE__*/
- fileDesc("CiJmaXRzL2FwaS92MS9wcmVkZWZpbmVkX3J1bGVzLnByb3RvEgtmaXRzLmFwaS52MTq4AQoKbWFjYWRkcmVzcxIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi35pUmIAEoCEJ6wkh3CnUKEXN0cmluZy5tYWNhZGRyZXNzEiZ0aGlzIHN0cmluZyBtdXN0IGJlIGEgdmFsaWQgbWFjYWRkcmVzcxo4dGhpcy5tYXRjaGVzKCdeKFswLTlBLUZhLWZdezJ9WzpdKXs1fShbMC05QS1GYS1mXXsyfSkkJylSCm1hY2FkZHJlc3M6mQEKB2lzX25hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuOaVJiABKAhCYsJIXwpdCg5zdHJpbmcuaXNfbmFtZRIjbXVzdCBiZSB3aXRoaW4gMiBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDIgJiYgdGhpcy5zaXplKCkgPD0gMTI4UgZpc05hbWU6mgEKDmlzX2Rlc2NyaXB0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGLnmlSYgASgIQlXCSFIKUAoVc3RyaW5nLmlzX2Rlc2NyaXB0aW9uEiNtdXN0IGJlIHNob3J0ZXIgdGhhbiAyNTYgY2hhcmFjdGVycxoSdGhpcy5zaXplKCkgPD0gMjU2Ug1pc0Rlc2NyaXB0aW9uOqgBCgxpc19wYXJ0aXRpb24SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuuaVJiABKAhCZ8JIZApiChNzdHJpbmcuaXNfcGFydGl0aW9uEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAxMjggY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAxMjhSC2lzUGFydGl0aW9uOoIBCglpc19wcmVmaXgSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYu+aVJiABKAhCR8JIRApCCg9zdHJpbmcucHJlZml4ZXMSHGdpdmVuIHByZWZpeGVzIG11c3QgYmUgdmFsaWQaEXRoaXMuaXNJcFByZWZpeCgpUghpc1ByZWZpeDptCgZpc191cmkSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYvOaVJiABKAhCOMJINQozCgpzdHJpbmcudXJpEhdnaXZlbiB1cmkgbXVzdCBiZSB2YWxpZBoMdGhpcy5pc1VyaSgpUgVpc1VyaTqnAQoRaXNfaXBfb3JfaG9zdG5hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYveaVJiABKAhCXsJIWwpZCg12YWxpZF9hZGRyZXNzEiZtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcyBvciBob3N0bmFtZRogdGhpcy5pc0lwKCkgfHwgdGhpcy5pc0hvc3RuYW1lKClSDmlzSXBPckhvc3RuYW1lOp0BCgd0cmltbWVkEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGL7mlSYgASgIQmXCSGIKYAoOc3RyaW5nLnRyaW1tZWQSK3ZhbHVlIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaIXRoaXMudHJpbSgpLnNpemUoKSA9PSB0aGlzLnNpemUoKVIHdHJpbW1lZDqPAQoIcHJlZml4ZXMSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjHtJYmIAEoCEJTwkhQCk4KEXJlcGVhdGVkLnByZWZpeGVzEhxnaXZlbiBwcmVmaXhlcyBtdXN0IGJlIHZhbGlkGht0aGlzLmFsbChtLCBtLmlzSXBQcmVmaXgoKSlSCHByZWZpeGVzOnUKA2lwcxIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzGMi0liYgASgIQkPCSEAKPgoMcmVwZWF0ZWQuaXBzEhdnaXZlbiBpcHMgbXVzdCBiZSB2YWxpZBoVdGhpcy5hbGwobSwgbS5pc0lwKCkpUgNpcHM65gEKEWFyZV9ob3N0X2FuZF9wb3J0EhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYybSWJiABKAhCmgHCSJYBCpMBChpyZXBlYXRlZC5hcmVfaG9zdF9hbmRfcG9ydBJQZ2l2ZW4gZW50cmllcyBtdXN0IGFsbCBiZSBpbiB0aGUgZm9ybSBvZiA8aXAgfCBob3N0Pjo8cG9ydD4gYnV0IHBvcnQgaXMgb3B0aW9uYWwaI3RoaXMuYWxsKG0sIG0uaXNIb3N0QW5kUG9ydChmYWxzZSkpUg5hcmVIb3N0QW5kUG9ydDq6AQoLYWxsX3RyaW1tZWQSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjKtJYmIAEoCEJ5wkh2CnQKFHJlcGVhdGVkLmFsbF90cmltbWVkEjJnaXZlbiB2YWx1ZXMgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZRoodGhpcy5hbGwobSwgbS50cmltKCkuc2l6ZSgpID09IG0uc2l6ZSgpKVIKYWxsVHJpbW1lZDqEAgoXa2V5c19hbmRfdmFsdWVzX3RyaW1tZWQSFi5idWYudmFsaWRhdGUuTWFwUnVsZXMY14KXJiABKAhCsQHCSK0BCqoBChttYXAua2V5c19hbmRfdmFsdWVzX3RyaW1tZWQSNWtleXMgYW5kIHZhbHVlcyBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlGlR0aGlzLmFsbChrLCBrLnRyaW0oKS5zaXplKCkgPT0gay5zaXplKCkpICYmIHRoaXMuYWxsKHYsIHYudHJpbSgpLnNpemUoKSA9PSB2LnNpemUoKSlSFGtleXNBbmRWYWx1ZXNUcmltbWVkOqsBCgxrZXlzX3RyaW1tZWQSFi5idWYudmFsaWRhdGUuTWFwUnVsZXMY2IKXJiABKAhCbcJIagpoChBtYXAua2V5c190cmltbWVkEiprZXlzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaKHRoaXMuYWxsKGssIGsudHJpbSgpLnNpemUoKSA9PSBrLnNpemUoKSlSC2tleXNUcmltbWVkQqABCg9jb20uZml0cy5hcGkudjFCFFByZWRlZmluZWRSdWxlc1Byb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMQ", [file_buf_validate_validate]);
+ fileDesc("CiJmaXRzL2FwaS92MS9wcmVkZWZpbmVkX3J1bGVzLnByb3RvEgtmaXRzLmFwaS52MTq4AQoKbWFjYWRkcmVzcxIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi35pUmIAEoCEJ6wkh3CnUKEXN0cmluZy5tYWNhZGRyZXNzEiZ0aGlzIHN0cmluZyBtdXN0IGJlIGEgdmFsaWQgbWFjYWRkcmVzcxo4dGhpcy5tYXRjaGVzKCdeKFswLTlBLUZhLWZdezJ9WzpdKXs1fShbMC05QS1GYS1mXXsyfSkkJylSCm1hY2FkZHJlc3M6mQEKB2lzX25hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuOaVJiABKAhCYsJIXwpdCg5zdHJpbmcuaXNfbmFtZRIjbXVzdCBiZSB3aXRoaW4gMiBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDIgJiYgdGhpcy5zaXplKCkgPD0gMTI4UgZpc05hbWU6mgEKDmlzX2Rlc2NyaXB0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGLnmlSYgASgIQlXCSFIKUAoVc3RyaW5nLmlzX2Rlc2NyaXB0aW9uEiNtdXN0IGJlIHNob3J0ZXIgdGhhbiAyNTYgY2hhcmFjdGVycxoSdGhpcy5zaXplKCkgPD0gMjU2Ug1pc0Rlc2NyaXB0aW9uOqgBCgxpc19wYXJ0aXRpb24SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuuaVJiABKAhCZ8JIZApiChNzdHJpbmcuaXNfcGFydGl0aW9uEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAxMjggY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAxMjhSC2lzUGFydGl0aW9uOoIBCglpc19wcmVmaXgSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYu+aVJiABKAhCR8JIRApCCg9zdHJpbmcucHJlZml4ZXMSHGdpdmVuIHByZWZpeGVzIG11c3QgYmUgdmFsaWQaEXRoaXMuaXNJcFByZWZpeCgpUghpc1ByZWZpeDptCgZpc191cmkSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYvOaVJiABKAhCOMJINQozCgpzdHJpbmcudXJpEhdnaXZlbiB1cmkgbXVzdCBiZSB2YWxpZBoMdGhpcy5pc1VyaSgpUgVpc1VyaTqnAQoRaXNfaXBfb3JfaG9zdG5hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYveaVJiABKAhCXsJIWwpZCg12YWxpZF9hZGRyZXNzEiZtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcyBvciBob3N0bmFtZRogdGhpcy5pc0lwKCkgfHwgdGhpcy5pc0hvc3RuYW1lKClSDmlzSXBPckhvc3RuYW1lOp0BCgd0cmltbWVkEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGL7mlSYgASgIQmXCSGIKYAoOc3RyaW5nLnRyaW1tZWQSK3ZhbHVlIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaIXRoaXMudHJpbSgpLnNpemUoKSA9PSB0aGlzLnNpemUoKVIHdHJpbW1lZDqxAQoMaXNfaXB2NF9jaWRyEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGL/mlSYgASgIQnHCSG4KbAoTc3RyaW5nLmlzX2lwdjRfY2lkchIrbXVzdCBiZSBhIHZhbGlkIElQdjQgQ0lEUiwgZS5nLiAxMC4wLjAuMC8yNBoodGhpcy5pc0lwUHJlZml4KCkgJiYgIXRoaXMuY29udGFpbnMoJzonKVIKaXNJcHY0Q2lkcjqPAQoIcHJlZml4ZXMSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjHtJYmIAEoCEJTwkhQCk4KEXJlcGVhdGVkLnByZWZpeGVzEhxnaXZlbiBwcmVmaXhlcyBtdXN0IGJlIHZhbGlkGht0aGlzLmFsbChtLCBtLmlzSXBQcmVmaXgoKSlSCHByZWZpeGVzOnUKA2lwcxIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzGMi0liYgASgIQkPCSEAKPgoMcmVwZWF0ZWQuaXBzEhdnaXZlbiBpcHMgbXVzdCBiZSB2YWxpZBoVdGhpcy5hbGwobSwgbS5pc0lwKCkpUgNpcHM65gEKEWFyZV9ob3N0X2FuZF9wb3J0EhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYybSWJiABKAhCmgHCSJYBCpMBChpyZXBlYXRlZC5hcmVfaG9zdF9hbmRfcG9ydBJQZ2l2ZW4gZW50cmllcyBtdXN0IGFsbCBiZSBpbiB0aGUgZm9ybSBvZiA8aXAgfCBob3N0Pjo8cG9ydD4gYnV0IHBvcnQgaXMgb3B0aW9uYWwaI3RoaXMuYWxsKG0sIG0uaXNIb3N0QW5kUG9ydChmYWxzZSkpUg5hcmVIb3N0QW5kUG9ydDq6AQoLYWxsX3RyaW1tZWQSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjKtJYmIAEoCEJ5wkh2CnQKFHJlcGVhdGVkLmFsbF90cmltbWVkEjJnaXZlbiB2YWx1ZXMgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZRoodGhpcy5hbGwobSwgbS50cmltKCkuc2l6ZSgpID09IG0uc2l6ZSgpKVIKYWxsVHJpbW1lZDqEAgoXa2V5c19hbmRfdmFsdWVzX3RyaW1tZWQSFi5idWYudmFsaWRhdGUuTWFwUnVsZXMY14KXJiABKAhCsQHCSK0BCqoBChttYXAua2V5c19hbmRfdmFsdWVzX3RyaW1tZWQSNWtleXMgYW5kIHZhbHVlcyBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlGlR0aGlzLmFsbChrLCBrLnRyaW0oKS5zaXplKCkgPT0gay5zaXplKCkpICYmIHRoaXMuYWxsKHYsIHYudHJpbSgpLnNpemUoKSA9PSB2LnNpemUoKSlSFGtleXNBbmRWYWx1ZXNUcmltbWVkOqsBCgxrZXlzX3RyaW1tZWQSFi5idWYudmFsaWRhdGUuTWFwUnVsZXMY2IKXJiABKAhCbcJIagpoChBtYXAua2V5c190cmltbWVkEiprZXlzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaKHRoaXMuYWxsKGssIGsudHJpbSgpLnNpemUoKSA9PSBrLnNpemUoKSlSC2tleXNUcmltbWVkQqABCg9jb20uZml0cy5hcGkudjFCFFByZWRlZmluZWRSdWxlc1Byb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMQ", [file_buf_validate_validate]);
/**
* Macaddress returns true if the given string is a valid macadress
@@ -77,13 +77,21 @@ export const is_ip_or_hostname: GenExtension = /*@__PURE__
export const trimmed: GenExtension = /*@__PURE__*/
extDesc(file_fits_api_v1_predefined_rules, 7);
+/**
+ * IsIpv4Cidr validates if the given string is a valid IPv4 CIDR, e.g. 10.0.0.0/24
+ *
+ * @generated from extension: optional bool is_ipv4_cidr = 80048959;
+ */
+export const is_ipv4_cidr: GenExtension = /*@__PURE__*/
+ extDesc(file_fits_api_v1_predefined_rules, 8);
+
/**
* Prefixes validates if a slice of prefixes in string form are valid
*
* @generated from extension: optional bool prefixes = 80058951;
*/
export const prefixes: GenExtension = /*@__PURE__*/
- extDesc(file_fits_api_v1_predefined_rules, 8);
+ extDesc(file_fits_api_v1_predefined_rules, 9);
/**
* Ips validates if a slice of ips in string form are valid
@@ -91,7 +99,7 @@ export const prefixes: GenExtension = /*@__PURE__*/
* @generated from extension: optional bool ips = 80058952;
*/
export const ips: GenExtension = /*@__PURE__*/
- extDesc(file_fits_api_v1_predefined_rules, 9);
+ extDesc(file_fits_api_v1_predefined_rules, 10);
/**
* AreHostAndPort validates if a slice of strings are all in the form of :
@@ -99,7 +107,7 @@ export const ips: GenExtension = /*@__PURE__*/
* @generated from extension: optional bool are_host_and_port = 80058953;
*/
export const are_host_and_port: GenExtension = /*@__PURE__*/
- extDesc(file_fits_api_v1_predefined_rules, 10);
+ extDesc(file_fits_api_v1_predefined_rules, 11);
/**
* All Trimmed enforces all strings to be trimmed, e.g. no whitespaces at the begin and end
@@ -107,7 +115,7 @@ export const are_host_and_port: GenExtension = /*@__PURE
* @generated from extension: optional bool all_trimmed = 80058954;
*/
export const all_trimmed: GenExtension = /*@__PURE__*/
- extDesc(file_fits_api_v1_predefined_rules, 11);
+ extDesc(file_fits_api_v1_predefined_rules, 12);
/**
* Keys and Values trimmed enforces all map keys and values to be trimmed, e.g. no whitespaces at the begin and end
@@ -115,7 +123,7 @@ export const all_trimmed: GenExtension = /*@__PURE__*/
* @generated from extension: optional bool keys_and_values_trimmed = 80068951;
*/
export const keys_and_values_trimmed: GenExtension = /*@__PURE__*/
- extDesc(file_fits_api_v1_predefined_rules, 12);
+ extDesc(file_fits_api_v1_predefined_rules, 13);
/**
* Keys trimmed enforces all map keys and values to be trimmed, e.g. no whitespaces at the begin and end
@@ -123,5 +131,5 @@ export const keys_and_values_trimmed: GenExtension = /*@__PUR
* @generated from extension: optional bool keys_trimmed = 80068952;
*/
export const keys_trimmed: GenExtension = /*@__PURE__*/
- extDesc(file_fits_api_v1_predefined_rules, 13);
+ extDesc(file_fits_api_v1_predefined_rules, 14);
diff --git a/js/fits/api/v1/project_pb.js b/js/fits/api/v1/project_pb.js
index d24ede8..916907a 100644
--- a/js/fits/api/v1/project_pb.js
+++ b/js/fits/api/v1/project_pb.js
@@ -5,11 +5,10 @@ import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2
import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import { file_fits_api_v1_common } from "./common_pb";
import { file_fits_api_v1_predefined_rules } from "./predefined_rules_pb";
-import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
/**
* Describes the file fits/api/v1/project.proto.
*/
-export const file_fits_api_v1_project = /*@__PURE__*/ fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSKtAQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBQg0KC19hdmF0YXJfdXJsIr4BChlQcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIgCgZ0ZW5hbnQYAyABKAlCC7pICHIGwLOusQIBSAKIAQESKAoGbGFiZWxzGAQgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzSAOIAQFCBQoDX2lkQgcKBV9uYW1lQgkKB190ZW5hbnRCCQoHX2xhYmVscyJEChpQcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZRImCghwcm9qZWN0cxgBIAMoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiNQoYUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBIkIKGVByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiwwEKG1Byb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBIaCgVsb2dpbhgBIAEoCUILukgIcgbAs66xAgESGQoEbmFtZRgCIAEoCUILukgIcgbAs66xAgESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEhcKCmF2YXRhcl91cmwYBCABKAlIAIgBARIjCgZsYWJlbHMYBSABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNCDQoLX2F2YXRhcl91cmwiRQocUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCI4ChtQcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiRQocUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCKxAgobUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESJQoLZGVzY3JpcHRpb24YBCABKAlCC7pICHIGyLOusQIBSAGIAQESFwoKYXZhdGFyX3VybBgFIAEoCUgCiAEBEi4KBmxhYmVscxgGIAEoCzIZLmZpdHMuYXBpLnYxLlVwZGF0ZUxhYmVsc0gDiAEBQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIkUKHFByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QylgQKDlByb2plY3RTZXJ2aWNlEmEKBExpc3QSJi5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0GicuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgCEmEKA0dldBIlLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVxdWVzdBomLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2UiC8rzGAMBAgPg8xgCEmkKBkNyZWF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCsLzGAIBAuDzGAESaAoGRGVsZXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZSIJyvMYAQHg8xgBEmkKBlVwZGF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2UiCsrzGAIBAuDzGAFCmAEKD2NvbS5maXRzLmFwaS52MUIMUHJvamVjdFByb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules, file_google_protobuf_timestamp]);
+export const file_fits_api_v1_project = /*@__PURE__*/ fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSKtAQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBQg0KC19hdmF0YXJfdXJsIr4BChlQcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIgCgZ0ZW5hbnQYAyABKAlCC7pICHIGwLOusQIBSAKIAQESKAoGbGFiZWxzGAQgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzSAOIAQFCBQoDX2lkQgcKBV9uYW1lQgkKB190ZW5hbnRCCQoHX2xhYmVscyJEChpQcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZRImCghwcm9qZWN0cxgBIAMoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiNQoYUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBIkIKGVByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiwwEKG1Byb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBIaCgVsb2dpbhgBIAEoCUILukgIcgbAs66xAgESGQoEbmFtZRgCIAEoCUILukgIcgbAs66xAgESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEhcKCmF2YXRhcl91cmwYBCABKAlIAIgBARIjCgZsYWJlbHMYBSABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNCDQoLX2F2YXRhcl91cmwiRQocUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCI4ChtQcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiRQocUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCKxAgobUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESJQoLZGVzY3JpcHRpb24YBCABKAlCC7pICHIGyLOusQIBSAGIAQESFwoKYXZhdGFyX3VybBgFIAEoCUgCiAEBEi4KBmxhYmVscxgGIAEoCzIZLmZpdHMuYXBpLnYxLlVwZGF0ZUxhYmVsc0gDiAEBQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIkUKHFByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QylgQKDlByb2plY3RTZXJ2aWNlEmEKBExpc3QSJi5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0GicuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgCEmEKA0dldBIlLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVxdWVzdBomLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2UiC8rzGAMBAgPg8xgCEmkKBkNyZWF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCsLzGAIBAuDzGAESaAoGRGVsZXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZSIJyvMYAQHg8xgBEmkKBlVwZGF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2UiCsrzGAIBAuDzGAFCmAEKD2NvbS5maXRzLmFwaS52MUIMUHJvamVjdFByb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
/**
* Describes the message fits.api.v1.Project.
* Use `create(ProjectSchema)` to create a new message.
diff --git a/js/fits/api/v1/project_pb.ts b/js/fits/api/v1/project_pb.ts
index 9af8676..033a721 100644
--- a/js/fits/api/v1/project_pb.ts
+++ b/js/fits/api/v1/project_pb.ts
@@ -8,14 +8,13 @@ import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import type { Labels, Meta, UpdateLabels, UpdateMeta } from "./common_pb";
import { file_fits_api_v1_common } from "./common_pb";
import { file_fits_api_v1_predefined_rules } from "./predefined_rules_pb";
-import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file fits/api/v1/project.proto.
*/
export const file_fits_api_v1_project: GenFile = /*@__PURE__*/
- fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSKtAQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBQg0KC19hdmF0YXJfdXJsIr4BChlQcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIgCgZ0ZW5hbnQYAyABKAlCC7pICHIGwLOusQIBSAKIAQESKAoGbGFiZWxzGAQgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzSAOIAQFCBQoDX2lkQgcKBV9uYW1lQgkKB190ZW5hbnRCCQoHX2xhYmVscyJEChpQcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZRImCghwcm9qZWN0cxgBIAMoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiNQoYUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBIkIKGVByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiwwEKG1Byb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBIaCgVsb2dpbhgBIAEoCUILukgIcgbAs66xAgESGQoEbmFtZRgCIAEoCUILukgIcgbAs66xAgESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEhcKCmF2YXRhcl91cmwYBCABKAlIAIgBARIjCgZsYWJlbHMYBSABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNCDQoLX2F2YXRhcl91cmwiRQocUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCI4ChtQcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiRQocUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCKxAgobUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESJQoLZGVzY3JpcHRpb24YBCABKAlCC7pICHIGyLOusQIBSAGIAQESFwoKYXZhdGFyX3VybBgFIAEoCUgCiAEBEi4KBmxhYmVscxgGIAEoCzIZLmZpdHMuYXBpLnYxLlVwZGF0ZUxhYmVsc0gDiAEBQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIkUKHFByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QylgQKDlByb2plY3RTZXJ2aWNlEmEKBExpc3QSJi5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0GicuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgCEmEKA0dldBIlLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVxdWVzdBomLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2UiC8rzGAMBAgPg8xgCEmkKBkNyZWF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCsLzGAIBAuDzGAESaAoGRGVsZXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZSIJyvMYAQHg8xgBEmkKBlVwZGF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2UiCsrzGAIBAuDzGAFCmAEKD2NvbS5maXRzLmFwaS52MUIMUHJvamVjdFByb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules, file_google_protobuf_timestamp]);
+ fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSKtAQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBQg0KC19hdmF0YXJfdXJsIr4BChlQcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIgCgZ0ZW5hbnQYAyABKAlCC7pICHIGwLOusQIBSAKIAQESKAoGbGFiZWxzGAQgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzSAOIAQFCBQoDX2lkQgcKBV9uYW1lQgkKB190ZW5hbnRCCQoHX2xhYmVscyJEChpQcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZRImCghwcm9qZWN0cxgBIAMoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiNQoYUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBIkIKGVByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiwwEKG1Byb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBIaCgVsb2dpbhgBIAEoCUILukgIcgbAs66xAgESGQoEbmFtZRgCIAEoCUILukgIcgbAs66xAgESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEhcKCmF2YXRhcl91cmwYBCABKAlIAIgBARIjCgZsYWJlbHMYBSABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNCDQoLX2F2YXRhcl91cmwiRQocUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCI4ChtQcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiRQocUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCKxAgobUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESJQoLZGVzY3JpcHRpb24YBCABKAlCC7pICHIGyLOusQIBSAGIAQESFwoKYXZhdGFyX3VybBgFIAEoCUgCiAEBEi4KBmxhYmVscxgGIAEoCzIZLmZpdHMuYXBpLnYxLlVwZGF0ZUxhYmVsc0gDiAEBQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIkUKHFByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QylgQKDlByb2plY3RTZXJ2aWNlEmEKBExpc3QSJi5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0GicuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgCEmEKA0dldBIlLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVxdWVzdBomLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2UiC8rzGAMBAgPg8xgCEmkKBkNyZWF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCsLzGAIBAuDzGAESaAoGRGVsZXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZSIJyvMYAQHg8xgBEmkKBlVwZGF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2UiCsrzGAIBAuDzGAFCmAEKD2NvbS5maXRzLmFwaS52MUIMUHJvamVjdFByb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
/**
* Project defines a group of resources belonging to a tenant
diff --git a/js/fits/api/v1/tenant_pb.js b/js/fits/api/v1/tenant_pb.js
index 998821d..2b24a5e 100644
--- a/js/fits/api/v1/tenant_pb.js
+++ b/js/fits/api/v1/tenant_pb.js
@@ -5,11 +5,10 @@ import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2
import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import { file_fits_api_v1_common } from "./common_pb";
import { file_fits_api_v1_predefined_rules } from "./predefined_rules_pb";
-import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
/**
* Describes the file fits/api/v1/tenant.proto.
*/
-export const file_fits_api_v1_tenant = /*@__PURE__*/ fileDesc("ChhmaXRzL2FwaS92MS90ZW5hbnQucHJvdG8SC2ZpdHMuYXBpLnYxIqwBCgZUZW5hbnQSDQoFbG9naW4YASABKAkSHwoEbWV0YRgCIAEoCzIRLmZpdHMuYXBpLnYxLk1ldGESGQoEbmFtZRgDIAEoCUILukgIcgbAs66xAgESDQoFZW1haWwYBCABKAkSIAoLZGVzY3JpcHRpb24YBSABKAlCC7pICHIGyLOusQIBEhIKCmF2YXRhcl91cmwYBiABKAkSEgoKY3JlYXRlZF9ieRgHIAEoCSKQAQoYVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIoCgZsYWJlbHMYAyABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNIAogBAUIFCgNfaWRCBwoFX25hbWVCCQoHX2xhYmVscyIoChdUZW5hbnRTZXJ2aWNlR2V0UmVxdWVzdBINCgVsb2dpbhgBIAEoCSLiAQoaVGVuYW50U2VydmljZUNyZWF0ZVJlcXVlc3QSGQoEbmFtZRgBIAEoCUILukgIcgbAs66xAgESJQoLZGVzY3JpcHRpb24YAiABKAlCC7pICHIGyLOusQIBSACIAQESGwoFZW1haWwYAyABKAlCB7pIBHICYAFIAYgBARIXCgphdmF0YXJfdXJsGAQgASgJSAKIAQESIwoGbGFiZWxzGAUgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzQg4KDF9kZXNjcmlwdGlvbkIICgZfZW1haWxCDQoLX2F2YXRhcl91cmwiywIKGlRlbmFudFNlcnZpY2VVcGRhdGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESGwoFZW1haWwYBCABKAlCB7pIBHICYAFIAYgBARIlCgtkZXNjcmlwdGlvbhgFIAEoCUILukgIcgbIs66xAgFIAogBARIXCgphdmF0YXJfdXJsGAYgASgJSAOIAQESLgoGbGFiZWxzGAcgASgLMhkuZml0cy5hcGkudjEuVXBkYXRlTGFiZWxzSASIAQFCBwoFX25hbWVCCAoGX2VtYWlsQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIisKGlRlbmFudFNlcnZpY2VEZWxldGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJIj8KGFRlbmFudFNlcnZpY2VHZXRSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQQoZVGVuYW50U2VydmljZUxpc3RSZXNwb25zZRIkCgd0ZW5hbnRzGAEgAygLMhMuZml0cy5hcGkudjEuVGVuYW50IkIKG1RlbmFudFNlcnZpY2VDcmVhdGVSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQgobVGVuYW50U2VydmljZVVwZGF0ZVJlc3BvbnNlEiMKBnRlbmFudBgBIAEoCzITLmZpdHMuYXBpLnYxLlRlbmFudCJCChtUZW5hbnRTZXJ2aWNlRGVsZXRlUmVzcG9uc2USIwoGdGVuYW50GAEgASgLMhMuZml0cy5hcGkudjEuVGVuYW50MosECg1UZW5hbnRTZXJ2aWNlEmUKBkNyZWF0ZRInLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VDcmVhdGVSZXF1ZXN0GiguZml0cy5hcGkudjEuVGVuYW50U2VydmljZUNyZWF0ZVJlc3BvbnNlIgjY8xgC4PMYARJfCgRMaXN0EiUuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0GiYuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXNwb25zZSII2PMYAuDzGAISYAoDR2V0EiQuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUdldFJlcXVlc3QaJS5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlR2V0UmVzcG9uc2UiDMLzGAQBAgME4PMYAhJnCgZVcGRhdGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlVXBkYXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VVcGRhdGVSZXNwb25zZSIKwvMYAgEC4PMYARJnCgZEZWxldGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlRGVsZXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VEZWxldGVSZXNwb25zZSIKwvMYAgEC4PMYAUKXAQoPY29tLmZpdHMuYXBpLnYxQgtUZW5hbnRQcm90b1ABWilnaXRodWIuY29tL2ZpLXRzL2FwaS9nby9maXRzL2FwaS92MTthcGl2MaICA0ZBWKoCC0ZpdHMuQXBpLlYxygILRml0c1xBcGlcVjHiAhdGaXRzXEFwaVxWMVxHUEJNZXRhZGF0YeoCDUZpdHM6OkFwaTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules, file_google_protobuf_timestamp]);
+export const file_fits_api_v1_tenant = /*@__PURE__*/ fileDesc("ChhmaXRzL2FwaS92MS90ZW5hbnQucHJvdG8SC2ZpdHMuYXBpLnYxIqwBCgZUZW5hbnQSDQoFbG9naW4YASABKAkSHwoEbWV0YRgCIAEoCzIRLmZpdHMuYXBpLnYxLk1ldGESGQoEbmFtZRgDIAEoCUILukgIcgbAs66xAgESDQoFZW1haWwYBCABKAkSIAoLZGVzY3JpcHRpb24YBSABKAlCC7pICHIGyLOusQIBEhIKCmF2YXRhcl91cmwYBiABKAkSEgoKY3JlYXRlZF9ieRgHIAEoCSKQAQoYVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIoCgZsYWJlbHMYAyABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNIAogBAUIFCgNfaWRCBwoFX25hbWVCCQoHX2xhYmVscyIoChdUZW5hbnRTZXJ2aWNlR2V0UmVxdWVzdBINCgVsb2dpbhgBIAEoCSLiAQoaVGVuYW50U2VydmljZUNyZWF0ZVJlcXVlc3QSGQoEbmFtZRgBIAEoCUILukgIcgbAs66xAgESJQoLZGVzY3JpcHRpb24YAiABKAlCC7pICHIGyLOusQIBSACIAQESGwoFZW1haWwYAyABKAlCB7pIBHICYAFIAYgBARIXCgphdmF0YXJfdXJsGAQgASgJSAKIAQESIwoGbGFiZWxzGAUgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzQg4KDF9kZXNjcmlwdGlvbkIICgZfZW1haWxCDQoLX2F2YXRhcl91cmwiywIKGlRlbmFudFNlcnZpY2VVcGRhdGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESGwoFZW1haWwYBCABKAlCB7pIBHICYAFIAYgBARIlCgtkZXNjcmlwdGlvbhgFIAEoCUILukgIcgbIs66xAgFIAogBARIXCgphdmF0YXJfdXJsGAYgASgJSAOIAQESLgoGbGFiZWxzGAcgASgLMhkuZml0cy5hcGkudjEuVXBkYXRlTGFiZWxzSASIAQFCBwoFX25hbWVCCAoGX2VtYWlsQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIisKGlRlbmFudFNlcnZpY2VEZWxldGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJIj8KGFRlbmFudFNlcnZpY2VHZXRSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQQoZVGVuYW50U2VydmljZUxpc3RSZXNwb25zZRIkCgd0ZW5hbnRzGAEgAygLMhMuZml0cy5hcGkudjEuVGVuYW50IkIKG1RlbmFudFNlcnZpY2VDcmVhdGVSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQgobVGVuYW50U2VydmljZVVwZGF0ZVJlc3BvbnNlEiMKBnRlbmFudBgBIAEoCzITLmZpdHMuYXBpLnYxLlRlbmFudCJCChtUZW5hbnRTZXJ2aWNlRGVsZXRlUmVzcG9uc2USIwoGdGVuYW50GAEgASgLMhMuZml0cy5hcGkudjEuVGVuYW50MosECg1UZW5hbnRTZXJ2aWNlEmUKBkNyZWF0ZRInLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VDcmVhdGVSZXF1ZXN0GiguZml0cy5hcGkudjEuVGVuYW50U2VydmljZUNyZWF0ZVJlc3BvbnNlIgjY8xgC4PMYARJfCgRMaXN0EiUuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0GiYuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXNwb25zZSII2PMYAuDzGAISYAoDR2V0EiQuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUdldFJlcXVlc3QaJS5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlR2V0UmVzcG9uc2UiDMLzGAQBAgME4PMYAhJnCgZVcGRhdGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlVXBkYXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VVcGRhdGVSZXNwb25zZSIKwvMYAgEC4PMYARJnCgZEZWxldGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlRGVsZXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VEZWxldGVSZXNwb25zZSIKwvMYAgEC4PMYAUKXAQoPY29tLmZpdHMuYXBpLnYxQgtUZW5hbnRQcm90b1ABWilnaXRodWIuY29tL2ZpLXRzL2FwaS9nby9maXRzL2FwaS92MTthcGl2MaICA0ZBWKoCC0ZpdHMuQXBpLlYxygILRml0c1xBcGlcVjHiAhdGaXRzXEFwaVxWMVxHUEJNZXRhZGF0YeoCDUZpdHM6OkFwaTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
/**
* Describes the message fits.api.v1.Tenant.
* Use `create(TenantSchema)` to create a new message.
diff --git a/js/fits/api/v1/tenant_pb.ts b/js/fits/api/v1/tenant_pb.ts
index 74c95af..9f0b970 100644
--- a/js/fits/api/v1/tenant_pb.ts
+++ b/js/fits/api/v1/tenant_pb.ts
@@ -8,14 +8,13 @@ import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import type { Labels, Meta, UpdateLabels, UpdateMeta } from "./common_pb";
import { file_fits_api_v1_common } from "./common_pb";
import { file_fits_api_v1_predefined_rules } from "./predefined_rules_pb";
-import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file fits/api/v1/tenant.proto.
*/
export const file_fits_api_v1_tenant: GenFile = /*@__PURE__*/
- fileDesc("ChhmaXRzL2FwaS92MS90ZW5hbnQucHJvdG8SC2ZpdHMuYXBpLnYxIqwBCgZUZW5hbnQSDQoFbG9naW4YASABKAkSHwoEbWV0YRgCIAEoCzIRLmZpdHMuYXBpLnYxLk1ldGESGQoEbmFtZRgDIAEoCUILukgIcgbAs66xAgESDQoFZW1haWwYBCABKAkSIAoLZGVzY3JpcHRpb24YBSABKAlCC7pICHIGyLOusQIBEhIKCmF2YXRhcl91cmwYBiABKAkSEgoKY3JlYXRlZF9ieRgHIAEoCSKQAQoYVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIoCgZsYWJlbHMYAyABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNIAogBAUIFCgNfaWRCBwoFX25hbWVCCQoHX2xhYmVscyIoChdUZW5hbnRTZXJ2aWNlR2V0UmVxdWVzdBINCgVsb2dpbhgBIAEoCSLiAQoaVGVuYW50U2VydmljZUNyZWF0ZVJlcXVlc3QSGQoEbmFtZRgBIAEoCUILukgIcgbAs66xAgESJQoLZGVzY3JpcHRpb24YAiABKAlCC7pICHIGyLOusQIBSACIAQESGwoFZW1haWwYAyABKAlCB7pIBHICYAFIAYgBARIXCgphdmF0YXJfdXJsGAQgASgJSAKIAQESIwoGbGFiZWxzGAUgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzQg4KDF9kZXNjcmlwdGlvbkIICgZfZW1haWxCDQoLX2F2YXRhcl91cmwiywIKGlRlbmFudFNlcnZpY2VVcGRhdGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESGwoFZW1haWwYBCABKAlCB7pIBHICYAFIAYgBARIlCgtkZXNjcmlwdGlvbhgFIAEoCUILukgIcgbIs66xAgFIAogBARIXCgphdmF0YXJfdXJsGAYgASgJSAOIAQESLgoGbGFiZWxzGAcgASgLMhkuZml0cy5hcGkudjEuVXBkYXRlTGFiZWxzSASIAQFCBwoFX25hbWVCCAoGX2VtYWlsQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIisKGlRlbmFudFNlcnZpY2VEZWxldGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJIj8KGFRlbmFudFNlcnZpY2VHZXRSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQQoZVGVuYW50U2VydmljZUxpc3RSZXNwb25zZRIkCgd0ZW5hbnRzGAEgAygLMhMuZml0cy5hcGkudjEuVGVuYW50IkIKG1RlbmFudFNlcnZpY2VDcmVhdGVSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQgobVGVuYW50U2VydmljZVVwZGF0ZVJlc3BvbnNlEiMKBnRlbmFudBgBIAEoCzITLmZpdHMuYXBpLnYxLlRlbmFudCJCChtUZW5hbnRTZXJ2aWNlRGVsZXRlUmVzcG9uc2USIwoGdGVuYW50GAEgASgLMhMuZml0cy5hcGkudjEuVGVuYW50MosECg1UZW5hbnRTZXJ2aWNlEmUKBkNyZWF0ZRInLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VDcmVhdGVSZXF1ZXN0GiguZml0cy5hcGkudjEuVGVuYW50U2VydmljZUNyZWF0ZVJlc3BvbnNlIgjY8xgC4PMYARJfCgRMaXN0EiUuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0GiYuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXNwb25zZSII2PMYAuDzGAISYAoDR2V0EiQuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUdldFJlcXVlc3QaJS5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlR2V0UmVzcG9uc2UiDMLzGAQBAgME4PMYAhJnCgZVcGRhdGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlVXBkYXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VVcGRhdGVSZXNwb25zZSIKwvMYAgEC4PMYARJnCgZEZWxldGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlRGVsZXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VEZWxldGVSZXNwb25zZSIKwvMYAgEC4PMYAUKXAQoPY29tLmZpdHMuYXBpLnYxQgtUZW5hbnRQcm90b1ABWilnaXRodWIuY29tL2ZpLXRzL2FwaS9nby9maXRzL2FwaS92MTthcGl2MaICA0ZBWKoCC0ZpdHMuQXBpLlYxygILRml0c1xBcGlcVjHiAhdGaXRzXEFwaVxWMVxHUEJNZXRhZGF0YeoCDUZpdHM6OkFwaTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules, file_google_protobuf_timestamp]);
+ fileDesc("ChhmaXRzL2FwaS92MS90ZW5hbnQucHJvdG8SC2ZpdHMuYXBpLnYxIqwBCgZUZW5hbnQSDQoFbG9naW4YASABKAkSHwoEbWV0YRgCIAEoCzIRLmZpdHMuYXBpLnYxLk1ldGESGQoEbmFtZRgDIAEoCUILukgIcgbAs66xAgESDQoFZW1haWwYBCABKAkSIAoLZGVzY3JpcHRpb24YBSABKAlCC7pICHIGyLOusQIBEhIKCmF2YXRhcl91cmwYBiABKAkSEgoKY3JlYXRlZF9ieRgHIAEoCSKQAQoYVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIoCgZsYWJlbHMYAyABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNIAogBAUIFCgNfaWRCBwoFX25hbWVCCQoHX2xhYmVscyIoChdUZW5hbnRTZXJ2aWNlR2V0UmVxdWVzdBINCgVsb2dpbhgBIAEoCSLiAQoaVGVuYW50U2VydmljZUNyZWF0ZVJlcXVlc3QSGQoEbmFtZRgBIAEoCUILukgIcgbAs66xAgESJQoLZGVzY3JpcHRpb24YAiABKAlCC7pICHIGyLOusQIBSACIAQESGwoFZW1haWwYAyABKAlCB7pIBHICYAFIAYgBARIXCgphdmF0YXJfdXJsGAQgASgJSAKIAQESIwoGbGFiZWxzGAUgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzQg4KDF9kZXNjcmlwdGlvbkIICgZfZW1haWxCDQoLX2F2YXRhcl91cmwiywIKGlRlbmFudFNlcnZpY2VVcGRhdGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESGwoFZW1haWwYBCABKAlCB7pIBHICYAFIAYgBARIlCgtkZXNjcmlwdGlvbhgFIAEoCUILukgIcgbIs66xAgFIAogBARIXCgphdmF0YXJfdXJsGAYgASgJSAOIAQESLgoGbGFiZWxzGAcgASgLMhkuZml0cy5hcGkudjEuVXBkYXRlTGFiZWxzSASIAQFCBwoFX25hbWVCCAoGX2VtYWlsQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIisKGlRlbmFudFNlcnZpY2VEZWxldGVSZXF1ZXN0Eg0KBWxvZ2luGAEgASgJIj8KGFRlbmFudFNlcnZpY2VHZXRSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQQoZVGVuYW50U2VydmljZUxpc3RSZXNwb25zZRIkCgd0ZW5hbnRzGAEgAygLMhMuZml0cy5hcGkudjEuVGVuYW50IkIKG1RlbmFudFNlcnZpY2VDcmVhdGVSZXNwb25zZRIjCgZ0ZW5hbnQYASABKAsyEy5maXRzLmFwaS52MS5UZW5hbnQiQgobVGVuYW50U2VydmljZVVwZGF0ZVJlc3BvbnNlEiMKBnRlbmFudBgBIAEoCzITLmZpdHMuYXBpLnYxLlRlbmFudCJCChtUZW5hbnRTZXJ2aWNlRGVsZXRlUmVzcG9uc2USIwoGdGVuYW50GAEgASgLMhMuZml0cy5hcGkudjEuVGVuYW50MosECg1UZW5hbnRTZXJ2aWNlEmUKBkNyZWF0ZRInLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VDcmVhdGVSZXF1ZXN0GiguZml0cy5hcGkudjEuVGVuYW50U2VydmljZUNyZWF0ZVJlc3BvbnNlIgjY8xgC4PMYARJfCgRMaXN0EiUuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXF1ZXN0GiYuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUxpc3RSZXNwb25zZSII2PMYAuDzGAISYAoDR2V0EiQuZml0cy5hcGkudjEuVGVuYW50U2VydmljZUdldFJlcXVlc3QaJS5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlR2V0UmVzcG9uc2UiDMLzGAQBAgME4PMYAhJnCgZVcGRhdGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlVXBkYXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VVcGRhdGVSZXNwb25zZSIKwvMYAgEC4PMYARJnCgZEZWxldGUSJy5maXRzLmFwaS52MS5UZW5hbnRTZXJ2aWNlRGVsZXRlUmVxdWVzdBooLmZpdHMuYXBpLnYxLlRlbmFudFNlcnZpY2VEZWxldGVSZXNwb25zZSIKwvMYAgEC4PMYAUKXAQoPY29tLmZpdHMuYXBpLnYxQgtUZW5hbnRQcm90b1ABWilnaXRodWIuY29tL2ZpLXRzL2FwaS9nby9maXRzL2FwaS92MTthcGl2MaICA0ZBWKoCC0ZpdHMuQXBpLlYxygILRml0c1xBcGlcVjHiAhdGaXRzXEFwaVxWMVxHUEJNZXRhZGF0YeoCDUZpdHM6OkFwaTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
/**
* Tenant is a customer of the platform
diff --git a/proto/Makefile b/proto/Makefile
index 93484a5..9ff2c69 100644
--- a/proto/Makefile
+++ b/proto/Makefile
@@ -1,5 +1,5 @@
MAKEFLAGS += --no-print-directory
-BUF_VERSION := 1.69.0
+BUF_VERSION := 1.72.0
_buf:
docker run --rm \
diff --git a/proto/fits/api/mvm/v1/location.proto b/proto/fits/api/mvm/v1/location.proto
new file mode 100644
index 0000000..89407b8
--- /dev/null
+++ b/proto/fits/api/mvm/v1/location.proto
@@ -0,0 +1,38 @@
+syntax = "proto3";
+
+package fits.api.mvm.v1;
+
+import "buf/validate/validate.proto";
+import "fits/api/v1/common.proto";
+import "fits/api/v1/predefined_rules.proto";
+
+// LocationService lists datacenter locations available for managed VM (MVM) instances, scoped per tenant.
+service LocationService {
+ // Returns a list of all datacenter locations available for a tenant.
+ rpc List(LocationServiceListRequest) returns (LocationServiceListResponse) {
+ option (fits.api.v1.tenant_roles) = TENANT_ROLE_OWNER;
+ option (fits.api.v1.tenant_roles) = TENANT_ROLE_EDITOR;
+ option (fits.api.v1.tenant_roles) = TENANT_ROLE_VIEWER;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+}
+
+// Location is the definition of an available datacenter location for MVM instances.
+message Location {
+ // Uuid of this location
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // title of the location
+ string title = 2 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// LocationServiceListRequest is the request payload for a location list request.
+message LocationServiceListRequest {
+ // Tenant to list available locations for
+ string tenant = 1 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// LocationServiceListResponse is the response payload for a location list request.
+message LocationServiceListResponse {
+ // The available locations
+ repeated Location locations = 1;
+}
diff --git a/proto/fits/api/mvm/v1/mvm.proto b/proto/fits/api/mvm/v1/mvm.proto
new file mode 100644
index 0000000..ccb2607
--- /dev/null
+++ b/proto/fits/api/mvm/v1/mvm.proto
@@ -0,0 +1,623 @@
+syntax = "proto3";
+
+package fits.api.mvm.v1;
+
+import "buf/validate/validate.proto";
+import "fits/api/mvm/v1/vlan.proto";
+import "fits/api/v1/common.proto";
+import "fits/api/v1/predefined_rules.proto";
+
+// MVMService provides managed VM (MVM) operations.
+service MVMService {
+ // Returns the MVM with the specified UUID.
+ rpc Get(MVMServiceGetRequest) returns (MVMServiceGetResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_VIEWER;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+ // Creates a new MVM.
+ rpc Create(MVMServiceCreateRequest) returns (MVMServiceCreateResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Updates a MVM.
+ rpc Update(MVMServiceUpdateRequest) returns (MVMServiceUpdateResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Returns the list of all MVMs.
+ rpc List(MVMServiceListRequest) returns (MVMServiceListResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_VIEWER;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+ // Deletes a MVM.
+ rpc Delete(MVMServiceDeleteRequest) returns (MVMServiceDeleteResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Orders an additional data disk for a MVM. System disks are ordered at
+ // MVM creation and cannot be added later.
+ rpc AddDisk(MVMServiceAddDiskRequest) returns (MVMServiceAddDiskResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Changes the size or auto-extend behavior of an existing disk; see
+ // DiskType for which operations apply per disk kind.
+ rpc UpdateDisk(MVMServiceUpdateDiskRequest) returns (MVMServiceUpdateDiskResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Cancels a data disk. OS and system disks cannot be deleted.
+ rpc DeleteDisk(MVMServiceDeleteDiskRequest) returns (MVMServiceDeleteDiskResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Orders an additional network interface for a MVM.
+ rpc AddNetworkInterface(MVMServiceAddNetworkInterfaceRequest) returns (MVMServiceAddNetworkInterfaceResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Moves a network interface from one MVM to another.
+ rpc MoveNetworkInterface(MVMServiceMoveNetworkInterfaceRequest) returns (MVMServiceMoveNetworkInterfaceResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Deletes a network interface from a MVM.
+ rpc DeleteNetworkInterface(MVMServiceDeleteNetworkInterfaceRequest) returns (MVMServiceDeleteNetworkInterfaceResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_INCLUDED;
+ }
+ // Validates a MVM create request without creating anything. Intended for
+ // form pre-checks; the create endpoint validates again before executing.
+ rpc ValidateCreate(MVMServiceValidateCreateRequest) returns (MVMServiceValidateCreateResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+ // Validates an AddDisk request without ordering anything.
+ rpc ValidateAddDisk(MVMServiceValidateAddDiskRequest) returns (MVMServiceValidateAddDiskResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+ // Validates an UpdateDisk request without changing anything.
+ rpc ValidateUpdateDisk(MVMServiceValidateUpdateDiskRequest) returns (MVMServiceValidateUpdateDiskResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+ // Validates an AddNetworkInterface request without ordering anything.
+ rpc ValidateAddNetworkInterface(MVMServiceValidateAddNetworkInterfaceRequest) returns (MVMServiceValidateAddNetworkInterfaceResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+}
+
+// Availability specifies the availability level of a MVM; higher value = higher availability.
+enum Availability {
+ // AVAILABILITY_UNSPECIFIED is not specified.
+ AVAILABILITY_UNSPECIFIED = 0 [(fits.api.v1.enum_string_value) = ""];
+ // AVAILABILITY_V0 is availability level V0.
+ AVAILABILITY_V0 = 1 [(fits.api.v1.enum_string_value) = "V0"];
+ // AVAILABILITY_V1 is availability level V1.
+ AVAILABILITY_V1 = 2 [(fits.api.v1.enum_string_value) = "V1"];
+ // AVAILABILITY_V2 is availability level V2.
+ AVAILABILITY_V2 = 3 [(fits.api.v1.enum_string_value) = "V2"];
+ // AVAILABILITY_V3 is availability level V3.
+ AVAILABILITY_V3 = 4 [(fits.api.v1.enum_string_value) = "V3"];
+}
+
+// ServiceClass specifies the service tier of a MVM; higher value = higher tier.
+// Only certain combinations with Availability are valid.
+enum ServiceClass {
+ // SERVICE_CLASS_UNSPECIFIED is not specified.
+ SERVICE_CLASS_UNSPECIFIED = 0 [(fits.api.v1.enum_string_value) = ""];
+ // SERVICE_CLASS_SZ1 is service class SZ1.
+ SERVICE_CLASS_SZ1 = 1 [(fits.api.v1.enum_string_value) = "SZ1"];
+ // SERVICE_CLASS_SZ2 is service class SZ2.
+ SERVICE_CLASS_SZ2 = 2 [(fits.api.v1.enum_string_value) = "SZ2"];
+ // SERVICE_CLASS_SZ3 is service class SZ3.
+ SERVICE_CLASS_SZ3 = 3 [(fits.api.v1.enum_string_value) = "SZ3"];
+}
+
+// MVMStatus specifies the status of a MVM.
+enum MVMStatus {
+ // MVM_STATUS_UNSPECIFIED is not specified.
+ MVM_STATUS_UNSPECIFIED = 0 [(fits.api.v1.enum_string_value) = ""];
+ // MVM_STATUS_ACTIVE is an active MVM.
+ MVM_STATUS_ACTIVE = 1 [(fits.api.v1.enum_string_value) = "active"];
+}
+
+// DiskType classifies a MVM disk by its lifecycle rules.
+// The upstream (nulink) API returns every disk of a MVM, including the
+// backend-provisioned OS disk, so that oversized OS disks stay billable.
+//
+// Lifecycle per kind:
+// - OS: provisioned by the backend and never part of create/add
+// requests; resizable via UpdateDisk, never deletable.
+// - SYSTEM: exactly one per MVM (drive letter F on Windows, mount point
+// /appdata on Linux), whose letter/mount point is fixed; must be
+// included in the create request; resizable via UpdateDisk, never
+// deletable.
+// - DATA: fully controllable (letter/mount point, size, auto-extend)
+// and deletable; may be included at creation or added later via
+// AddDisk.
+//
+// Whether auto-extend is supported for OS and SYSTEM disks is not yet
+// known; only DATA disks are documented as supporting it.
+//
+// These rules are enforced by the upstream (nulink) API at creation and
+// edit time (e.g. duplicate drive letters, deleting a system disk);
+// fco-api does not re-validate them locally and surfaces upstream
+// violations as InvalidArgument errors. Use the Validate* RPCs to
+// pre-check a request against the upstream rules.
+enum DiskType {
+ // DISK_TYPE_UNSPECIFIED is not specified.
+ DISK_TYPE_UNSPECIFIED = 0 [(fits.api.v1.enum_string_value) = ""];
+ // DISK_TYPE_OS is the operating system disk; provisioned by the backend,
+ // resizable, never deletable.
+ DISK_TYPE_OS = 1 [(fits.api.v1.enum_string_value) = "os"];
+ // DISK_TYPE_SYSTEM is the additional system disk (volume F on Windows,
+ // /appdata on Linux); the letter/mount point is fixed, the size is
+ // resizable, never deletable.
+ DISK_TYPE_SYSTEM = 2 [(fits.api.v1.enum_string_value) = "system"];
+ // DISK_TYPE_DATA is a user-managed data disk; fully controllable and
+ // deletable.
+ DISK_TYPE_DATA = 3 [(fits.api.v1.enum_string_value) = "data"];
+}
+
+// Linux-specific MVM details.
+message LinuxDetails {
+ // Disks configured on the Linux MVM.
+ repeated LinuxDisk disks = 1;
+ // UUID of the LDAP directory the MVM is integrated with.
+ string ldap_uuid = 2 [(buf.validate.field).string.uuid = true];
+ // Linux-specific FQDN, derived from the name at creation or generated by the backend.
+ string ldap_fqdn = 3 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// Windows-specific MVM details.
+message WindowsDetails {
+ // Disks configured on the Windows MVM.
+ repeated WindowsDisk disks = 1;
+ // UUID of the Windows domain the MVM has joined.
+ string domain_uuid = 2 [(buf.validate.field).string.uuid = true];
+ // Windows-specific FQDN, derived from the name at creation or generated by the backend.
+ string domain_fqdn = 3 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// A network interface of a MVM. IPv4 only; IPv6 is not yet supported.
+message NetworkInterface {
+ // UUID of this interface.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // IPv4 address assigned to this interface.
+ string ipaddress = 2 [(buf.validate.field).string.(fits.api.v1.is_ip_or_hostname) = true];
+ // MAC address of this interface.
+ string macaddress = 3; // TODO: add validation
+}
+
+// ManagedVM is a managed VM instance as returned by the API.
+message ManagedVM {
+ // UUID of this MVM.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Metadata for this MVM.
+ // TODO: dates are available in the nulink db but not passed through yet.
+ fits.api.v1.Meta meta = 2;
+ // FQDN of the MVM, derived from the name at creation or generated by the backend.
+ string fqdn = 3 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+ // Tenant this MVM belongs to.
+ string tenant = 4 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+ // UUID of the project this MVM belongs to.
+ string project_uuid = 5 [(buf.validate.field).string.uuid = true];
+ // UUID of the OS image installed on the MVM; resolve the title via the OS endpoint.
+ string os_uuid = 6 [(buf.validate.field).string.uuid = true];
+ // UUID of the datacenter location.
+ string location_uuid = 7 [(buf.validate.field).string.uuid = true];
+ // TODO: Contact UUID – not yet implemented; open discussion with FCN (#23).
+ string contact_uuid = 8 [(buf.validate.field).string.uuid = true];
+ // Number of CPU cores.
+ uint32 cpu = 9;
+ // RAM in GB.
+ uint32 ram = 10;
+ // Whether backup is enabled.
+ // TODO: the upstream (nulink) list/get models do not expose this; always false.
+ bool backup = 11;
+ // Status of the MVM.
+ MVMStatus status = 12 [(buf.validate.field).enum.defined_only = true];
+ // Additional information about the current status.
+ string status_info = 13;
+ // Availability level.
+ Availability availability = 14 [(buf.validate.field).enum.defined_only = true];
+ // Service class.
+ ServiceClass serviceclass = 15 [(buf.validate.field).enum.defined_only = true];
+ // OS-specific configuration.
+ oneof details {
+ option (buf.validate.oneof).required = true;
+ // Windows-specific settings (domain + disks).
+ WindowsDetails windows_details = 16;
+ // Linux-specific settings (LDAP + disks).
+ LinuxDetails linux_details = 17;
+ }
+ // Network interfaces attached to the MVM (IPv4 only).
+ repeated NetworkInterface interfaces = 18;
+ // VLAN the MVM is attached to.
+ // TODO: not exposed by the upstream (nulink) MVM records yet; always unset.
+ VLAN vlan = 19;
+ // Internal reference number provided by the user, e.g. a ticket ID.
+ string order_number = 20;
+}
+
+// Request to get a MVM by UUID.
+message MVMServiceGetRequest {
+ // UUID of the MVM.
+ optional string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Tenant of the MVM.
+ string tenant = 2 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// Response containing the requested MVM.
+message MVMServiceGetResponse {
+ // The MVM.
+ ManagedVM mvm = 1;
+}
+// Windows-specific create request parts.
+message MVMServiceCreateWindowsRequest {
+ // UUID of the Windows domain the MVM should join.
+ string domain_uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Disks for the Windows MVM, excluding the OS disk; must contain exactly
+ // one system disk plus any number of data disks (see DiskType).
+ repeated WindowsDisk disks = 2 [(buf.validate.field).repeated.min_items = 1];
+}
+
+// Linux-specific create request parts.
+message MVMServiceCreateLinuxRequest {
+ // UUID of the LDAP directory the MVM should integrate with.
+ string ldap_uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Disks for the Linux MVM, excluding the OS disk; must contain exactly
+ // one system disk plus any number of data disks (see DiskType).
+ repeated LinuxDisk disks = 2 [(buf.validate.field).repeated.min_items = 1];
+}
+
+// Request to create a new MVM instance.
+message MVMServiceCreateRequest {
+ // UUID of the project this MVM belongs to.
+ string project_uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Optional name; the FQDN is derived from it.
+ optional string name = 2 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+ // UUID of the operating system image to install.
+ string os_uuid = 3 [(buf.validate.field).string.uuid = true];
+ // UUID of the VLAN network to attach the MVM to.
+ string vlan_uuid = 4 [(buf.validate.field).string.uuid = true];
+ // UUID of the datacenter location; the MVM is scheduled into one data center within it.
+ string location_uuid = 5 [(buf.validate.field).string.uuid = true];
+ // TODO: Contact UUID – open discussion with FCN; may become a dedicated /contact endpoint.
+ string contact_uuid = 6 [(buf.validate.field).string.uuid = true];
+ // Number of CPU cores.
+ uint32 cpu = 7;
+ // RAM in GB. Must be a power of 2.
+ uint32 ram = 8;
+ // Internal reference number provided by the user, e.g. a ticket ID.
+ // TODO: can this be optional?
+ string order_number = 9;
+ // Optional key-value labels for accounting purposes.
+ // (e.g. contract number, transaction number, technical key, accounting key).
+ fits.api.v1.Labels labels = 10;
+ // Whether backup is enabled.
+ bool backup = 11;
+ // Availability level.
+ Availability availability = 12 [(buf.validate.field).enum.defined_only = true];
+ // Service class; only certain combinations with availability are valid.
+ ServiceClass serviceclass = 13 [(buf.validate.field).enum.defined_only = true];
+ // OS type and its configuration.
+ oneof mvmtype {
+ option (buf.validate.oneof).required = true;
+ // Windows-specific settings (domain + disk).
+ MVMServiceCreateWindowsRequest windows = 14;
+ // Linux-specific settings (LDAP + disk).
+ MVMServiceCreateLinuxRequest linux = 15;
+ }
+}
+
+// Disk configuration for a Linux MVM. See DiskType for the kinds of disks
+// (os, system, data) and their lifecycle rules.
+message LinuxDisk {
+ // UUID of the disk; set for existing disks, unset for new ones.
+ optional string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Label (name) of the disk.
+ string label = 2;
+ // Whether the disk grows automatically when space runs low.
+ bool auto_extend = 3;
+ // Size of the disk in GB; defaults to 50 when unset.
+ optional uint64 size = 4;
+ // Mount point (e.g. "/data"). Fixed to "/appdata" for the system disk;
+ // free-form for data disks.
+ optional string mount_point = 5;
+ // Kind of the disk; determines which operations are allowed on it.
+ // Provided by the client in create/add requests and populated by the
+ // API in responses.
+ // TODO: talk to FCE that we will provide the disk type in create/add
+ // requests.
+ optional DiskType disk_type = 6 [(buf.validate.field).enum.defined_only = true];
+}
+
+// Disk configuration for a Windows MVM. See DiskType for the kinds of
+// disks (os, system, data) and their lifecycle rules.
+message WindowsDisk {
+ // UUID of the disk; set for existing disks, unset for new ones.
+ optional string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Label (name) of the disk.
+ string label = 2;
+ // Whether the disk grows automatically when space runs low.
+ bool auto_extend = 3;
+ // Size of the disk in GB; defaults to 50 when unset.
+ optional uint64 size = 4;
+ // Drive letter (e.g. "D"). Fixed to "F" for the system disk; free-form
+ // for data disks.
+ optional string driveletter = 5;
+ // Kind of the disk; determines which operations are allowed on it.
+ // Provided by the client in create/add requests and populated by the
+ // API in responses.
+ // TODO: talk to FCE that we will provide the disk type in create/add
+ // requests.
+ optional DiskType disk_type = 6 [(buf.validate.field).enum.defined_only = true];
+}
+
+// Response for Create; an empty response means the MVM was accepted.
+message MVMServiceCreateResponse {}
+
+// Request to change a mutable property of an existing MVM.
+// Exactly one action must be set; each maps onto its own upstream endpoint.
+// TODO: the oneof mirrors the upstream constraint (nulink has one endpoint per
+// action); combined changes would need
+// server-side fan-out without rollback.
+// TODO: clarify async semantics — this is a queued "request to update", not an
+// immediate update (e.g. disk changes are applied overnight). Consider
+// renaming to reflect that.
+// TODO: differentiate between fire-and-forget and queued actions in the API.
+// TODO: is it possible to expose the pending-change queue (list/cancel) to the caller?
+// TODO: clarify who enqueues the request and whether a pending change blocks
+// further edits (e.g. after AddDisk, until the change executes).
+message MVMServiceUpdateRequest {
+ // UUID of the MVM to update.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Project the MVM belongs to.
+ string project = 2 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 3;
+ // Timestamp and strategy for this update.
+ fits.api.v1.UpdateMeta update_meta = 4 [(buf.validate.field).required = true];
+ // The change to apply.
+ oneof action {
+ option (buf.validate.oneof).required = true;
+ // Change the CPU/RAM performance class.
+ PerformanceClassChange performance_class = 5;
+ // Change the service class.
+ ServiceClassChange service_class = 6;
+ // Change the contact person.
+ ContactChange contact = 7;
+ }
+}
+
+// PerformanceClassChange is the payload for changing a MVM's CPU and RAM.
+message PerformanceClassChange {
+ // Number of vCPUs (1-64).
+ uint32 cpu = 1 [
+ (buf.validate.field).uint32.gte = 1,
+ (buf.validate.field).uint32.lte = 64
+ ];
+ // RAM size in GB.
+ uint32 ram = 2 [(buf.validate.field).uint32.gt = 0];
+}
+
+// ServiceClassChange is the payload for changing a MVM's service class.
+message ServiceClassChange {
+ // Target service class.
+ ServiceClass serviceclass = 1 [(buf.validate.field).enum.defined_only = true];
+}
+
+// ContactChange is the payload for changing a MVM's contact person.
+message ContactChange {
+ // UUID of the new contact.
+ string contact_uuid = 1 [(buf.validate.field).string.uuid = true];
+}
+
+// Response for Update; an empty response means the change was accepted.
+message MVMServiceUpdateResponse {}
+
+// Request to list MVMs.
+message MVMServiceListRequest {
+ // Tenant of the MVMs.
+ optional string tenant = 1 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// Response containing the list of MVMs.
+message MVMServiceListResponse {
+ // The MVM instances.
+ repeated ManagedVM mvms = 1;
+}
+
+// Request to cancel a MVM instance.
+message MVMServiceDeleteRequest {
+ // Project the MVM belongs to.
+ string project = 1 [(buf.validate.field).string.uuid = true];
+ // UUID of the MVM to delete.
+ string uuid = 2 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 3;
+}
+
+// Response for Delete; an empty response means the cancellation was accepted.
+message MVMServiceDeleteResponse {}
+
+// Validation messages.
+// The Validate* RPCs dry-run the upstream business rules without executing the
+// operation; the mutation endpoints validate again before executing.
+
+// Request to validate a MVM create without creating anything.
+message MVMServiceValidateCreateRequest {
+ // The create request to validate.
+ MVMServiceCreateRequest create = 1 [(buf.validate.field).required = true];
+}
+
+// Response for ValidateCreate; violations are returned as an InvalidArgument error.
+message MVMServiceValidateCreateResponse {}
+
+// Request to validate an AddDisk without ordering anything.
+message MVMServiceValidateAddDiskRequest {
+ // The add disk request to validate.
+ MVMServiceAddDiskRequest add_disk = 1 [(buf.validate.field).required = true];
+}
+
+// Response for ValidateAddDisk; violations are returned as an InvalidArgument error.
+message MVMServiceValidateAddDiskResponse {}
+
+// Request to validate an UpdateDisk without changing anything.
+message MVMServiceValidateUpdateDiskRequest {
+ // The update disk request to validate.
+ MVMServiceUpdateDiskRequest update_disk = 1 [(buf.validate.field).required = true];
+}
+
+// Response for ValidateUpdateDisk; violations are returned as an InvalidArgument error.
+message MVMServiceValidateUpdateDiskResponse {}
+
+// Disk lifecycle messages.
+// A successful response means the operation was accepted; the affected disks
+// can be inspected via Get.
+
+// Response for AddDisk.
+message MVMServiceAddDiskResponse {}
+
+// Response for UpdateDisk.
+message MVMServiceUpdateDiskResponse {}
+
+// Response for DeleteDisk.
+message MVMServiceDeleteDiskResponse {}
+
+// Request to order an additional data disk for a MVM.
+message MVMServiceAddDiskRequest {
+ // UUID of the MVM to attach the disk to.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Project the MVM belongs to.
+ string project = 2 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 3;
+ // OS-specific disk specification; must match the MVM's OS type.
+ oneof disk {
+ option (buf.validate.oneof).required = true;
+ // Linux data disk.
+ LinuxDisk linux = 4;
+ // Windows data disk.
+ WindowsDisk windows = 5;
+ }
+}
+
+// Request to change an existing disk; only size and auto-extend are
+// mutable (see DiskType for applicability per disk kind).
+message MVMServiceUpdateDiskRequest {
+ // UUID of the MVM the disk belongs to.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // UUID of the disk to change.
+ string disk_uuid = 2 [(buf.validate.field).string.uuid = true];
+ // Project the MVM belongs to.
+ string project = 3 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 4;
+ // New auto-extend behavior; unset keeps the current value.
+ optional bool auto_extend = 5;
+ // New size of the disk in GB; unset keeps the current value.
+ optional uint64 size = 6;
+}
+
+// Request to cancel a data disk; OS and system disks are rejected by the
+// upstream.
+message MVMServiceDeleteDiskRequest {
+ // UUID of the MVM the disk belongs to.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // UUID of the disk to cancel.
+ string disk_uuid = 2 [(buf.validate.field).string.uuid = true];
+ // Project the MVM belongs to.
+ string project = 3 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 4;
+}
+
+// Network interface lifecycle messages.
+// A successful response means the operation was accepted; the affected
+// interfaces can be inspected via Get.
+
+// Response for AddNetworkInterface.
+message MVMServiceAddNetworkInterfaceResponse {}
+
+// Response for MoveNetworkInterface.
+message MVMServiceMoveNetworkInterfaceResponse {}
+
+// Response for DeleteNetworkInterface.
+message MVMServiceDeleteNetworkInterfaceResponse {}
+
+// Request to order an additional network interface for a MVM.
+// Nulink treats interface and IP as a 1:1 relation; move and delete
+// operate on the interface_uuid.
+message MVMServiceAddNetworkInterfaceRequest {
+ // UUID of the MVM to attach the interface to.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Project the MVM belongs to.
+ string project = 2 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 3;
+}
+
+// Request to move a network interface from one MVM to another.
+message MVMServiceMoveNetworkInterfaceRequest {
+ // UUID of the MVM the interface currently belongs to.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // UUID of the network interface holding the IP.
+ string interface_uuid = 2 [(buf.validate.field).string.uuid = true];
+ // Project the MVM belongs to.
+ string project = 3 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 4;
+ // UUID of the MVM to move the interface to.
+ string target_mvm_uuid = 5 [(buf.validate.field).string.uuid = true];
+}
+
+// Request to delete a network interface from a MVM.
+message MVMServiceDeleteNetworkInterfaceRequest {
+ // UUID of the MVM the interface belongs to.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // UUID of the network interface holding the IP.
+ string interface_uuid = 2 [(buf.validate.field).string.uuid = true];
+ // Project the MVM belongs to.
+ string project = 3 [(buf.validate.field).string.uuid = true];
+ // Order reference for this operation.
+ // TODO: can this be optional?
+ string order_number = 4;
+}
+
+// Request to validate an AddNetworkInterface without ordering anything.
+message MVMServiceValidateAddNetworkInterfaceRequest {
+ // The add network interface request to validate.
+ MVMServiceAddNetworkInterfaceRequest add_network_interface = 1 [(buf.validate.field).required = true];
+}
+
+// Response for ValidateAddNetworkInterface; violations are returned as an InvalidArgument error.
+message MVMServiceValidateAddNetworkInterfaceResponse {}
diff --git a/proto/fits/api/mvm/v1/os.proto b/proto/fits/api/mvm/v1/os.proto
new file mode 100644
index 0000000..c2e42eb
--- /dev/null
+++ b/proto/fits/api/mvm/v1/os.proto
@@ -0,0 +1,45 @@
+syntax = "proto3";
+
+package fits.api.mvm.v1;
+
+import "buf/validate/validate.proto";
+import "fits/api/v1/common.proto";
+import "fits/api/v1/predefined_rules.proto";
+
+// OSService lists operating systems available for managed VM (MVM) instances.
+service OSService {
+ // Returns a list of all operating systems.
+ rpc List(OSServiceListRequest) returns (OSServiceListResponse) {
+ option (fits.api.v1.visibility) = VISIBILITY_SELF;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+}
+
+// OSType specifies the type of an operating system.
+enum OSType {
+ // OS_TYPE_UNSPECIFIED is not specified.
+ OS_TYPE_UNSPECIFIED = 0 [(fits.api.v1.enum_string_value) = ""];
+ // OS_TYPE_LINUX is a Linux operating system.
+ OS_TYPE_LINUX = 1 [(fits.api.v1.enum_string_value) = "linux"];
+ // OS_TYPE_WINDOWS is a Windows operating system.
+ OS_TYPE_WINDOWS = 2 [(fits.api.v1.enum_string_value) = "windows"];
+}
+
+// OS is the definition of an available OS for MVM instances.
+message OS {
+ // Uuid of this OS.
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Title of the OS.
+ string title = 2 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+ // Type of the OS.
+ OSType type = 3;
+}
+
+// OSServiceListRequest is the request payload for a OS list request.
+message OSServiceListRequest {}
+
+// OSServiceListResponse is the response payload for a OS list request
+message OSServiceListResponse {
+ // The available operating systems.
+ repeated OS operating_systems = 1;
+}
diff --git a/proto/fits/api/mvm/v1/stagetype.proto b/proto/fits/api/mvm/v1/stagetype.proto
new file mode 100644
index 0000000..2c55d0c
--- /dev/null
+++ b/proto/fits/api/mvm/v1/stagetype.proto
@@ -0,0 +1,36 @@
+syntax = "proto3";
+
+package fits.api.mvm.v1;
+
+import "buf/validate/validate.proto";
+import "fits/api/v1/common.proto";
+import "fits/api/v1/predefined_rules.proto";
+
+// TODO: this type may be completely removed, as VLANs could be project-scoped
+// StageTypeService lists stage types available for managed VM (MVM) instances.
+service StageTypeService {
+ // Returns a list of all stage types available for a tenant.
+ rpc List(StageTypeServiceListRequest) returns (StageTypeServiceListResponse) {
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_OWNER;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_EDITOR;
+ option (fits.api.v1.project_roles) = PROJECT_ROLE_VIEWER;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+}
+
+// StageType is the definition of available stage types. (Development, Test, Integration, Production)
+message StageType {
+ // Uuid of this stage type
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // title of the stage type
+ string title = 2 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// StageTypeServiceListRequest is the request payload for a stage type list request.
+message StageTypeServiceListRequest {}
+
+// StageTypeServiceListResponse is the response payload for a stage type list request
+message StageTypeServiceListResponse {
+ // The available stage types
+ repeated StageType stage_types = 1;
+}
diff --git a/proto/fits/api/mvm/v1/vlan.proto b/proto/fits/api/mvm/v1/vlan.proto
new file mode 100644
index 0000000..076e3b3
--- /dev/null
+++ b/proto/fits/api/mvm/v1/vlan.proto
@@ -0,0 +1,52 @@
+syntax = "proto3";
+
+package fits.api.mvm.v1;
+
+import "buf/validate/validate.proto";
+import "fits/api/v1/common.proto";
+import "fits/api/v1/predefined_rules.proto";
+
+// VLANService lists VLANs available for managed VM (MVM) instances.
+service VLANService {
+ // Returns a list of all VLANs available for a tenant.
+ rpc List(VLANServiceListRequest) returns (VLANServiceListResponse) {
+ option (fits.api.v1.tenant_roles) = TENANT_ROLE_OWNER;
+ option (fits.api.v1.tenant_roles) = TENANT_ROLE_EDITOR;
+ option (fits.api.v1.tenant_roles) = TENANT_ROLE_VIEWER;
+ option (fits.api.v1.auditing) = AUDITING_EXCLUDED;
+ }
+}
+
+// VLAN is a VLAN that a MVM can be connected to.
+message VLAN {
+ // Uuid of this VLAN
+ string uuid = 1 [(buf.validate.field).string.uuid = true];
+ // Id of this VLAN
+ // This is not a foreign key, this is the actual ID of the VLAN the network interface is attached to.
+ int32 vlan_id = 2;
+ // Title of the subnet this VLAN belongs to
+ string subnet_title = 3 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+ // CIDR of the subnet this VLAN belongs to
+ string subnet_cidr = 4 [(buf.validate.field).string.(fits.api.v1.is_ipv4_cidr) = true];
+ // TODO instead of the pod title, could we have the location_uuid?
+ optional string location_uuid = 10 [(buf.validate.field).string.uuid = true];
+ // TODO: instead of a stage type, this should be mapped to a project.
+ // TODO: this would have to be re-mapped in the customer onboarding
+ // Uuid of the stage type of this VLAN
+ string stage_type_uuid = 11 [(buf.validate.field).string.uuid = true];
+ // Tenant this VLAN belongs to.
+ string tenant = 12 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// VLANServiceListRequest is the request payload for a VLAN list request.
+message VLANServiceListRequest {
+ // Tenant to list available VLANs for
+ // TODO should be filtered by project instead, see https://github.com/fi-ts/fco-apiserver/issues/39
+ string tenant = 1 [(buf.validate.field).string.(fits.api.v1.is_name) = true];
+}
+
+// VLANServiceListResponse is the response payload for a VLAN list request
+message VLANServiceListResponse {
+ // The available VLANs
+ repeated VLAN vlans = 1;
+}
diff --git a/proto/fits/api/v1/predefined_rules.proto b/proto/fits/api/v1/predefined_rules.proto
index c045824..86a10d9 100644
--- a/proto/fits/api/v1/predefined_rules.proto
+++ b/proto/fits/api/v1/predefined_rules.proto
@@ -56,6 +56,12 @@ extend buf.validate.StringRules {
message: "value must not start or end with whitespace"
expression: "this.trim().size() == this.size()"
}];
+ // IsIpv4Cidr validates if the given string is a valid IPv4 CIDR, e.g. 10.0.0.0/24
+ optional bool is_ipv4_cidr = 80048959 [(buf.validate.predefined).cel = {
+ id: "string.is_ipv4_cidr"
+ message: "must be a valid IPv4 CIDR, e.g. 10.0.0.0/24"
+ expression: "this.isIpPrefix() && !this.contains(':')"
+ }];
}
extend buf.validate.RepeatedRules {
diff --git a/proto/fits/api/v1/project.proto b/proto/fits/api/v1/project.proto
index a4a2871..f67bcce 100644
--- a/proto/fits/api/v1/project.proto
+++ b/proto/fits/api/v1/project.proto
@@ -5,7 +5,6 @@ package fits.api.v1;
import "buf/validate/validate.proto";
import "fits/api/v1/common.proto";
import "fits/api/v1/predefined_rules.proto";
-import "google/protobuf/timestamp.proto";
// ProjectService provides project management operations.
service ProjectService {
diff --git a/proto/fits/api/v1/tenant.proto b/proto/fits/api/v1/tenant.proto
index 2edade7..70ee137 100644
--- a/proto/fits/api/v1/tenant.proto
+++ b/proto/fits/api/v1/tenant.proto
@@ -5,7 +5,6 @@ package fits.api.v1;
import "buf/validate/validate.proto";
import "fits/api/v1/common.proto";
import "fits/api/v1/predefined_rules.proto";
-import "google/protobuf/timestamp.proto";
// TenantService provides tenant management operations.
service TenantService {
diff --git a/python/fits/api/mvm/__init__.py b/python/fits/api/mvm/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/python/fits/api/mvm/v1/__init__.py b/python/fits/api/mvm/v1/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/python/fits/api/mvm/v1/location_connect.py b/python/fits/api/mvm/v1/location_connect.py
new file mode 100644
index 0000000..4585912
--- /dev/null
+++ b/python/fits/api/mvm/v1/location_connect.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: fits/api/mvm/v1/location.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.codec import Codec
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import fits.api.mvm.v1.location_pb2 as fits_dot_api_dot_mvm_dot_v1_dot_location__pb2
+
+
+class LocationService(Protocol):
+ async def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class LocationServiceASGIApplication(ConnectASGIApplication[LocationService]):
+ def __init__(self, service: LocationService | AsyncGenerator[LocationService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/fits.api.mvm.v1.LocationService/List": Endpoint.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.LocationService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.LocationService"
+
+
+class LocationServiceClient(ConnectClient):
+ async def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.LocationService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+
+
+
+class LocationServiceSync(Protocol):
+ def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class LocationServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: LocationServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/fits.api.mvm.v1.LocationService/List": EndpointSync.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.LocationService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.LocationService"
+
+
+class LocationServiceClientSync(ConnectClientSync):
+ def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.LocationService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_location__pb2.LocationServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
diff --git a/python/fits/api/mvm/v1/location_pb2.py b/python/fits/api/mvm/v1/location_pb2.py
new file mode 100644
index 0000000..831a699
--- /dev/null
+++ b/python/fits/api/mvm/v1/location_pb2.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: fits/api/mvm/v1/location.proto
+# Protobuf Python Version: 7.36.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 36,
+ 1,
+ '',
+ 'fits/api/mvm/v1/location.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
+from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
+from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x66its/api/mvm/v1/location.proto\x12\x0f\x66its.api.mvm.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"K\n\x08Location\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n\x05title\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x05title\"A\n\x1aLocationServiceListRequest\x12#\n\x06tenant\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenant\"V\n\x1bLocationServiceListResponse\x12\x37\n\tlocations\x18\x01 \x03(\x0b\x32\x19.fits.api.mvm.v1.LocationR\tlocations2\x81\x01\n\x0fLocationService\x12n\n\x04List\x12+.fits.api.mvm.v1.LocationServiceListRequest\x1a,.fits.api.mvm.v1.LocationServiceListResponse\"\x0b\xc2\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x42\xb2\x01\n\x13\x63om.fits.api.mvm.v1B\rLocationProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03\x46\x41M\xaa\x02\x0f\x46its.Api.Mvm.V1\xca\x02\x0f\x46its\\Api\\Mvm\\V1\xe2\x02\x1b\x46its\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12\x46its::Api::Mvm::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'fits.api.mvm.v1.location_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\023com.fits.api.mvm.v1B\rLocationProtoP\001Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\242\002\003FAM\252\002\017Fits.Api.Mvm.V1\312\002\017Fits\\Api\\Mvm\\V1\342\002\033Fits\\Api\\Mvm\\V1\\GPBMetadata\352\002\022Fits::Api::Mvm::V1'
+ _globals['_LOCATION'].fields_by_name['uuid']._loaded_options = None
+ _globals['_LOCATION'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_LOCATION'].fields_by_name['title']._loaded_options = None
+ _globals['_LOCATION'].fields_by_name['title']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_LOCATIONSERVICELISTREQUEST'].fields_by_name['tenant']._loaded_options = None
+ _globals['_LOCATIONSERVICELISTREQUEST'].fields_by_name['tenant']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_LOCATIONSERVICE'].methods_by_name['List']._loaded_options = None
+ _globals['_LOCATIONSERVICE'].methods_by_name['List']._serialized_options = b'\302\363\030\003\001\002\003\340\363\030\002'
+ _globals['_LOCATION']._serialized_start=142
+ _globals['_LOCATION']._serialized_end=217
+ _globals['_LOCATIONSERVICELISTREQUEST']._serialized_start=219
+ _globals['_LOCATIONSERVICELISTREQUEST']._serialized_end=284
+ _globals['_LOCATIONSERVICELISTRESPONSE']._serialized_start=286
+ _globals['_LOCATIONSERVICELISTRESPONSE']._serialized_end=372
+ _globals['_LOCATIONSERVICE']._serialized_start=375
+ _globals['_LOCATIONSERVICE']._serialized_end=504
+# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/mvm/v1/location_pb2.pyi b/python/fits/api/mvm/v1/location_pb2.pyi
new file mode 100644
index 0000000..989a6b3
--- /dev/null
+++ b/python/fits/api/mvm/v1/location_pb2.pyi
@@ -0,0 +1,30 @@
+from buf.validate import validate_pb2 as _validate_pb2
+from fits.api.v1 import common_pb2 as _common_pb2
+from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class Location(_message.Message):
+ __slots__ = ("uuid", "title")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ TITLE_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ title: str
+ def __init__(self, uuid: _Optional[str] = ..., title: _Optional[str] = ...) -> None: ...
+
+class LocationServiceListRequest(_message.Message):
+ __slots__ = ("tenant",)
+ TENANT_FIELD_NUMBER: _ClassVar[int]
+ tenant: str
+ def __init__(self, tenant: _Optional[str] = ...) -> None: ...
+
+class LocationServiceListResponse(_message.Message):
+ __slots__ = ("locations",)
+ LOCATIONS_FIELD_NUMBER: _ClassVar[int]
+ locations: _containers.RepeatedCompositeFieldContainer[Location]
+ def __init__(self, locations: _Optional[_Iterable[_Union[Location, _Mapping]]] = ...) -> None: ...
diff --git a/python/fits/api/mvm/v1/mvm_connect.py b/python/fits/api/mvm/v1/mvm_connect.py
new file mode 100644
index 0000000..2a95968
--- /dev/null
+++ b/python/fits/api/mvm/v1/mvm_connect.py
@@ -0,0 +1,1041 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: fits/api/mvm/v1/mvm.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.codec import Codec
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import fits.api.mvm.v1.mvm_pb2 as fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2
+
+
+class MVMService(Protocol):
+ async def get(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def create(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def update(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def delete(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def add_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def update_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def delete_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def add_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def move_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def delete_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def validate_create(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def validate_add_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def validate_update_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def validate_add_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class MVMServiceASGIApplication(ConnectASGIApplication[MVMService]):
+ def __init__(self, service: MVMService | AsyncGenerator[MVMService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/fits.api.mvm.v1.MVMService/Get": Endpoint.unary(
+ method=MethodInfo(
+ name="Get",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get,
+ ),
+ "/fits.api.mvm.v1.MVMService/Create": Endpoint.unary(
+ method=MethodInfo(
+ name="Create",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.create,
+ ),
+ "/fits.api.mvm.v1.MVMService/Update": Endpoint.unary(
+ method=MethodInfo(
+ name="Update",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.update,
+ ),
+ "/fits.api.mvm.v1.MVMService/List": Endpoint.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list,
+ ),
+ "/fits.api.mvm.v1.MVMService/Delete": Endpoint.unary(
+ method=MethodInfo(
+ name="Delete",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.delete,
+ ),
+ "/fits.api.mvm.v1.MVMService/AddDisk": Endpoint.unary(
+ method=MethodInfo(
+ name="AddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.add_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/UpdateDisk": Endpoint.unary(
+ method=MethodInfo(
+ name="UpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.update_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/DeleteDisk": Endpoint.unary(
+ method=MethodInfo(
+ name="DeleteDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.delete_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/AddNetworkInterface": Endpoint.unary(
+ method=MethodInfo(
+ name="AddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.add_network_interface,
+ ),
+ "/fits.api.mvm.v1.MVMService/MoveNetworkInterface": Endpoint.unary(
+ method=MethodInfo(
+ name="MoveNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.move_network_interface,
+ ),
+ "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface": Endpoint.unary(
+ method=MethodInfo(
+ name="DeleteNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.delete_network_interface,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateCreate": Endpoint.unary(
+ method=MethodInfo(
+ name="ValidateCreate",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.validate_create,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateAddDisk": Endpoint.unary(
+ method=MethodInfo(
+ name="ValidateAddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.validate_add_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk": Endpoint.unary(
+ method=MethodInfo(
+ name="ValidateUpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.validate_update_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface": Endpoint.unary(
+ method=MethodInfo(
+ name="ValidateAddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.validate_add_network_interface,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.MVMService"
+
+
+class MVMServiceClient(ConnectClient):
+ async def get(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Get",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def create(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Create",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def update(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Update",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def delete(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Delete",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def add_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="AddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def update_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def delete_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="DeleteDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def add_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="AddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def move_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="MoveNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def delete_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="DeleteNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def validate_create(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateCreate",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def validate_add_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateAddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def validate_update_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateUpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def validate_add_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateAddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+
+
+
+class MVMServiceSync(Protocol):
+ def get(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def create(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def update(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def delete(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def add_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def update_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def delete_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def add_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def move_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def delete_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def validate_create(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def validate_add_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def validate_update_disk(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def validate_add_network_interface(self, request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class MVMServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: MVMServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/fits.api.mvm.v1.MVMService/Get": EndpointSync.unary(
+ method=MethodInfo(
+ name="Get",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get,
+ ),
+ "/fits.api.mvm.v1.MVMService/Create": EndpointSync.unary(
+ method=MethodInfo(
+ name="Create",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.create,
+ ),
+ "/fits.api.mvm.v1.MVMService/Update": EndpointSync.unary(
+ method=MethodInfo(
+ name="Update",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.update,
+ ),
+ "/fits.api.mvm.v1.MVMService/List": EndpointSync.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list,
+ ),
+ "/fits.api.mvm.v1.MVMService/Delete": EndpointSync.unary(
+ method=MethodInfo(
+ name="Delete",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.delete,
+ ),
+ "/fits.api.mvm.v1.MVMService/AddDisk": EndpointSync.unary(
+ method=MethodInfo(
+ name="AddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.add_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/UpdateDisk": EndpointSync.unary(
+ method=MethodInfo(
+ name="UpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.update_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/DeleteDisk": EndpointSync.unary(
+ method=MethodInfo(
+ name="DeleteDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.delete_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/AddNetworkInterface": EndpointSync.unary(
+ method=MethodInfo(
+ name="AddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.add_network_interface,
+ ),
+ "/fits.api.mvm.v1.MVMService/MoveNetworkInterface": EndpointSync.unary(
+ method=MethodInfo(
+ name="MoveNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.move_network_interface,
+ ),
+ "/fits.api.mvm.v1.MVMService/DeleteNetworkInterface": EndpointSync.unary(
+ method=MethodInfo(
+ name="DeleteNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.delete_network_interface,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateCreate": EndpointSync.unary(
+ method=MethodInfo(
+ name="ValidateCreate",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.validate_create,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateAddDisk": EndpointSync.unary(
+ method=MethodInfo(
+ name="ValidateAddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.validate_add_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateUpdateDisk": EndpointSync.unary(
+ method=MethodInfo(
+ name="ValidateUpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.validate_update_disk,
+ ),
+ "/fits.api.mvm.v1.MVMService/ValidateAddNetworkInterface": EndpointSync.unary(
+ method=MethodInfo(
+ name="ValidateAddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.validate_add_network_interface,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.MVMService"
+
+
+class MVMServiceClientSync(ConnectClientSync):
+ def get(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Get",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceGetResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def create(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Create",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def update(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Update",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def delete(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="Delete",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def add_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="AddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def update_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def delete_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="DeleteDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def add_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="AddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def move_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="MoveNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceMoveNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def delete_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="DeleteNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceDeleteNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def validate_create(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateCreate",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateCreateResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def validate_add_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateAddDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def validate_update_disk(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateUpdateDisk",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateUpdateDiskResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def validate_add_network_interface(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ValidateAddNetworkInterface",
+ service_name="fits.api.mvm.v1.MVMService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_mvm__pb2.MVMServiceValidateAddNetworkInterfaceResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
diff --git a/python/fits/api/mvm/v1/mvm_pb2.py b/python/fits/api/mvm/v1/mvm_pb2.py
new file mode 100644
index 0000000..6d5fdba
--- /dev/null
+++ b/python/fits/api/mvm/v1/mvm_pb2.py
@@ -0,0 +1,329 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: fits/api/mvm/v1/mvm.proto
+# Protobuf Python Version: 7.36.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 36,
+ 1,
+ '',
+ 'fits/api/mvm/v1/mvm.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
+from fits.api.mvm.v1 import vlan_pb2 as fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2
+from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
+from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66its/api/mvm/v1/mvm.proto\x12\x0f\x66its.api.mvm.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1a\x66its/api/mvm/v1/vlan.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\x91\x01\n\x0cLinuxDetails\x12\x30\n\x05\x64isks\x18\x01 \x03(\x0b\x32\x1a.fits.api.mvm.v1.LinuxDiskR\x05\x64isks\x12%\n\tldap_uuid\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08ldapUuid\x12(\n\tldap_fqdn\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x08ldapFqdn\"\x9d\x01\n\x0eWindowsDetails\x12\x32\n\x05\x64isks\x18\x01 \x03(\x0b\x32\x1c.fits.api.mvm.v1.WindowsDiskR\x05\x64isks\x12)\n\x0b\x64omain_uuid\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\ndomainUuid\x12,\n\x0b\x64omain_fqdn\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\ndomainFqdn\"{\n\x10NetworkInterface\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12)\n\tipaddress\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xe8\xb3\xae\xb1\x02\x01R\tipaddress\x12\x1e\n\nmacaddress\x18\x03 \x01(\tR\nmacaddress\"\xac\x07\n\tManagedVM\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12%\n\x04meta\x18\x02 \x01(\x0b\x32\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n\x04\x66qdn\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04\x66qdn\x12#\n\x06tenant\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenant\x12+\n\x0cproject_uuid\x18\x05 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0bprojectUuid\x12!\n\x07os_uuid\x18\x06 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x06osUuid\x12-\n\rlocation_uuid\x18\x07 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0clocationUuid\x12+\n\x0c\x63ontact_uuid\x18\x08 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0b\x63ontactUuid\x12\x10\n\x03\x63pu\x18\t \x01(\rR\x03\x63pu\x12\x10\n\x03ram\x18\n \x01(\rR\x03ram\x12\x16\n\x06\x62\x61\x63kup\x18\x0b \x01(\x08R\x06\x62\x61\x63kup\x12<\n\x06status\x18\x0c \x01(\x0e\x32\x1a.fits.api.mvm.v1.MVMStatusB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x06status\x12\x1f\n\x0bstatus_info\x18\r \x01(\tR\nstatusInfo\x12K\n\x0c\x61vailability\x18\x0e \x01(\x0e\x32\x1d.fits.api.mvm.v1.AvailabilityB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x0c\x61vailability\x12K\n\x0cserviceclass\x18\x0f \x01(\x0e\x32\x1d.fits.api.mvm.v1.ServiceClassB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x0cserviceclass\x12J\n\x0fwindows_details\x18\x10 \x01(\x0b\x32\x1f.fits.api.mvm.v1.WindowsDetailsH\x00R\x0ewindowsDetails\x12\x44\n\rlinux_details\x18\x11 \x01(\x0b\x32\x1d.fits.api.mvm.v1.LinuxDetailsH\x00R\x0clinuxDetails\x12\x41\n\ninterfaces\x18\x12 \x03(\x0b\x32!.fits.api.mvm.v1.NetworkInterfaceR\ninterfaces\x12)\n\x04vlan\x18\x13 \x01(\x0b\x32\x15.fits.api.mvm.v1.VLANR\x04vlan\x12!\n\x0corder_number\x18\x14 \x01(\tR\x0borderNumberB\x10\n\x07\x64\x65tails\x12\x05\xbaH\x02\x08\x01\"g\n\x14MVMServiceGetRequest\x12!\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12#\n\x06tenant\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenantB\x07\n\x05_uuid\"E\n\x15MVMServiceGetResponse\x12,\n\x03mvm\x18\x01 \x01(\x0b\x32\x1a.fits.api.mvm.v1.ManagedVMR\x03mvm\"\x89\x01\n\x1eMVMServiceCreateWindowsRequest\x12)\n\x0b\x64omain_uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\ndomainUuid\x12<\n\x05\x64isks\x18\x02 \x03(\x0b\x32\x1c.fits.api.mvm.v1.WindowsDiskB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x05\x64isks\"\x81\x01\n\x1cMVMServiceCreateLinuxRequest\x12%\n\tldap_uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08ldapUuid\x12:\n\x05\x64isks\x18\x02 \x03(\x0b\x32\x1a.fits.api.mvm.v1.LinuxDiskB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x05\x64isks\"\xe7\x05\n\x17MVMServiceCreateRequest\x12+\n\x0cproject_uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0bprojectUuid\x12$\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12!\n\x07os_uuid\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x06osUuid\x12%\n\tvlan_uuid\x18\x04 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08vlanUuid\x12-\n\rlocation_uuid\x18\x05 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0clocationUuid\x12+\n\x0c\x63ontact_uuid\x18\x06 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0b\x63ontactUuid\x12\x10\n\x03\x63pu\x18\x07 \x01(\rR\x03\x63pu\x12\x10\n\x03ram\x18\x08 \x01(\rR\x03ram\x12!\n\x0corder_number\x18\t \x01(\tR\x0borderNumber\x12+\n\x06labels\x18\n \x01(\x0b\x32\x13.fits.api.v1.LabelsR\x06labels\x12\x16\n\x06\x62\x61\x63kup\x18\x0b \x01(\x08R\x06\x62\x61\x63kup\x12K\n\x0c\x61vailability\x18\x0c \x01(\x0e\x32\x1d.fits.api.mvm.v1.AvailabilityB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x0c\x61vailability\x12K\n\x0cserviceclass\x18\r \x01(\x0e\x32\x1d.fits.api.mvm.v1.ServiceClassB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x0cserviceclass\x12K\n\x07windows\x18\x0e \x01(\x0b\x32/.fits.api.mvm.v1.MVMServiceCreateWindowsRequestH\x00R\x07windows\x12\x45\n\x05linux\x18\x0f \x01(\x0b\x32-.fits.api.mvm.v1.MVMServiceCreateLinuxRequestH\x00R\x05linuxB\x10\n\x07mvmtype\x12\x05\xbaH\x02\x08\x01\x42\x07\n\x05_name\"\x9b\x02\n\tLinuxDisk\x12!\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12\x14\n\x05label\x18\x02 \x01(\tR\x05label\x12\x1f\n\x0b\x61uto_extend\x18\x03 \x01(\x08R\nautoExtend\x12\x17\n\x04size\x18\x04 \x01(\x04H\x01R\x04size\x88\x01\x01\x12$\n\x0bmount_point\x18\x05 \x01(\tH\x02R\nmountPoint\x88\x01\x01\x12\x45\n\tdisk_type\x18\x06 \x01(\x0e\x32\x19.fits.api.mvm.v1.DiskTypeB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x03R\x08\x64iskType\x88\x01\x01\x42\x07\n\x05_uuidB\x07\n\x05_sizeB\x0e\n\x0c_mount_pointB\x0c\n\n_disk_type\"\x9e\x02\n\x0bWindowsDisk\x12!\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12\x14\n\x05label\x18\x02 \x01(\tR\x05label\x12\x1f\n\x0b\x61uto_extend\x18\x03 \x01(\x08R\nautoExtend\x12\x17\n\x04size\x18\x04 \x01(\x04H\x01R\x04size\x88\x01\x01\x12%\n\x0b\x64riveletter\x18\x05 \x01(\tH\x02R\x0b\x64riveletter\x88\x01\x01\x12\x45\n\tdisk_type\x18\x06 \x01(\x0e\x32\x19.fits.api.mvm.v1.DiskTypeB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x03R\x08\x64iskType\x88\x01\x01\x42\x07\n\x05_uuidB\x07\n\x05_sizeB\x0e\n\x0c_driveletterB\x0c\n\n_disk_type\"\x1a\n\x18MVMServiceCreateResponse\"\xb1\x03\n\x17MVMServiceUpdateRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\"\n\x07project\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12!\n\x0corder_number\x18\x03 \x01(\tR\x0borderNumber\x12@\n\x0bupdate_meta\x18\x04 \x01(\x0b\x32\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\nupdateMeta\x12V\n\x11performance_class\x18\x05 \x01(\x0b\x32\'.fits.api.mvm.v1.PerformanceClassChangeH\x00R\x10performanceClass\x12J\n\rservice_class\x18\x06 \x01(\x0b\x32#.fits.api.mvm.v1.ServiceClassChangeH\x00R\x0cserviceClass\x12:\n\x07\x63ontact\x18\x07 \x01(\x0b\x32\x1e.fits.api.mvm.v1.ContactChangeH\x00R\x07\x63ontactB\x0f\n\x06\x61\x63tion\x12\x05\xbaH\x02\x08\x01\"P\n\x16PerformanceClassChange\x12\x1b\n\x03\x63pu\x18\x01 \x01(\rB\t\xbaH\x06*\x04\x18@(\x01R\x03\x63pu\x12\x19\n\x03ram\x18\x02 \x01(\rB\x07\xbaH\x04*\x02 \x00R\x03ram\"a\n\x12ServiceClassChange\x12K\n\x0cserviceclass\x18\x01 \x01(\x0e\x32\x1d.fits.api.mvm.v1.ServiceClassB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x0cserviceclass\"<\n\rContactChange\x12+\n\x0c\x63ontact_uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0b\x63ontactUuid\"\x1a\n\x18MVMServiceUpdateResponse\"L\n\x15MVMServiceListRequest\x12(\n\x06tenant\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x06tenant\x88\x01\x01\x42\t\n\x07_tenant\"H\n\x16MVMServiceListResponse\x12.\n\x04mvms\x18\x01 \x03(\x0b\x32\x1a.fits.api.mvm.v1.ManagedVMR\x04mvms\"~\n\x17MVMServiceDeleteRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12\x1c\n\x04uuid\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n\x0corder_number\x18\x03 \x01(\tR\x0borderNumber\"\x1a\n\x18MVMServiceDeleteResponse\"k\n\x1fMVMServiceValidateCreateRequest\x12H\n\x06\x63reate\x18\x01 \x01(\x0b\x32(.fits.api.mvm.v1.MVMServiceCreateRequestB\x06\xbaH\x03\xc8\x01\x01R\x06\x63reate\"\"\n MVMServiceValidateCreateResponse\"p\n MVMServiceValidateAddDiskRequest\x12L\n\x08\x61\x64\x64_disk\x18\x01 \x01(\x0b\x32).fits.api.mvm.v1.MVMServiceAddDiskRequestB\x06\xbaH\x03\xc8\x01\x01R\x07\x61\x64\x64\x44isk\"#\n!MVMServiceValidateAddDiskResponse\"|\n#MVMServiceValidateUpdateDiskRequest\x12U\n\x0bupdate_disk\x18\x01 \x01(\x0b\x32,.fits.api.mvm.v1.MVMServiceUpdateDiskRequestB\x06\xbaH\x03\xc8\x01\x01R\nupdateDisk\"&\n$MVMServiceValidateUpdateDiskResponse\"\x1b\n\x19MVMServiceAddDiskResponse\"\x1e\n\x1cMVMServiceUpdateDiskResponse\"\x1e\n\x1cMVMServiceDeleteDiskResponse\"\xfc\x01\n\x18MVMServiceAddDiskRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\"\n\x07project\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12!\n\x0corder_number\x18\x03 \x01(\tR\x0borderNumber\x12\x32\n\x05linux\x18\x04 \x01(\x0b\x32\x1a.fits.api.mvm.v1.LinuxDiskH\x00R\x05linux\x12\x38\n\x07windows\x18\x05 \x01(\x0b\x32\x1c.fits.api.mvm.v1.WindowsDiskH\x00R\x07windowsB\r\n\x04\x64isk\x12\x05\xbaH\x02\x08\x01\"\x81\x02\n\x1bMVMServiceUpdateDiskRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12%\n\tdisk_uuid\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08\x64iskUuid\x12\"\n\x07project\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12!\n\x0corder_number\x18\x04 \x01(\tR\x0borderNumber\x12$\n\x0b\x61uto_extend\x18\x05 \x01(\x08H\x00R\nautoExtend\x88\x01\x01\x12\x17\n\x04size\x18\x06 \x01(\x04H\x01R\x04size\x88\x01\x01\x42\x0e\n\x0c_auto_extendB\x07\n\x05_size\"\xa9\x01\n\x1bMVMServiceDeleteDiskRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12%\n\tdisk_uuid\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08\x64iskUuid\x12\"\n\x07project\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12!\n\x0corder_number\x18\x04 \x01(\tR\x0borderNumber\"\'\n%MVMServiceAddNetworkInterfaceResponse\"(\n&MVMServiceMoveNetworkInterfaceResponse\"*\n(MVMServiceDeleteNetworkInterfaceResponse\"\x8b\x01\n$MVMServiceAddNetworkInterfaceRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\"\n\x07project\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12!\n\x0corder_number\x18\x03 \x01(\tR\x0borderNumber\"\xef\x01\n%MVMServiceMoveNetworkInterfaceRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12/\n\x0einterface_uuid\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\rinterfaceUuid\x12\"\n\x07project\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12!\n\x0corder_number\x18\x04 \x01(\tR\x0borderNumber\x12\x30\n\x0ftarget_mvm_uuid\x18\x05 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\rtargetMvmUuid\"\xbf\x01\n\'MVMServiceDeleteNetworkInterfaceRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12/\n\x0einterface_uuid\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\rinterfaceUuid\x12\"\n\x07project\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12!\n\x0corder_number\x18\x04 \x01(\tR\x0borderNumber\"\xa1\x01\n,MVMServiceValidateAddNetworkInterfaceRequest\x12q\n\x15\x61\x64\x64_network_interface\x18\x01 \x01(\x0b\x32\x35.fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequestB\x06\xbaH\x03\xc8\x01\x01R\x13\x61\x64\x64NetworkInterface\"/\n-MVMServiceValidateAddNetworkInterfaceResponse*\xa6\x01\n\x0c\x41vailability\x12\"\n\x18\x41VAILABILITY_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x1b\n\x0f\x41VAILABILITY_V0\x10\x01\x1a\x06\x82\xb2\x19\x02V0\x12\x1b\n\x0f\x41VAILABILITY_V1\x10\x02\x1a\x06\x82\xb2\x19\x02V1\x12\x1b\n\x0f\x41VAILABILITY_V2\x10\x03\x1a\x06\x82\xb2\x19\x02V2\x12\x1b\n\x0f\x41VAILABILITY_V3\x10\x04\x1a\x06\x82\xb2\x19\x02V3*\x93\x01\n\x0cServiceClass\x12#\n\x19SERVICE_CLASS_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x1e\n\x11SERVICE_CLASS_SZ1\x10\x01\x1a\x07\x82\xb2\x19\x03SZ1\x12\x1e\n\x11SERVICE_CLASS_SZ2\x10\x02\x1a\x07\x82\xb2\x19\x03SZ2\x12\x1e\n\x11SERVICE_CLASS_SZ3\x10\x03\x1a\x07\x82\xb2\x19\x03SZ3*P\n\tMVMStatus\x12 \n\x16MVM_STATUS_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12!\n\x11MVM_STATUS_ACTIVE\x10\x01\x1a\n\x82\xb2\x19\x06\x61\x63tive*\x85\x01\n\x08\x44iskType\x12\x1f\n\x15\x44ISK_TYPE_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x18\n\x0c\x44ISK_TYPE_OS\x10\x01\x1a\x06\x82\xb2\x19\x02os\x12 \n\x10\x44ISK_TYPE_SYSTEM\x10\x02\x1a\n\x82\xb2\x19\x06system\x12\x1c\n\x0e\x44ISK_TYPE_DATA\x10\x03\x1a\x08\x82\xb2\x19\x04\x64\x61ta2\xfd\x0e\n\nMVMService\x12\x61\n\x03Get\x12%.fits.api.mvm.v1.MVMServiceGetRequest\x1a&.fits.api.mvm.v1.MVMServiceGetResponse\"\x0b\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n\x06\x43reate\x12(.fits.api.mvm.v1.MVMServiceCreateRequest\x1a).fits.api.mvm.v1.MVMServiceCreateResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12i\n\x06Update\x12(.fits.api.mvm.v1.MVMServiceUpdateRequest\x1a).fits.api.mvm.v1.MVMServiceUpdateResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x64\n\x04List\x12&.fits.api.mvm.v1.MVMServiceListRequest\x1a\'.fits.api.mvm.v1.MVMServiceListResponse\"\x0b\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n\x06\x44\x65lete\x12(.fits.api.mvm.v1.MVMServiceDeleteRequest\x1a).fits.api.mvm.v1.MVMServiceDeleteResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12l\n\x07\x41\x64\x64\x44isk\x12).fits.api.mvm.v1.MVMServiceAddDiskRequest\x1a*.fits.api.mvm.v1.MVMServiceAddDiskResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12u\n\nUpdateDisk\x12,.fits.api.mvm.v1.MVMServiceUpdateDiskRequest\x1a-.fits.api.mvm.v1.MVMServiceUpdateDiskResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12u\n\nDeleteDisk\x12,.fits.api.mvm.v1.MVMServiceDeleteDiskRequest\x1a-.fits.api.mvm.v1.MVMServiceDeleteDiskResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x90\x01\n\x13\x41\x64\x64NetworkInterface\x12\x35.fits.api.mvm.v1.MVMServiceAddNetworkInterfaceRequest\x1a\x36.fits.api.mvm.v1.MVMServiceAddNetworkInterfaceResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x93\x01\n\x14MoveNetworkInterface\x12\x36.fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceRequest\x1a\x37.fits.api.mvm.v1.MVMServiceMoveNetworkInterfaceResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x99\x01\n\x16\x44\x65leteNetworkInterface\x12\x38.fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceRequest\x1a\x39.fits.api.mvm.v1.MVMServiceDeleteNetworkInterfaceResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12\x81\x01\n\x0eValidateCreate\x12\x30.fits.api.mvm.v1.MVMServiceValidateCreateRequest\x1a\x31.fits.api.mvm.v1.MVMServiceValidateCreateResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02\x12\x84\x01\n\x0fValidateAddDisk\x12\x31.fits.api.mvm.v1.MVMServiceValidateAddDiskRequest\x1a\x32.fits.api.mvm.v1.MVMServiceValidateAddDiskResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02\x12\x8d\x01\n\x12ValidateUpdateDisk\x12\x34.fits.api.mvm.v1.MVMServiceValidateUpdateDiskRequest\x1a\x35.fits.api.mvm.v1.MVMServiceValidateUpdateDiskResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02\x12\xa8\x01\n\x1bValidateAddNetworkInterface\x12=.fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceRequest\x1a>.fits.api.mvm.v1.MVMServiceValidateAddNetworkInterfaceResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x02\x42\xad\x01\n\x13\x63om.fits.api.mvm.v1B\x08MvmProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03\x46\x41M\xaa\x02\x0f\x46its.Api.Mvm.V1\xca\x02\x0f\x46its\\Api\\Mvm\\V1\xe2\x02\x1b\x46its\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12\x46its::Api::Mvm::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'fits.api.mvm.v1.mvm_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\023com.fits.api.mvm.v1B\010MvmProtoP\001Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\242\002\003FAM\252\002\017Fits.Api.Mvm.V1\312\002\017Fits\\Api\\Mvm\\V1\342\002\033Fits\\Api\\Mvm\\V1\\GPBMetadata\352\002\022Fits::Api::Mvm::V1'
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_UNSPECIFIED"]._loaded_options = None
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_UNSPECIFIED"]._serialized_options = b'\202\262\031\000'
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V0"]._loaded_options = None
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V0"]._serialized_options = b'\202\262\031\002V0'
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V1"]._loaded_options = None
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V1"]._serialized_options = b'\202\262\031\002V1'
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V2"]._loaded_options = None
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V2"]._serialized_options = b'\202\262\031\002V2'
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V3"]._loaded_options = None
+ _globals['_AVAILABILITY'].values_by_name["AVAILABILITY_V3"]._serialized_options = b'\202\262\031\002V3'
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_UNSPECIFIED"]._loaded_options = None
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_UNSPECIFIED"]._serialized_options = b'\202\262\031\000'
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_SZ1"]._loaded_options = None
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_SZ1"]._serialized_options = b'\202\262\031\003SZ1'
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_SZ2"]._loaded_options = None
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_SZ2"]._serialized_options = b'\202\262\031\003SZ2'
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_SZ3"]._loaded_options = None
+ _globals['_SERVICECLASS'].values_by_name["SERVICE_CLASS_SZ3"]._serialized_options = b'\202\262\031\003SZ3'
+ _globals['_MVMSTATUS'].values_by_name["MVM_STATUS_UNSPECIFIED"]._loaded_options = None
+ _globals['_MVMSTATUS'].values_by_name["MVM_STATUS_UNSPECIFIED"]._serialized_options = b'\202\262\031\000'
+ _globals['_MVMSTATUS'].values_by_name["MVM_STATUS_ACTIVE"]._loaded_options = None
+ _globals['_MVMSTATUS'].values_by_name["MVM_STATUS_ACTIVE"]._serialized_options = b'\202\262\031\006active'
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_UNSPECIFIED"]._loaded_options = None
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_UNSPECIFIED"]._serialized_options = b'\202\262\031\000'
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_OS"]._loaded_options = None
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_OS"]._serialized_options = b'\202\262\031\002os'
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_SYSTEM"]._loaded_options = None
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_SYSTEM"]._serialized_options = b'\202\262\031\006system'
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_DATA"]._loaded_options = None
+ _globals['_DISKTYPE'].values_by_name["DISK_TYPE_DATA"]._serialized_options = b'\202\262\031\004data'
+ _globals['_LINUXDETAILS'].fields_by_name['ldap_uuid']._loaded_options = None
+ _globals['_LINUXDETAILS'].fields_by_name['ldap_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_LINUXDETAILS'].fields_by_name['ldap_fqdn']._loaded_options = None
+ _globals['_LINUXDETAILS'].fields_by_name['ldap_fqdn']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_WINDOWSDETAILS'].fields_by_name['domain_uuid']._loaded_options = None
+ _globals['_WINDOWSDETAILS'].fields_by_name['domain_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_WINDOWSDETAILS'].fields_by_name['domain_fqdn']._loaded_options = None
+ _globals['_WINDOWSDETAILS'].fields_by_name['domain_fqdn']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_NETWORKINTERFACE'].fields_by_name['uuid']._loaded_options = None
+ _globals['_NETWORKINTERFACE'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_NETWORKINTERFACE'].fields_by_name['ipaddress']._loaded_options = None
+ _globals['_NETWORKINTERFACE'].fields_by_name['ipaddress']._serialized_options = b'\272H\010r\006\350\263\256\261\002\001'
+ _globals['_MANAGEDVM'].oneofs_by_name['details']._loaded_options = None
+ _globals['_MANAGEDVM'].oneofs_by_name['details']._serialized_options = b'\272H\002\010\001'
+ _globals['_MANAGEDVM'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MANAGEDVM'].fields_by_name['fqdn']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['fqdn']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_MANAGEDVM'].fields_by_name['tenant']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['tenant']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_MANAGEDVM'].fields_by_name['project_uuid']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['project_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MANAGEDVM'].fields_by_name['os_uuid']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['os_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MANAGEDVM'].fields_by_name['location_uuid']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['location_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MANAGEDVM'].fields_by_name['contact_uuid']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['contact_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MANAGEDVM'].fields_by_name['status']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['status']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_MANAGEDVM'].fields_by_name['availability']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['availability']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_MANAGEDVM'].fields_by_name['serviceclass']._loaded_options = None
+ _globals['_MANAGEDVM'].fields_by_name['serviceclass']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_MVMSERVICEGETREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEGETREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEGETREQUEST'].fields_by_name['tenant']._loaded_options = None
+ _globals['_MVMSERVICEGETREQUEST'].fields_by_name['tenant']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_MVMSERVICECREATEWINDOWSREQUEST'].fields_by_name['domain_uuid']._loaded_options = None
+ _globals['_MVMSERVICECREATEWINDOWSREQUEST'].fields_by_name['domain_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICECREATEWINDOWSREQUEST'].fields_by_name['disks']._loaded_options = None
+ _globals['_MVMSERVICECREATEWINDOWSREQUEST'].fields_by_name['disks']._serialized_options = b'\272H\005\222\001\002\010\001'
+ _globals['_MVMSERVICECREATELINUXREQUEST'].fields_by_name['ldap_uuid']._loaded_options = None
+ _globals['_MVMSERVICECREATELINUXREQUEST'].fields_by_name['ldap_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICECREATELINUXREQUEST'].fields_by_name['disks']._loaded_options = None
+ _globals['_MVMSERVICECREATELINUXREQUEST'].fields_by_name['disks']._serialized_options = b'\272H\005\222\001\002\010\001'
+ _globals['_MVMSERVICECREATEREQUEST'].oneofs_by_name['mvmtype']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].oneofs_by_name['mvmtype']._serialized_options = b'\272H\002\010\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['project_uuid']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['project_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['name']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['name']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['os_uuid']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['os_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['vlan_uuid']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['vlan_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['location_uuid']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['location_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['contact_uuid']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['contact_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['availability']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['availability']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['serviceclass']._loaded_options = None
+ _globals['_MVMSERVICECREATEREQUEST'].fields_by_name['serviceclass']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_LINUXDISK'].fields_by_name['uuid']._loaded_options = None
+ _globals['_LINUXDISK'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_LINUXDISK'].fields_by_name['disk_type']._loaded_options = None
+ _globals['_LINUXDISK'].fields_by_name['disk_type']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_WINDOWSDISK'].fields_by_name['uuid']._loaded_options = None
+ _globals['_WINDOWSDISK'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_WINDOWSDISK'].fields_by_name['disk_type']._loaded_options = None
+ _globals['_WINDOWSDISK'].fields_by_name['disk_type']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_MVMSERVICEUPDATEREQUEST'].oneofs_by_name['action']._loaded_options = None
+ _globals['_MVMSERVICEUPDATEREQUEST'].oneofs_by_name['action']._serialized_options = b'\272H\002\010\001'
+ _globals['_MVMSERVICEUPDATEREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEUPDATEREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEUPDATEREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEUPDATEREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEUPDATEREQUEST'].fields_by_name['update_meta']._loaded_options = None
+ _globals['_MVMSERVICEUPDATEREQUEST'].fields_by_name['update_meta']._serialized_options = b'\272H\003\310\001\001'
+ _globals['_PERFORMANCECLASSCHANGE'].fields_by_name['cpu']._loaded_options = None
+ _globals['_PERFORMANCECLASSCHANGE'].fields_by_name['cpu']._serialized_options = b'\272H\006*\004\030@(\001'
+ _globals['_PERFORMANCECLASSCHANGE'].fields_by_name['ram']._loaded_options = None
+ _globals['_PERFORMANCECLASSCHANGE'].fields_by_name['ram']._serialized_options = b'\272H\004*\002 \000'
+ _globals['_SERVICECLASSCHANGE'].fields_by_name['serviceclass']._loaded_options = None
+ _globals['_SERVICECLASSCHANGE'].fields_by_name['serviceclass']._serialized_options = b'\272H\005\202\001\002\020\001'
+ _globals['_CONTACTCHANGE'].fields_by_name['contact_uuid']._loaded_options = None
+ _globals['_CONTACTCHANGE'].fields_by_name['contact_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICELISTREQUEST'].fields_by_name['tenant']._loaded_options = None
+ _globals['_MVMSERVICELISTREQUEST'].fields_by_name['tenant']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_MVMSERVICEDELETEREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEDELETEREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEDELETEREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEDELETEREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEVALIDATECREATEREQUEST'].fields_by_name['create']._loaded_options = None
+ _globals['_MVMSERVICEVALIDATECREATEREQUEST'].fields_by_name['create']._serialized_options = b'\272H\003\310\001\001'
+ _globals['_MVMSERVICEVALIDATEADDDISKREQUEST'].fields_by_name['add_disk']._loaded_options = None
+ _globals['_MVMSERVICEVALIDATEADDDISKREQUEST'].fields_by_name['add_disk']._serialized_options = b'\272H\003\310\001\001'
+ _globals['_MVMSERVICEVALIDATEUPDATEDISKREQUEST'].fields_by_name['update_disk']._loaded_options = None
+ _globals['_MVMSERVICEVALIDATEUPDATEDISKREQUEST'].fields_by_name['update_disk']._serialized_options = b'\272H\003\310\001\001'
+ _globals['_MVMSERVICEADDDISKREQUEST'].oneofs_by_name['disk']._loaded_options = None
+ _globals['_MVMSERVICEADDDISKREQUEST'].oneofs_by_name['disk']._serialized_options = b'\272H\002\010\001'
+ _globals['_MVMSERVICEADDDISKREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEADDDISKREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEADDDISKREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEADDDISKREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEUPDATEDISKREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEUPDATEDISKREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEUPDATEDISKREQUEST'].fields_by_name['disk_uuid']._loaded_options = None
+ _globals['_MVMSERVICEUPDATEDISKREQUEST'].fields_by_name['disk_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEUPDATEDISKREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEUPDATEDISKREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEDELETEDISKREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEDELETEDISKREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEDELETEDISKREQUEST'].fields_by_name['disk_uuid']._loaded_options = None
+ _globals['_MVMSERVICEDELETEDISKREQUEST'].fields_by_name['disk_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEDELETEDISKREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEDELETEDISKREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEADDNETWORKINTERFACEREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEADDNETWORKINTERFACEREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEADDNETWORKINTERFACEREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEADDNETWORKINTERFACEREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['interface_uuid']._loaded_options = None
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['interface_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['target_mvm_uuid']._loaded_options = None
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST'].fields_by_name['target_mvm_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST'].fields_by_name['uuid']._loaded_options = None
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST'].fields_by_name['interface_uuid']._loaded_options = None
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST'].fields_by_name['interface_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST'].fields_by_name['project']._loaded_options = None
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST'].fields_by_name['project']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_MVMSERVICEVALIDATEADDNETWORKINTERFACEREQUEST'].fields_by_name['add_network_interface']._loaded_options = None
+ _globals['_MVMSERVICEVALIDATEADDNETWORKINTERFACEREQUEST'].fields_by_name['add_network_interface']._serialized_options = b'\272H\003\310\001\001'
+ _globals['_MVMSERVICE'].methods_by_name['Get']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['Get']._serialized_options = b'\312\363\030\003\001\002\003\340\363\030\002'
+ _globals['_MVMSERVICE'].methods_by_name['Create']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['Create']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['Update']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['Update']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['List']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['List']._serialized_options = b'\312\363\030\003\001\002\003\340\363\030\002'
+ _globals['_MVMSERVICE'].methods_by_name['Delete']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['Delete']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['AddDisk']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['AddDisk']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['UpdateDisk']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['UpdateDisk']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['DeleteDisk']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['DeleteDisk']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['AddNetworkInterface']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['AddNetworkInterface']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['MoveNetworkInterface']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['MoveNetworkInterface']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['DeleteNetworkInterface']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['DeleteNetworkInterface']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
+ _globals['_MVMSERVICE'].methods_by_name['ValidateCreate']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['ValidateCreate']._serialized_options = b'\312\363\030\002\001\002\340\363\030\002'
+ _globals['_MVMSERVICE'].methods_by_name['ValidateAddDisk']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['ValidateAddDisk']._serialized_options = b'\312\363\030\002\001\002\340\363\030\002'
+ _globals['_MVMSERVICE'].methods_by_name['ValidateUpdateDisk']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['ValidateUpdateDisk']._serialized_options = b'\312\363\030\002\001\002\340\363\030\002'
+ _globals['_MVMSERVICE'].methods_by_name['ValidateAddNetworkInterface']._loaded_options = None
+ _globals['_MVMSERVICE'].methods_by_name['ValidateAddNetworkInterface']._serialized_options = b'\312\363\030\002\001\002\340\363\030\002'
+ _globals['_AVAILABILITY']._serialized_start=6514
+ _globals['_AVAILABILITY']._serialized_end=6680
+ _globals['_SERVICECLASS']._serialized_start=6683
+ _globals['_SERVICECLASS']._serialized_end=6830
+ _globals['_MVMSTATUS']._serialized_start=6832
+ _globals['_MVMSTATUS']._serialized_end=6912
+ _globals['_DISKTYPE']._serialized_start=6915
+ _globals['_DISKTYPE']._serialized_end=7048
+ _globals['_LINUXDETAILS']._serialized_start=166
+ _globals['_LINUXDETAILS']._serialized_end=311
+ _globals['_WINDOWSDETAILS']._serialized_start=314
+ _globals['_WINDOWSDETAILS']._serialized_end=471
+ _globals['_NETWORKINTERFACE']._serialized_start=473
+ _globals['_NETWORKINTERFACE']._serialized_end=596
+ _globals['_MANAGEDVM']._serialized_start=599
+ _globals['_MANAGEDVM']._serialized_end=1539
+ _globals['_MVMSERVICEGETREQUEST']._serialized_start=1541
+ _globals['_MVMSERVICEGETREQUEST']._serialized_end=1644
+ _globals['_MVMSERVICEGETRESPONSE']._serialized_start=1646
+ _globals['_MVMSERVICEGETRESPONSE']._serialized_end=1715
+ _globals['_MVMSERVICECREATEWINDOWSREQUEST']._serialized_start=1718
+ _globals['_MVMSERVICECREATEWINDOWSREQUEST']._serialized_end=1855
+ _globals['_MVMSERVICECREATELINUXREQUEST']._serialized_start=1858
+ _globals['_MVMSERVICECREATELINUXREQUEST']._serialized_end=1987
+ _globals['_MVMSERVICECREATEREQUEST']._serialized_start=1990
+ _globals['_MVMSERVICECREATEREQUEST']._serialized_end=2733
+ _globals['_LINUXDISK']._serialized_start=2736
+ _globals['_LINUXDISK']._serialized_end=3019
+ _globals['_WINDOWSDISK']._serialized_start=3022
+ _globals['_WINDOWSDISK']._serialized_end=3308
+ _globals['_MVMSERVICECREATERESPONSE']._serialized_start=3310
+ _globals['_MVMSERVICECREATERESPONSE']._serialized_end=3336
+ _globals['_MVMSERVICEUPDATEREQUEST']._serialized_start=3339
+ _globals['_MVMSERVICEUPDATEREQUEST']._serialized_end=3772
+ _globals['_PERFORMANCECLASSCHANGE']._serialized_start=3774
+ _globals['_PERFORMANCECLASSCHANGE']._serialized_end=3854
+ _globals['_SERVICECLASSCHANGE']._serialized_start=3856
+ _globals['_SERVICECLASSCHANGE']._serialized_end=3953
+ _globals['_CONTACTCHANGE']._serialized_start=3955
+ _globals['_CONTACTCHANGE']._serialized_end=4015
+ _globals['_MVMSERVICEUPDATERESPONSE']._serialized_start=4017
+ _globals['_MVMSERVICEUPDATERESPONSE']._serialized_end=4043
+ _globals['_MVMSERVICELISTREQUEST']._serialized_start=4045
+ _globals['_MVMSERVICELISTREQUEST']._serialized_end=4121
+ _globals['_MVMSERVICELISTRESPONSE']._serialized_start=4123
+ _globals['_MVMSERVICELISTRESPONSE']._serialized_end=4195
+ _globals['_MVMSERVICEDELETEREQUEST']._serialized_start=4197
+ _globals['_MVMSERVICEDELETEREQUEST']._serialized_end=4323
+ _globals['_MVMSERVICEDELETERESPONSE']._serialized_start=4325
+ _globals['_MVMSERVICEDELETERESPONSE']._serialized_end=4351
+ _globals['_MVMSERVICEVALIDATECREATEREQUEST']._serialized_start=4353
+ _globals['_MVMSERVICEVALIDATECREATEREQUEST']._serialized_end=4460
+ _globals['_MVMSERVICEVALIDATECREATERESPONSE']._serialized_start=4462
+ _globals['_MVMSERVICEVALIDATECREATERESPONSE']._serialized_end=4496
+ _globals['_MVMSERVICEVALIDATEADDDISKREQUEST']._serialized_start=4498
+ _globals['_MVMSERVICEVALIDATEADDDISKREQUEST']._serialized_end=4610
+ _globals['_MVMSERVICEVALIDATEADDDISKRESPONSE']._serialized_start=4612
+ _globals['_MVMSERVICEVALIDATEADDDISKRESPONSE']._serialized_end=4647
+ _globals['_MVMSERVICEVALIDATEUPDATEDISKREQUEST']._serialized_start=4649
+ _globals['_MVMSERVICEVALIDATEUPDATEDISKREQUEST']._serialized_end=4773
+ _globals['_MVMSERVICEVALIDATEUPDATEDISKRESPONSE']._serialized_start=4775
+ _globals['_MVMSERVICEVALIDATEUPDATEDISKRESPONSE']._serialized_end=4813
+ _globals['_MVMSERVICEADDDISKRESPONSE']._serialized_start=4815
+ _globals['_MVMSERVICEADDDISKRESPONSE']._serialized_end=4842
+ _globals['_MVMSERVICEUPDATEDISKRESPONSE']._serialized_start=4844
+ _globals['_MVMSERVICEUPDATEDISKRESPONSE']._serialized_end=4874
+ _globals['_MVMSERVICEDELETEDISKRESPONSE']._serialized_start=4876
+ _globals['_MVMSERVICEDELETEDISKRESPONSE']._serialized_end=4906
+ _globals['_MVMSERVICEADDDISKREQUEST']._serialized_start=4909
+ _globals['_MVMSERVICEADDDISKREQUEST']._serialized_end=5161
+ _globals['_MVMSERVICEUPDATEDISKREQUEST']._serialized_start=5164
+ _globals['_MVMSERVICEUPDATEDISKREQUEST']._serialized_end=5421
+ _globals['_MVMSERVICEDELETEDISKREQUEST']._serialized_start=5424
+ _globals['_MVMSERVICEDELETEDISKREQUEST']._serialized_end=5593
+ _globals['_MVMSERVICEADDNETWORKINTERFACERESPONSE']._serialized_start=5595
+ _globals['_MVMSERVICEADDNETWORKINTERFACERESPONSE']._serialized_end=5634
+ _globals['_MVMSERVICEMOVENETWORKINTERFACERESPONSE']._serialized_start=5636
+ _globals['_MVMSERVICEMOVENETWORKINTERFACERESPONSE']._serialized_end=5676
+ _globals['_MVMSERVICEDELETENETWORKINTERFACERESPONSE']._serialized_start=5678
+ _globals['_MVMSERVICEDELETENETWORKINTERFACERESPONSE']._serialized_end=5720
+ _globals['_MVMSERVICEADDNETWORKINTERFACEREQUEST']._serialized_start=5723
+ _globals['_MVMSERVICEADDNETWORKINTERFACEREQUEST']._serialized_end=5862
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST']._serialized_start=5865
+ _globals['_MVMSERVICEMOVENETWORKINTERFACEREQUEST']._serialized_end=6104
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST']._serialized_start=6107
+ _globals['_MVMSERVICEDELETENETWORKINTERFACEREQUEST']._serialized_end=6298
+ _globals['_MVMSERVICEVALIDATEADDNETWORKINTERFACEREQUEST']._serialized_start=6301
+ _globals['_MVMSERVICEVALIDATEADDNETWORKINTERFACEREQUEST']._serialized_end=6462
+ _globals['_MVMSERVICEVALIDATEADDNETWORKINTERFACERESPONSE']._serialized_start=6464
+ _globals['_MVMSERVICEVALIDATEADDNETWORKINTERFACERESPONSE']._serialized_end=6511
+ _globals['_MVMSERVICE']._serialized_start=7051
+ _globals['_MVMSERVICE']._serialized_end=8968
+# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/mvm/v1/mvm_pb2.pyi b/python/fits/api/mvm/v1/mvm_pb2.pyi
new file mode 100644
index 0000000..9ee1844
--- /dev/null
+++ b/python/fits/api/mvm/v1/mvm_pb2.pyi
@@ -0,0 +1,438 @@
+from buf.validate import validate_pb2 as _validate_pb2
+from fits.api.mvm.v1 import vlan_pb2 as _vlan_pb2
+from fits.api.v1 import common_pb2 as _common_pb2
+from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class Availability(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ AVAILABILITY_UNSPECIFIED: _ClassVar[Availability]
+ AVAILABILITY_V0: _ClassVar[Availability]
+ AVAILABILITY_V1: _ClassVar[Availability]
+ AVAILABILITY_V2: _ClassVar[Availability]
+ AVAILABILITY_V3: _ClassVar[Availability]
+
+class ServiceClass(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ SERVICE_CLASS_UNSPECIFIED: _ClassVar[ServiceClass]
+ SERVICE_CLASS_SZ1: _ClassVar[ServiceClass]
+ SERVICE_CLASS_SZ2: _ClassVar[ServiceClass]
+ SERVICE_CLASS_SZ3: _ClassVar[ServiceClass]
+
+class MVMStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ MVM_STATUS_UNSPECIFIED: _ClassVar[MVMStatus]
+ MVM_STATUS_ACTIVE: _ClassVar[MVMStatus]
+
+class DiskType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ DISK_TYPE_UNSPECIFIED: _ClassVar[DiskType]
+ DISK_TYPE_OS: _ClassVar[DiskType]
+ DISK_TYPE_SYSTEM: _ClassVar[DiskType]
+ DISK_TYPE_DATA: _ClassVar[DiskType]
+AVAILABILITY_UNSPECIFIED: Availability
+AVAILABILITY_V0: Availability
+AVAILABILITY_V1: Availability
+AVAILABILITY_V2: Availability
+AVAILABILITY_V3: Availability
+SERVICE_CLASS_UNSPECIFIED: ServiceClass
+SERVICE_CLASS_SZ1: ServiceClass
+SERVICE_CLASS_SZ2: ServiceClass
+SERVICE_CLASS_SZ3: ServiceClass
+MVM_STATUS_UNSPECIFIED: MVMStatus
+MVM_STATUS_ACTIVE: MVMStatus
+DISK_TYPE_UNSPECIFIED: DiskType
+DISK_TYPE_OS: DiskType
+DISK_TYPE_SYSTEM: DiskType
+DISK_TYPE_DATA: DiskType
+
+class LinuxDetails(_message.Message):
+ __slots__ = ("disks", "ldap_uuid", "ldap_fqdn")
+ DISKS_FIELD_NUMBER: _ClassVar[int]
+ LDAP_UUID_FIELD_NUMBER: _ClassVar[int]
+ LDAP_FQDN_FIELD_NUMBER: _ClassVar[int]
+ disks: _containers.RepeatedCompositeFieldContainer[LinuxDisk]
+ ldap_uuid: str
+ ldap_fqdn: str
+ def __init__(self, disks: _Optional[_Iterable[_Union[LinuxDisk, _Mapping]]] = ..., ldap_uuid: _Optional[str] = ..., ldap_fqdn: _Optional[str] = ...) -> None: ...
+
+class WindowsDetails(_message.Message):
+ __slots__ = ("disks", "domain_uuid", "domain_fqdn")
+ DISKS_FIELD_NUMBER: _ClassVar[int]
+ DOMAIN_UUID_FIELD_NUMBER: _ClassVar[int]
+ DOMAIN_FQDN_FIELD_NUMBER: _ClassVar[int]
+ disks: _containers.RepeatedCompositeFieldContainer[WindowsDisk]
+ domain_uuid: str
+ domain_fqdn: str
+ def __init__(self, disks: _Optional[_Iterable[_Union[WindowsDisk, _Mapping]]] = ..., domain_uuid: _Optional[str] = ..., domain_fqdn: _Optional[str] = ...) -> None: ...
+
+class NetworkInterface(_message.Message):
+ __slots__ = ("uuid", "ipaddress", "macaddress")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ IPADDRESS_FIELD_NUMBER: _ClassVar[int]
+ MACADDRESS_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ ipaddress: str
+ macaddress: str
+ def __init__(self, uuid: _Optional[str] = ..., ipaddress: _Optional[str] = ..., macaddress: _Optional[str] = ...) -> None: ...
+
+class ManagedVM(_message.Message):
+ __slots__ = ("uuid", "meta", "fqdn", "tenant", "project_uuid", "os_uuid", "location_uuid", "contact_uuid", "cpu", "ram", "backup", "status", "status_info", "availability", "serviceclass", "windows_details", "linux_details", "interfaces", "vlan", "order_number")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ META_FIELD_NUMBER: _ClassVar[int]
+ FQDN_FIELD_NUMBER: _ClassVar[int]
+ TENANT_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_UUID_FIELD_NUMBER: _ClassVar[int]
+ OS_UUID_FIELD_NUMBER: _ClassVar[int]
+ LOCATION_UUID_FIELD_NUMBER: _ClassVar[int]
+ CONTACT_UUID_FIELD_NUMBER: _ClassVar[int]
+ CPU_FIELD_NUMBER: _ClassVar[int]
+ RAM_FIELD_NUMBER: _ClassVar[int]
+ BACKUP_FIELD_NUMBER: _ClassVar[int]
+ STATUS_FIELD_NUMBER: _ClassVar[int]
+ STATUS_INFO_FIELD_NUMBER: _ClassVar[int]
+ AVAILABILITY_FIELD_NUMBER: _ClassVar[int]
+ SERVICECLASS_FIELD_NUMBER: _ClassVar[int]
+ WINDOWS_DETAILS_FIELD_NUMBER: _ClassVar[int]
+ LINUX_DETAILS_FIELD_NUMBER: _ClassVar[int]
+ INTERFACES_FIELD_NUMBER: _ClassVar[int]
+ VLAN_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ meta: _common_pb2.Meta
+ fqdn: str
+ tenant: str
+ project_uuid: str
+ os_uuid: str
+ location_uuid: str
+ contact_uuid: str
+ cpu: int
+ ram: int
+ backup: bool
+ status: MVMStatus
+ status_info: str
+ availability: Availability
+ serviceclass: ServiceClass
+ windows_details: WindowsDetails
+ linux_details: LinuxDetails
+ interfaces: _containers.RepeatedCompositeFieldContainer[NetworkInterface]
+ vlan: _vlan_pb2.VLAN
+ order_number: str
+ def __init__(self, uuid: _Optional[str] = ..., meta: _Optional[_Union[_common_pb2.Meta, _Mapping]] = ..., fqdn: _Optional[str] = ..., tenant: _Optional[str] = ..., project_uuid: _Optional[str] = ..., os_uuid: _Optional[str] = ..., location_uuid: _Optional[str] = ..., contact_uuid: _Optional[str] = ..., cpu: _Optional[int] = ..., ram: _Optional[int] = ..., backup: _Optional[bool] = ..., status: _Optional[_Union[MVMStatus, str]] = ..., status_info: _Optional[str] = ..., availability: _Optional[_Union[Availability, str]] = ..., serviceclass: _Optional[_Union[ServiceClass, str]] = ..., windows_details: _Optional[_Union[WindowsDetails, _Mapping]] = ..., linux_details: _Optional[_Union[LinuxDetails, _Mapping]] = ..., interfaces: _Optional[_Iterable[_Union[NetworkInterface, _Mapping]]] = ..., vlan: _Optional[_Union[_vlan_pb2.VLAN, _Mapping]] = ..., order_number: _Optional[str] = ...) -> None: ...
+
+class MVMServiceGetRequest(_message.Message):
+ __slots__ = ("uuid", "tenant")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ TENANT_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ tenant: str
+ def __init__(self, uuid: _Optional[str] = ..., tenant: _Optional[str] = ...) -> None: ...
+
+class MVMServiceGetResponse(_message.Message):
+ __slots__ = ("mvm",)
+ MVM_FIELD_NUMBER: _ClassVar[int]
+ mvm: ManagedVM
+ def __init__(self, mvm: _Optional[_Union[ManagedVM, _Mapping]] = ...) -> None: ...
+
+class MVMServiceCreateWindowsRequest(_message.Message):
+ __slots__ = ("domain_uuid", "disks")
+ DOMAIN_UUID_FIELD_NUMBER: _ClassVar[int]
+ DISKS_FIELD_NUMBER: _ClassVar[int]
+ domain_uuid: str
+ disks: _containers.RepeatedCompositeFieldContainer[WindowsDisk]
+ def __init__(self, domain_uuid: _Optional[str] = ..., disks: _Optional[_Iterable[_Union[WindowsDisk, _Mapping]]] = ...) -> None: ...
+
+class MVMServiceCreateLinuxRequest(_message.Message):
+ __slots__ = ("ldap_uuid", "disks")
+ LDAP_UUID_FIELD_NUMBER: _ClassVar[int]
+ DISKS_FIELD_NUMBER: _ClassVar[int]
+ ldap_uuid: str
+ disks: _containers.RepeatedCompositeFieldContainer[LinuxDisk]
+ def __init__(self, ldap_uuid: _Optional[str] = ..., disks: _Optional[_Iterable[_Union[LinuxDisk, _Mapping]]] = ...) -> None: ...
+
+class MVMServiceCreateRequest(_message.Message):
+ __slots__ = ("project_uuid", "name", "os_uuid", "vlan_uuid", "location_uuid", "contact_uuid", "cpu", "ram", "order_number", "labels", "backup", "availability", "serviceclass", "windows", "linux")
+ PROJECT_UUID_FIELD_NUMBER: _ClassVar[int]
+ NAME_FIELD_NUMBER: _ClassVar[int]
+ OS_UUID_FIELD_NUMBER: _ClassVar[int]
+ VLAN_UUID_FIELD_NUMBER: _ClassVar[int]
+ LOCATION_UUID_FIELD_NUMBER: _ClassVar[int]
+ CONTACT_UUID_FIELD_NUMBER: _ClassVar[int]
+ CPU_FIELD_NUMBER: _ClassVar[int]
+ RAM_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ LABELS_FIELD_NUMBER: _ClassVar[int]
+ BACKUP_FIELD_NUMBER: _ClassVar[int]
+ AVAILABILITY_FIELD_NUMBER: _ClassVar[int]
+ SERVICECLASS_FIELD_NUMBER: _ClassVar[int]
+ WINDOWS_FIELD_NUMBER: _ClassVar[int]
+ LINUX_FIELD_NUMBER: _ClassVar[int]
+ project_uuid: str
+ name: str
+ os_uuid: str
+ vlan_uuid: str
+ location_uuid: str
+ contact_uuid: str
+ cpu: int
+ ram: int
+ order_number: str
+ labels: _common_pb2.Labels
+ backup: bool
+ availability: Availability
+ serviceclass: ServiceClass
+ windows: MVMServiceCreateWindowsRequest
+ linux: MVMServiceCreateLinuxRequest
+ def __init__(self, project_uuid: _Optional[str] = ..., name: _Optional[str] = ..., os_uuid: _Optional[str] = ..., vlan_uuid: _Optional[str] = ..., location_uuid: _Optional[str] = ..., contact_uuid: _Optional[str] = ..., cpu: _Optional[int] = ..., ram: _Optional[int] = ..., order_number: _Optional[str] = ..., labels: _Optional[_Union[_common_pb2.Labels, _Mapping]] = ..., backup: _Optional[bool] = ..., availability: _Optional[_Union[Availability, str]] = ..., serviceclass: _Optional[_Union[ServiceClass, str]] = ..., windows: _Optional[_Union[MVMServiceCreateWindowsRequest, _Mapping]] = ..., linux: _Optional[_Union[MVMServiceCreateLinuxRequest, _Mapping]] = ...) -> None: ...
+
+class LinuxDisk(_message.Message):
+ __slots__ = ("uuid", "label", "auto_extend", "size", "mount_point", "disk_type")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ LABEL_FIELD_NUMBER: _ClassVar[int]
+ AUTO_EXTEND_FIELD_NUMBER: _ClassVar[int]
+ SIZE_FIELD_NUMBER: _ClassVar[int]
+ MOUNT_POINT_FIELD_NUMBER: _ClassVar[int]
+ DISK_TYPE_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ label: str
+ auto_extend: bool
+ size: int
+ mount_point: str
+ disk_type: DiskType
+ def __init__(self, uuid: _Optional[str] = ..., label: _Optional[str] = ..., auto_extend: _Optional[bool] = ..., size: _Optional[int] = ..., mount_point: _Optional[str] = ..., disk_type: _Optional[_Union[DiskType, str]] = ...) -> None: ...
+
+class WindowsDisk(_message.Message):
+ __slots__ = ("uuid", "label", "auto_extend", "size", "driveletter", "disk_type")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ LABEL_FIELD_NUMBER: _ClassVar[int]
+ AUTO_EXTEND_FIELD_NUMBER: _ClassVar[int]
+ SIZE_FIELD_NUMBER: _ClassVar[int]
+ DRIVELETTER_FIELD_NUMBER: _ClassVar[int]
+ DISK_TYPE_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ label: str
+ auto_extend: bool
+ size: int
+ driveletter: str
+ disk_type: DiskType
+ def __init__(self, uuid: _Optional[str] = ..., label: _Optional[str] = ..., auto_extend: _Optional[bool] = ..., size: _Optional[int] = ..., driveletter: _Optional[str] = ..., disk_type: _Optional[_Union[DiskType, str]] = ...) -> None: ...
+
+class MVMServiceCreateResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceUpdateRequest(_message.Message):
+ __slots__ = ("uuid", "project", "order_number", "update_meta", "performance_class", "service_class", "contact")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ UPDATE_META_FIELD_NUMBER: _ClassVar[int]
+ PERFORMANCE_CLASS_FIELD_NUMBER: _ClassVar[int]
+ SERVICE_CLASS_FIELD_NUMBER: _ClassVar[int]
+ CONTACT_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ project: str
+ order_number: str
+ update_meta: _common_pb2.UpdateMeta
+ performance_class: PerformanceClassChange
+ service_class: ServiceClassChange
+ contact: ContactChange
+ def __init__(self, uuid: _Optional[str] = ..., project: _Optional[str] = ..., order_number: _Optional[str] = ..., update_meta: _Optional[_Union[_common_pb2.UpdateMeta, _Mapping]] = ..., performance_class: _Optional[_Union[PerformanceClassChange, _Mapping]] = ..., service_class: _Optional[_Union[ServiceClassChange, _Mapping]] = ..., contact: _Optional[_Union[ContactChange, _Mapping]] = ...) -> None: ...
+
+class PerformanceClassChange(_message.Message):
+ __slots__ = ("cpu", "ram")
+ CPU_FIELD_NUMBER: _ClassVar[int]
+ RAM_FIELD_NUMBER: _ClassVar[int]
+ cpu: int
+ ram: int
+ def __init__(self, cpu: _Optional[int] = ..., ram: _Optional[int] = ...) -> None: ...
+
+class ServiceClassChange(_message.Message):
+ __slots__ = ("serviceclass",)
+ SERVICECLASS_FIELD_NUMBER: _ClassVar[int]
+ serviceclass: ServiceClass
+ def __init__(self, serviceclass: _Optional[_Union[ServiceClass, str]] = ...) -> None: ...
+
+class ContactChange(_message.Message):
+ __slots__ = ("contact_uuid",)
+ CONTACT_UUID_FIELD_NUMBER: _ClassVar[int]
+ contact_uuid: str
+ def __init__(self, contact_uuid: _Optional[str] = ...) -> None: ...
+
+class MVMServiceUpdateResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceListRequest(_message.Message):
+ __slots__ = ("tenant",)
+ TENANT_FIELD_NUMBER: _ClassVar[int]
+ tenant: str
+ def __init__(self, tenant: _Optional[str] = ...) -> None: ...
+
+class MVMServiceListResponse(_message.Message):
+ __slots__ = ("mvms",)
+ MVMS_FIELD_NUMBER: _ClassVar[int]
+ mvms: _containers.RepeatedCompositeFieldContainer[ManagedVM]
+ def __init__(self, mvms: _Optional[_Iterable[_Union[ManagedVM, _Mapping]]] = ...) -> None: ...
+
+class MVMServiceDeleteRequest(_message.Message):
+ __slots__ = ("project", "uuid", "order_number")
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ project: str
+ uuid: str
+ order_number: str
+ def __init__(self, project: _Optional[str] = ..., uuid: _Optional[str] = ..., order_number: _Optional[str] = ...) -> None: ...
+
+class MVMServiceDeleteResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceValidateCreateRequest(_message.Message):
+ __slots__ = ("create",)
+ CREATE_FIELD_NUMBER: _ClassVar[int]
+ create: MVMServiceCreateRequest
+ def __init__(self, create: _Optional[_Union[MVMServiceCreateRequest, _Mapping]] = ...) -> None: ...
+
+class MVMServiceValidateCreateResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceValidateAddDiskRequest(_message.Message):
+ __slots__ = ("add_disk",)
+ ADD_DISK_FIELD_NUMBER: _ClassVar[int]
+ add_disk: MVMServiceAddDiskRequest
+ def __init__(self, add_disk: _Optional[_Union[MVMServiceAddDiskRequest, _Mapping]] = ...) -> None: ...
+
+class MVMServiceValidateAddDiskResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceValidateUpdateDiskRequest(_message.Message):
+ __slots__ = ("update_disk",)
+ UPDATE_DISK_FIELD_NUMBER: _ClassVar[int]
+ update_disk: MVMServiceUpdateDiskRequest
+ def __init__(self, update_disk: _Optional[_Union[MVMServiceUpdateDiskRequest, _Mapping]] = ...) -> None: ...
+
+class MVMServiceValidateUpdateDiskResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceAddDiskResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceUpdateDiskResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceDeleteDiskResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceAddDiskRequest(_message.Message):
+ __slots__ = ("uuid", "project", "order_number", "linux", "windows")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ LINUX_FIELD_NUMBER: _ClassVar[int]
+ WINDOWS_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ project: str
+ order_number: str
+ linux: LinuxDisk
+ windows: WindowsDisk
+ def __init__(self, uuid: _Optional[str] = ..., project: _Optional[str] = ..., order_number: _Optional[str] = ..., linux: _Optional[_Union[LinuxDisk, _Mapping]] = ..., windows: _Optional[_Union[WindowsDisk, _Mapping]] = ...) -> None: ...
+
+class MVMServiceUpdateDiskRequest(_message.Message):
+ __slots__ = ("uuid", "disk_uuid", "project", "order_number", "auto_extend", "size")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ DISK_UUID_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ AUTO_EXTEND_FIELD_NUMBER: _ClassVar[int]
+ SIZE_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ disk_uuid: str
+ project: str
+ order_number: str
+ auto_extend: bool
+ size: int
+ def __init__(self, uuid: _Optional[str] = ..., disk_uuid: _Optional[str] = ..., project: _Optional[str] = ..., order_number: _Optional[str] = ..., auto_extend: _Optional[bool] = ..., size: _Optional[int] = ...) -> None: ...
+
+class MVMServiceDeleteDiskRequest(_message.Message):
+ __slots__ = ("uuid", "disk_uuid", "project", "order_number")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ DISK_UUID_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ disk_uuid: str
+ project: str
+ order_number: str
+ def __init__(self, uuid: _Optional[str] = ..., disk_uuid: _Optional[str] = ..., project: _Optional[str] = ..., order_number: _Optional[str] = ...) -> None: ...
+
+class MVMServiceAddNetworkInterfaceResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceMoveNetworkInterfaceResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceDeleteNetworkInterfaceResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class MVMServiceAddNetworkInterfaceRequest(_message.Message):
+ __slots__ = ("uuid", "project", "order_number")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ project: str
+ order_number: str
+ def __init__(self, uuid: _Optional[str] = ..., project: _Optional[str] = ..., order_number: _Optional[str] = ...) -> None: ...
+
+class MVMServiceMoveNetworkInterfaceRequest(_message.Message):
+ __slots__ = ("uuid", "interface_uuid", "project", "order_number", "target_mvm_uuid")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ INTERFACE_UUID_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ TARGET_MVM_UUID_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ interface_uuid: str
+ project: str
+ order_number: str
+ target_mvm_uuid: str
+ def __init__(self, uuid: _Optional[str] = ..., interface_uuid: _Optional[str] = ..., project: _Optional[str] = ..., order_number: _Optional[str] = ..., target_mvm_uuid: _Optional[str] = ...) -> None: ...
+
+class MVMServiceDeleteNetworkInterfaceRequest(_message.Message):
+ __slots__ = ("uuid", "interface_uuid", "project", "order_number")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ INTERFACE_UUID_FIELD_NUMBER: _ClassVar[int]
+ PROJECT_FIELD_NUMBER: _ClassVar[int]
+ ORDER_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ interface_uuid: str
+ project: str
+ order_number: str
+ def __init__(self, uuid: _Optional[str] = ..., interface_uuid: _Optional[str] = ..., project: _Optional[str] = ..., order_number: _Optional[str] = ...) -> None: ...
+
+class MVMServiceValidateAddNetworkInterfaceRequest(_message.Message):
+ __slots__ = ("add_network_interface",)
+ ADD_NETWORK_INTERFACE_FIELD_NUMBER: _ClassVar[int]
+ add_network_interface: MVMServiceAddNetworkInterfaceRequest
+ def __init__(self, add_network_interface: _Optional[_Union[MVMServiceAddNetworkInterfaceRequest, _Mapping]] = ...) -> None: ...
+
+class MVMServiceValidateAddNetworkInterfaceResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
diff --git a/python/fits/api/mvm/v1/os_connect.py b/python/fits/api/mvm/v1/os_connect.py
new file mode 100644
index 0000000..a09fc58
--- /dev/null
+++ b/python/fits/api/mvm/v1/os_connect.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: fits/api/mvm/v1/os.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.codec import Codec
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import fits.api.mvm.v1.os_pb2 as fits_dot_api_dot_mvm_dot_v1_dot_os__pb2
+
+
+class OSService(Protocol):
+ async def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class OSServiceASGIApplication(ConnectASGIApplication[OSService]):
+ def __init__(self, service: OSService | AsyncGenerator[OSService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/fits.api.mvm.v1.OSService/List": Endpoint.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.OSService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.OSService"
+
+
+class OSServiceClient(ConnectClient):
+ async def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.OSService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+
+
+
+class OSServiceSync(Protocol):
+ def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class OSServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: OSServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/fits.api.mvm.v1.OSService/List": EndpointSync.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.OSService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.OSService"
+
+
+class OSServiceClientSync(ConnectClientSync):
+ def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.OSService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_os__pb2.OSServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
diff --git a/python/fits/api/mvm/v1/os_pb2.py b/python/fits/api/mvm/v1/os_pb2.py
new file mode 100644
index 0000000..ffc94e9
--- /dev/null
+++ b/python/fits/api/mvm/v1/os_pb2.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: fits/api/mvm/v1/os.proto
+# Protobuf Python Version: 7.36.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 36,
+ 1,
+ '',
+ 'fits/api/mvm/v1/os.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
+from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
+from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66its/api/mvm/v1/os.proto\x12\x0f\x66its.api.mvm.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"r\n\x02OS\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n\x05title\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x05title\x12+\n\x04type\x18\x03 \x01(\x0e\x32\x17.fits.api.mvm.v1.OSTypeR\x04type\"\x16\n\x14OSServiceListRequest\"Y\n\x15OSServiceListResponse\x12@\n\x11operating_systems\x18\x01 \x03(\x0b\x32\x13.fits.api.mvm.v1.OSR\x10operatingSystems*g\n\x06OSType\x12\x1d\n\x13OS_TYPE_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12\x1c\n\rOS_TYPE_LINUX\x10\x01\x1a\t\x82\xb2\x19\x05linux\x12 \n\x0fOS_TYPE_WINDOWS\x10\x02\x1a\x0b\x82\xb2\x19\x07windows2l\n\tOSService\x12_\n\x04List\x12%.fits.api.mvm.v1.OSServiceListRequest\x1a&.fits.api.mvm.v1.OSServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x02\x42\xac\x01\n\x13\x63om.fits.api.mvm.v1B\x07OsProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03\x46\x41M\xaa\x02\x0f\x46its.Api.Mvm.V1\xca\x02\x0f\x46its\\Api\\Mvm\\V1\xe2\x02\x1b\x46its\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12\x46its::Api::Mvm::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'fits.api.mvm.v1.os_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\023com.fits.api.mvm.v1B\007OsProtoP\001Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\242\002\003FAM\252\002\017Fits.Api.Mvm.V1\312\002\017Fits\\Api\\Mvm\\V1\342\002\033Fits\\Api\\Mvm\\V1\\GPBMetadata\352\002\022Fits::Api::Mvm::V1'
+ _globals['_OSTYPE'].values_by_name["OS_TYPE_UNSPECIFIED"]._loaded_options = None
+ _globals['_OSTYPE'].values_by_name["OS_TYPE_UNSPECIFIED"]._serialized_options = b'\202\262\031\000'
+ _globals['_OSTYPE'].values_by_name["OS_TYPE_LINUX"]._loaded_options = None
+ _globals['_OSTYPE'].values_by_name["OS_TYPE_LINUX"]._serialized_options = b'\202\262\031\005linux'
+ _globals['_OSTYPE'].values_by_name["OS_TYPE_WINDOWS"]._loaded_options = None
+ _globals['_OSTYPE'].values_by_name["OS_TYPE_WINDOWS"]._serialized_options = b'\202\262\031\007windows'
+ _globals['_OS'].fields_by_name['uuid']._loaded_options = None
+ _globals['_OS'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_OS'].fields_by_name['title']._loaded_options = None
+ _globals['_OS'].fields_by_name['title']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_OSSERVICE'].methods_by_name['List']._loaded_options = None
+ _globals['_OSSERVICE'].methods_by_name['List']._serialized_options = b'\330\363\030\002\340\363\030\002'
+ _globals['_OSTYPE']._serialized_start=367
+ _globals['_OSTYPE']._serialized_end=470
+ _globals['_OS']._serialized_start=136
+ _globals['_OS']._serialized_end=250
+ _globals['_OSSERVICELISTREQUEST']._serialized_start=252
+ _globals['_OSSERVICELISTREQUEST']._serialized_end=274
+ _globals['_OSSERVICELISTRESPONSE']._serialized_start=276
+ _globals['_OSSERVICELISTRESPONSE']._serialized_end=365
+ _globals['_OSSERVICE']._serialized_start=472
+ _globals['_OSSERVICE']._serialized_end=580
+# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/mvm/v1/os_pb2.pyi b/python/fits/api/mvm/v1/os_pb2.pyi
new file mode 100644
index 0000000..954f20f
--- /dev/null
+++ b/python/fits/api/mvm/v1/os_pb2.pyi
@@ -0,0 +1,40 @@
+from buf.validate import validate_pb2 as _validate_pb2
+from fits.api.v1 import common_pb2 as _common_pb2
+from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class OSType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ OS_TYPE_UNSPECIFIED: _ClassVar[OSType]
+ OS_TYPE_LINUX: _ClassVar[OSType]
+ OS_TYPE_WINDOWS: _ClassVar[OSType]
+OS_TYPE_UNSPECIFIED: OSType
+OS_TYPE_LINUX: OSType
+OS_TYPE_WINDOWS: OSType
+
+class OS(_message.Message):
+ __slots__ = ("uuid", "title", "type")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ TITLE_FIELD_NUMBER: _ClassVar[int]
+ TYPE_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ title: str
+ type: OSType
+ def __init__(self, uuid: _Optional[str] = ..., title: _Optional[str] = ..., type: _Optional[_Union[OSType, str]] = ...) -> None: ...
+
+class OSServiceListRequest(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class OSServiceListResponse(_message.Message):
+ __slots__ = ("operating_systems",)
+ OPERATING_SYSTEMS_FIELD_NUMBER: _ClassVar[int]
+ operating_systems: _containers.RepeatedCompositeFieldContainer[OS]
+ def __init__(self, operating_systems: _Optional[_Iterable[_Union[OS, _Mapping]]] = ...) -> None: ...
diff --git a/python/fits/api/mvm/v1/stagetype_connect.py b/python/fits/api/mvm/v1/stagetype_connect.py
new file mode 100644
index 0000000..84af511
--- /dev/null
+++ b/python/fits/api/mvm/v1/stagetype_connect.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: fits/api/mvm/v1/stagetype.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.codec import Codec
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import fits.api.mvm.v1.stagetype_pb2 as fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2
+
+
+class StageTypeService(Protocol):
+ async def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class StageTypeServiceASGIApplication(ConnectASGIApplication[StageTypeService]):
+ def __init__(self, service: StageTypeService | AsyncGenerator[StageTypeService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/fits.api.mvm.v1.StageTypeService/List": Endpoint.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.StageTypeService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.StageTypeService"
+
+
+class StageTypeServiceClient(ConnectClient):
+ async def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.StageTypeService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+
+
+
+class StageTypeServiceSync(Protocol):
+ def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class StageTypeServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: StageTypeServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/fits.api.mvm.v1.StageTypeService/List": EndpointSync.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.StageTypeService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.StageTypeService"
+
+
+class StageTypeServiceClientSync(ConnectClientSync):
+ def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.StageTypeService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_stagetype__pb2.StageTypeServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
diff --git a/python/fits/api/mvm/v1/stagetype_pb2.py b/python/fits/api/mvm/v1/stagetype_pb2.py
new file mode 100644
index 0000000..d21b008
--- /dev/null
+++ b/python/fits/api/mvm/v1/stagetype_pb2.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: fits/api/mvm/v1/stagetype.proto
+# Protobuf Python Version: 7.36.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 36,
+ 1,
+ '',
+ 'fits/api/mvm/v1/stagetype.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
+from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
+from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x66its/api/mvm/v1/stagetype.proto\x12\x0f\x66its.api.mvm.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"L\n\tStageType\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12!\n\x05title\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x05title\"\x1d\n\x1bStageTypeServiceListRequest\"[\n\x1cStageTypeServiceListResponse\x12;\n\x0bstage_types\x18\x01 \x03(\x0b\x32\x1a.fits.api.mvm.v1.StageTypeR\nstageTypes2\x84\x01\n\x10StageTypeService\x12p\n\x04List\x12,.fits.api.mvm.v1.StageTypeServiceListRequest\x1a-.fits.api.mvm.v1.StageTypeServiceListResponse\"\x0b\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x42\xb3\x01\n\x13\x63om.fits.api.mvm.v1B\x0eStagetypeProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03\x46\x41M\xaa\x02\x0f\x46its.Api.Mvm.V1\xca\x02\x0f\x46its\\Api\\Mvm\\V1\xe2\x02\x1b\x46its\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12\x46its::Api::Mvm::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'fits.api.mvm.v1.stagetype_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\023com.fits.api.mvm.v1B\016StagetypeProtoP\001Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\242\002\003FAM\252\002\017Fits.Api.Mvm.V1\312\002\017Fits\\Api\\Mvm\\V1\342\002\033Fits\\Api\\Mvm\\V1\\GPBMetadata\352\002\022Fits::Api::Mvm::V1'
+ _globals['_STAGETYPE'].fields_by_name['uuid']._loaded_options = None
+ _globals['_STAGETYPE'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_STAGETYPE'].fields_by_name['title']._loaded_options = None
+ _globals['_STAGETYPE'].fields_by_name['title']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_STAGETYPESERVICE'].methods_by_name['List']._loaded_options = None
+ _globals['_STAGETYPESERVICE'].methods_by_name['List']._serialized_options = b'\312\363\030\003\001\002\003\340\363\030\002'
+ _globals['_STAGETYPE']._serialized_start=143
+ _globals['_STAGETYPE']._serialized_end=219
+ _globals['_STAGETYPESERVICELISTREQUEST']._serialized_start=221
+ _globals['_STAGETYPESERVICELISTREQUEST']._serialized_end=250
+ _globals['_STAGETYPESERVICELISTRESPONSE']._serialized_start=252
+ _globals['_STAGETYPESERVICELISTRESPONSE']._serialized_end=343
+ _globals['_STAGETYPESERVICE']._serialized_start=346
+ _globals['_STAGETYPESERVICE']._serialized_end=478
+# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/mvm/v1/stagetype_pb2.pyi b/python/fits/api/mvm/v1/stagetype_pb2.pyi
new file mode 100644
index 0000000..0e26a78
--- /dev/null
+++ b/python/fits/api/mvm/v1/stagetype_pb2.pyi
@@ -0,0 +1,28 @@
+from buf.validate import validate_pb2 as _validate_pb2
+from fits.api.v1 import common_pb2 as _common_pb2
+from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class StageType(_message.Message):
+ __slots__ = ("uuid", "title")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ TITLE_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ title: str
+ def __init__(self, uuid: _Optional[str] = ..., title: _Optional[str] = ...) -> None: ...
+
+class StageTypeServiceListRequest(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class StageTypeServiceListResponse(_message.Message):
+ __slots__ = ("stage_types",)
+ STAGE_TYPES_FIELD_NUMBER: _ClassVar[int]
+ stage_types: _containers.RepeatedCompositeFieldContainer[StageType]
+ def __init__(self, stage_types: _Optional[_Iterable[_Union[StageType, _Mapping]]] = ...) -> None: ...
diff --git a/python/fits/api/mvm/v1/vlan_connect.py b/python/fits/api/mvm/v1/vlan_connect.py
new file mode 100644
index 0000000..5092f66
--- /dev/null
+++ b/python/fits/api/mvm/v1/vlan_connect.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: fits/api/mvm/v1/vlan.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.codec import Codec
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import fits.api.mvm.v1.vlan_pb2 as fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2
+
+
+class VLANService(Protocol):
+ async def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class VLANServiceASGIApplication(ConnectASGIApplication[VLANService]):
+ def __init__(self, service: VLANService | AsyncGenerator[VLANService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/fits.api.mvm.v1.VLANService/List": Endpoint.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.VLANService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.VLANService"
+
+
+class VLANServiceClient(ConnectClient):
+ async def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.VLANService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+
+
+
+class VLANServiceSync(Protocol):
+ def list(self, request: fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest, ctx: RequestContext) -> fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class VLANServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: VLANServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None, codecs: Iterable[Codec] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/fits.api.mvm.v1.VLANService/List": EndpointSync.unary(
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.VLANService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ codecs=codecs,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/fits.api.mvm.v1.VLANService"
+
+
+class VLANServiceClientSync(ConnectClientSync):
+ def list(
+ self,
+ request: fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="List",
+ service_name="fits.api.mvm.v1.VLANService",
+ input=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListRequest,
+ output=fits_dot_api_dot_mvm_dot_v1_dot_vlan__pb2.VLANServiceListResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
diff --git a/python/fits/api/mvm/v1/vlan_pb2.py b/python/fits/api/mvm/v1/vlan_pb2.py
new file mode 100644
index 0000000..fce24d7
--- /dev/null
+++ b/python/fits/api/mvm/v1/vlan_pb2.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: fits/api/mvm/v1/vlan.proto
+# Protobuf Python Version: 7.36.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 36,
+ 1,
+ '',
+ 'fits/api/mvm/v1/vlan.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
+from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
+from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66its/api/mvm/v1/vlan.proto\x12\x0f\x66its.api.mvm.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xb8\x02\n\x04VLAN\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\x17\n\x07vlan_id\x18\x02 \x01(\x05R\x06vlanId\x12.\n\x0csubnet_title\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x0bsubnetTitle\x12,\n\x0bsubnet_cidr\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xf8\xb3\xae\xb1\x02\x01R\nsubnetCidr\x12\x32\n\rlocation_uuid\x18\n \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x0clocationUuid\x88\x01\x01\x12\x30\n\x0fstage_type_uuid\x18\x0b \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\rstageTypeUuid\x12#\n\x06tenant\x18\x0c \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenantB\x10\n\x0e_location_uuid\"=\n\x16VLANServiceListRequest\x12#\n\x06tenant\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x06tenant\"F\n\x17VLANServiceListResponse\x12+\n\x05vlans\x18\x01 \x03(\x0b\x32\x15.fits.api.mvm.v1.VLANR\x05vlans2u\n\x0bVLANService\x12\x66\n\x04List\x12\'.fits.api.mvm.v1.VLANServiceListRequest\x1a(.fits.api.mvm.v1.VLANServiceListResponse\"\x0b\xc2\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x42\xae\x01\n\x13\x63om.fits.api.mvm.v1B\tVlanProtoP\x01Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\xa2\x02\x03\x46\x41M\xaa\x02\x0f\x46its.Api.Mvm.V1\xca\x02\x0f\x46its\\Api\\Mvm\\V1\xe2\x02\x1b\x46its\\Api\\Mvm\\V1\\GPBMetadata\xea\x02\x12\x46its::Api::Mvm::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'fits.api.mvm.v1.vlan_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\023com.fits.api.mvm.v1B\tVlanProtoP\001Z-github.com/fi-ts/api/go/fits/api/mvm/v1;mvmv1\242\002\003FAM\252\002\017Fits.Api.Mvm.V1\312\002\017Fits\\Api\\Mvm\\V1\342\002\033Fits\\Api\\Mvm\\V1\\GPBMetadata\352\002\022Fits::Api::Mvm::V1'
+ _globals['_VLAN'].fields_by_name['uuid']._loaded_options = None
+ _globals['_VLAN'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_VLAN'].fields_by_name['subnet_title']._loaded_options = None
+ _globals['_VLAN'].fields_by_name['subnet_title']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_VLAN'].fields_by_name['subnet_cidr']._loaded_options = None
+ _globals['_VLAN'].fields_by_name['subnet_cidr']._serialized_options = b'\272H\010r\006\370\263\256\261\002\001'
+ _globals['_VLAN'].fields_by_name['location_uuid']._loaded_options = None
+ _globals['_VLAN'].fields_by_name['location_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_VLAN'].fields_by_name['stage_type_uuid']._loaded_options = None
+ _globals['_VLAN'].fields_by_name['stage_type_uuid']._serialized_options = b'\272H\005r\003\260\001\001'
+ _globals['_VLAN'].fields_by_name['tenant']._loaded_options = None
+ _globals['_VLAN'].fields_by_name['tenant']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_VLANSERVICELISTREQUEST'].fields_by_name['tenant']._loaded_options = None
+ _globals['_VLANSERVICELISTREQUEST'].fields_by_name['tenant']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
+ _globals['_VLANSERVICE'].methods_by_name['List']._loaded_options = None
+ _globals['_VLANSERVICE'].methods_by_name['List']._serialized_options = b'\302\363\030\003\001\002\003\340\363\030\002'
+ _globals['_VLAN']._serialized_start=139
+ _globals['_VLAN']._serialized_end=451
+ _globals['_VLANSERVICELISTREQUEST']._serialized_start=453
+ _globals['_VLANSERVICELISTREQUEST']._serialized_end=514
+ _globals['_VLANSERVICELISTRESPONSE']._serialized_start=516
+ _globals['_VLANSERVICELISTRESPONSE']._serialized_end=586
+ _globals['_VLANSERVICE']._serialized_start=588
+ _globals['_VLANSERVICE']._serialized_end=705
+# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/mvm/v1/vlan_pb2.pyi b/python/fits/api/mvm/v1/vlan_pb2.pyi
new file mode 100644
index 0000000..acdec60
--- /dev/null
+++ b/python/fits/api/mvm/v1/vlan_pb2.pyi
@@ -0,0 +1,40 @@
+from buf.validate import validate_pb2 as _validate_pb2
+from fits.api.v1 import common_pb2 as _common_pb2
+from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class VLAN(_message.Message):
+ __slots__ = ("uuid", "vlan_id", "subnet_title", "subnet_cidr", "location_uuid", "stage_type_uuid", "tenant")
+ UUID_FIELD_NUMBER: _ClassVar[int]
+ VLAN_ID_FIELD_NUMBER: _ClassVar[int]
+ SUBNET_TITLE_FIELD_NUMBER: _ClassVar[int]
+ SUBNET_CIDR_FIELD_NUMBER: _ClassVar[int]
+ LOCATION_UUID_FIELD_NUMBER: _ClassVar[int]
+ STAGE_TYPE_UUID_FIELD_NUMBER: _ClassVar[int]
+ TENANT_FIELD_NUMBER: _ClassVar[int]
+ uuid: str
+ vlan_id: int
+ subnet_title: str
+ subnet_cidr: str
+ location_uuid: str
+ stage_type_uuid: str
+ tenant: str
+ def __init__(self, uuid: _Optional[str] = ..., vlan_id: _Optional[int] = ..., subnet_title: _Optional[str] = ..., subnet_cidr: _Optional[str] = ..., location_uuid: _Optional[str] = ..., stage_type_uuid: _Optional[str] = ..., tenant: _Optional[str] = ...) -> None: ...
+
+class VLANServiceListRequest(_message.Message):
+ __slots__ = ("tenant",)
+ TENANT_FIELD_NUMBER: _ClassVar[int]
+ tenant: str
+ def __init__(self, tenant: _Optional[str] = ...) -> None: ...
+
+class VLANServiceListResponse(_message.Message):
+ __slots__ = ("vlans",)
+ VLANS_FIELD_NUMBER: _ClassVar[int]
+ vlans: _containers.RepeatedCompositeFieldContainer[VLAN]
+ def __init__(self, vlans: _Optional[_Iterable[_Union[VLAN, _Mapping]]] = ...) -> None: ...
diff --git a/python/fits/api/v1/predefined_rules_pb2.py b/python/fits/api/v1/predefined_rules_pb2.py
index dcbcd24..5666427 100644
--- a/python/fits/api/v1/predefined_rules_pb2.py
+++ b/python/fits/api/v1/predefined_rules_pb2.py
@@ -25,7 +25,7 @@
from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"fits/api/v1/predefined_rules.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto:\xb8\x01\n\nmacaddress\x12\x19.buf.validate.StringRules\x18\xb7\xe6\x95& \x01(\x08\x42z\xc2Hw\nu\n\x11string.macaddress\x12&this string must be a valid macaddress\x1a\x38this.matches(\'^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$\')R\nmacaddress:\x99\x01\n\x07is_name\x12\x19.buf.validate.StringRules\x18\xb8\xe6\x95& \x01(\x08\x42\x62\xc2H_\n]\n\x0estring.is_name\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x06isName:\x9a\x01\n\x0eis_description\x12\x19.buf.validate.StringRules\x18\xb9\xe6\x95& \x01(\x08\x42U\xc2HR\nP\n\x15string.is_description\x12#must be shorter than 256 characters\x1a\x12this.size() <= 256R\risDescription:\xa8\x01\n\x0cis_partition\x12\x19.buf.validate.StringRules\x18\xba\xe6\x95& \x01(\x08\x42g\xc2Hd\nb\n\x13string.is_partition\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x0bisPartition:\x82\x01\n\tis_prefix\x12\x19.buf.validate.StringRules\x18\xbb\xe6\x95& \x01(\x08\x42G\xc2HD\nB\n\x0fstring.prefixes\x12\x1cgiven prefixes must be valid\x1a\x11this.isIpPrefix()R\x08isPrefix:m\n\x06is_uri\x12\x19.buf.validate.StringRules\x18\xbc\xe6\x95& \x01(\x08\x42\x38\xc2H5\n3\n\nstring.uri\x12\x17given uri must be valid\x1a\x0cthis.isUri()R\x05isUri:\xa7\x01\n\x11is_ip_or_hostname\x12\x19.buf.validate.StringRules\x18\xbd\xe6\x95& \x01(\x08\x42^\xc2H[\nY\n\rvalid_address\x12&must be a valid IP address or hostname\x1a this.isIp() || this.isHostname()R\x0eisIpOrHostname:\x9d\x01\n\x07trimmed\x12\x19.buf.validate.StringRules\x18\xbe\xe6\x95& \x01(\x08\x42\x65\xc2Hb\n`\n\x0estring.trimmed\x12+value must not start or end with whitespace\x1a!this.trim().size() == this.size()R\x07trimmed:\x8f\x01\n\x08prefixes\x12\x1b.buf.validate.RepeatedRules\x18\xc7\xb4\x96& \x01(\x08\x42S\xc2HP\nN\n\x11repeated.prefixes\x12\x1cgiven prefixes must be valid\x1a\x1bthis.all(m, m.isIpPrefix())R\x08prefixes:u\n\x03ips\x12\x1b.buf.validate.RepeatedRules\x18\xc8\xb4\x96& \x01(\x08\x42\x43\xc2H@\n>\n\x0crepeated.ips\x12\x17given ips must be valid\x1a\x15this.all(m, m.isIp())R\x03ips:\xe6\x01\n\x11\x61re_host_and_port\x12\x1b.buf.validate.RepeatedRules\x18\xc9\xb4\x96& \x01(\x08\x42\x9a\x01\xc2H\x96\x01\n\x93\x01\n\x1arepeated.are_host_and_port\x12Pgiven entries must all be in the form of : but port is optional\x1a#this.all(m, m.isHostAndPort(false))R\x0e\x61reHostAndPort:\xba\x01\n\x0b\x61ll_trimmed\x12\x1b.buf.validate.RepeatedRules\x18\xca\xb4\x96& \x01(\x08\x42y\xc2Hv\nt\n\x14repeated.all_trimmed\x12\x32given values must not start or end with whitespace\x1a(this.all(m, m.trim().size() == m.size())R\nallTrimmed:\x84\x02\n\x17keys_and_values_trimmed\x12\x16.buf.validate.MapRules\x18\xd7\x82\x97& \x01(\x08\x42\xb1\x01\xc2H\xad\x01\n\xaa\x01\n\x1bmap.keys_and_values_trimmed\x12\x35keys and values must not start or end with whitespace\x1aTthis.all(k, k.trim().size() == k.size()) && this.all(v, v.trim().size() == v.size())R\x14keysAndValuesTrimmed:\xab\x01\n\x0ckeys_trimmed\x12\x16.buf.validate.MapRules\x18\xd8\x82\x97& \x01(\x08\x42m\xc2Hj\nh\n\x10map.keys_trimmed\x12*keys must not start or end with whitespace\x1a(this.all(k, k.trim().size() == k.size())R\x0bkeysTrimmedB\xa0\x01\n\x0f\x63om.fits.api.v1B\x14PredefinedRulesProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"fits/api/v1/predefined_rules.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto:\xb8\x01\n\nmacaddress\x12\x19.buf.validate.StringRules\x18\xb7\xe6\x95& \x01(\x08\x42z\xc2Hw\nu\n\x11string.macaddress\x12&this string must be a valid macaddress\x1a\x38this.matches(\'^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$\')R\nmacaddress:\x99\x01\n\x07is_name\x12\x19.buf.validate.StringRules\x18\xb8\xe6\x95& \x01(\x08\x42\x62\xc2H_\n]\n\x0estring.is_name\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x06isName:\x9a\x01\n\x0eis_description\x12\x19.buf.validate.StringRules\x18\xb9\xe6\x95& \x01(\x08\x42U\xc2HR\nP\n\x15string.is_description\x12#must be shorter than 256 characters\x1a\x12this.size() <= 256R\risDescription:\xa8\x01\n\x0cis_partition\x12\x19.buf.validate.StringRules\x18\xba\xe6\x95& \x01(\x08\x42g\xc2Hd\nb\n\x13string.is_partition\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x0bisPartition:\x82\x01\n\tis_prefix\x12\x19.buf.validate.StringRules\x18\xbb\xe6\x95& \x01(\x08\x42G\xc2HD\nB\n\x0fstring.prefixes\x12\x1cgiven prefixes must be valid\x1a\x11this.isIpPrefix()R\x08isPrefix:m\n\x06is_uri\x12\x19.buf.validate.StringRules\x18\xbc\xe6\x95& \x01(\x08\x42\x38\xc2H5\n3\n\nstring.uri\x12\x17given uri must be valid\x1a\x0cthis.isUri()R\x05isUri:\xa7\x01\n\x11is_ip_or_hostname\x12\x19.buf.validate.StringRules\x18\xbd\xe6\x95& \x01(\x08\x42^\xc2H[\nY\n\rvalid_address\x12&must be a valid IP address or hostname\x1a this.isIp() || this.isHostname()R\x0eisIpOrHostname:\x9d\x01\n\x07trimmed\x12\x19.buf.validate.StringRules\x18\xbe\xe6\x95& \x01(\x08\x42\x65\xc2Hb\n`\n\x0estring.trimmed\x12+value must not start or end with whitespace\x1a!this.trim().size() == this.size()R\x07trimmed:\xb1\x01\n\x0cis_ipv4_cidr\x12\x19.buf.validate.StringRules\x18\xbf\xe6\x95& \x01(\x08\x42q\xc2Hn\nl\n\x13string.is_ipv4_cidr\x12+must be a valid IPv4 CIDR, e.g. 10.0.0.0/24\x1a(this.isIpPrefix() && !this.contains(\':\')R\nisIpv4Cidr:\x8f\x01\n\x08prefixes\x12\x1b.buf.validate.RepeatedRules\x18\xc7\xb4\x96& \x01(\x08\x42S\xc2HP\nN\n\x11repeated.prefixes\x12\x1cgiven prefixes must be valid\x1a\x1bthis.all(m, m.isIpPrefix())R\x08prefixes:u\n\x03ips\x12\x1b.buf.validate.RepeatedRules\x18\xc8\xb4\x96& \x01(\x08\x42\x43\xc2H@\n>\n\x0crepeated.ips\x12\x17given ips must be valid\x1a\x15this.all(m, m.isIp())R\x03ips:\xe6\x01\n\x11\x61re_host_and_port\x12\x1b.buf.validate.RepeatedRules\x18\xc9\xb4\x96& \x01(\x08\x42\x9a\x01\xc2H\x96\x01\n\x93\x01\n\x1arepeated.are_host_and_port\x12Pgiven entries must all be in the form of : but port is optional\x1a#this.all(m, m.isHostAndPort(false))R\x0e\x61reHostAndPort:\xba\x01\n\x0b\x61ll_trimmed\x12\x1b.buf.validate.RepeatedRules\x18\xca\xb4\x96& \x01(\x08\x42y\xc2Hv\nt\n\x14repeated.all_trimmed\x12\x32given values must not start or end with whitespace\x1a(this.all(m, m.trim().size() == m.size())R\nallTrimmed:\x84\x02\n\x17keys_and_values_trimmed\x12\x16.buf.validate.MapRules\x18\xd7\x82\x97& \x01(\x08\x42\xb1\x01\xc2H\xad\x01\n\xaa\x01\n\x1bmap.keys_and_values_trimmed\x12\x35keys and values must not start or end with whitespace\x1aTthis.all(k, k.trim().size() == k.size()) && this.all(v, v.trim().size() == v.size())R\x14keysAndValuesTrimmed:\xab\x01\n\x0ckeys_trimmed\x12\x16.buf.validate.MapRules\x18\xd8\x82\x97& \x01(\x08\x42m\xc2Hj\nh\n\x10map.keys_trimmed\x12*keys must not start or end with whitespace\x1a(this.all(k, k.trim().size() == k.size())R\x0bkeysTrimmedB\xa0\x01\n\x0f\x63om.fits.api.v1B\x14PredefinedRulesProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -49,6 +49,8 @@
_globals['is_ip_or_hostname']._serialized_options = b'\302H[\nY\n\rvalid_address\022&must be a valid IP address or hostname\032 this.isIp() || this.isHostname()'
_globals['trimmed']._loaded_options = None
_globals['trimmed']._serialized_options = b'\302Hb\n`\n\016string.trimmed\022+value must not start or end with whitespace\032!this.trim().size() == this.size()'
+ _globals['is_ipv4_cidr']._loaded_options = None
+ _globals['is_ipv4_cidr']._serialized_options = b'\302Hn\nl\n\023string.is_ipv4_cidr\022+must be a valid IPv4 CIDR, e.g. 10.0.0.0/24\032(this.isIpPrefix() && !this.contains(\':\')'
_globals['prefixes']._loaded_options = None
_globals['prefixes']._serialized_options = b'\302HP\nN\n\021repeated.prefixes\022\034given prefixes must be valid\032\033this.all(m, m.isIpPrefix())'
_globals['ips']._loaded_options = None
diff --git a/python/fits/api/v1/predefined_rules_pb2.pyi b/python/fits/api/v1/predefined_rules_pb2.pyi
index 6290e37..a96ccf6 100644
--- a/python/fits/api/v1/predefined_rules_pb2.pyi
+++ b/python/fits/api/v1/predefined_rules_pb2.pyi
@@ -19,6 +19,8 @@ IS_IP_OR_HOSTNAME_FIELD_NUMBER: _ClassVar[int]
is_ip_or_hostname: _descriptor.FieldDescriptor
TRIMMED_FIELD_NUMBER: _ClassVar[int]
trimmed: _descriptor.FieldDescriptor
+IS_IPV4_CIDR_FIELD_NUMBER: _ClassVar[int]
+is_ipv4_cidr: _descriptor.FieldDescriptor
PREFIXES_FIELD_NUMBER: _ClassVar[int]
prefixes: _descriptor.FieldDescriptor
IPS_FIELD_NUMBER: _ClassVar[int]
diff --git a/python/fits/api/v1/project_pb2.py b/python/fits/api/v1/project_pb2.py
index 73dad2b..377e912 100644
--- a/python/fits/api/v1/project_pb2.py
+++ b/python/fits/api/v1/project_pb2.py
@@ -25,10 +25,9 @@
from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
-from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66its/api/v1/project.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xdf\x01\n\x07Project\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12%\n\x04meta\x18\x02 \x01(\x0b\x32\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\x16\n\x06tenant\x18\x05 \x01(\tR\x06tenant\x12\"\n\navatar_url\x18\x06 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x42\r\n\x0b_avatar_url\"\xd8\x01\n\x19ProjectServiceListRequest\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12$\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12(\n\x06tenant\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x02R\x06tenant\x88\x01\x01\x12\x30\n\x06labels\x18\x04 \x01(\x0b\x32\x13.fits.api.v1.LabelsH\x03R\x06labels\x88\x01\x01\x42\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_tenantB\t\n\x07_labels\"N\n\x1aProjectServiceListResponse\x12\x30\n\x08projects\x18\x01 \x03(\x0b\x32\x14.fits.api.v1.ProjectR\x08projects\">\n\x18ProjectServiceGetRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"K\n\x19ProjectServiceGetResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xf0\x01\n\x1bProjectServiceCreateRequest\x12!\n\x05login\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x05login\x12\x1f\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\"\n\navatar_url\x18\x04 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x12+\n\x06labels\x18\x05 \x01(\x0b\x32\x13.fits.api.v1.LabelsR\x06labelsB\r\n\x0b_avatar_url\"N\n\x1cProjectServiceCreateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"A\n\x1bProjectServiceDeleteRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"N\n\x1cProjectServiceDeleteResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xec\x02\n\x1bProjectServiceUpdateRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12@\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\nupdateMeta\x12$\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04name\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x01R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\navatar_url\x18\x05 \x01(\tH\x02R\tavatarUrl\x88\x01\x01\x12\x36\n\x06labels\x18\x06 \x01(\x0b\x32\x19.fits.api.v1.UpdateLabelsH\x03R\x06labels\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_descriptionB\r\n\x0b_avatar_urlB\t\n\x07_labels\"N\n\x1cProjectServiceUpdateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project2\x96\x04\n\x0eProjectService\x12\x61\n\x04List\x12&.fits.api.v1.ProjectServiceListRequest\x1a\'.fits.api.v1.ProjectServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x02\x12\x61\n\x03Get\x12%.fits.api.v1.ProjectServiceGetRequest\x1a&.fits.api.v1.ProjectServiceGetResponse\"\x0b\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n\x06\x43reate\x12(.fits.api.v1.ProjectServiceCreateRequest\x1a).fits.api.v1.ProjectServiceCreateResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12h\n\x06\x44\x65lete\x12(.fits.api.v1.ProjectServiceDeleteRequest\x1a).fits.api.v1.ProjectServiceDeleteResponse\"\t\xca\xf3\x18\x01\x01\xe0\xf3\x18\x01\x12i\n\x06Update\x12(.fits.api.v1.ProjectServiceUpdateRequest\x1a).fits.api.v1.ProjectServiceUpdateResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x42\x98\x01\n\x0f\x63om.fits.api.v1B\x0cProjectProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66its/api/v1/project.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xdf\x01\n\x07Project\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12%\n\x04meta\x18\x02 \x01(\x0b\x32\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\x16\n\x06tenant\x18\x05 \x01(\tR\x06tenant\x12\"\n\navatar_url\x18\x06 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x42\r\n\x0b_avatar_url\"\xd8\x01\n\x19ProjectServiceListRequest\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12$\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12(\n\x06tenant\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x02R\x06tenant\x88\x01\x01\x12\x30\n\x06labels\x18\x04 \x01(\x0b\x32\x13.fits.api.v1.LabelsH\x03R\x06labels\x88\x01\x01\x42\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_tenantB\t\n\x07_labels\"N\n\x1aProjectServiceListResponse\x12\x30\n\x08projects\x18\x01 \x03(\x0b\x32\x14.fits.api.v1.ProjectR\x08projects\">\n\x18ProjectServiceGetRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"K\n\x19ProjectServiceGetResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xf0\x01\n\x1bProjectServiceCreateRequest\x12!\n\x05login\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x05login\x12\x1f\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\"\n\navatar_url\x18\x04 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x12+\n\x06labels\x18\x05 \x01(\x0b\x32\x13.fits.api.v1.LabelsR\x06labelsB\r\n\x0b_avatar_url\"N\n\x1cProjectServiceCreateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"A\n\x1bProjectServiceDeleteRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"N\n\x1cProjectServiceDeleteResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xec\x02\n\x1bProjectServiceUpdateRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12@\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\nupdateMeta\x12$\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04name\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x01R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\navatar_url\x18\x05 \x01(\tH\x02R\tavatarUrl\x88\x01\x01\x12\x36\n\x06labels\x18\x06 \x01(\x0b\x32\x19.fits.api.v1.UpdateLabelsH\x03R\x06labels\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_descriptionB\r\n\x0b_avatar_urlB\t\n\x07_labels\"N\n\x1cProjectServiceUpdateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project2\x96\x04\n\x0eProjectService\x12\x61\n\x04List\x12&.fits.api.v1.ProjectServiceListRequest\x1a\'.fits.api.v1.ProjectServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x02\x12\x61\n\x03Get\x12%.fits.api.v1.ProjectServiceGetRequest\x1a&.fits.api.v1.ProjectServiceGetResponse\"\x0b\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n\x06\x43reate\x12(.fits.api.v1.ProjectServiceCreateRequest\x1a).fits.api.v1.ProjectServiceCreateResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12h\n\x06\x44\x65lete\x12(.fits.api.v1.ProjectServiceDeleteRequest\x1a).fits.api.v1.ProjectServiceDeleteResponse\"\t\xca\xf3\x18\x01\x01\xe0\xf3\x18\x01\x12i\n\x06Update\x12(.fits.api.v1.ProjectServiceUpdateRequest\x1a).fits.api.v1.ProjectServiceUpdateResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x42\x98\x01\n\x0f\x63om.fits.api.v1B\x0cProjectProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1b\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -72,28 +71,28 @@
_globals['_PROJECTSERVICE'].methods_by_name['Delete']._serialized_options = b'\312\363\030\001\001\340\363\030\001'
_globals['_PROJECTSERVICE'].methods_by_name['Update']._loaded_options = None
_globals['_PROJECTSERVICE'].methods_by_name['Update']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
- _globals['_PROJECT']._serialized_start=167
- _globals['_PROJECT']._serialized_end=390
- _globals['_PROJECTSERVICELISTREQUEST']._serialized_start=393
- _globals['_PROJECTSERVICELISTREQUEST']._serialized_end=609
- _globals['_PROJECTSERVICELISTRESPONSE']._serialized_start=611
- _globals['_PROJECTSERVICELISTRESPONSE']._serialized_end=689
- _globals['_PROJECTSERVICEGETREQUEST']._serialized_start=691
- _globals['_PROJECTSERVICEGETREQUEST']._serialized_end=753
- _globals['_PROJECTSERVICEGETRESPONSE']._serialized_start=755
- _globals['_PROJECTSERVICEGETRESPONSE']._serialized_end=830
- _globals['_PROJECTSERVICECREATEREQUEST']._serialized_start=833
- _globals['_PROJECTSERVICECREATEREQUEST']._serialized_end=1073
- _globals['_PROJECTSERVICECREATERESPONSE']._serialized_start=1075
- _globals['_PROJECTSERVICECREATERESPONSE']._serialized_end=1153
- _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_start=1155
- _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_end=1220
- _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_start=1222
- _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_end=1300
- _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_start=1303
- _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_end=1667
- _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_start=1669
- _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_end=1747
- _globals['_PROJECTSERVICE']._serialized_start=1750
- _globals['_PROJECTSERVICE']._serialized_end=2284
+ _globals['_PROJECT']._serialized_start=134
+ _globals['_PROJECT']._serialized_end=357
+ _globals['_PROJECTSERVICELISTREQUEST']._serialized_start=360
+ _globals['_PROJECTSERVICELISTREQUEST']._serialized_end=576
+ _globals['_PROJECTSERVICELISTRESPONSE']._serialized_start=578
+ _globals['_PROJECTSERVICELISTRESPONSE']._serialized_end=656
+ _globals['_PROJECTSERVICEGETREQUEST']._serialized_start=658
+ _globals['_PROJECTSERVICEGETREQUEST']._serialized_end=720
+ _globals['_PROJECTSERVICEGETRESPONSE']._serialized_start=722
+ _globals['_PROJECTSERVICEGETRESPONSE']._serialized_end=797
+ _globals['_PROJECTSERVICECREATEREQUEST']._serialized_start=800
+ _globals['_PROJECTSERVICECREATEREQUEST']._serialized_end=1040
+ _globals['_PROJECTSERVICECREATERESPONSE']._serialized_start=1042
+ _globals['_PROJECTSERVICECREATERESPONSE']._serialized_end=1120
+ _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_start=1122
+ _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_end=1187
+ _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_start=1189
+ _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_end=1267
+ _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_start=1270
+ _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_end=1634
+ _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_start=1636
+ _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_end=1714
+ _globals['_PROJECTSERVICE']._serialized_start=1717
+ _globals['_PROJECTSERVICE']._serialized_end=2251
# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/v1/project_pb2.pyi b/python/fits/api/v1/project_pb2.pyi
index 8756f92..4aad5d3 100644
--- a/python/fits/api/v1/project_pb2.pyi
+++ b/python/fits/api/v1/project_pb2.pyi
@@ -1,7 +1,6 @@
from buf.validate import validate_pb2 as _validate_pb2
from fits.api.v1 import common_pb2 as _common_pb2
from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
-from google.protobuf import timestamp_pb2 as _timestamp_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
diff --git a/python/fits/api/v1/tenant_pb2.py b/python/fits/api/v1/tenant_pb2.py
index 2cf7533..a501288 100644
--- a/python/fits/api/v1/tenant_pb2.py
+++ b/python/fits/api/v1/tenant_pb2.py
@@ -25,10 +25,9 @@
from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
-from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66its/api/v1/tenant.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xe9\x01\n\x06Tenant\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\x12%\n\x04meta\x18\x02 \x01(\x0b\x32\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12\x14\n\x05\x65mail\x18\x04 \x01(\tR\x05\x65mail\x12-\n\x0b\x64\x65scription\x18\x05 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\x1d\n\navatar_url\x18\x06 \x01(\tR\tavatarUrl\x12\x1d\n\ncreated_by\x18\x07 \x01(\tR\tcreatedBy\"\xa2\x01\n\x18TenantServiceListRequest\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12$\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12\x30\n\x06labels\x18\x03 \x01(\x0b\x32\x13.fits.api.v1.LabelsH\x02R\x06labels\x88\x01\x01\x42\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_labels\"/\n\x17TenantServiceGetRequest\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\"\x8f\x02\n\x1aTenantServiceCreateRequest\x12\x1f\n\x04name\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12\x32\n\x0b\x64\x65scription\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x00R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\x05\x65mail\x18\x03 \x01(\tB\x07\xbaH\x04r\x02`\x01H\x01R\x05\x65mail\x88\x01\x01\x12\"\n\navatar_url\x18\x04 \x01(\tH\x02R\tavatarUrl\x88\x01\x01\x12+\n\x06labels\x18\x05 \x01(\x0b\x32\x13.fits.api.v1.LabelsR\x06labelsB\x0e\n\x0c_descriptionB\x08\n\x06_emailB\r\n\x0b_avatar_url\"\x8b\x03\n\x1aTenantServiceUpdateRequest\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\x12@\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\nupdateMeta\x12$\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04name\x88\x01\x01\x12\"\n\x05\x65mail\x18\x04 \x01(\tB\x07\xbaH\x04r\x02`\x01H\x01R\x05\x65mail\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x05 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x02R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\navatar_url\x18\x06 \x01(\tH\x03R\tavatarUrl\x88\x01\x01\x12\x36\n\x06labels\x18\x07 \x01(\x0b\x32\x19.fits.api.v1.UpdateLabelsH\x04R\x06labels\x88\x01\x01\x42\x07\n\x05_nameB\x08\n\x06_emailB\x0e\n\x0c_descriptionB\r\n\x0b_avatar_urlB\t\n\x07_labels\"2\n\x1aTenantServiceDeleteRequest\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\"G\n\x18TenantServiceGetResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant\"J\n\x19TenantServiceListResponse\x12-\n\x07tenants\x18\x01 \x03(\x0b\x32\x13.fits.api.v1.TenantR\x07tenants\"J\n\x1bTenantServiceCreateResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant\"J\n\x1bTenantServiceUpdateResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant\"J\n\x1bTenantServiceDeleteResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant2\x8b\x04\n\rTenantService\x12\x65\n\x06\x43reate\x12\'.fits.api.v1.TenantServiceCreateRequest\x1a(.fits.api.v1.TenantServiceCreateResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12_\n\x04List\x12%.fits.api.v1.TenantServiceListRequest\x1a&.fits.api.v1.TenantServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x02\x12`\n\x03Get\x12$.fits.api.v1.TenantServiceGetRequest\x1a%.fits.api.v1.TenantServiceGetResponse\"\x0c\xc2\xf3\x18\x04\x01\x02\x03\x04\xe0\xf3\x18\x02\x12g\n\x06Update\x12\'.fits.api.v1.TenantServiceUpdateRequest\x1a(.fits.api.v1.TenantServiceUpdateResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12g\n\x06\x44\x65lete\x12\'.fits.api.v1.TenantServiceDeleteRequest\x1a(.fits.api.v1.TenantServiceDeleteResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x42\x97\x01\n\x0f\x63om.fits.api.v1B\x0bTenantProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66its/api/v1/tenant.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xe9\x01\n\x06Tenant\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\x12%\n\x04meta\x18\x02 \x01(\x0b\x32\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12\x14\n\x05\x65mail\x18\x04 \x01(\tR\x05\x65mail\x12-\n\x0b\x64\x65scription\x18\x05 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\x1d\n\navatar_url\x18\x06 \x01(\tR\tavatarUrl\x12\x1d\n\ncreated_by\x18\x07 \x01(\tR\tcreatedBy\"\xa2\x01\n\x18TenantServiceListRequest\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12$\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12\x30\n\x06labels\x18\x03 \x01(\x0b\x32\x13.fits.api.v1.LabelsH\x02R\x06labels\x88\x01\x01\x42\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_labels\"/\n\x17TenantServiceGetRequest\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\"\x8f\x02\n\x1aTenantServiceCreateRequest\x12\x1f\n\x04name\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12\x32\n\x0b\x64\x65scription\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x00R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\x05\x65mail\x18\x03 \x01(\tB\x07\xbaH\x04r\x02`\x01H\x01R\x05\x65mail\x88\x01\x01\x12\"\n\navatar_url\x18\x04 \x01(\tH\x02R\tavatarUrl\x88\x01\x01\x12+\n\x06labels\x18\x05 \x01(\x0b\x32\x13.fits.api.v1.LabelsR\x06labelsB\x0e\n\x0c_descriptionB\x08\n\x06_emailB\r\n\x0b_avatar_url\"\x8b\x03\n\x1aTenantServiceUpdateRequest\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\x12@\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\nupdateMeta\x12$\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04name\x88\x01\x01\x12\"\n\x05\x65mail\x18\x04 \x01(\tB\x07\xbaH\x04r\x02`\x01H\x01R\x05\x65mail\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x05 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x02R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\navatar_url\x18\x06 \x01(\tH\x03R\tavatarUrl\x88\x01\x01\x12\x36\n\x06labels\x18\x07 \x01(\x0b\x32\x19.fits.api.v1.UpdateLabelsH\x04R\x06labels\x88\x01\x01\x42\x07\n\x05_nameB\x08\n\x06_emailB\x0e\n\x0c_descriptionB\r\n\x0b_avatar_urlB\t\n\x07_labels\"2\n\x1aTenantServiceDeleteRequest\x12\x14\n\x05login\x18\x01 \x01(\tR\x05login\"G\n\x18TenantServiceGetResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant\"J\n\x19TenantServiceListResponse\x12-\n\x07tenants\x18\x01 \x03(\x0b\x32\x13.fits.api.v1.TenantR\x07tenants\"J\n\x1bTenantServiceCreateResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant\"J\n\x1bTenantServiceUpdateResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant\"J\n\x1bTenantServiceDeleteResponse\x12+\n\x06tenant\x18\x01 \x01(\x0b\x32\x13.fits.api.v1.TenantR\x06tenant2\x8b\x04\n\rTenantService\x12\x65\n\x06\x43reate\x12\'.fits.api.v1.TenantServiceCreateRequest\x1a(.fits.api.v1.TenantServiceCreateResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12_\n\x04List\x12%.fits.api.v1.TenantServiceListRequest\x1a&.fits.api.v1.TenantServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x02\x12`\n\x03Get\x12$.fits.api.v1.TenantServiceGetRequest\x1a%.fits.api.v1.TenantServiceGetResponse\"\x0c\xc2\xf3\x18\x04\x01\x02\x03\x04\xe0\xf3\x18\x02\x12g\n\x06Update\x12\'.fits.api.v1.TenantServiceUpdateRequest\x1a(.fits.api.v1.TenantServiceUpdateResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12g\n\x06\x44\x65lete\x12\'.fits.api.v1.TenantServiceDeleteRequest\x1a(.fits.api.v1.TenantServiceDeleteResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x42\x97\x01\n\x0f\x63om.fits.api.v1B\x0bTenantProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1b\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -66,28 +65,28 @@
_globals['_TENANTSERVICE'].methods_by_name['Update']._serialized_options = b'\302\363\030\002\001\002\340\363\030\001'
_globals['_TENANTSERVICE'].methods_by_name['Delete']._loaded_options = None
_globals['_TENANTSERVICE'].methods_by_name['Delete']._serialized_options = b'\302\363\030\002\001\002\340\363\030\001'
- _globals['_TENANT']._serialized_start=166
- _globals['_TENANT']._serialized_end=399
- _globals['_TENANTSERVICELISTREQUEST']._serialized_start=402
- _globals['_TENANTSERVICELISTREQUEST']._serialized_end=564
- _globals['_TENANTSERVICEGETREQUEST']._serialized_start=566
- _globals['_TENANTSERVICEGETREQUEST']._serialized_end=613
- _globals['_TENANTSERVICECREATEREQUEST']._serialized_start=616
- _globals['_TENANTSERVICECREATEREQUEST']._serialized_end=887
- _globals['_TENANTSERVICEUPDATEREQUEST']._serialized_start=890
- _globals['_TENANTSERVICEUPDATEREQUEST']._serialized_end=1285
- _globals['_TENANTSERVICEDELETEREQUEST']._serialized_start=1287
- _globals['_TENANTSERVICEDELETEREQUEST']._serialized_end=1337
- _globals['_TENANTSERVICEGETRESPONSE']._serialized_start=1339
- _globals['_TENANTSERVICEGETRESPONSE']._serialized_end=1410
- _globals['_TENANTSERVICELISTRESPONSE']._serialized_start=1412
- _globals['_TENANTSERVICELISTRESPONSE']._serialized_end=1486
- _globals['_TENANTSERVICECREATERESPONSE']._serialized_start=1488
- _globals['_TENANTSERVICECREATERESPONSE']._serialized_end=1562
- _globals['_TENANTSERVICEUPDATERESPONSE']._serialized_start=1564
- _globals['_TENANTSERVICEUPDATERESPONSE']._serialized_end=1638
- _globals['_TENANTSERVICEDELETERESPONSE']._serialized_start=1640
- _globals['_TENANTSERVICEDELETERESPONSE']._serialized_end=1714
- _globals['_TENANTSERVICE']._serialized_start=1717
- _globals['_TENANTSERVICE']._serialized_end=2240
+ _globals['_TENANT']._serialized_start=133
+ _globals['_TENANT']._serialized_end=366
+ _globals['_TENANTSERVICELISTREQUEST']._serialized_start=369
+ _globals['_TENANTSERVICELISTREQUEST']._serialized_end=531
+ _globals['_TENANTSERVICEGETREQUEST']._serialized_start=533
+ _globals['_TENANTSERVICEGETREQUEST']._serialized_end=580
+ _globals['_TENANTSERVICECREATEREQUEST']._serialized_start=583
+ _globals['_TENANTSERVICECREATEREQUEST']._serialized_end=854
+ _globals['_TENANTSERVICEUPDATEREQUEST']._serialized_start=857
+ _globals['_TENANTSERVICEUPDATEREQUEST']._serialized_end=1252
+ _globals['_TENANTSERVICEDELETEREQUEST']._serialized_start=1254
+ _globals['_TENANTSERVICEDELETEREQUEST']._serialized_end=1304
+ _globals['_TENANTSERVICEGETRESPONSE']._serialized_start=1306
+ _globals['_TENANTSERVICEGETRESPONSE']._serialized_end=1377
+ _globals['_TENANTSERVICELISTRESPONSE']._serialized_start=1379
+ _globals['_TENANTSERVICELISTRESPONSE']._serialized_end=1453
+ _globals['_TENANTSERVICECREATERESPONSE']._serialized_start=1455
+ _globals['_TENANTSERVICECREATERESPONSE']._serialized_end=1529
+ _globals['_TENANTSERVICEUPDATERESPONSE']._serialized_start=1531
+ _globals['_TENANTSERVICEUPDATERESPONSE']._serialized_end=1605
+ _globals['_TENANTSERVICEDELETERESPONSE']._serialized_start=1607
+ _globals['_TENANTSERVICEDELETERESPONSE']._serialized_end=1681
+ _globals['_TENANTSERVICE']._serialized_start=1684
+ _globals['_TENANTSERVICE']._serialized_end=2207
# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/v1/tenant_pb2.pyi b/python/fits/api/v1/tenant_pb2.pyi
index fd7ba94..8345ce9 100644
--- a/python/fits/api/v1/tenant_pb2.pyi
+++ b/python/fits/api/v1/tenant_pb2.pyi
@@ -1,7 +1,6 @@
from buf.validate import validate_pb2 as _validate_pb2
from fits.api.v1 import common_pb2 as _common_pb2
from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
-from google.protobuf import timestamp_pb2 as _timestamp_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
diff --git a/python/fits/client/client.py b/python/fits/client/client.py
index 2054258..01964c3 100755
--- a/python/fits/client/client.py
+++ b/python/fits/client/client.py
@@ -2,13 +2,19 @@
import pyqwest
-import fits.api.v1.health_connect as api_health_connect
-import fits.api.v1.ip_connect as api_ip_connect
-import fits.api.v1.method_connect as api_method_connect
-import fits.api.v1.project_connect as api_project_connect
-import fits.api.v1.tenant_connect as api_tenant_connect
-import fits.api.v1.token_connect as api_token_connect
-import fits.api.v1.version_connect as api_version_connect
+import fits.api.mvm.v1.location_connect as fits_api_mvm_v1_location_connect
+import fits.api.mvm.v1.mvm_connect as fits_api_mvm_v1_mvm_connect
+import fits.api.mvm.v1.os_connect as fits_api_mvm_v1_os_connect
+import fits.api.mvm.v1.stagetype_connect as fits_api_mvm_v1_stagetype_connect
+import fits.api.mvm.v1.vlan_connect as fits_api_mvm_v1_vlan_connect
+
+import fits.api.v1.health_connect as fits_api_v1_health_connect
+import fits.api.v1.ip_connect as fits_api_v1_ip_connect
+import fits.api.v1.method_connect as fits_api_v1_method_connect
+import fits.api.v1.project_connect as fits_api_v1_project_connect
+import fits.api.v1.tenant_connect as fits_api_v1_tenant_connect
+import fits.api.v1.token_connect as fits_api_v1_token_connect
+import fits.api.v1.version_connect as fits_api_v1_version_connect
@@ -26,11 +32,37 @@ def __init__(self, baseurl: str, timeout: float = 10, interceptors: list = []):
self._client = pyqwest.SyncClient(transport=transport)
+ def apimvmv1(self):
+ return self._Apimvmv1(baseurl=self._baseurl, client=self._client, interceptors=self._interceptors)
+
def apiv1(self):
return self._Apiv1(baseurl=self._baseurl, client=self._client, interceptors=self._interceptors)
+ class _Apimvmv1:
+ def __init__(self, baseurl: str, client: pyqwest.SyncClient = None, interceptors: list = []):
+ self._baseurl = baseurl
+ self._client = client
+ self._interceptors = list(interceptors)
+
+
+ def location(self):
+ return fits_api_mvm_v1_location_connect.LocationServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+
+ def mvm(self):
+ return fits_api_mvm_v1_mvm_connect.MVMServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+
+ def os(self):
+ return fits_api_mvm_v1_os_connect.OSServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+
+ def stagetype(self):
+ return fits_api_mvm_v1_stagetype_connect.StageTypeServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+
+ def vlan(self):
+ return fits_api_mvm_v1_vlan_connect.VLANServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+
+
class _Apiv1:
def __init__(self, baseurl: str, client: pyqwest.SyncClient = None, interceptors: list = []):
self._baseurl = baseurl
@@ -39,24 +71,24 @@ def __init__(self, baseurl: str, client: pyqwest.SyncClient = None, interceptors
def health(self):
- return api_health_connect.HealthServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return fits_api_v1_health_connect.HealthServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
def ip(self):
- return api_ip_connect.IPServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return fits_api_v1_ip_connect.IPServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
def method(self):
- return api_method_connect.MethodServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return fits_api_v1_method_connect.MethodServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
def project(self):
- return api_project_connect.ProjectServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return fits_api_v1_project_connect.ProjectServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
def tenant(self):
- return api_tenant_connect.TenantServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return fits_api_v1_tenant_connect.TenantServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
def token(self):
- return api_token_connect.TokenServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return fits_api_v1_token_connect.TokenServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
def version(self):
- return api_version_connect.VersionServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)
+ return fits_api_v1_version_connect.VersionServiceClientSync(address=self._baseurl, http_client=self._client, interceptors=self._interceptors)