integrations / integrations/terraform-provider-github

[MAINT] Migrate all resources and data sources to Context-aware CRUD functions

Open
#2,996 5 comments 1 reaction 0 assignees View on GitHub
Good first issue Status: Up for grabs
Dominant language
Go
Stars
1.2k
Forks
1k
Avg merge
1d 14h
Merged PRs (30d)
8

Description

## Summary

This issue tracks the migration of all resources and data sources from legacy CRUD functions (`Create`, `Read`, `Update`, `Delete`) to Context-aware CRUD functions (`CreateContext`, `ReadContext`, `UpdateContext`, `DeleteContext`).

## Why This Migration Is Needed

Per the [Terraform Plugin SDK v2 Upgrade Guide](https://developer.hashicorp.com/terraform/plugin/sdkv2/guides/v2-upgrade-guide#more-support-for-context-context):

1. **Deprecation**: The legacy CRUD function types (`CreateFunc`, `ReadFunc`, `UpdateFunc`, `DeleteFunc`) are deprecated in favor of their context-aware counterparts
2. **Reliable Timeouts & Cancellation**: Context-aware functions plumb `context.Context` throughout the SDK, enabling better request lifecycle management
3. **Improved Error Handling**: Migration to `diag.Diagnostics` allows returning multiple errors and warnings while associating them with specific fields

## Related Issues

- **#3070** - [MAINT] Tracking issue for refactoring logging to use `tflog` - Should be paired with this work since `tflog` requires `context.Context`

## Migration Pattern

### Before (Legacy)
```go
func resourceGithubExample() *schema.Resource {
return &schema.Resource{
Create: resourceGithubExampleCreate,
Read: resourceGithubExampleRead,
Update: resourceGithubExampleUpdate,
Delete: resourceGithubExampleDelete,
// ...
}
}

func resourceGithubExampleCreate(d *schema.ResourceData, meta interface{}) error {
// ...
return nil
}
```

### After (Context-Aware)
```go
func resourceGithubExample() *schema.Resource {
return &schema.Resource{
CreateContext: resourceGithubExampleCreate,
ReadContext: resourceGithubExampleRead,
UpdateContext: resourceGithubExampleUpdate,
DeleteContext: resourceGithubExampleDelete,
// ...
}
}

func resourceGithubExampleCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
// Use ctx in API calls for proper cancellation support
// ...
return nil
}
```

## Current Status

- **Total files**: 153
- **Already migrated**: 20
- **Remaining**: 133

## Migration Checklist

### Resources (85 files)

#### Actions
- [ ] `resource_github_actions_environment_secret.go`
- [ ] `resource_github_actions_environment_variable.go`
- [ ] `resource_github_actions_hosted_runner.go`
- [ ] `resource_github_actions_organization_oidc_subject_claim_customization_template.go`
- [ ] `resource_github_actions_organization_permissions.go`
- [ ] `resource_github_actions_organization_secret.go`
- [ ] `resource_github_actions_organization_secret_repositories.go`
- [ ] `resource_github_actions_organization_secret_repository.go`
- [ ] `resource_github_actions_organization_variable.go`
- [ ] `resource_github_actions_repository_access_level.go`
- [ ] `resource_github_actions_repository_oidc_subject_claim_customization_template.go`
- [ ] `resource_github_actions_repository_permissions.go`
- [ ] `resource_github_actions_runner_group.go`
- [ ] `resource_github_actions_secret.go`
- [ ] `resource_github_actions_variable.go`

#### App Installation
- [ ] `resource_github_app_installation_repositories.go`
- [ ] `resource_github_app_installation_repository.go`

#### Branch
- [ ] `resource_github_branch.go`
- [ ] `resource_github_branch_default.go`
- [ ] `resource_github_branch_protection.go`
- [ ] `resource_github_branch_protection_v3.go`

#### Codespaces
- [ ] `resource_github_codespaces_organization_secret.go`
- [ ] `resource_github_codespaces_organization_secret_repositories.go`
- [ ] `resource_github_codespaces_secret.go`
- [ ] `resource_github_codespaces_user_secret.go`

#### Dependabot
- [ ] `resource_github_dependabot_organization_secret.go`
- [ ] `resource_github_dependabot_organization_secret_repositories.go`
- [ ] `resource_github_dependabot_secret.go`

#### Enterprise
- [ ] `resource_github_enterprise_actions_permissions.go`
- [ ] `resource_github_enterprise_actions_runner_group.go`
- [ ] `resource_github_enterprise_actions_workflow_permissions.go`
- [ ] `resource_github_enterprise_organization.go`
- [ ] `resource_github_enterprise_security_analysis_settings.go`

#### EMU
- [ ] `resource_github_emu_group_mapping.go`

#### Issues
- [ ] `resource_github_issue.go`
- [ ] `resource_github_issue_label.go`
- [ ] `resource_github_issue_labels.go`

#### Membership
- [x] `resource_github_membership.go` ✅

#### Organization
- [ ] `resource_github_organization_custom_properties.go`
- [ ] `resource_github_organization_custom_role.go`
- [ ] `resource_github_organization_project.go`
- [x] `resource_github_organization_repository_role.go` ✅
- [x] `resource_github_organization_role.go` ✅
- [x] `resource_github_organization_role_team.go` ✅
- [ ] `resource_github_organization_role_team_assignment.go`
- [x] `resource_github_organization_role_user.go` ✅
- [x] `resource_github_organization_ruleset.go` ✅
- [ ] `resource_github_organization_security_manager.go`
- [ ] `resource_github_organization_settings.go`
- [ ] `resource_github_organization_webhook.go`
- [ ] `resource_organization_block.go`

#### Projects
- [ ] `resource_github_project_card.go`
- [ ] `resource_github_project_column.go`

#### Release
- [x] `resource_github_release.go`

#### Repository
- [x] `resource_github_repository.go` ✅
- [ ] `resource_github_repository_autolink_reference.go`
- [ ] `resource_github_repository_collaborator.go`
- [ ] `resource_github_repository_collaborators.go`
- [ ] `resource_github_repository_custom_property.go`
- [ ] `resource_github_repository_dependabot_security_updates.go`
- [ ] `resource_github_repository_deploy_key.go`
- [ ] `resource_github_repository_deployment_branch_policy.go`
- [ ] `resource_github_repository_environment.go`
- [x] `resource_github_repository_environment_deployment_policy.go` ✅
- [ ] `resource_github_repository_file.go`
- [ ] `resource_github_repository_milestone.go`
- [ ] `resource_github_repository_project.go`
- [ ] `resource_github_repository_pull_request.go`
- [x] `resource_github_repository_ruleset.go` ✅
- [ ] `resource_github_repository_topics.go`
- [ ] `resource_github_repository_webhook.go`

#### Team
- [x] `resource_github_team.go` ✅
- [ ] `resource_github_team_members.go`
- [ ] `resource_github_team_membership.go`
- [ ] `resource_github_team_repository.go`
- [ ] `resource_github_team_settings.go`
- [ ] `resource_github_team_sync_group_mapping.go`

#### User
- [ ] `resource_github_user_gpg_key.go`
- [ ] `resource_github_user_invitation_accepter.go`
- [ ] `resource_github_user_ssh_key.go`

#### Workflow
- [ ] `resource_github_workflow_repository_permissions.go`

### Data Sources (72 files)

#### Actions
- [ ] `data_source_github_actions_environment_public_key.go`
- [ ] `data_source_github_actions_environment_secrets.go`
- [ ] `data_source_github_actions_environment_variables.go`
- [ ] `data_source_github_actions_organization_oidc_subject_claim_customization_template.go`
- [ ] `data_source_github_actions_organization_public_key.go`
- [ ] `data_source_github_actions_organization_registration_token.go`
- [ ] `data_source_github_actions_organization_secrets.go`
- [ ] `data_source_github_actions_organization_variables.go`
- [ ] `data_source_github_actions_public_key.go`
- [ ] `data_source_github_actions_registration_token.go`
- [ ] `data_source_github_actions_repository_oidc_subject_claim_customization_template.go`
- [ ] `data_source_github_actions_secrets.go`
- [ ] `data_source_github_actions_variables.go`

#### App
- [ ] `data_source_github_app.go`
- [ ] `data_source_github_app_token.go`

#### Branch
- [ ] `data_source_github_branch.go`
- [ ] `data_source_github_branch_protection_rules.go`

#### Codespaces
- [ ] `data_source_github_codespaces_organization_public_key.go`
- [ ] `data_source_github_codespaces_organization_secrets.go`
- [ ] `data_source_github_codespaces_public_key.go`
- [ ] `data_source_github_codespaces_secrets.go`
- [ ] `data_source_github_codespaces_user_public_key.go`
- [ ] `data_source_github_codespaces_user_secrets.go`

#### Collaborators
- [ ] `data_source_github_collaborators.go`

#### Dependabot
- [ ] `data_source_github_dependabot_organization_public_key.go`
- [ ] `data_source_github_dependabot_organization_secrets.go`
- [ ] `data_source_github_dependabot_public_key.go`
- [ ] `data_source_github_dependabot_secrets.go`

#### Enterprise
- [ ] `data_source_github_enterprise.go`

#### External Groups
- [ ] `data_source_github_external_groups.go`

#### IP Ranges
- [ ] `data_source_github_ip_ranges.go`

#### Issues
- [ ] `data_source_github_issue_labels.go`

#### Membership
- [ ] `data_source_github_membership.go`

#### Organization
- [ ] `data_source_github_organization.go`
- [ ] `data_source_github_organization_custom_properties.go`
- [ ] `data_source_github_organization_custom_role.go`
- [ ] `data_source_github_organization_external_identities.go`
- [ ] `data_source_github_organization_ip_allow_list.go`
- [x] `data_source_github_organization_repository_role.go` ✅
- [x] `data_source_github_organization_repository_roles.go` ✅
- [x] `data_source_github_organization_role.go` ✅
- [x] `data_source_github_organization_role_teams.go` ✅
- [x] `data_source_github_organization_role_users.go` ✅
- [x] `data_source_github_organization_roles.go` ✅
- [ ] `data_source_github_organization_security_managers.go`
- [ ] `data_source_github_organization_team_sync_groups.go`
- [ ] `data_source_github_organization_teams.go`
- [ ] `data_source_github_organization_webhooks.go`

#### Ref
- [ ] `data_source_github_ref.go`

#### Release
- [x] `data_source_github_release.go`

#### Repository
- [ ] `data_source_github_repositories.go`
- [x] `data_source_github_repository.go` ✅
- [ ] `data_source_github_repository_autolink_references.go`
- [ ] `data_source_github_repository_branches.go`
- [ ] `data_source_github_repository_custom_properties.go`
- [ ] `data_source_github_repository_deploy_keys.go`
- [ ] `data_source_github_repository_deployment_branch_policies.go`
- [x] `data_source_github_repository_environment_deployment_policies.go` ✅
- [ ] `data_source_github_repository_environments.go`
- [x] `data_source_github_repository_file.go` ✅
- [ ] `data_source_github_repository_milestone.go`
- [ ] `data_source_github_repository_pull_request.go`
- [ ] `data_source_github_repository_pull_requests.go`
- [ ] `data_source_github_repository_teams.go`
- [ ] `data_source_github_repository_webhooks.go`

#### REST API
- [ ] `data_source_github_rest_api.go`

#### SSH Keys
- [ ] `data_source_github_ssh_keys.go`

#### Team
- [x] `data_source_github_team.go` ✅

#### Tree
- [ ] `data_source_github_tree.go`

#### User
- [ ] `data_source_github_user.go`
- [ ] `data_source_github_user_external_identity.go`
- [ ] `data_source_github_users.go`

## Suggested Approach

1. **Pair with tflog migration**: When migrating a file, also convert logging to `tflog` (#3070)
2. **Batch by domain**: Group related resources/data sources and migrate them together
3. **Reference existing migrations**: Use already-migrated files as reference implementations
4. **Update function signatures**: Change CRUD function signatures to include `ctx context.Context` and return `diag.Diagnostics`
5. **Pass context to API calls**: Update go-github client calls to use the context parameter
6. **Test thoroughly**: Ensure acceptance tests pass after each batch migration

## References

- [Terraform Plugin SDK v2 Upgrade Guide - Context Support](https://developer.hashicorp.com/terraform/plugin/sdkv2/guides/v2-upgrade-guide#more-support-for-context-context)
- Example migrated files: `resource_github_membership.go`, `resource_github_team.go`, `data_source_github_repository_file.go`

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.