Skip to content

Commit fd9a827

Browse files
committed
update nodegroup nebius
1 parent 8ce058d commit fd9a827

3 files changed

Lines changed: 110 additions & 0 deletions

File tree

internal/validation/suite.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,33 @@ func RunKubernetesValidation(t *testing.T, config ProviderConfig, opts Kubernete
442442
require.NoError(t, err, "ValidateClusterNodeGroups should pass")
443443
})
444444

445+
// Test: Modify Kubernetes Node Group
446+
t.Run("ValidateModifyKubernetesNodeGroup", func(t *testing.T) {
447+
err := v1.ValidateModifyKubernetesNodeGroup(ctx, client, v1.ModifyNodeGroupArgs{
448+
ID: nodeGroup.ID,
449+
MinNodeCount: opts.NodeGroupOpts.MinNodeCount + 1,
450+
MaxNodeCount: opts.NodeGroupOpts.MaxNodeCount + 1,
451+
})
452+
require.NoError(t, err, "ValidateModifyKubernetesNodeGroup should pass")
453+
})
454+
455+
// Test: WaitFor Kubernetes Node Group to Be Available
456+
t.Run("WaitForKubernetesNodeGroupToBeAvailable", func(t *testing.T) {
457+
err := WaitForResourcePredicate(ctx, WaitForResourcePredicateOpts[*v1.NodeGroup]{
458+
GetResource: func() (*v1.NodeGroup, error) {
459+
return client.GetNodeGroup(ctx, v1.GetNodeGroupArgs{ID: nodeGroup.ID})
460+
},
461+
Predicate: func(nodeGroup *v1.NodeGroup) bool {
462+
return nodeGroup.Status == v1.NodeGroupStatusAvailable &&
463+
nodeGroup.MinNodeCount == opts.NodeGroupOpts.MinNodeCount+1 &&
464+
nodeGroup.MaxNodeCount == opts.NodeGroupOpts.MaxNodeCount+1
465+
},
466+
Timeout: 5 * time.Minute,
467+
Interval: 5 * time.Second,
468+
})
469+
require.NoError(t, err, "WaitForKubernetesNodeGroupToBeAvailable should pass")
470+
})
471+
445472
// Test: Delete Kubernetes Node Group
446473
t.Run("ValidateDeleteKubernetesNodeGroup", func(t *testing.T) {
447474
err := v1.ValidateDeleteKubernetesNodeGroup(ctx, client, v1.DeleteNodeGroupArgs{

v1/kubernetes.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,28 @@ type DeleteClusterArgs struct {
157157
}
158158

159159
type CloudMaintainKubernetes interface {
160+
// Create a new Kubernetes cluster.
160161
CreateCluster(ctx context.Context, args CreateClusterArgs) (*Cluster, error)
162+
163+
// Get a Kubernetes cluster identified by the provided args.
161164
GetCluster(ctx context.Context, args GetClusterArgs) (*Cluster, error)
165+
166+
// Put a user into a Kubernetes cluster.
162167
PutUser(ctx context.Context, args PutUserArgs) (*PutUserResponse, error)
168+
169+
// Create a new Kubernetes node group.
163170
CreateNodeGroup(ctx context.Context, args CreateNodeGroupArgs) (*NodeGroup, error)
171+
172+
// Get a Kubernetes node group identified by the provided args.
164173
GetNodeGroup(ctx context.Context, args GetNodeGroupArgs) (*NodeGroup, error)
174+
175+
// Modify a Kubernetes node group.
165176
ModifyNodeGroup(ctx context.Context, args ModifyNodeGroupArgs) error
177+
178+
// Delete a Kubernetes node group identified by the provided args.
166179
DeleteNodeGroup(ctx context.Context, args DeleteNodeGroupArgs) error
180+
181+
// Delete a Kubernetes cluster identified by the provided args.
167182
DeleteCluster(ctx context.Context, args DeleteClusterArgs) error
168183
}
169184

v1/providers/nebius/kubernetes.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,74 @@ func parseNebiusNodeGroupStatus(status *nebiusmk8s.NodeGroupStatus) v1.NodeGroup
422422
return v1.NodeGroupStatusUnknown
423423
}
424424

425+
func (c *NebiusClient) ModifyNodeGroup(ctx context.Context, args v1.ModifyNodeGroupArgs) error {
426+
nebiusNodeGroupService := c.sdk.Services().MK8S().V1().NodeGroup()
427+
428+
err := validateModifyNodeGroupArgs(args)
429+
if err != nil {
430+
return errors.WrapAndTrace(err)
431+
}
432+
433+
nodeGroup, err := nebiusNodeGroupService.Get(ctx, &nebiusmk8s.GetNodeGroupRequest{
434+
Id: string(args.ID),
435+
})
436+
if err != nil {
437+
return errors.WrapAndTrace(err)
438+
}
439+
440+
_, err = nebiusNodeGroupService.Update(ctx, &nebiusmk8s.UpdateNodeGroupRequest{
441+
Metadata: &nebiuscommon.ResourceMetadata{
442+
Id: nodeGroup.Metadata.Id,
443+
Name: nodeGroup.Metadata.Name,
444+
ParentId: nodeGroup.Metadata.ParentId,
445+
Labels: nodeGroup.Metadata.Labels,
446+
},
447+
Spec: &nebiusmk8s.NodeGroupSpec{
448+
Size: &nebiusmk8s.NodeGroupSpec_Autoscaling{
449+
Autoscaling: &nebiusmk8s.NodeGroupAutoscalingSpec{
450+
MinNodeCount: int64(args.MinNodeCount),
451+
MaxNodeCount: int64(args.MaxNodeCount),
452+
},
453+
},
454+
Template: &nebiusmk8s.NodeTemplate{
455+
Resources: &nebiusmk8s.ResourcesSpec{
456+
Platform: nodeGroup.Spec.GetTemplate().GetResources().GetPlatform(),
457+
Size: &nebiusmk8s.ResourcesSpec_Preset{
458+
Preset: nodeGroup.Spec.GetTemplate().GetResources().GetPreset(),
459+
},
460+
},
461+
GpuSettings: &nebiusmk8s.GpuSettings{
462+
DriversPreset: nodeGroup.Spec.GetTemplate().GetGpuSettings().GetDriversPreset(),
463+
},
464+
BootDisk: &nebiusmk8s.DiskSpec{
465+
Type: nodeGroup.Spec.GetTemplate().GetBootDisk().GetType(),
466+
Size: &nebiusmk8s.DiskSpec_SizeGibibytes{
467+
SizeGibibytes: nodeGroup.Spec.GetTemplate().GetBootDisk().GetSizeGibibytes(),
468+
},
469+
},
470+
},
471+
},
472+
})
473+
if err != nil {
474+
return errors.WrapAndTrace(fmt.Errorf("failed to modify node group: %w", err))
475+
}
476+
477+
return nil
478+
}
479+
480+
func validateModifyNodeGroupArgs(args v1.ModifyNodeGroupArgs) error {
481+
if args.MinNodeCount < 1 {
482+
return fmt.Errorf("node group minNodeCount must be greater than 0")
483+
}
484+
if args.MaxNodeCount < 1 {
485+
return fmt.Errorf("node group maxNodeCount must be greater than 0")
486+
}
487+
if args.MaxNodeCount < args.MinNodeCount {
488+
return fmt.Errorf("node group maxNodeCount must be greater than or equal to minNodeCount")
489+
}
490+
return nil
491+
}
492+
425493
func (c *NebiusClient) DeleteNodeGroup(ctx context.Context, args v1.DeleteNodeGroupArgs) error {
426494
nebiusNodeGroupService := c.sdk.Services().MK8S().V1().NodeGroup()
427495

0 commit comments

Comments
 (0)