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

New Resource: azurerm_mssql_job_agent #11248

Merged
merged 43 commits into from
Apr 16, 2021
Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
8d27af5
add client for elastic job agent
r0bnet Jan 6, 2021
3fd3982
add parse and validate files for job agent
r0bnet Jan 6, 2021
ecf579f
add client for elastic job agent
r0bnet Jan 6, 2021
99bb248
add parse and validate files for job agent
r0bnet Jan 6, 2021
a81604b
register mssql_job_agent
r0bnet Mar 11, 2021
1165285
add function to validate job agent name
r0bnet Apr 7, 2021
a28178a
implement read, create&update and delete methods
r0bnet Apr 7, 2021
43471ca
add basic test
r0bnet Apr 7, 2021
645ca4e
Merge remote-tracking branch 'fork/sql-elastic-job-agent' into sql-el…
r0bnet Apr 7, 2021
c06c7a5
add update and requires import test
r0bnet Apr 7, 2021
7095e33
add documentation
r0bnet Apr 8, 2021
1f28c0e
`azurerm_media_service_account` - `storage_authentication_type` corre…
jcanizalez Apr 6, 2021
45c7b51
Update changelog for #11222
mbfrahry Apr 6, 2021
9fd604a
new resource "azurerm_spring_cloud_app_redis_association" (#11154)
njuCZ Apr 6, 2021
b7a515b
CHANGELOG.md for #11154
katbyte Apr 6, 2021
981e50d
New resource: azurerm_api_management_email_template (#10914)
jan-mrm Apr 7, 2021
97deefd
Update changelog for #10914
manicminer Apr 7, 2021
7f4a2b0
d/dns_zone: not setting the resource id until after we've looked it up
tombuildsstuff Apr 6, 2021
380ec43
updating to include #11221
tombuildsstuff Apr 7, 2021
1def5cd
fix kubernates cluster acc tests
ms-henglu Apr 2, 2021
5d21851
docs: adding a heads up about the breaking api change rolling out 202…
tombuildsstuff Apr 7, 2021
c727172
`azurerm_eventgrid_data_connection`: add support for `table_name`, `m…
favoretti Apr 7, 2021
2464be0
CHANGELOG.md for #11157
katbyte Apr 7, 2021
c80e5f1
add client for elastic job agent
r0bnet Jan 6, 2021
2d98381
fix formatting errors
r0bnet Apr 8, 2021
aeade7c
fix incorrect usage of % in string
r0bnet Apr 8, 2021
534e545
add client for elastic job agent
r0bnet Jan 6, 2021
94211a5
add parse and validate files for job agent
r0bnet Jan 6, 2021
8ba1408
register mssql_job_agent
r0bnet Mar 11, 2021
54f398d
add function to validate job agent name
r0bnet Apr 7, 2021
233623e
implement read, create&update and delete methods
r0bnet Apr 7, 2021
74102aa
add basic test
r0bnet Apr 7, 2021
e33b5c8
add client for elastic job agent
r0bnet Jan 6, 2021
d74b9e7
add update and requires import test
r0bnet Apr 7, 2021
9b86a6f
add documentation
r0bnet Apr 8, 2021
a8e85ce
add client for elastic job agent
r0bnet Jan 6, 2021
b495bf1
fix formatting errors
r0bnet Apr 8, 2021
f6d858e
fix incorrect usage of % in string
r0bnet Apr 8, 2021
b15f9a5
Merge remote-tracking branch 'fork/sql-elastic-job-agent' into sql-el…
r0bnet Apr 8, 2021
a06ef2b
remove obsolete resource_group_name property
r0bnet Apr 15, 2021
5adf0d9
fix formatting
r0bnet Apr 15, 2021
e790e6d
Merge branch 'master' into sql-elastic-job-agent
r0bnet Apr 16, 2021
b953554
fix vendor dependencies
r0bnet Apr 16, 2021
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
7 changes: 6 additions & 1 deletion azurerm/internal/services/mssql/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ type Client struct {
BackupLongTermRetentionPoliciesClient *sql.BackupLongTermRetentionPoliciesClient
BackupShortTermRetentionPoliciesClient *sql.BackupShortTermRetentionPoliciesClient
DatabaseExtendedBlobAuditingPoliciesClient *sql.ExtendedDatabaseBlobAuditingPoliciesClient
DatabaseThreatDetectionPoliciesClient *sql.DatabaseThreatDetectionPoliciesClient
DatabaseVulnerabilityAssessmentRuleBaselinesClient *sql.DatabaseVulnerabilityAssessmentRuleBaselinesClient
DatabaseThreatDetectionPoliciesClient *sql.DatabaseThreatDetectionPoliciesClient
DatabasesClient *sql.DatabasesClient
ElasticPoolsClient *sql.ElasticPoolsClient
FirewallRulesClient *sql.FirewallRulesClient
JobAgentsClient *sql.JobAgentsClient
RestorableDroppedDatabasesClient *sql.RestorableDroppedDatabasesClient
ServerAzureADAdministratorsClient *sql.ServerAzureADAdministratorsClient
ServerConnectionPoliciesClient *sql.ServerConnectionPoliciesClient
Expand Down Expand Up @@ -49,6 +50,9 @@ func NewClient(o *common.ClientOptions) *Client {
elasticPoolsClient := sql.NewElasticPoolsClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&elasticPoolsClient.Client, o.ResourceManagerAuthorizer)

jobAgentsClient := sql.NewJobAgentsClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&jobAgentsClient.Client, o.ResourceManagerAuthorizer)

firewallRulesClient := sql.NewFirewallRulesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&firewallRulesClient.Client, o.ResourceManagerAuthorizer)

Expand Down Expand Up @@ -87,6 +91,7 @@ func NewClient(o *common.ClientOptions) *Client {
DatabaseThreatDetectionPoliciesClient: &databaseThreatDetectionPoliciesClient,
DatabaseVulnerabilityAssessmentRuleBaselinesClient: &databaseVulnerabilityAssessmentRuleBaselinesClient,
ElasticPoolsClient: &elasticPoolsClient,
JobAgentsClient: &jobAgentsClient,
FirewallRulesClient: &firewallRulesClient,
RestorableDroppedDatabasesClient: &restorableDroppedDatabasesClient,
ServerAzureADAdministratorsClient: &serverAzureADAdministratorsClient,
Expand Down
164 changes: 164 additions & 0 deletions azurerm/internal/services/mssql/mssql_job_agent_resource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
package mssql

import (
"fmt"
"log"
"time"

"github.com/Azure/azure-sdk-for-go/services/preview/sql/mgmt/v3.0/sql"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/mssql/parse"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/mssql/validate"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags"
azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func resourceMsSqlJobAgent() *schema.Resource {
return &schema.Resource{
Create: resourceMsSqlJobAgentCreateUpdate,
Read: resourceMsSqlJobAgentRead,
Update: resourceMsSqlJobAgentCreateUpdate,
Delete: resourceMsSqlJobAgentDelete,

Importer: azSchema.ValidateResourceIDPriorToImport(func(id string) error {
_, err := parse.JobAgentID(id)
return err
}),

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(60 * time.Minute),
Read: schema.DefaultTimeout(5 * time.Minute),
Update: schema.DefaultTimeout(60 * time.Minute),
Delete: schema.DefaultTimeout(60 * time.Minute),
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validate.ValidateMsSqlJobAgentName,
},

"database_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validate.DatabaseID,
},

"resource_group_name": azure.SchemaResourceGroupName(),
r0bnet marked this conversation as resolved.
Show resolved Hide resolved

"location": azure.SchemaLocation(),

"tags": tags.Schema(),
},
}
}

func resourceMsSqlJobAgentCreateUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).MSSQL.JobAgentsClient
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

log.Printf("[INFO] preparing arguments for Job Agent creation.")

name := d.Get("name").(string)
resGroup := d.Get("resource_group_name").(string)
location := azure.NormalizeLocation(d.Get("location").(string))
databaseId := d.Get("database_id").(string)
dbId, _ := parse.DatabaseID(databaseId)

if d.IsNewResource() {
existing, err := client.Get(ctx, resGroup, dbId.ServerName, name)
if err != nil {
if !utils.ResponseWasNotFound(existing.Response) {
return fmt.Errorf("Failed to check for presence of existing Job Agent %q (MsSql Server %q / Resource Group %q): %s", name, dbId.ServerName, resGroup, err)
}
}

if existing.ID != nil && *existing.ID != "" {
return tf.ImportAsExistsError("azurerm_mssql_job_agent", *existing.ID)
}
}

params := sql.JobAgent{
Name: &name,
Location: utils.String(location),
JobAgentProperties: &sql.JobAgentProperties{
DatabaseID: &databaseId,
},
Tags: tags.Expand(d.Get("tags").(map[string]interface{})),
}

future, err := client.CreateOrUpdate(ctx, resGroup, dbId.ServerName, name, params)
if err != nil {
return fmt.Errorf("creating MsSql Job Agent %q (Sql Server %q / Resource Group %q): %+v", name, dbId.ServerName, dbId.ResourceGroup, err)
}

if err = future.WaitForCompletionRef(ctx, client.Client); err != nil {
return fmt.Errorf("waiting for creation of Job Agent %q (MsSql Server Name %q / Resource Group %q): %+v", name, dbId.ServerName, resGroup, err)
}

resp, err := client.Get(ctx, dbId.ResourceGroup, dbId.ServerName, name)
if err != nil {
return fmt.Errorf("reading request for Job Agent %q (MsSql Server Name %q / Resource Group %q): %+v", name, dbId.ServerName, resGroup, err)
}

d.SetId(*resp.ID)

return resourceMsSqlJobAgentRead(d, meta)
}

func resourceMsSqlJobAgentRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).MSSQL.JobAgentsClient
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := parse.JobAgentID(d.Id())
if err != nil {
return err
}

resp, err := client.Get(ctx, id.ResourceGroup, id.ServerName, id.Name)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
d.SetId("")
return nil
}
return fmt.Errorf("reading MsSql Job Agent %s (MsSql Server Name %q / Resource Group %q): %s", id.Name, id.ServerName, id.ResourceGroup, err)
}

d.Set("name", resp.Name)
d.Set("resource_group_name", id.ResourceGroup)
if location := resp.Location; location != nil {
d.Set("location", azure.NormalizeLocation(*location))
}

d.Set("database_id", resp.DatabaseID)

return tags.FlattenAndSet(d, resp.Tags)
}

func resourceMsSqlJobAgentDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).MSSQL.JobAgentsClient
ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := parse.JobAgentID(d.Id())
if err != nil {
return err
}

future, err := client.Delete(ctx, id.ResourceGroup, id.ServerName, id.Name)
if err != nil {
return fmt.Errorf("deleting Job Agent %s: %+v", id.Name, err)
}

return future.WaitForCompletionRef(ctx, client.Client)
}
176 changes: 176 additions & 0 deletions azurerm/internal/services/mssql/mssql_job_agent_resource_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
package mssql_test

import (
"context"
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/terraform"

"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance/check"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/mssql/parse"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

type MsSqlJobAgentResource struct{}

func TestAccMsSqlJobAgent_basic(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_mssql_job_agent", "test")
r := MsSqlJobAgentResource{}

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.basic(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep(),
})
}

func TestAccMsSqlJobAgent_requiresImport(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_mssql_job_agent", "test")
r := MsSqlJobAgentResource{}

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.basic(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.RequiresImportErrorStep(r.requiresImport),
})
}

func TestAccMsSqlJobAgent_update(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_mssql_job_agent", "test")
r := MsSqlJobAgentResource{}

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.basic(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep(),
{
Config: r.complete(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep(),
})
}

func (MsSqlJobAgentResource) Exists(ctx context.Context, client *clients.Client, state *terraform.InstanceState) (*bool, error) {
id, err := parse.JobAgentID(state.ID)
if err != nil {
return nil, err
}

resp, err := client.MSSQL.JobAgentsClient.Get(ctx, id.ResourceGroup, id.ServerName, id.Name)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
return nil, fmt.Errorf("Job Agent %q (Resource Group %q) does not exist", id.Name, id.ResourceGroup)
}
return nil, fmt.Errorf("reading Job Agent %q (Resource Group %q): %v", id.Name, id.ResourceGroup, err)
}

return utils.Bool(resp.ID != nil), nil
}

func (MsSqlJobAgentResource) basic(data acceptance.TestData) string {
return fmt.Sprintf(`
provider "azurerm" {
features {}
}

resource "azurerm_resource_group" "test" {
name = "acctestRG-jobagent-%[1]d"
location = "%[2]s"
}

resource "azurerm_mssql_server" "test" {
name = "acctestmssqlserver%[1]d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
version = "12.0"
administrator_login = "4dministr4t0r"
administrator_login_password = "superSecur3!!!"
}

resource "azurerm_mssql_database" "test" {
name = "acctestmssqldb%[1]d"
server_id = azurerm_mssql_server.test.id
collation = "SQL_Latin1_General_CP1_CI_AS"
sku_name = "S1"
}

resource "azurerm_mssql_job_agent" "test" {
name = "acctestmssqljobagent%[1]d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
database_id = azurerm_mssql_database.test.id
}
`, data.RandomInteger, data.Locations.Primary)
}

func (r MsSqlJobAgentResource) requiresImport(data acceptance.TestData) string {
return fmt.Sprintf(`
%s

resource "azurerm_mssql_job_agent" "import" {
name = azurerm_mssql_job_agent.test.name
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
database_id = azurerm_mssql_database.test.id
}
`, r.basic(data))
}

func (MsSqlJobAgentResource) complete(data acceptance.TestData) string {
return fmt.Sprintf(`
provider "azurerm" {
features {}
}

resource "azurerm_resource_group" "test" {
name = "acctestRG-jobagent-%[1]d"
location = "%[2]s"
}

resource "azurerm_mssql_server" "test" {
name = "acctestmssqlserver%[1]d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
version = "12.0"
administrator_login = "4dministr4t0r"
administrator_login_password = "superSecur3!!!"
}

resource "azurerm_mssql_database" "test" {
name = "acctestmssqldb%[1]d"
server_id = azurerm_mssql_server.test.id
collation = "SQL_Latin1_General_CP1_CI_AS"
sku_name = "S1"
}

resource "azurerm_mssql_job_agent" "test" {
name = "acctestmssqljobagent%[1]d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
database_id = azurerm_mssql_database.test.id

tags = {
ENV = "production"
}
}
`, data.RandomInteger, data.Locations.Primary)
}
Loading