Skip to content
Merged
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
4 changes: 2 additions & 2 deletions .github/workflows/documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
markdown-link-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v5
- uses: gaurav-nelson/github-action-markdown-link-check@v1
with:
use-quiet-mode: 'yes'
Expand All @@ -26,7 +26,7 @@ jobs:
markdown-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v5
- uses: avto-dev/markdown-lint@v1
with:
config: '.markdownlint.yml'
Expand Down
9 changes: 3 additions & 6 deletions .github/workflows/lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v5
- name: Set up Go
uses: actions/setup-go@v3
uses: actions/setup-go@v6
with:
go-version-file: "go.mod"
cache: true

- name: golangci-lint
uses: golangci/golangci-lint-action@v3
uses: golangci/golangci-lint-action@v8
with:
go-version-file: "go.mod"
cache: true
version: v1.53
only-new-issues: true
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ jobs:
steps:
-
name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v5
-
name: Set up Go
uses: actions/setup-go@v3
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
cache: true
Expand Down
23 changes: 20 additions & 3 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
linters-settings:
errcheck:
ignore: Set
version: "2"
linters:
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
paths:
- third_party$
- builtin$
- examples$
formatters:
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$
1 change: 1 addition & 0 deletions docs/resources/airflow_user_roles.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ resource "airflow_user_roles" "example" {
## Argument Reference

The following arguments are supported:

* `username` - (Required) The username
* `roles` - (Required) A set of User roles to attach to the User.

Expand Down
4 changes: 2 additions & 2 deletions internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ func AirflowProvider() *schema.Provider {
return provider
}

func providerConfigure(ctx context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) {
func providerConfigure(_ context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) {
var transport http.RoundTripper

if disableSSL := d.Get("disable_ssl_verification").(bool); disableSSL {
Expand All @@ -97,7 +97,7 @@ func providerConfigure(ctx context.Context, d *schema.ResourceData) (interface{}
Transport: transport,
}

ctx = context.Background()
ctx := context.Background()
endpoint := d.Get("base_endpoint").(string)
u, err := url.Parse(endpoint)
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions internal/provider/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ func TestProvider(t *testing.T) {
}

func TestProvider_impl(t *testing.T) {
var _ *schema.Provider = AirflowProvider()
var _ = AirflowProvider()
}

func testAccPreCheck(t *testing.T) {
_, tokenOk := os.LookupEnv("AIRFLOW_OAUTH2_TOKEN")
_, userOk := os.LookupEnv("AIRFLOW_API_USERNAME")
_, passOk := os.LookupEnv("AIRFLOW_API_PASSWORD")

if tokenOk && !(userOk || passOk) {
if tokenOk && !userOk && !passOk {
t.Fatal("AIRFLOW_OAUTH2_TOKEN OR AIRFLOW_API_USERNAME/AIRFLOW_API_PASSWORD must be set for acceptance tests")
}

Expand Down
40 changes: 30 additions & 10 deletions internal/provider/resource_connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,19 +143,39 @@ func resourceConnectionRead(ctx context.Context, d *schema.ResourceData, m inter
return diag.Errorf("failed to get connection `%s` from Airflow: %s", d.Id(), err)
}

d.Set("connection_id", connection.GetConnectionId())
d.Set("conn_type", connection.GetConnType())
d.Set("host", connection.GetHost())
d.Set("login", connection.GetLogin())
d.Set("schema", connection.GetSchema())
d.Set("port", connection.GetPort())
d.Set("extra", connection.GetExtra())
d.Set("description", connection.GetDescription())
if err := d.Set("connection_id", connection.GetConnectionId()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("conn_type", connection.GetConnType()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("host", connection.GetHost()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("login", connection.GetLogin()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("schema", connection.GetSchema()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("port", connection.GetPort()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("extra", connection.GetExtra()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("description", connection.GetDescription()); err != nil {
return diag.FromErr(err)
}

if v, ok := connection.GetPasswordOk(); ok {
d.Set("password", v)
if err := d.Set("password", v); err != nil {
return diag.FromErr(err)
}
} else if v, ok := d.GetOk("password"); ok {
d.Set("password", v)
if err := d.Set("password", v); err != nil {
return diag.FromErr(err)
}
}

return nil
Expand Down
32 changes: 24 additions & 8 deletions internal/provider/resource_dag.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,30 @@ func resourceDagRead(ctx context.Context, d *schema.ResourceData, m interface{})
return diag.Errorf("failed to get DAG `%s` from Airflow: %s", d.Id(), err)
}

d.Set("dag_id", DAG.DagId)
d.Set("is_paused", DAG.IsPaused.Get())
d.Set("is_active", DAG.IsActive.Get())
d.Set("is_subdag", DAG.IsSubdag)
d.Set("description", DAG.Description.Get())
d.Set("file_token", DAG.FileToken)
d.Set("fileloc", DAG.Fileloc)
d.Set("root_dag_id", DAG.RootDagId.Get())
if err := d.Set("dag_id", DAG.DagId); err != nil {
return diag.FromErr(err)
}
if err := d.Set("is_paused", DAG.IsPaused.Get()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("is_active", DAG.IsActive.Get()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("is_subdag", DAG.IsSubdag); err != nil {
return diag.FromErr(err)
}
if err := d.Set("description", DAG.Description.Get()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("file_token", DAG.FileToken); err != nil {
return diag.FromErr(err)
}
if err := d.Set("fileloc", DAG.Fileloc); err != nil {
return diag.FromErr(err)
}
if err := d.Set("root_dag_id", DAG.RootDagId.Get()); err != nil {
return diag.FromErr(err)
}

return nil
}
Expand Down
22 changes: 15 additions & 7 deletions internal/provider/resource_dag_run.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

"github.com/apache/airflow-client-go/airflow"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

Expand Down Expand Up @@ -70,7 +70,7 @@ func resourceDagRunCreate(ctx context.Context, d *schema.ResourceData, m interfa
}
d.SetId(fmt.Sprintf("%s:%s", dagId, *res.DagRunId.Get()))

stateConf := &resource.StateChangeConf{
stateConf := &retry.StateChangeConf{
Pending: []string{"queued", "running", "success"},
Target: []string{"success"},
Refresh: resourceDagRunStateRefreshFunc(d.Id(), pcfg.AuthContext, client),
Expand Down Expand Up @@ -103,10 +103,18 @@ func resourceDagRunRead(ctx context.Context, d *schema.ResourceData, m interface
return diag.Errorf("failed to get dagRunId `%s` from Airflow: %s", d.Id(), err)
}

d.Set("dag_id", dagRun.DagId)
d.Set("dag_run_id", dagRun.DagRunId.Get())
d.Set("conf", dagRun.Conf)
d.Set("state", dagRun.State)
if err := d.Set("dag_id", dagRun.DagId); err != nil {
return diag.FromErr(err)
}
if err := d.Set("dag_run_id", dagRun.DagRunId.Get()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("conf", dagRun.Conf); err != nil {
return diag.FromErr(err)
}
if err := d.Set("state", dagRun.State); err != nil {
return diag.FromErr(err)
}

return nil
}
Expand Down Expand Up @@ -142,7 +150,7 @@ func airflowDagRunId(id string) (string, string, error) {
return parts[0], parts[1], nil
}

func resourceDagRunStateRefreshFunc(id string, pcfg context.Context, client *airflow.DAGRunApiService) resource.StateRefreshFunc {
func resourceDagRunStateRefreshFunc(id string, pcfg context.Context, client *airflow.DAGRunApiService) retry.StateRefreshFunc {
return func() (interface{}, string, error) {
dagId, dagRunId, err := airflowDagRunId(id)
if err != nil {
Expand Down
24 changes: 18 additions & 6 deletions internal/provider/resource_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,24 @@ func resourcePoolRead(ctx context.Context, d *schema.ResourceData, m interface{}
return diag.Errorf("failed to get pool `%s` from Airflow: %s", d.Id(), err)
}

d.Set("name", pool.Name)
d.Set("slots", pool.Slots)
d.Set("occupied_slots", pool.OccupiedSlots)
d.Set("queued_slots", pool.QueuedSlots)
d.Set("open_slots", pool.OpenSlots)
d.Set("used_slots", pool.UsedSlots)
if err := d.Set("name", pool.Name); err != nil {
return diag.FromErr(err)
}
if err := d.Set("slots", pool.Slots); err != nil {
return diag.FromErr(err)
}
if err := d.Set("occupied_slots", pool.OccupiedSlots); err != nil {
return diag.FromErr(err)
}
if err := d.Set("queued_slots", pool.QueuedSlots); err != nil {
return diag.FromErr(err)
}
if err := d.Set("open_slots", pool.OpenSlots); err != nil {
return diag.FromErr(err)
}
if err := d.Set("used_slots", pool.UsedSlots); err != nil {
return diag.FromErr(err)
}

return nil
}
Expand Down
4 changes: 3 additions & 1 deletion internal/provider/resource_role.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,9 @@ func resourceRoleRead(ctx context.Context, d *schema.ResourceData, m interface{}
return diag.Errorf("failed to get role `%s` from Airflow: %s", d.Id(), err)
}

d.Set("name", role.Name)
if err := d.Set("name", role.Name); err != nil {
return diag.FromErr(err)
}
if err := d.Set("action", flattenAirflowRoleActions(*role.Actions)); err != nil {
return diag.Errorf("error setting action: %s", err)
}
Expand Down
36 changes: 27 additions & 9 deletions internal/provider/resource_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,33 @@ func resourceUserRead(ctx context.Context, d *schema.ResourceData, m interface{}
return diag.Errorf("failed to get user `%s` from Airflow: %s", d.Id(), err)
}

d.Set("active", user.GetActive())
d.Set("email", user.Email)
d.Set("failed_login_count", user.GetFailedLoginCount())
d.Set("first_name", user.FirstName)
d.Set("last_name", user.LastName)
d.Set("login_count", user.GetLastLogin())
d.Set("username", user.Username)
d.Set("password", d.Get("password").(string))
d.Set("roles", flattenAirflowUserRoles(*user.Roles))
if err := d.Set("active", user.GetActive()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("email", user.Email); err != nil {
return diag.FromErr(err)
}
if err := d.Set("failed_login_count", user.GetFailedLoginCount()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("first_name", user.FirstName); err != nil {
return diag.FromErr(err)
}
if err := d.Set("last_name", user.LastName); err != nil {
return diag.FromErr(err)
}
if err := d.Set("login_count", user.GetLastLogin()); err != nil {
return diag.FromErr(err)
}
if err := d.Set("username", user.Username); err != nil {
return diag.FromErr(err)
}
if err := d.Set("password", d.Get("password").(string)); err != nil {
return diag.FromErr(err)
}
if err := d.Set("roles", flattenAirflowUserRoles(*user.Roles)); err != nil {
return diag.FromErr(err)
}

return nil
}
Expand Down
11 changes: 8 additions & 3 deletions internal/provider/resource_user_roles.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,12 @@ func resourceUserRolesRead(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("failed to get user `%s` from Airflow: %s", d.Id(), err)
}

d.Set("username", user.Username)
d.Set("roles", flattenAirflowUserRoles(*user.Roles))
if err := d.Set("username", user.Username); err != nil {
return diag.FromErr(err)
}
if err := d.Set("roles", flattenAirflowUserRoles(*user.Roles)); err != nil {
return diag.FromErr(err)
}

return nil
}
Expand Down Expand Up @@ -104,7 +108,8 @@ func resourceUserRolesDelete(ctx context.Context, d *schema.ResourceData, m inte
roles := make([]airflow.UserCollectionItemRoles, 0)
username := d.Id()

_, _, err := client.UserApi.PatchUser(pcfg.AuthContext, username).UpdateMask([]string{"roles"}).User(airflow.User{
var err error
_, _, _ = client.UserApi.PatchUser(pcfg.AuthContext, username).UpdateMask([]string{"roles"}).User(airflow.User{
Roles: &roles,
Username: &username,
FirstName: &username,
Expand Down
2 changes: 1 addition & 1 deletion internal/provider/resource_user_roles_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func testAccCheckAirflowUserRolesCheckDestroy(s *terraform.State) error {
continue
}
}
client.ApiClient.UserApi.DeleteUser(client.AuthContext, accName).Execute()
_, _ = client.ApiClient.UserApi.DeleteUser(client.AuthContext, accName).Execute()

return nil
}
Expand Down
12 changes: 9 additions & 3 deletions internal/provider/resource_variable.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,15 @@ func resourceVariableRead(ctx context.Context, d *schema.ResourceData, m interfa
return diag.Errorf("failed to get variable `%s`, Status: `%s` from Airflow: %s", d.Id(), resp.Status, err)
}

d.Set("key", variable.Key)
d.Set("value", variable.Value)
d.Set("description", variable.GetDescription())
if err := d.Set("key", variable.Key); err != nil {
return diag.FromErr(err)
}
if err := d.Set("value", variable.Value); err != nil {
return diag.FromErr(err)
}
if err := d.Set("description", variable.GetDescription()); err != nil {
return diag.FromErr(err)
}

return nil
}
Expand Down