Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat multiple servernames #38

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
17 changes: 9 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ require (
github.com/hashicorp/terraform-plugin-sdk/v2 v2.27.0
github.com/stretchr/testify v1.8.4
github.com/tsuru/go-tsuruclient v0.0.0-20240403182619-fe8da980483b
github.com/tsuru/rpaas-operator v0.43.0
k8s.io/apimachinery v0.26.2
github.com/tsuru/rpaas-operator v0.45.1
k8s.io/apimachinery v0.26.7
)

require (
Expand Down Expand Up @@ -144,6 +144,7 @@ require (
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
go.uber.org/atomic v1.10.0 // indirect
golang.org/x/crypto v0.11.0 // indirect
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
golang.org/x/mod v0.10.0 // indirect
golang.org/x/net v0.12.0 // indirect
golang.org/x/oauth2 v0.10.0 // indirect
Expand All @@ -161,16 +162,16 @@ require (
gopkg.in/ini.v1 v1.66.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/api v0.26.2 // indirect
k8s.io/api v0.26.7 // indirect
k8s.io/apiextensions-apiserver v0.26.2 // indirect
k8s.io/cli-runtime v0.26.2 // indirect
k8s.io/client-go v0.26.2 // indirect
k8s.io/component-base v0.26.2 // indirect
k8s.io/cli-runtime v0.26.7 // indirect
k8s.io/client-go v0.26.7 // indirect
k8s.io/component-base v0.26.7 // indirect
k8s.io/klog/v2 v2.90.1 // indirect
k8s.io/kube-aggregator v0.24.2 // indirect
k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d // indirect
k8s.io/kubectl v0.26.2 // indirect
k8s.io/metrics v0.26.2 // indirect
k8s.io/kubectl v0.26.7 // indirect
k8s.io/metrics v0.26.7 // indirect
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect
knative.dev/pkg v0.0.0-20230306194819-b77a78c6c0ad // indirect
sigs.k8s.io/controller-runtime v0.14.5 // indirect
Expand Down
32 changes: 16 additions & 16 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -759,8 +759,8 @@ github.com/tsuru/go-tsuruclient v0.0.0-20240403182619-fe8da980483b h1:CWioMVdmtk
github.com/tsuru/go-tsuruclient v0.0.0-20240403182619-fe8da980483b/go.mod h1:qwh/KJ6ypa2GISRI79XFOHhnSjGOe1cZVPHF3nfrf18=
github.com/tsuru/nginx-operator v0.15.2-0.20240515194244-a38b4b58e866 h1:aCoSpcfQuMztS/7xFrQ2ml02NxqipXYLMgJonyux6fk=
github.com/tsuru/nginx-operator v0.15.2-0.20240515194244-a38b4b58e866/go.mod h1:qdJQVY4buUQymyhcpYO99ZCfLMPRvcB/1ywK3PAh/+Q=
github.com/tsuru/rpaas-operator v0.43.0 h1:QLeNUiDFIrHeVwVlzmVieWoBJfAGgC/9DT1rDuafRl8=
github.com/tsuru/rpaas-operator v0.43.0/go.mod h1:dxlwKGKICcstTwH0sbrrsb9Shsl2/BdDVo7uh1FWWRQ=
github.com/tsuru/rpaas-operator v0.45.1 h1:TTfS95vPOO7mpfpMTtqrLDA/ctA9wGl4A2p75cXm0K0=
github.com/tsuru/rpaas-operator v0.45.1/go.mod h1:aUYNaPrPgNn/5k+VdA+6JgcPwYkhUvh790r8Q0vZ+O4=
github.com/tsuru/stern v1.20.2-0.20210928180051-1157b938dc3f h1:9dTZI6bQUVkKAsCnqaDl4V7fKAc5ErVpmX+bzevz3Cg=
github.com/tsuru/stern v1.20.2-0.20210928180051-1157b938dc3f/go.mod h1:SUQKJ3CLsVARBwkz5z9IIL8Pj008JNj4U8eF50kkm2c=
github.com/tsuru/tablecli v0.0.0-20190131152944-7ded8a3383c6 h1:1XDdWFAjIbCSG1OjN9v9KdWhuM8UtYlFcfHe/Ldkchk=
Expand Down Expand Up @@ -1349,32 +1349,32 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg=
k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY=
k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg=
k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ=
k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU=
k8s.io/api v0.26.7 h1:Lf4iEBEJb5OFNmawtBfSZV/UNi9riSJ0t1qdhyZqI40=
k8s.io/api v0.26.7/go.mod h1:Vk9bMadzA49UHPmHB//lX7VRCQSXGoVwfLd3Sc1SSXI=
k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE=
k8s.io/apiextensions-apiserver v0.26.2 h1:/yTG2B9jGY2Q70iGskMf41qTLhL9XeNN2KhI0uDgwko=
k8s.io/apiextensions-apiserver v0.26.2/go.mod h1:Y7UPgch8nph8mGCuVk0SK83LnS8Esf3n6fUBgew8SH8=
k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI=
k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ=
k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I=
k8s.io/apimachinery v0.26.7 h1:590jSBwaSHCAFCqltaEogY/zybFlhGsnLteLpuF2wig=
k8s.io/apimachinery v0.26.7/go.mod h1:qYzLkrQ9lhrZRh0jNKo2cfvf/R1/kQONnSiyB7NUJU0=
k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU=
k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI=
k8s.io/cli-runtime v0.26.2 h1:6XcIQOYW1RGNwFgRwejvyUyAojhToPmJLGr0JBMC5jw=
k8s.io/cli-runtime v0.26.2/go.mod h1:U7sIXX7n6ZB+MmYQsyJratzPeJwgITqrSlpr1a5wM5I=
k8s.io/cli-runtime v0.26.7 h1:ZhAV9RK9wzXUeMKVvtVVX8jnsJcxw6hcSAu4K3eQbEo=
k8s.io/cli-runtime v0.26.7/go.mod h1:THp0KBlPxRk4SdpeoBmsuxJwNrwfpTT4+oDaNqhpv0c=
k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU=
k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk=
k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30=
k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI=
k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU=
k8s.io/client-go v0.26.7 h1:hyU9aKHlwVOykgyxzGYkrDSLCc4+mimZVyUJjPyUn1E=
k8s.io/client-go v0.26.7/go.mod h1:okYjy0jtq6sdeztALDvCh24tg4opOQS1XNvsJlERDAo=
k8s.io/code-generator v0.21.3/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo=
k8s.io/code-generator v0.22.0/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o=
k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ=
k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM=
k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI=
k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs=
k8s.io/component-base v0.26.7 h1:uqsOyZh0Zqoaup8tmHa491D/CvgFdGUs+X2H/inNUKM=
k8s.io/component-base v0.26.7/go.mod h1:CZe1HTmX/DQdeBrb9XYOXzs96jXth8ZbFvhLMsoJLUg=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
Expand All @@ -1396,10 +1396,10 @@ k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2R
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d h1:VcFq5n7wCJB2FQMCIHfC+f+jNcGgNMar1uKd6rVlifU=
k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY=
k8s.io/kubectl v0.26.2 h1:SMPB4j48eVFxsYluBq3VLyqXtE6b72YnszkbTAtFye4=
k8s.io/kubectl v0.26.2/go.mod h1:KYWOXSwp2BrDn3kPeoU/uKzKtdqvhK1dgZGd0+no4cM=
k8s.io/metrics v0.26.2 h1:2gUvUWWnHPdE2tyA5DvyHC8HGryr+izhY9i5dzLP06s=
k8s.io/metrics v0.26.2/go.mod h1:PX1wm9REV9hSGuw9GcXTFNDgab1KRXck3mNeiLYbRho=
k8s.io/kubectl v0.26.7 h1:s24r6MjKDMW4sMOsuBLaNYQHlweTZeDC0BPkMiom8s0=
k8s.io/kubectl v0.26.7/go.mod h1:4PGqS2bPQ5yGE0ZSQajzYdWKFUAi8HiuWBZQ2/iEFHg=
k8s.io/metrics v0.26.7 h1:GziC+HlH1Gpbh4xrI5Vfz8QxBmy5nXzzRiul2HS5Ioc=
k8s.io/metrics v0.26.7/go.mod h1:k1LCQu9vAS1HRZ2BGAosFHy2qSGZEUYn6bqHVMiFNK0=
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
k8s.io/utils v0.0.0-20210722164352-7f3ee0f31471/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
Expand Down
119 changes: 80 additions & 39 deletions internal/provider/resource_rpaas_block.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,18 @@ func resourceRpaasBlock() *schema.Resource {
ForceNew: true,
Description: "RPaaS Service Name",
},
"server_name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Description: "Optional parameter used to match the server name in the block. If not provided, it will apply to all servers.",
},
"extend": {
Type: schema.TypeBool,
Optional: true,
Default: false,
Description: "Extend is a flag to indicate if the block should be appended to the default configuration, only valid when specify a server_name.",
},
"name": {
Type: schema.TypeString,
Required: true,
Expand Down Expand Up @@ -72,40 +84,50 @@ func resourceRpaasBlockCreate(ctx context.Context, d *schema.ResourceData, meta

instance := d.Get("instance").(string)
serviceName := d.Get("service_name").(string)
serverName := d.Get("server_name").(string)
blockName := d.Get("name").(string)
content := d.Get("content").(string)
extend := d.Get("extend").(bool)

rpaasClient, err := provider.RpaasClient.SetService(serviceName)
if err != nil {
return diag.Errorf("Unable to create client for service %s: %v", serviceName, err)
}

tflog.Info(ctx, "Create block", map[string]interface{}{
"service": serviceName,
"instance": instance,
"name": blockName,
"service": serviceName,
"instance": instance,
"serverName": serverName,
"name": blockName,
"extend": extend,
})

err = rpaasRetry(ctx, d.Timeout(schema.TimeoutCreate), func() (*http.Response, error) {
return nil, rpaasClient.UpdateBlock(ctx, rpaas_client.UpdateBlockArgs{
Instance: instance,
Name: blockName,
Content: content,
Instance: instance,
Name: blockName,
ServerName: serverName,
Content: content,
Extend: extend,
})
})

if err != nil {
return diag.Errorf("Unable to create/update block %s for instance %s: %v", blockName, instance, err)
}

d.SetId(fmt.Sprintf("%s::%s::%s", serviceName, instance, blockName))
if serverName == "" {
d.SetId(fmt.Sprintf("%s::%s::%s", serviceName, instance, blockName))
} else {
d.SetId(fmt.Sprintf("%s::%s::%s::%s", serviceName, instance, serverName, blockName))
}
return resourceRpaasBlockRead(ctx, d, meta)
}

func resourceRpaasBlockUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
provider := meta.(*rpaasProvider)

serviceName, instance, blockName, err := parseRpaasBlockID(d.Id())
serviceName, instance, serverName, blockName, err := parseRpaasBlockID(d.Id())
if err != nil {
return diag.Errorf("Unable to parse Block ID: %v", err)
}
Expand All @@ -116,18 +138,22 @@ func resourceRpaasBlockUpdate(ctx context.Context, d *schema.ResourceData, meta
}

content := d.Get("content").(string)
extend := d.Get("extend").(bool)
tflog.Info(ctx, "Update block", map[string]interface{}{
"id": d.Id(),
"service": serviceName,
"instance": instance,
"name": blockName,
"id": d.Id(),
"service": serviceName,
"instance": instance,
"serverName": serverName,
"name": blockName,
})

err = rpaasRetry(ctx, d.Timeout(schema.TimeoutUpdate), func() (*http.Response, error) {
return nil, rpaasClient.UpdateBlock(ctx, rpaas_client.UpdateBlockArgs{
Instance: instance,
Name: blockName,
Content: content,
Instance: instance,
Name: blockName,
ServerName: serverName,
Content: content,
Extend: extend,
})
})

Expand All @@ -141,14 +167,15 @@ func resourceRpaasBlockUpdate(ctx context.Context, d *schema.ResourceData, meta
func resourceRpaasBlockRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
provider := meta.(*rpaasProvider)

serviceName, instance, blockName, err := parseRpaasBlockID(d.Id())
serviceName, instance, serverName, blockName, err := parseRpaasBlockID(d.Id())
if err != nil {
return diag.Errorf("Unable to parse Block ID: %v", err)
}

d.SetId(fmt.Sprintf("%s::%s::%s", serviceName, instance, blockName))
d.Set("instance", instance)
d.Set("service_name", serviceName)
d.Set("server_name", serverName)

rpaasClient, err := provider.RpaasClient.SetService(serviceName)
if err != nil {
Expand Down Expand Up @@ -182,12 +209,20 @@ func resourceRpaasBlockRead(ctx context.Context, d *schema.ResourceData, meta in
}

for _, b := range blocks {
if b.Name == blockName {
d.Set("name", b.Name)
d.Set("content", b.Content)
if b.ServerName != serverName || b.Name != blockName {
continue
}

d.Set("name", b.Name)
d.Set("content", b.Content)
d.Set("extend", b.Extend)

if serverName == "" {
d.SetId(fmt.Sprintf("%s::%s::%s", serviceName, instance, blockName))
return nil
} else {
d.SetId(fmt.Sprintf("%s::%s::%s::%s", serviceName, instance, serverName, blockName))
}
return nil
}

// no match
Expand All @@ -198,25 +233,29 @@ func resourceRpaasBlockRead(ctx context.Context, d *schema.ResourceData, meta in
func resourceRpaasBlockDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
provider := meta.(*rpaasProvider)

instance := d.Get("instance").(string)
serviceName := d.Get("service_name").(string)
blockName := d.Get("name").(string)
serviceName, instance, serverName, blockName, err := parseRpaasBlockID(d.Id())
if err != nil {
return diag.Errorf("Unable to parse Block ID: %v", err)
}

rpaasClient, err := provider.RpaasClient.SetService(serviceName)
if err != nil {
return diag.Errorf("Unable to create client for service %s: %v", serviceName, err)
}

tflog.Info(ctx, "Delete block", map[string]interface{}{
"id": d.Id(),
"service": serviceName,
"instance": instance,
"name": blockName,
"id": d.Id(),
"service": serviceName,
"instance": instance,
"serverName": serverName,
"name": blockName,
})

err = rpaasRetry(ctx, d.Timeout(schema.TimeoutDelete), func() (*http.Response, error) {
return nil, rpaasClient.DeleteBlock(ctx, rpaas_client.DeleteBlockArgs{
Instance: instance,
Name: blockName,
Instance: instance,
Name: blockName,
ServerName: serverName,
})
})

Expand All @@ -227,28 +266,30 @@ func resourceRpaasBlockDelete(ctx context.Context, d *schema.ResourceData, meta
return nil
}

func parseRpaasBlockID(id string) (serviceName, instance, blockName string, err error) {
func parseRpaasBlockID(id string) (serviceName, instance, serverName, blockName string, err error) {
splitID := strings.Split(id, "::")

if len(splitID) != 3 {
if len(splitID) == 3 {
serviceName = splitID[0]
instance = splitID[1]
blockName = splitID[2]
} else if len(splitID) == 4 {
serviceName = splitID[0]
instance = splitID[1]
serverName = splitID[2]
blockName = splitID[3]
} else {
serviceName, instance, blockName, err = parseRpaasBlockID_legacyV0(id)
if err != nil {
err = fmt.Errorf("Could not parse id %q. Format should be \"service::instance::blockName\"", id)
}
return
}

serviceName = splitID[0]
instance = splitID[1]
blockName = splitID[2]
return
}

func parseRpaasBlockID_legacyV0(id string) (serviceName, instance, blockName string, err error) {
splitID := strings.Split(id, "/")

if len(splitID) != 2 {
err = fmt.Errorf("Resource ID could not be parsed. Legacy WRONG format: \"service/instance\"")
err = fmt.Errorf("Could not parse id %q. Format should be \"service::instance::blockName\" or \"service::instance::serverName::blockName\"", id)
return
}

Expand Down
Loading