Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions endpoints.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* [nebius.compute.v1.ImageService](nebius/compute/v1/image_service.proto)
* [nebius.compute.v1.InstanceService](nebius/compute/v1/instance_service.proto)
* [nebius.compute.v1.MaintenanceService](nebius/compute/v1/maintenance_service.proto)
* [nebius.compute.v1.NVLInstanceGroupService](nebius/compute/v1/nvlinstancegroup_service.proto)
* [nebius.compute.v1.NodeService](nebius/compute/v1/node_service.proto)
* [nebius.compute.v1.PlatformService](nebius/compute/v1/platform_service.proto)
* [nebius.compute.v1alpha1.DiskService](nebius/compute/v1alpha1/disk_service.proto)
Expand Down Expand Up @@ -70,6 +71,7 @@
* [nebius.applications.v1alpha1.K8sReleaseService](nebius/applications/v1alpha1/k8s_release_service.proto)
* [nebius.common.v1.OperationService](nebius/common/v1/operation_service.proto)
* dns.api.nebius.cloud:443
* [nebius.common.v1.OperationService](nebius/common/v1/operation_service.proto)
* [nebius.dns.v1.RecordService](nebius/dns/v1/record_service.proto)
* [nebius.dns.v1.ZoneService](nebius/dns/v1/zone_service.proto)
* dpl.mysterybox.api.nebius.cloud:443
Expand Down
13 changes: 9 additions & 4 deletions nebius/compute/v1/instance.proto
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ message InstanceSpec {
]
}];

// NVLink Instance Group ID associated with the VM
string nvl_instance_group_id = 21;

ReservationPolicy reservation_policy = 23;

// Local disks are meaningfully different from regular (remote) disks:
Expand All @@ -112,11 +115,13 @@ message PreemptibleSpec {
(field_behavior) = IMMUTABLE
];

// The value can range from 1 to 5, where 5 indicates the highest priority.
// Affects the order in which Compute tries to preempt VMs, but does not guarantee the exact order.
int32 priority = 2 [
(buf.validate.field).required = true,
(field_behavior) = IMMUTABLE
(field_behavior) = IMMUTABLE,
deprecated = true,
(field_deprecation_details) = {
effective_at: "2026-05-11"
description: "it is deprecated and doesn't affect preemption behavior anymore."
}
];
}

Expand Down
51 changes: 51 additions & 0 deletions nebius/compute/v1/nvlinstancegroup.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
syntax = "proto3";

package nebius.compute.v1;

import "buf/validate/validate.proto";
import "nebius/annotations.proto";
import "nebius/common/v1/metadata.proto";
import "nebius/compute/v1/instance.proto";

option go_package = "github.com/nebius/gosdk/proto/nebius/compute/v1";
option java_multiple_files = true;
option java_outer_classname = "NvlinstancegroupProto";
option java_package = "ai.nebius.pub.compute.v1";

// Represents an NVLink InstanceGroup.
message NVLInstanceGroup {
common.v1.ResourceMetadata metadata = 1;

NVLInstanceGroupSpec spec = 2;

NVLInstanceGroupStatus status = 3;
}

message NVLInstanceGroupSpec {
// Type of the NVLink InstanceGroup.
enum NVLInstanceGroupType {
UNSPECIFIED = 0;

GB200 = 1;

GB300 = 2;
}

// Type of the NVLink InstanceGroup (corresponds to the Compute platform)
NVLInstanceGroupType type = 1 [(field_behavior) = IMMUTABLE];
}

message NVLInstanceGroupStatus {
reserved 2;

message InstanceInfo {
// Current state of the instance.
InstanceStatus.InstanceState instance_state = 1 [(buf.validate.field).required = true];
}

// Instances that are associated with this NVLink InstanceGroup
map<string, InstanceInfo> instances = 1;

// Indicates whether there is an ongoing operation with any VM in the InstanceGroup
bool reconciling = 3;
}
61 changes: 61 additions & 0 deletions nebius/compute/v1/nvlinstancegroup_service.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
syntax = "proto3";

package nebius.compute.v1;

import "nebius/annotations.proto";
import "nebius/common/v1/metadata.proto";
import "nebius/common/v1/operation.proto";
import "nebius/compute/v1/nvlinstancegroup.proto";

option go_package = "github.com/nebius/gosdk/proto/nebius/compute/v1";
option java_multiple_files = true;
option java_outer_classname = "NvlinstancegroupServiceProto";
option java_package = "ai.nebius.pub.compute.v1";

// Service for managing NVLink InstanceGroups.
service NVLInstanceGroupService {
option (api_service_name) = "compute";

// Create creates a new NVL InstanceGroup.
rpc Create(CreateNVLInstanceGroupRequest) returns (common.v1.Operation);

// Get retrieves the specified NVL InstanceGroup by its ID.
rpc Get(GetNVLInstanceGroupRequest) returns (NVLInstanceGroup);

// GetByName retrieves the specified NVL InstanceGroup by its parent and name.
rpc GetByName(common.v1.GetByNameRequest) returns (NVLInstanceGroup);

// List lists all NVL InstanceGroups in the specified parent.
rpc List(ListNVLInstanceGroupsRequest) returns (ListNVLInstanceGroupsResponse);

// Delete deletes the specified NVL InstanceGroup by its ID.
rpc Delete(DeleteNVLInstanceGroupRequest) returns (common.v1.Operation);
}

message CreateNVLInstanceGroupRequest {
common.v1.ResourceMetadata metadata = 1;

NVLInstanceGroupSpec spec = 2;
}

message GetNVLInstanceGroupRequest {
string id = 1;
}

message ListNVLInstanceGroupsRequest {
string parent_id = 1;

int64 page_size = 2;

string page_token = 3;
}

message ListNVLInstanceGroupsResponse {
repeated NVLInstanceGroup items = 1;

string next_page_token = 2;
}

message DeleteNVLInstanceGroupRequest {
string id = 1;
}
71 changes: 71 additions & 0 deletions nebius/dns/v1/record.proto
Original file line number Diff line number Diff line change
Expand Up @@ -172,3 +172,74 @@ message ListRecordsResponse {
// If `next_page_token` is empty, this is the last result page
string next_page_token = 2;
}

// Request to create a DNS record
message CreateRecordRequest {
// Metadata for the DNS record to create
// The only required field is `metadata.parent_id`, which must be set to the ID of this record's parent DNS zone
common.v1.ResourceMetadata metadata = 1 [
(buf.validate.field) = {
cel: [
{
id: "metadata_name"
message: "metadata.name must start and end with a letter a-z or a digit 0-9, contain only letters a-z, digits 0-9 and hyphens, and have a length between 1 and 63 characters"
expression: "this.name.matches('^|[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$')"
}
]
required: true
},
(nid) = {
parent_resource: ["dnszone"]
}
];

// Specification for the DNS record to create
RecordSpec spec = 2 [(buf.validate.field).required = true];
}

// Request to update the DNS record by its ID
message UpdateRecordRequest {
// Metadata for the DNS record being updated
// - The only required field is `metadata.id`, which must be set to the ID of the DNS record being updated
// - You may also set the expected DNS record version (`metadata.resource_version`), which ensures that only the requested version is
// updated (and a `FAILED_PRECONDITION` error is returned on version mismatch)
common.v1.ResourceMetadata metadata = 1 [
(buf.validate.field) = {
cel: [
{
id: "metadata_name"
message: "metadata.name must start and end with a letter a-z or a digit 0-9, contain only letters a-z, digits 0-9 and hyphens, and have a length between 1 and 63 characters"
expression: "this.name.matches('^|[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$')"
}
]
},
(nid) = {
parent_resource: ["dnszone"]
}
];

// New specification for the DNS record
RecordSpec spec = 2;
}

// Request to delete the DNS record by its ID
message DeleteRecordRequest {
// ID of the DNS record to delete
string id = 1 [
(buf.validate.field).required = true,
(nid) = {
resource: ["dnsrecord"]
}
];

// Optional: expected DNS record version (`metadata.resource_version`)
// - If specified, ensures that only the requested version is deleted (and a `FAILED_PRECONDITION` error is returned on version mismatch)
// - If not specified or set to `0`, the latest version will be deleted
int64 resource_version = 2 [(buf.validate.field) = {
int64: {gte: 0}
}];

// Indicates that deletion-protected records should be also deleted
// Attempt to delete a protected record without this flag set to `true` will cause a `FAILED_PRECONDITION` error
bool force = 3;
}
10 changes: 10 additions & 0 deletions nebius/dns/v1/record_service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package nebius.dns.v1;

import "nebius/annotations.proto";
import "nebius/common/v1/metadata.proto";
import "nebius/common/v1/operation.proto";
import "nebius/dns/v1/record.proto";

option go_package = "github.com/nebius/gosdk/proto/nebius/dns/v1";
Expand All @@ -23,4 +24,13 @@ service RecordService {

// Lists DNS records in the specified DNS zone
rpc List(ListRecordsRequest) returns (ListRecordsResponse);

// Creates a DNS record
rpc Create(CreateRecordRequest) returns (common.v1.Operation);

// Updates the DNS record with the specified ID
rpc Update(UpdateRecordRequest) returns (common.v1.Operation);

// Deletes the DNS record with the specified ID
rpc Delete(DeleteRecordRequest) returns (common.v1.Operation);
}
66 changes: 66 additions & 0 deletions nebius/dns/v1/zone.proto
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,69 @@ message ListZonesResponse {
// If `next_page_token` is empty, this is the last result page
string next_page_token = 2;
}

// Request to create a DNS zone
message CreateZoneRequest {
// Metadata for the DNS zone to create
// The only required field is `metadata.parent_id`, which must be set to the ID of this zone's parent IAM container
common.v1.ResourceMetadata metadata = 1 [
(buf.validate.field) = {
cel: [
{
id: "metadata_name"
message: "metadata.name must start and end with a letter a-z or a digit 0-9, contain only letters a-z, digits 0-9 and hyphens, and have a length between 1 and 63 characters"
expression: "this.name.matches('^|[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$')"
}
]
required: true
},
(nid) = {
parent_resource: ["project"]
}
];

// Specification for the DNS zone to create
ZoneSpec spec = 2 [(buf.validate.field).required = true];
}

// Request to update the DNS zone by its ID
message UpdateZoneRequest {
// Metadata for the DNS zone being updated
// - The only required field is `metadata.id`, which must be set to the ID of the DNS zone being updated
// - You may also set the expected DNS zone version (`metadata.resource_version`), which ensures that only the requested version is
// updated (and a `FAILED_PRECONDITION` error is returned on version mismatch)
common.v1.ResourceMetadata metadata = 1 [
(buf.validate.field) = {
cel: [
{
id: "metadata_name"
message: "metadata.name must start and end with a letter a-z or a digit 0-9, contain only letters a-z, digits 0-9 and hyphens, and have a length between 1 and 63 characters"
expression: "this.name.matches('^|[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$')"
}
]
},
(nid) = {
parent_resource: ["project"]
}
];

// New specification for the DNS zone
ZoneSpec spec = 2;
}

message DeleteZoneRequest {
// ID of the DNS zone to delete
string id = 1 [
(buf.validate.field).required = true,
(nid) = {
resource: ["dnszone"]
}
];

// Optional: expected DNS zone version (`metadata.resource_version`)
// - If specified, ensures that only the requested version is deleted (and a `FAILED_PRECONDITION` error is returned on version mismatch)
// - If not specified or set to `0`, the latest version will be deleted
int64 resource_version = 2 [(buf.validate.field) = {
int64: {gte: 0}
}];
}
10 changes: 10 additions & 0 deletions nebius/dns/v1/zone_service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package nebius.dns.v1;

import "nebius/annotations.proto";
import "nebius/common/v1/metadata.proto";
import "nebius/common/v1/operation.proto";
import "nebius/dns/v1/zone.proto";

option go_package = "github.com/nebius/gosdk/proto/nebius/dns/v1";
Expand All @@ -23,4 +24,13 @@ service ZoneService {

// Lists DNS zones in the specified parent IAM container
rpc List(ListZonesRequest) returns (ListZonesResponse);

// Creates a DNS zone
rpc Create(CreateZoneRequest) returns (common.v1.Operation);

// Updates the DNS zone with the specified ID
rpc Update(UpdateZoneRequest) returns (common.v1.Operation);

// Deletes the DNS zone with the specified ID
rpc Delete(DeleteZoneRequest) returns (common.v1.Operation);
}
7 changes: 5 additions & 2 deletions nebius/mk8s/v1/cluster.proto
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package nebius.mk8s.v1;
import "buf/validate/validate.proto";
import "nebius/annotations.proto";
import "nebius/common/v1/metadata.proto";
import "nebius/common/v1/resource_event.proto";

option go_package = "github.com/nebius/gosdk/proto/nebius/mk8s/v1";
option java_multiple_files = true;
Expand All @@ -16,8 +17,8 @@ message Cluster {
cel: [
{
id: "metadata_name"
message: "'name' must be 1 to 63 characters long and use only letters, digits, '-', or '.', starting and ending with a letter or digit"
expression: "size(this.name) >= 1 && size(this.name) <= 63 && this.name.matches('^(([A-Za-z0-9][-A-Za-z0-9.]*)?[A-Za-z0-9])?$')"
message: "'name' must be 1 to 63 characters long and use only letters, digits, '-', or '_', starting and ending with a letter or digit"
expression: "size(this.name) >= 1 && size(this.name) <= 63 && this.name.matches('^(([A-Za-z0-9][-A-Za-z0-9_]*)?[A-Za-z0-9])?$')"
}
]
}];
Expand Down Expand Up @@ -128,6 +129,8 @@ message ClusterStatus {

ControlPlaneStatus control_plane = 2;

repeated common.v1.RecurrentResourceEvent events = 3;

// Show that changes are in flight
bool reconciling = 100;
}
Expand Down
4 changes: 2 additions & 2 deletions nebius/mk8s/v1/cluster_service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ message CreateClusterRequest {
cel: [
{
id: "metadata_name"
message: "'name' must be 1 to 63 characters long and use only letters, digits, '-', or '.', starting and ending with a letter or digit"
expression: "size(this.name) >= 1 && size(this.name) <= 63 && this.name.matches('^(([A-Za-z0-9][-A-Za-z0-9.]*)?[A-Za-z0-9])?$')"
message: "'name' must be 1 to 63 characters long and use only letters, digits, '-', or '_', starting and ending with a letter or digit"
expression: "size(this.name) >= 1 && size(this.name) <= 63 && this.name.matches('^(([A-Za-z0-9][-A-Za-z0-9_]*)?[A-Za-z0-9])?$')"
}
]
required: true
Expand Down
Loading