Skip to content

Commit

Permalink
New resources: azurerm_mssql_job and azurerm_mssql_job_schedule (h…
Browse files Browse the repository at this point in the history
…ashicorp#28456)

* New resources: azurerm_mssql_job and azurerm_mssql_job_schedule

* Update timeouts

* Fix lint

* Update struct name to follow convention

* Apply suggestions from code review

Co-authored-by: stephybun <[email protected]>

* Update internal/services/mssql/mssql_job_schedule_resource.go

Co-authored-by: stephybun <[email protected]>

* Update based on comments

---------

Co-authored-by: stephybun <[email protected]>
  • Loading branch information
2 people authored and NotTheEvilOne committed Jan 20, 2025
1 parent 113a570 commit 77da2eb
Show file tree
Hide file tree
Showing 24 changed files with 1,888 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .github/labeler-issue-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ service/monitor:
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_monitor_((.|\n)*)###'

service/mssql:
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_(mssql_database\W+|mssql_database_extended_auditing_policy\W+|mssql_database_vulnerability_assessment_rule_baseline\W+|mssql_elasticpool\W+|mssql_failover_group\W+|mssql_firewall_rule\W+|mssql_job_agent\W+|mssql_job_credential\W+|mssql_outbound_firewall_rule\W+|mssql_server\W+|mssql_server_dns_alias\W+|mssql_server_extended_auditing_policy\W+|mssql_server_microsoft_support_auditing_policy\W+|mssql_server_security_alert_policy\W+|mssql_server_transparent_data_encryption\W+|mssql_server_vulnerability_assessment\W+|mssql_virtual_machine\W+|mssql_virtual_machine_availability_group_listener\W+|mssql_virtual_machine_group\W+|mssql_virtual_network_rule\W+)((.|\n)*)###'
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_(mssql_database\W+|mssql_database_extended_auditing_policy\W+|mssql_database_vulnerability_assessment_rule_baseline\W+|mssql_elasticpool\W+|mssql_failover_group\W+|mssql_firewall_rule\W+|mssql_job\W+|mssql_job_agent\W+|mssql_job_credential\W+|mssql_job_schedule\W+|mssql_outbound_firewall_rule\W+|mssql_server\W+|mssql_server_dns_alias\W+|mssql_server_extended_auditing_policy\W+|mssql_server_microsoft_support_auditing_policy\W+|mssql_server_security_alert_policy\W+|mssql_server_transparent_data_encryption\W+|mssql_server_vulnerability_assessment\W+|mssql_virtual_machine\W+|mssql_virtual_machine_availability_group_listener\W+|mssql_virtual_machine_group\W+|mssql_virtual_network_rule\W+)((.|\n)*)###'

service/mssqlmanagedinstance:
- '### (|New or )Affected Resource\(s\)\/Data Source\(s\)((.|\n)*)azurerm_mssql_managed_((.|\n)*)###'
Expand Down
9 changes: 9 additions & 0 deletions internal/services/mssql/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/geobackuppolicies"
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/jobagents"
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/jobcredentials"
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/jobs"
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/longtermretentionpolicies"
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/outboundfirewallrules"
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/replicationlinks"
Expand Down Expand Up @@ -53,6 +54,7 @@ type Client struct {
GeoBackupPoliciesClient *geobackuppolicies.GeoBackupPoliciesClient
JobAgentsClient *jobagents.JobAgentsClient
JobCredentialsClient *jobcredentials.JobCredentialsClient
JobsClient *jobs.JobsClient
LongTermRetentionPoliciesClient *longtermretentionpolicies.LongTermRetentionPoliciesClient
OutboundFirewallRulesClient *outboundfirewallrules.OutboundFirewallRulesClient
ReplicationLinksClient *replicationlinks.ReplicationLinksClient
Expand Down Expand Up @@ -148,6 +150,12 @@ func NewClient(o *common.ClientOptions) (*Client, error) {
}
o.Configure(jobCredentialsClient.Client, o.Authorizers.ResourceManager)

jobsClient, err := jobs.NewJobsClientWithBaseURI(o.Environment.ResourceManager)
if err != nil {
return nil, fmt.Errorf("building Jobs Client: %+v", err)
}
o.Configure(jobsClient.Client, o.Authorizers.ResourceManager)

longTermRetentionPoliciesClient, err := longtermretentionpolicies.NewLongTermRetentionPoliciesClientWithBaseURI(o.Environment.ResourceManager)
if err != nil {
return nil, fmt.Errorf("building Long Term Retention Policies Client: %+v", err)
Expand Down Expand Up @@ -292,6 +300,7 @@ func NewClient(o *common.ClientOptions) (*Client, error) {
DatabaseSecurityAlertPoliciesClient: databaseSecurityAlertPoliciesClient,
ElasticPoolsClient: elasticPoolsClient,
GeoBackupPoliciesClient: geoBackupPoliciesClient,
JobsClient: jobsClient,
LongTermRetentionPoliciesClient: longTermRetentionPoliciesClient,
ReplicationLinksClient: replicationLinksClient,
RestorableDroppedDatabasesClient: restorableDroppedDatabasesClient,
Expand Down
192 changes: 192 additions & 0 deletions internal/services/mssql/mssql_job_resource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
package mssql

import (
"context"
"fmt"
"time"

"github.com/hashicorp/go-azure-helpers/lang/pointer"
"github.com/hashicorp/go-azure-helpers/lang/response"
"github.com/hashicorp/go-azure-sdk/resource-manager/sql/2023-08-01-preview/jobs"
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
)

type MsSqlJobResource struct{}

type MsSqlJobResourceModel struct {
Name string `tfschema:"name"`
JobAgentID string `tfschema:"job_agent_id"`
Description string `tfschema:"description"`
}

var _ sdk.ResourceWithUpdate = MsSqlJobResource{}

func (MsSqlJobResource) Arguments() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{
"name": {
Type: pluginsdk.TypeString,
Required: true,
ValidateFunc: validation.StringIsNotEmpty,
ForceNew: true,
},
"job_agent_id": {
Type: pluginsdk.TypeString,
Required: true,
ValidateFunc: jobs.ValidateJobAgentID,
ForceNew: true,
},
"description": {
Type: pluginsdk.TypeString,
Optional: true,
},
}
}

func (MsSqlJobResource) Attributes() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{}
}

func (MsSqlJobResource) ModelObject() interface{} {
return &MsSqlJobResourceModel{}
}

func (MsSqlJobResource) ResourceType() string {
return "azurerm_mssql_job"
}

func (r MsSqlJobResource) Create() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 30 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.MSSQL.JobsClient

var model MsSqlJobResourceModel
if err := metadata.Decode(&model); err != nil {
return fmt.Errorf("decoding: %+v", err)
}

jobAgent, err := jobs.ParseJobAgentID(model.JobAgentID)
if err != nil {
return err
}

id := jobs.NewJobID(jobAgent.SubscriptionId, jobAgent.ResourceGroupName, jobAgent.ServerName, jobAgent.JobAgentName, model.Name)

existing, err := client.Get(ctx, id)
if err != nil && !response.WasNotFound(existing.HttpResponse) {
return fmt.Errorf("checking for presence of existing %s: %+v", id, err)
}

if !response.WasNotFound(existing.HttpResponse) {
return metadata.ResourceRequiresImport(r.ResourceType(), id)
}

parameters := jobs.Job{
Name: pointer.To(model.Name),
Properties: pointer.To(jobs.JobProperties{
Description: pointer.To(model.Description),
}),
}

if _, err := client.CreateOrUpdate(ctx, id, parameters); err != nil {
return fmt.Errorf("creating %s: %+v", id, err)
}

metadata.SetID(id)
return nil
},
}
}

func (MsSqlJobResource) Read() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 5 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.MSSQL.JobsClient

id, err := jobs.ParseJobID(metadata.ResourceData.Id())
if err != nil {
return err
}

resp, err := client.Get(ctx, *id)
if err != nil {
if response.WasNotFound(resp.HttpResponse) {
return metadata.MarkAsGone(id)
}

return fmt.Errorf("retrieving %s: %+v", id, err)
}

state := MsSqlJobResourceModel{
Name: id.JobName,
JobAgentID: jobs.NewJobAgentID(id.SubscriptionId, id.ResourceGroupName, id.ServerName, id.JobAgentName).ID(),
}

if model := resp.Model; model != nil {
if props := model.Properties; props != nil {
state.Description = pointer.From(props.Description)
}
}

return metadata.Encode(&state)
},
}
}

func (MsSqlJobResource) Update() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 30 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.MSSQL.JobsClient

id, err := jobs.ParseJobID(metadata.ResourceData.Id())
if err != nil {
return err
}

var config MsSqlJobResourceModel
if err := metadata.Decode(&config); err != nil {
return fmt.Errorf("decoding: %+v", err)
}

param := jobs.Job{
Properties: pointer.To(jobs.JobProperties{
Description: pointer.To(config.Description),
}),
}

if _, err := client.CreateOrUpdate(ctx, *id, param); err != nil {
return fmt.Errorf("updating %s: %+v", id, err)
}

return nil
},
}
}

func (MsSqlJobResource) Delete() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 30 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.MSSQL.JobsClient

id, err := jobs.ParseJobID(metadata.ResourceData.Id())
if err != nil {
return err
}

if _, err := client.Delete(ctx, *id); err != nil {
return fmt.Errorf("deleting %s: %+v", id, err)
}

return nil
},
}
}

func (MsSqlJobResource) IDValidationFunc() pluginsdk.SchemaValidateFunc {
return jobs.ValidateJobID
}
Loading

0 comments on commit 77da2eb

Please sign in to comment.