diff --git a/nebius/ai/v1/endpoint.proto b/nebius/ai/v1/endpoint.proto index 2756e74..642fc15 100644 --- a/nebius/ai/v1/endpoint.proto +++ b/nebius/ai/v1/endpoint.proto @@ -4,6 +4,7 @@ package nebius.ai.v1; import "buf/validate/validate.proto"; import "nebius/annotations.proto"; +import "nebius/common/v1/error.proto"; import "nebius/common/v1/metadata.proto"; import "nebius/compute/v1/disk.proto"; import "nebius/compute/v1/instance.proto"; @@ -401,6 +402,11 @@ message EndpointStateDetails { // Detailed human-readable description. string message = 2; + + // Structured error details for the failure, if available. + // For quota-related failures, `service_error.details.quota_failure` + // is populated with the quota violations. + common.v1.ServiceError service_error = 3; } // EndpointInstanceStatus represents the status of a endpoint instance. diff --git a/nebius/ai/v1/endpoint_service.proto b/nebius/ai/v1/endpoint_service.proto index ef00712..b543f82 100644 --- a/nebius/ai/v1/endpoint_service.proto +++ b/nebius/ai/v1/endpoint_service.proto @@ -35,6 +35,9 @@ service EndpointService { // Starts an endpoint. rpc Start(StartEndpointRequest) returns (common.v1.Operation); + // Restarts an endpoint. + rpc Restart(RestartEndpointRequest) returns (common.v1.Operation); + // Stops an endpoint. rpc Stop(StopEndpointRequest) returns (common.v1.Operation); } @@ -104,6 +107,15 @@ message StartEndpointRequest { ]; } +message RestartEndpointRequest { + string id = 1 [ + (buf.validate.field).required = true, + (nid) = { + resource: ["aiendpoint"] + } + ]; +} + message StopEndpointRequest { string id = 1 [ (buf.validate.field).required = true, diff --git a/nebius/ai/v1/job.proto b/nebius/ai/v1/job.proto index d419cb9..3b0be12 100644 --- a/nebius/ai/v1/job.proto +++ b/nebius/ai/v1/job.proto @@ -6,6 +6,7 @@ import "buf/validate/validate.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "nebius/annotations.proto"; +import "nebius/common/v1/error.proto"; import "nebius/common/v1/metadata.proto"; import "nebius/compute/v1/disk.proto"; import "nebius/compute/v1/instance.proto"; @@ -400,6 +401,11 @@ message JobStateDetails { // Detailed human-readable description. string message = 2; + + // Structured error details for the failure, if available. + // For quota-related failures, `service_error.details.quota_failure` + // is populated with the quota violations. + common.v1.ServiceError service_error = 3; } // JobInstanceStatus represents the status of a job instance. diff --git a/nebius/ai/v1/job_service.proto b/nebius/ai/v1/job_service.proto index cff39b2..8e578af 100644 --- a/nebius/ai/v1/job_service.proto +++ b/nebius/ai/v1/job_service.proto @@ -34,6 +34,9 @@ service JobService { // Cancels a job. rpc Cancel(CancelJobRequest) returns (common.v1.Operation); + + // Restarts a job. + rpc Restart(RestartJobRequest) returns (common.v1.Operation); } message GetJobRequest { @@ -101,6 +104,15 @@ message CancelJobRequest { ]; } +message RestartJobRequest { + string id = 1 [ + (buf.validate.field).required = true, + (nid) = { + resource: ["aijob"] + } + ]; +} + message ListJobsResponse { repeated Job items = 1; diff --git a/nebius/capacity/v1/capacity_block_group.proto b/nebius/capacity/v1/capacity_block_group.proto index 04a09c0..eb5ff26 100644 --- a/nebius/capacity/v1/capacity_block_group.proto +++ b/nebius/capacity/v1/capacity_block_group.proto @@ -138,7 +138,10 @@ message CapacityBlockGroup { common.v1.ResourceMetadata metadata = 1 [ (buf.validate.field).required = true, (nid) = { - parent_resource: ["tenant"] + parent_resource: [ + "tenant", + "aitenant" + ] } ]; diff --git a/nebius/capacity/v1/capacity_block_group_service.proto b/nebius/capacity/v1/capacity_block_group_service.proto index 1299745..cbb12fc 100644 --- a/nebius/capacity/v1/capacity_block_group_service.proto +++ b/nebius/capacity/v1/capacity_block_group_service.proto @@ -47,7 +47,10 @@ message GetCapacityBlockGroupByResourceAffinityRequest { string parent_id = 1 [ (buf.validate.field).required = true, (nid) = { - resource: ["tenant"] + resource: [ + "tenant", + "aitenant" + ] } ]; @@ -65,7 +68,10 @@ message ListCapacityBlockGroupsRequest { string parent_id = 1 [ (buf.validate.field).required = true, (nid) = { - resource: ["tenant"] + resource: [ + "tenant", + "aitenant" + ] } ]; diff --git a/nebius/capacity/v1/capacity_interval.proto b/nebius/capacity/v1/capacity_interval.proto index ad4bbbc..51b0c98 100644 --- a/nebius/capacity/v1/capacity_interval.proto +++ b/nebius/capacity/v1/capacity_interval.proto @@ -34,7 +34,10 @@ message CapacityIntervalStatus { // Tenant ID for which the Capacity Interval is created. string container_id = 1 [(nid) = { - resource: ["tenant"] + resource: [ + "tenant", + "aitenant" + ] }]; // Name of the region where the Capacity Interval is created. diff --git a/nebius/mk8s/v1/node_group.proto b/nebius/mk8s/v1/node_group.proto index c6de60e..34d6548 100644 --- a/nebius/mk8s/v1/node_group.proto +++ b/nebius/mk8s/v1/node_group.proto @@ -68,6 +68,11 @@ message NodeGroupSpec { id: "node_group_spec.nvlink_autoscaling" message: "autoscaling cannot be used for a node group with NVLink" expression: "!(has(this.template.nvlink) && has(this.autoscaling))" + }, + { + id: "node_group_spec.nvlink_max_surge" + message: "max_surge must be 0 for a node group with NVLink" + expression: "!has(this.template.nvlink) || !has(this.strategy.max_surge) || (has(this.strategy.max_surge.count) && this.strategy.max_surge.count == 0) || (has(this.strategy.max_surge.percent) && this.strategy.max_surge.percent == 0)" } ] }; diff --git a/nebius/vpc/v1alpha1/network_interface.proto b/nebius/vpc/v1alpha1/network_interface.proto index 6d49be9..ad16984 100644 --- a/nebius/vpc/v1alpha1/network_interface.proto +++ b/nebius/vpc/v1alpha1/network_interface.proto @@ -14,7 +14,6 @@ option java_package = "ai.nebius.pub.vpc.v1alpha1"; message NetworkInterfaceSpec { // Subnet ID string subnet_id = 1 [ - (buf.validate.field).required = true, (field_behavior) = IMMUTABLE, (nid) = { resource: ["vpcsubnet"] @@ -97,6 +96,12 @@ message NetworkInterfaceStatus { // MAC address string mac_address = 7; + + // Subnet ID actually used by the network interface. + // Equals spec.subnet_id when it is provided; otherwise contains the resolved default subnet ID. + string subnet_id = 10 [(nid) = { + resource: ["vpcsubnet"] + }]; } message IPAddressStatus {