Skip to content

Commit eee6cef

Browse files
committed
Throw exception from JobAccount cmdlets if the server is not v12. Use the same client id for all ARM calls.
1 parent 4f2e404 commit eee6cef

File tree

7 files changed

+89
-41
lines changed

7 files changed

+89
-41
lines changed

src/ResourceManager/Sql/Commands.Sql/JobAccount/Cmdlet/GetAzureSqlJobAccount.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,19 @@ public class GetAzureSqlJobAccount : AzureSqlJobAccountCmdletBase
5050
/// <returns>A single server</returns>
5151
protected override IEnumerable<AzureSqlJobAccountModel> GetEntity()
5252
{
53-
ICollection<AzureSqlJobAccountModel> results = null;
53+
ModelAdapter.ThrowIfJobAccountNotSupportedByServer(this.ResourceGroupName, this.ServerName, this.clientRequestId);
5454

5555
if (this.MyInvocation.BoundParameters.ContainsKey("JobAccountName"))
5656
{
57-
results = new List<AzureSqlJobAccountModel>
57+
return new List<AzureSqlJobAccountModel>
5858
{
59-
ModelAdapter.GetJobAccount(this.ResourceGroupName, this.ServerName, this.JobAccountName)
59+
ModelAdapter.GetJobAccount(this.ResourceGroupName, this.ServerName, this.JobAccountName, this.clientRequestId)
6060
};
6161
}
6262
else
6363
{
64-
results = ModelAdapter.GetJobAccount(this.ResourceGroupName, this.ServerName);
64+
return ModelAdapter.GetJobAccount(this.ResourceGroupName, this.ServerName, this.clientRequestId);
6565
}
66-
67-
return results;
6866
}
6967

7068
/// <summary>

src/ResourceManager/Sql/Commands.Sql/JobAccount/Cmdlet/NewAzureSqlJobAccount.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public class NewAzureSqlJobAccount : AzureSqlJobAccountCmdletBase
6161
public Dictionary<string, string> Tags { get; set; }
6262

6363
/// <summary>
64-
/// Check to see if the server already exists in this resource group.
64+
/// Check to see if the job account already exists in this resource group.
6565
/// </summary>
66-
/// <returns>Null if the server doesn't exist. Otherwise throws exception</returns>
66+
/// <returns>Null if the job account doesn't exist. Otherwise throws exception</returns>
6767
protected override IEnumerable<Model.AzureSqlJobAccountModel> GetEntity()
6868
{
6969
try
@@ -95,7 +95,8 @@ public class NewAzureSqlJobAccount : AzureSqlJobAccountCmdletBase
9595
/// <returns>The generated model from user input</returns>
9696
protected override IEnumerable<Model.AzureSqlJobAccountModel> ApplyUserInputToModel(IEnumerable<Model.AzureSqlJobAccountModel> model)
9797
{
98-
string location = ModelAdapter.GetServerLocation(ResourceGroupName, ServerName);
98+
string location = ModelAdapter.GetServerLocationAndThrowIfJobAccountNotSupportedByServer(this.ResourceGroupName, this.ServerName, this.clientRequestId);
99+
99100
List<Model.AzureSqlJobAccountModel> newEntity = new List<Model.AzureSqlJobAccountModel>
100101
{
101102
new Model.AzureSqlJobAccountModel
@@ -120,7 +121,7 @@ public class NewAzureSqlJobAccount : AzureSqlJobAccountCmdletBase
120121
{
121122
return new List<Model.AzureSqlJobAccountModel>
122123
{
123-
ModelAdapter.UpsertJobAccount(entity.First())
124+
ModelAdapter.UpsertJobAccount(entity.First(), this.clientRequestId)
124125
};
125126
}
126127
}

src/ResourceManager/Sql/Commands.Sql/JobAccount/Cmdlet/RemoveAzureSqlJobAccount.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,11 @@ public class RemoveAzureSqlJobAccount : AzureSqlJobAccountCmdletBase
5858
/// <returns>The entity going to be deleted</returns>
5959
protected override IEnumerable<Model.AzureSqlJobAccountModel> GetEntity()
6060
{
61-
return new List<Model.AzureSqlJobAccountModel>() {
62-
ModelAdapter.GetJobAccount(this.ResourceGroupName, this.ServerName, this.JobAccountName)
61+
ModelAdapter.ThrowIfJobAccountNotSupportedByServer(this.ResourceGroupName, this.ServerName, this.clientRequestId);
62+
63+
return new List<Model.AzureSqlJobAccountModel>
64+
{
65+
ModelAdapter.GetJobAccount(this.ResourceGroupName, this.ServerName, this.JobAccountName, this.clientRequestId)
6366
};
6467
}
6568

@@ -80,7 +83,7 @@ public class RemoveAzureSqlJobAccount : AzureSqlJobAccountCmdletBase
8083
/// <returns>The job account that was deleted</returns>
8184
protected override IEnumerable<Model.AzureSqlJobAccountModel> PersistChanges(IEnumerable<Model.AzureSqlJobAccountModel> entity)
8285
{
83-
ModelAdapter.RemoveJobAccount(this.ResourceGroupName, this.ServerName, this.JobAccountName);
86+
ModelAdapter.RemoveJobAccount(this.ResourceGroupName, this.ServerName, this.JobAccountName, this.clientRequestId);
8487
return entity;
8588
}
8689

src/ResourceManager/Sql/Commands.Sql/JobAccount/Model/AzureSqlJobAccountModel.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
// ----------------------------------------------------------------------------------
1414

1515
using System.Collections.Generic;
16-
using System.Security;
1716

1817
namespace Microsoft.Azure.Commands.Sql.JobAccount.Model
1918
{

src/ResourceManager/Sql/Commands.Sql/JobAccount/Services/AzureSqlJobAccountAdapter.cs

Lines changed: 62 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,11 @@
1515
using Microsoft.Azure.Commands.Common.Authentication.Models;
1616
using Microsoft.Azure.Commands.Sql.JobAccount.Model;
1717
using Microsoft.Azure.Commands.Sql.JobAccount.Services;
18-
using Microsoft.Azure.Commands.Sql.Services;
1918
using Microsoft.Azure.Management.Sql.Models;
2019
using System;
2120
using System.Collections.Generic;
2221
using System.Linq;
23-
using System.Runtime.InteropServices;
24-
using System.Security;
25-
using System.Security.Permissions;
26-
using Microsoft.Azure.Commands.Sql.Server.Adapter;
22+
using Microsoft.Azure.Commands.Sql.Server.Services;
2723

2824
namespace Microsoft.Azure.Commands.Sql.JobAccount.Adapter
2925
{
@@ -58,10 +54,13 @@ public AzureSqlJobAccountAdapter(AzureContext context)
5854
/// <param name="resourceGroupName">The name of the resource group</param>
5955
/// <param name="serverName">The server the job account is in</param>
6056
/// <param name="jobAccountName">Name of the job account.</param>
61-
/// <returns>The job account</returns>
62-
public AzureSqlJobAccountModel GetJobAccount(string resourceGroupName, string serverName, string jobAccountName)
57+
/// <param name="clientId">The client identifier.</param>
58+
/// <returns>
59+
/// The job account
60+
/// </returns>
61+
public AzureSqlJobAccountModel GetJobAccount(string resourceGroupName, string serverName, string jobAccountName, string clientId)
6362
{
64-
var resp = Communicator.Get(resourceGroupName, serverName, jobAccountName, Util.GenerateTracingId());
63+
var resp = Communicator.Get(resourceGroupName, serverName, jobAccountName, clientId);
6564
return CreateJobAccountModelFromResponse(resourceGroupName, serverName, resp);
6665
}
6766

@@ -70,19 +69,25 @@ public AzureSqlJobAccountModel GetJobAccount(string resourceGroupName, string se
7069
/// </summary>
7170
/// <param name="resourceGroupName">The name of the resource group</param>
7271
/// <param name="serverName">The server the job account is in</param>
73-
/// <returns>A list of all the job account</returns>
74-
public List<AzureSqlJobAccountModel> GetJobAccount(string resourceGroupName, string serverName)
72+
/// <param name="clientId">The client identifier.</param>
73+
/// <returns>
74+
/// A list of all the job account
75+
/// </returns>
76+
public List<AzureSqlJobAccountModel> GetJobAccount(string resourceGroupName, string serverName, string clientId)
7577
{
76-
var resp = Communicator.List(resourceGroupName, serverName, Util.GenerateTracingId());
78+
var resp = Communicator.List(resourceGroupName, serverName, clientId);
7779
return resp.Select(s => CreateJobAccountModelFromResponse(resourceGroupName, serverName, s)).ToList();
7880
}
7981

8082
/// <summary>
8183
/// Upserts a server
8284
/// </summary>
8385
/// <param name="model">The server to upsert</param>
84-
/// <returns>The updated server model</returns>
85-
public AzureSqlJobAccountModel UpsertJobAccount(AzureSqlJobAccountModel model)
86+
/// <param name="clientId">The client identifier.</param>
87+
/// <returns>
88+
/// The updated server model
89+
/// </returns>
90+
public AzureSqlJobAccountModel UpsertJobAccount(AzureSqlJobAccountModel model, string clientId)
8691
{
8792
// Construct database id
8893
string databaseId = string.Format("/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Sql/servers/{2}/databases/{3}",
@@ -91,7 +96,7 @@ public AzureSqlJobAccountModel UpsertJobAccount(AzureSqlJobAccountModel model)
9196
model.ServerName,
9297
model.DatabaseName);
9398

94-
var resp = Communicator.CreateOrUpdate(model.ResourceGroupName, model.ServerName, model.JobAccountName, Util.GenerateTracingId(), new JobAccountCreateOrUpdateParameters
99+
var resp = Communicator.CreateOrUpdate(model.ResourceGroupName, model.ServerName, model.JobAccountName, clientId, new JobAccountCreateOrUpdateParameters
95100
{
96101
Location = model.Location,
97102
Tags = model.Tags,
@@ -110,9 +115,10 @@ public AzureSqlJobAccountModel UpsertJobAccount(AzureSqlJobAccountModel model)
110115
/// <param name="resourceGroupName">The resource group the server is in</param>
111116
/// <param name="serverName">The server the job account is in</param>
112117
/// <param name="jobAccountName">Name of the job account to delete.</param>
113-
public void RemoveJobAccount(string resourceGroupName, string serverName, string jobAccountName)
118+
/// <param name="clientId">The client identifier.</param>
119+
public void RemoveJobAccount(string resourceGroupName, string serverName, string jobAccountName, string clientId)
114120
{
115-
Communicator.Remove(resourceGroupName, serverName, jobAccountName, Util.GenerateTracingId());
121+
Communicator.Remove(resourceGroupName, serverName, jobAccountName, clientId);
116122
}
117123

118124
/// <summary>
@@ -129,28 +135,57 @@ private static AzureSqlJobAccountModel CreateJobAccountModelFromResponse(string
129135
int lastSlashIndex = resp.Properties.DatabaseId.LastIndexOf('/');
130136
string databaseName = resp.Properties.DatabaseId.Substring(lastSlashIndex + 1);
131137

132-
AzureSqlJobAccountModel jobAccount = new AzureSqlJobAccountModel();
133-
134-
jobAccount.ResourceGroupName = resourceGroupName;
135-
jobAccount.ServerName = serverName;
136-
jobAccount.JobAccountName = resp.Name;
137-
jobAccount.Location = resp.Location;
138-
jobAccount.DatabaseName = databaseName;
138+
AzureSqlJobAccountModel jobAccount = new AzureSqlJobAccountModel
139+
{
140+
ResourceGroupName = resourceGroupName,
141+
ServerName = serverName,
142+
JobAccountName = resp.Name,
143+
Location = resp.Location,
144+
DatabaseName = databaseName
145+
};
139146

140147
return jobAccount;
141148
}
142149

143150
/// <summary>
144-
/// Gets the Location of the server.
151+
/// Gets the Location of the server. Throws an exception if the server does not support job accounts.
145152
/// </summary>
146153
/// <param name="resourceGroupName">The resource group the server is in</param>
147154
/// <param name="serverName">The name of the server</param>
155+
/// <param name="clientId">The client identifier.</param>
148156
/// <returns></returns>
149-
public string GetServerLocation(string resourceGroupName, string serverName)
157+
/// <remarks>
158+
/// These 2 operations (get location, throw if not supported) are combined in order to minimize round trips.
159+
/// </remarks>
160+
public string GetServerLocationAndThrowIfJobAccountNotSupportedByServer(string resourceGroupName, string serverName, string clientId)
150161
{
151-
AzureSqlServerAdapter serverAdapter = new AzureSqlServerAdapter(Context);
152-
var server = serverAdapter.GetServer(resourceGroupName, serverName);
162+
AzureSqlServerCommunicator serverCommunicator = new AzureSqlServerCommunicator(Context);
163+
var server = serverCommunicator.Get(resourceGroupName, serverName, clientId);
164+
165+
ThrowIfJobAccountNotSupportedByServer(server);
166+
153167
return server.Location;
154168
}
169+
170+
/// <summary>
171+
/// Throws an exception if the server does not support job accounts.
172+
/// </summary>
173+
public void ThrowIfJobAccountNotSupportedByServer(string resourceGroupName, string serverName, string clientId)
174+
{
175+
AzureSqlServerCommunicator serverCommunicator = new AzureSqlServerCommunicator(Context);
176+
Management.Sql.Models.Server server = serverCommunicator.Get(resourceGroupName, serverName, clientId);
177+
ThrowIfJobAccountNotSupportedByServer(server);
178+
}
179+
180+
/// <summary>
181+
/// Throws an exception if the server does not support job accounts.
182+
/// </summary>
183+
private static void ThrowIfJobAccountNotSupportedByServer(Management.Sql.Models.Server server)
184+
{
185+
if (server.Properties.Version != "12.0")
186+
{
187+
throw new InvalidOperationException(string.Format(Properties.Resources.ServerNotApplicableForJobAccount, server.Name));
188+
}
189+
}
155190
}
156191
}

src/ResourceManager/Sql/Commands.Sql/Properties/Resources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ResourceManager/Sql/Commands.Sql/Properties/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,4 +297,7 @@
297297
<data name="RemoveAzureSqlJobAccountWarning" xml:space="preserve">
298298
<value>Are you sure you want to remove the job account '{0}' for Azure Sql Database Server '{1}'?</value>
299299
</data>
300+
<data name="ServerNotApplicableForJobAccount" xml:space="preserve">
301+
<value>Job accounts are only available for the latest SQL Database Update (V12). Please upgrade the server '{0}' or choose a different server.</value>
302+
</data>
300303
</root>

0 commit comments

Comments
 (0)