Skip to content

Commit

Permalink
fix: acceptance test for kubernetes cloud resource
Browse files Browse the repository at this point in the history
  • Loading branch information
anvial committed Oct 11, 2024
1 parent a5c04d1 commit 072b86a
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 25 deletions.
7 changes: 6 additions & 1 deletion .github/workflows/test_integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,12 @@ jobs:
if: ${{ matrix.action-operator.cloud == 'lxd' }}
# language=bash
run: |
sudo microk8s.config > /home/$USER/microk8s-config.yaml
sudo microk8s.config view > /home/$USER/microk8s-config.yaml
{
echo 'MICROK8S_CONFIG<<EOF'
sudo microk8s.config view
echo EOF
} >> "$GITHUB_ENV"
- run: go mod download
- env:
TF_ACC: "1"
Expand Down
36 changes: 34 additions & 2 deletions internal/juju/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@
package juju

import (
"context"
"fmt"
"strings"
"time"

"github.com/juju/clock"
"github.com/juju/errors"
"github.com/juju/juju/api/client/modelconfig"
"github.com/juju/juju/api/client/modelmanager"
"github.com/juju/juju/core/constraints"
"github.com/juju/juju/core/model"
"github.com/juju/juju/rpc/params"
"github.com/juju/names/v5"
"github.com/juju/retry"
)

var ModelNotFoundError = &modelNotFoundError{}
Expand Down Expand Up @@ -319,7 +323,7 @@ func (c *modelsClient) UpdateModel(input UpdateModelInput) error {
return nil
}

func (c *modelsClient) DestroyModel(input DestroyModelInput) error {
func (c *modelsClient) DestroyModel(ctx context.Context, input DestroyModelInput) error {
conn, err := c.GetConnection(nil)
if err != nil {
return err
Expand All @@ -341,8 +345,36 @@ func (c *modelsClient) DestroyModel(input DestroyModelInput) error {
return err
}

retryErr := retry.Call(retry.CallArgs{
Func: func() error {
output, err := client.ModelInfo([]names.ModelTag{tag})
if err != nil {
return err
}

if output[0].Error != nil {
// TODO: We get permission denied error instead ModelNotFound. Looks like this is a bug
// in the modelmanager facade. So until that is fixed, we will check for permission denied
// error and return nil if that is the case.
if strings.Contains(output[0].Error.Error(), "permission denied") {
return nil
}
}

c.Tracef("Model still exists:", map[string]interface{}{"output": output})

return errors.Errorf("model %q still exists", input.UUID)
},
BackoffFunc: retry.DoubleDelay,
Attempts: -1,
Delay: time.Second,
Clock: clock.WallClock,
Stop: ctx.Done(),
MaxDuration: timeout,
})

c.RemoveModel(input.UUID)
return nil
return retryErr
}

func (c *modelsClient) GrantModel(input GrantModelInput) error {
Expand Down
2 changes: 1 addition & 1 deletion internal/provider/resource_application_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1133,7 +1133,7 @@ func setupModelAndSpaces(t *testing.T, modelName string) (string, string, func()
t.Fatal(err)
}
cleanUp := func() {
_ = TestClient.Models.DestroyModel(internaljuju.DestroyModelInput{UUID: model.UUID})
_ = TestClient.Models.DestroyModel(context.Background(), internaljuju.DestroyModelInput{UUID: model.UUID})
_ = conn.Close()
}

Expand Down
34 changes: 14 additions & 20 deletions internal/provider/resource_kubernetes_cloud_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,53 +13,47 @@ import (
)

func TestAcc_ResourceKubernetesCloud(t *testing.T) {
// TODO: Skip this ACC test until we have a way to run correctly with kubernetes_config
// attribute set to a correct k8s config in github action environment
t.Skip(t.Name() + " is skipped until we have a way to run correctly with kubernetes_config attribute set to a correct k8s config in github action environment")

if testingCloud != LXDCloudTesting {
t.Skip(t.Name() + " only runs with LXD")
}
cloudName := acctest.RandomWithPrefix("tf-test-k8scloud")
modelName := acctest.RandomWithPrefix("tf-test-model")
cloudConfig := os.Getenv("MICROK8S_CONFIG")
cloudName := acctest.RandomWithPrefix("test-k8scloud")
modelName := "test-model"
userName := os.Getenv("USER")

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProtoV6ProviderFactories: frameworkProviderFactories,
Steps: []resource.TestStep{
{
Config: testAccResourceKubernetesCloud(cloudName, modelName, cloudConfig),
Config: testAccResourceKubernetesCloud(cloudName, modelName, userName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("juju_kubernetes_cloud."+cloudName, "name", cloudName),
resource.TestCheckResourceAttr("juju_kubernetes_cloud."+cloudName, "model", modelName),
resource.TestCheckResourceAttr("juju_kubernetes_cloud.test-k8scloud", "name", cloudName),
resource.TestCheckResourceAttr("juju_model.test-model", "name", modelName),
),
},
},
})
}

func testAccResourceKubernetesCloud(cloudName string, modelName string, config string) string {
func testAccResourceKubernetesCloud(cloudName string, modelName string, userName string) string {
return internaltesting.GetStringFromTemplateWithData(
"testAccResourceSecret",
"testAccResourceKubernetesCloud",
`
resource "juju_kubernetes_cloud" "tf-test-k8scloud" {
resource "juju_kubernetes_cloud" "test-k8scloud" {
name = "{{.CloudName}}"
kubernetes_config = file("~/microk8s-config.yaml")
kubernetes_config = file("/home/{{.UserName}}/microk8s-config.yaml")
}
resource "juju_model" {{.ModelName}} {
resource "juju_model" "test-model" {
name = "{{.ModelName}}"
credential = juju_kubernetes_cloud.tf-test-k8scloud.credential
credential = juju_kubernetes_cloud.test-k8scloud.credential
cloud {
name = juju_kubernetes_cloud.tf-test-k8scloud.name
name = juju_kubernetes_cloud.test-k8scloud.name
}
}
`, internaltesting.TemplateData{
"CloudName": cloudName,
"ModelName": modelName,
"Config": config,
"UserName": userName,
})
}
2 changes: 1 addition & 1 deletion internal/provider/resource_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,7 @@ func (r *modelResource) Delete(ctx context.Context, req resource.DeleteRequest,
arg := juju.DestroyModelInput{
UUID: modelUUID,
}
err := r.client.Models.DestroyModel(arg)
err := r.client.Models.DestroyModel(ctx, arg)
if err != nil {
resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete model, got error: %s", err))
return
Expand Down

0 comments on commit 072b86a

Please sign in to comment.