Skip to content
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
6121310
fix templates
Laure-di Sep 3, 2024
769b63a
fix waiters template defaultRetryInterval
Laure-di Sep 3, 2024
3818f52
fix test templates
Laure-di Sep 3, 2024
3ee54d9
fix sweeper test
Laure-di Sep 3, 2024
916049f
fix sweeper test
Laure-di Sep 3, 2024
7664365
separate sweeper
Laure-di Sep 3, 2024
bbe296a
fix test resource
Laure-di Sep 3, 2024
c4b1b0c
add sweep template and test
Laure-di Sep 6, 2024
bebf2f5
fix resource and helper
Laure-di Sep 6, 2024
03e0e9f
fix name resource
Laure-di Sep 6, 2024
7b2f95a
feat(inference): add support
Laure-di Sep 10, 2024
9636658
fix package name
Laure-di Sep 10, 2024
b57f7f5
add deployment_resource to provider
Laure-di Sep 10, 2024
28f6b25
fix method name
Laure-di Sep 10, 2024
5168bb9
create deployment fix
Laure-di Sep 10, 2024
215ac39
create deployment finish
Laure-di Sep 11, 2024
2c44fed
add testdata create deployment
Laure-di Sep 11, 2024
531e3a6
dev read deployment
Laure-di Sep 11, 2024
c143b3a
Merge branch 'master' into feat-add-support-inference
Laure-di Sep 11, 2024
78b2f01
sweep and sweeper_test
Laure-di Sep 11, 2024
d9f50a1
gofumpt
Laure-di Sep 11, 2024
65da5ae
clean import
Laure-di Sep 11, 2024
dfcfb4b
organize endpoint create
Laure-di Sep 11, 2024
d026fc6
add tests endpoints
Laure-di Sep 11, 2024
06edac4
read set endpoints url
Laure-di Sep 11, 2024
d9d061d
manage endpoints read and auth
Laure-di Sep 11, 2024
a56e7ad
add create_at and updated_at read
Laure-di Sep 11, 2024
ba6c799
gci fix
Laure-di Sep 12, 2024
73e3be9
add checks.go and change tests names
Laure-di Sep 12, 2024
9e587c3
fix type tfprovider-lint
Laure-di Sep 12, 2024
c9da181
fix golangci-lint
Laure-di Sep 12, 2024
7feb5e0
fix tests
Laure-di Sep 17, 2024
caadd43
fix test compute size
Laure-di Oct 10, 2024
67a5a17
fix golangci
Laure-di Oct 10, 2024
f22e85b
Merge branch 'master' into feat-add-support-inference
Laure-di Oct 14, 2024
75b6b6f
Update internal/services/inference/testfuncs/checks.go
Laure-di Oct 14, 2024
fc8d29f
fix review
Laure-di Oct 16, 2024
15598f3
change endpoints
Laure-di Oct 16, 2024
713c990
fix endpoints
Laure-di Oct 22, 2024
adb9c7d
fix lint
Laure-di Oct 23, 2024
0728de0
Merge branch 'master' into feat-add-support-inference
Laure-di Oct 23, 2024
bdb7283
Update internal/services/inference/deployment.go
Laure-di Oct 23, 2024
cf8b820
fix update and min_size, max_size
Laure-di Oct 23, 2024
0e5ac6b
add tests
Laure-di Oct 23, 2024
663fd5e
remove default deployment size
Codelax Oct 24, 2024
afcbf34
lower retry interval
Codelax Oct 24, 2024
7b1d228
update cassettes
Codelax Oct 24, 2024
5390f89
add doc
Codelax Oct 24, 2024
cc2b8aa
improve doc
Codelax Oct 25, 2024
47c753e
Merge branch 'master' into feat-add-support-inference
Laure-di Oct 28, 2024
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 internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package provider

import (
"context"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/inference"
"os"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
Expand Down Expand Up @@ -157,6 +158,7 @@ func Provider(config *Config) plugin.ProviderFunc {
"scaleway_iam_policy": iam.ResourcePolicy(),
"scaleway_iam_ssh_key": iam.ResourceSSKKey(),
"scaleway_iam_user": iam.ResourceUser(),
"scaleway_inference_deployment": inference.ResourceDeployment(),
"scaleway_instance_image": instance.ResourceImage(),
"scaleway_instance_ip": instance.ResourceIP(),
"scaleway_instance_ip_reverse_dns": instance.ResourceIPReverseDNS(),
Expand Down
271 changes: 271 additions & 0 deletions internal/services/inference/deployment.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
package inference

import (
"context"
inference "github.com/scaleway/scaleway-sdk-go/api/inference/v1beta1"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/scaleway/scaleway-sdk-go/scw"
_ "time"
)

func ResourceDeployment() *schema.Resource {
return &schema.Resource{
CreateContext: ResourceDeploymentCreate,
ReadContext: ResourceDeploymentRead,
UpdateContext: ResourceDeploymentUpdate,
DeleteContext: ResourceDeploymentDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Timeouts: &schema.ResourceTimeout{ // TODO: remove unused timeouts
Create: schema.DefaultTimeout(defaultInferenceDeploymentTimeout),
Read: schema.DefaultTimeout(defaultInferenceDeploymentTimeout),
Update: schema.DefaultTimeout(defaultInferenceDeploymentTimeout),
Delete: schema.DefaultTimeout(defaultInferenceDeploymentTimeout),
Default: schema.DefaultTimeout(defaultInferenceDeploymentTimeout),
},
SchemaVersion: 0,
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: "The deployment name",
},
"region": regional.Schema(),
"project_id": account.ProjectIDSchema(),
"organization_id": account.OrganizationIDSchema(),
"node_type": {
Type: schema.TypeString,
Required: true,
Description: "The node type to use for the deployment",
},
"model_name": {
Type: schema.TypeString,
Required: true,
Description: "The model name to use for the deployment",
},
"accept_eula": {
Type: schema.TypeBool,
Optional: true,
Default: false,
Description: "Whether or not the deployment is accepting eula",
},
"tags": {
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Optional: true,
Description: "The tags associated with the deployment",
},
"min_size": {
Type: schema.TypeInt,
Optional: true,
Description: "The minimum size of the pool",
},
"max_size": {
Type: schema.TypeInt,
Optional: true,
Description: "The maximum size of the pool",
},
"size": {
Type: schema.TypeInt,
Computed: true,
Description: "The size of the pool",
},
"status": {
Type: schema.TypeString,
Computed: true,
Description: "The status of the deployment",
},
"endpoint_public_url": {
Type: schema.TypeString,
Computed: true,
Description: "The endpoint public URL",
},
"endpoint_private_url": {
Type: schema.TypeString,
Computed: true,
Description: "The endpoint private URL",
},
"endpoint_public_id": {
Type: schema.TypeString,
Computed: true,
Description: "The endpoint public ID",
},
"endpoint_private_id": {
Type: schema.TypeString,
Computed: true,
Description: "The endpoint private ID",
},
"endpoints": {
Type: schema.TypeList,
Required: true,
Description: "List of endpoints",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"public_endpoint": {
Type: schema.TypeBool,
Description: "Set the endpoint as public",
Optional: true,
},
"private_endpoint": {
Type: schema.TypeString,
Description: "The id of the private network",
Optional: true,
},
},
},
},
},
}
}

func ResourceDeploymentCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
api, region, err := NewAPIWithRegion(d, m)
if err != nil {
return diag.FromErr(err)
}

endpoint := inference.EndpointSpec{
Public: nil,
PrivateNetwork: nil,
DisableAuth: false,
}

req := &inference.CreateDeploymentRequest{
Region: region,
ProjectID: d.Get("project_id").(string),
Name: d.Get("name").(string),
NodeType: d.Get("node_type").(string),
ModelName: d.Get("model_name").(string),
Tags: types.ExpandStrings(d.Get("tags")),
}

if _, isEndpoint := d.GetOk("endpoints"); isEndpoint {
if publicEndpoint := d.Get("endpoints.0.public_endpoint"); publicEndpoint != nil && publicEndpoint.(bool) {
endpoint.Public = &inference.EndpointSpecPublic{}
}
if privateEndpoint := d.Get("endpoints.0.private_endpoint"); privateEndpoint != "" {
endpoint.PrivateNetwork = &inference.EndpointSpecPrivateNetwork{
PrivateNetworkID: privateEndpoint.(string),
}
}
}

if maxSize, ok := d.GetOk("max_size"); ok {
req.MaxSize = scw.Uint32Ptr(uint32(maxSize.(int)))
}

if minSize, ok := d.GetOk("min_size"); ok {
req.MaxSize = scw.Uint32Ptr(uint32(minSize.(int)))
}

req.Endpoints = []*inference.EndpointSpec{&endpoint}

if isAcceptingEula, ok := d.GetOk("accept_eula"); ok {
req.AcceptEula = scw.BoolPtr(isAcceptingEula.(bool))
}

deployment, err := api.CreateDeployment(req, scw.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
}

d.SetId(regional.NewIDString(region, deployment.ID))

_, err = waitForDeployment(ctx, api, region, deployment.ID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}

return ResourceDeploymentRead(ctx, d, m)
}

func ResourceDeploymentRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
api, region, id, err := NewAPIWithRegionAndID(m, d.Id())
if err != nil {
return diag.FromErr(err)
}

deployment, err := waitForDeployment(ctx, api, region, id, d.Timeout(schema.TimeoutRead))
if err != nil {
if httperrors.Is404(err) {
d.SetId("")
return nil
}
return diag.FromErr(err)
}

_ = d.Set("name", deployment.Name)
_ = d.Set("region", deployment.Region)
_ = d.Set("project_id", deployment.ProjectID)
_ = d.Set("node_type", deployment.NodeType)
_ = d.Set("model_name", deployment.ModelName)
_ = d.Set("min_size", deployment.MinSize)
_ = d.Set("max_size", deployment.MaxSize)
_ = d.Set("size", deployment.Size)
_ = d.Set("status", deployment.Status)

return nil
}

func ResourceDeploymentUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
api, region, id, err := NewAPIWithRegionAndID(m, d.Id())
if err != nil {
return diag.FromErr(err)
}

deployment, err := waitForDeployment(ctx, api, region, id, d.Timeout(schema.TimeoutUpdate))
if err != nil {
if httperrors.Is404(err) {
d.SetId("")
return nil
}
return diag.FromErr(err)
}
req := &inference.UpdateDeploymentRequest{
Region: region,
DeploymentID: deployment.ID,
}

if d.HasChange("name") {
req.Name = types.ExpandUpdatedStringPtr(d.Get("name"))
}

if _, err := api.UpdateDeployment(req, scw.WithContext(ctx)); err != nil {
return diag.FromErr(err)
}

return ResourceDeploymentRead(ctx, d, m)
}

func ResourceDeploymentDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
api, region, id, err := NewAPIWithRegionAndID(m, d.Id())
if err != nil {
return diag.FromErr(err)
}

_, err = waitForDeployment(ctx, api, region, id, d.Timeout(schema.TimeoutDelete))
if err != nil {
return diag.FromErr(err)
}
_, err = api.DeleteDeployment(&inference.DeleteDeploymentRequest{
Region: region,
DeploymentID: id,
}, scw.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
}
_, err = waitForDeployment(ctx, api, region, id, d.Timeout(schema.TimeoutDelete))
if err != nil && !httperrors.Is404(err) {
return diag.FromErr(err)
}

return nil
}
Loading