Skip to content

Commit 5371cee

Browse files
Add new cmdlets for Synapse managed private endpoint (Azure#15562)
* synapse managed private endpoint * synapse managed private endpoint, resolve review comment * Synapse managed private endpoint resolve comments again * Move const strings to SynapseConstants * HelpMessages & ManagedPrivateEndpointName parameter name change * restore endpoint name parameter setting * add help markdown file for synapse managed private endpoint cmdlet * modify change log * add online version to markdown * update set endpoint md file * update set- cmdlet to new- cmdlet * [Synapse] new cmdlet for managed private endpoint * update online version, description, sample in AzSynapseManagedPrivateEndpoint md files * modify online version for new-AzSynapseManagedPrivateEndpoint.md * add Azure.Analytics.Synapse.ManagedPrivateEndpoints.dll to required assembly * update changelog to avoid merge issue * update description in resouces and helpmessage Co-authored-by: Yeming Liu <[email protected]>
1 parent d4187b5 commit 5371cee

19 files changed

+1036
-3
lines changed

src/Synapse/Synapse/Az.Synapse.psd1

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ RequiredModules = @(@{ModuleName = 'Az.Accounts'; ModuleVersion = '2.5.1'; })
5959
RequiredAssemblies = 'Microsoft.Azure.Management.Synapse.dll',
6060
'Azure.Analytics.Synapse.Spark.dll',
6161
'Azure.Analytics.Synapse.AccessControl.dll',
62-
'Azure.Analytics.Synapse.Artifacts.dll'
62+
'Azure.Analytics.Synapse.Artifacts.dll',
63+
'Azure.Analytics.Synapse.ManagedPrivateEndpoints.dll'
6364

6465
# Script files (.ps1) that are run in the caller's environment prior to importing this module.
6566
# ScriptsToProcess = @()
@@ -174,7 +175,10 @@ CmdletsToExport = 'Get-AzSynapseSparkJob', 'Stop-AzSynapseSparkJob',
174175
'Update-AzSynapseManagedVirtualNetworkConfig',
175176
'Get-AzSynapseSparkJobDefinition',
176177
'Remove-AzSynapseSparkJobDefinition',
177-
'Set-AzSynapseSparkJobDefinition'
178+
'Set-AzSynapseSparkJobDefinition',
179+
'Get-AzSynapseManagedPrivateEndpoint',
180+
'New-AzSynapseManagedPrivateEndpoint',
181+
'Remove-AzSynapseManagedPrivateEndpoint'
178182

179183
# Variables to export from this module
180184
# VariablesToExport = @()
@@ -193,7 +197,8 @@ AliasesToExport = 'New-AzSynapsePipeline', 'New-AzSynapseLinkedService',
193197
'Clear-AzSynapseSqlPoolVulnerabilityAssessmentSetting',
194198
'Enable-AzSynapseSqlAdvancedThreatProtection',
195199
'Disable-AzSynapseSqlAdvancedThreatProtection',
196-
'New-AzSynapseSparkJobDefinition'
200+
'New-AzSynapseSparkJobDefinition',
201+
'Set-AzSynapseManagedPrivateEndpoint'
197202

198203
# DSC resources to export from this module
199204
# DscResourcesToExport = @()

src/Synapse/Synapse/ChangeLog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21+
* Added support for Synapse Managed Private Endpoint
22+
- Added `New-AzSynapseManagedPrivateEndpoint` cmdlet
23+
- Added `Get-AzSynapseManagedPrivateEndpoint` cmdlet
24+
- Added `Remove-AzSynapseManagedPrivateEndpoint` cmdlet
2125
* Added parameter `-ManagedResourceGroupName` for the `New-AzSynapseWorkspace` cmdlet
2226

2327
## Version 0.13.0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
2+
using Microsoft.Azure.Commands.Synapse.Common;
3+
using Microsoft.Azure.Commands.Synapse.Models;
4+
using Microsoft.WindowsAzure.Commands.Utilities.Common;
5+
using System.Linq;
6+
using System.Management.Automation;
7+
8+
namespace Microsoft.Azure.Commands.Synapse
9+
{
10+
[Cmdlet(VerbsCommon.Get, ResourceManager.Common.AzureRMConstants.AzureRMPrefix + SynapseConstants.SynapsePrefix + SynapseConstants.ManagedPrivateEndpoint,
11+
DefaultParameterSetName = GetByName)]
12+
[OutputType(typeof(PSManagedPrivateEndpointResource))]
13+
public class GetAzureSynapseManagedPrivateEndpoint : SynapseManagedPrivateEndpointsClientCmdletBase
14+
{
15+
private const string GetByName = "GetByName";
16+
private const string GetByObject = "GetByObject";
17+
18+
[Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByName,
19+
Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)]
20+
[ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")]
21+
[ValidateNotNullOrEmpty]
22+
public override string WorkspaceName { get; set; }
23+
24+
[Parameter(ValueFromPipeline = true, ParameterSetName = GetByObject,
25+
Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)]
26+
[ValidateNotNull]
27+
public PSSynapseWorkspace WorkspaceObject { get; set; }
28+
29+
[Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.ManagedPrivateEndpointName)]
30+
[ValidateNotNullOrEmpty]
31+
[Alias("ManagedPrivateEndpointName")]
32+
public string Name { get; set; }
33+
34+
[Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.DefaultVNetName)]
35+
[ValidateNotNullOrEmpty]
36+
[Alias("VNetName")]
37+
[PSDefaultValue(Help = SynapseConstants.DefaultVNetName, Value = SynapseConstants.DefaultVNetName)]
38+
public string VirtualNetworkName { get; set; } = SynapseConstants.DefaultVNetName;
39+
40+
public override void ExecuteCmdlet()
41+
{
42+
if (this.IsParameterBound(c => c.WorkspaceObject))
43+
{
44+
this.WorkspaceName = this.WorkspaceObject.Name;
45+
}
46+
if(this.IsParameterBound(c => this.Name))
47+
{
48+
if (!string.IsNullOrEmpty(Name))
49+
{
50+
WriteObject(new PSManagedPrivateEndpointResource(SynapseManagedPrivateEndpointsClient.GetManagedPrivateEndpoint(this.Name, this.VirtualNetworkName), this.WorkspaceName));
51+
}
52+
}
53+
else
54+
{
55+
var privateEndpoints = SynapseManagedPrivateEndpointsClient.ListManagedPrivateEndpoints(this.VirtualNetworkName)
56+
.Select(element => new PSManagedPrivateEndpointResource(element, this.WorkspaceName));
57+
WriteObject(privateEndpoints, true);
58+
}
59+
}
60+
}
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
2+
using Microsoft.Azure.Commands.Synapse.Common;
3+
using Microsoft.Azure.Commands.Synapse.Models;
4+
using Microsoft.Azure.Commands.Synapse.Properties;
5+
using Microsoft.WindowsAzure.Commands.Utilities.Common;
6+
using System;
7+
using System.Management.Automation;
8+
9+
namespace Microsoft.Azure.Commands.Synapse
10+
{
11+
[Cmdlet(VerbsCommon.New, ResourceManager.Common.AzureRMConstants.AzureRMPrefix + SynapseConstants.SynapsePrefix + SynapseConstants.ManagedPrivateEndpoint,
12+
DefaultParameterSetName = SetByName, SupportsShouldProcess = true)]
13+
[Alias("Set-" + ResourceManager.Common.AzureRMConstants.AzureRMPrefix + SynapseConstants.SynapsePrefix + SynapseConstants.ManagedPrivateEndpoint)]
14+
[OutputType(typeof(PSManagedPrivateEndpointResource))]
15+
public class NewAzureSynapseManagedPrivateEndpoint : SynapseManagedPrivateEndpointsClientCmdletBase
16+
{
17+
private const string SetByName = "SetByName";
18+
private const string SetByObject = "SetByObject";
19+
20+
[Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = SetByName,
21+
Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)]
22+
[ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")]
23+
[ValidateNotNullOrEmpty]
24+
public override string WorkspaceName { get; set; }
25+
26+
[Parameter(ValueFromPipeline = true, ParameterSetName = SetByObject,
27+
Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)]
28+
[ValidateNotNull]
29+
public PSSynapseWorkspace WorkspaceObject { get; set; }
30+
31+
[Parameter(ValueFromPipelineByPropertyName = false, Mandatory = true, HelpMessage = HelpMessages.ManagedPrivateEndpointName)]
32+
[ValidateNotNullOrEmpty]
33+
[Alias("ManagedPrivateEndpointName")]
34+
public string Name { get; set; }
35+
36+
[Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.DefaultVNetName)]
37+
[ValidateNotNullOrEmpty]
38+
[Alias("VNetName")]
39+
[PSDefaultValue(Help = SynapseConstants.DefaultVNetName, Value = SynapseConstants.DefaultVNetName)]
40+
public string VirtualNetworkName { get; set; } = SynapseConstants.DefaultVNetName;
41+
42+
[Parameter(ValueFromPipelineByPropertyName = false, Mandatory = true, HelpMessage = HelpMessages.JsonFilePath)]
43+
[ValidateNotNullOrEmpty]
44+
[Alias("File")]
45+
public string DefinitionFile { get; set; }
46+
47+
[Parameter(Mandatory = false, HelpMessage = HelpMessages.AsJob)]
48+
public SwitchParameter AsJob { get; set; }
49+
50+
public override void ExecuteCmdlet()
51+
{
52+
if (this.IsParameterBound(c => c.WorkspaceObject))
53+
{
54+
this.WorkspaceName = this.WorkspaceObject.Name;
55+
}
56+
57+
if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.SettingSynapseManagedPrivateEndPoint, this.Name, this.WorkspaceName)))
58+
{
59+
string rawJsonContent = SynapseManagedPrivateEndpointsClient.ReadJsonFileContent(this.TryResolvePath(DefinitionFile));
60+
WriteObject(new PSManagedPrivateEndpointResource(SynapseManagedPrivateEndpointsClient.CreateManagedPrivateEndpoint(this.Name, rawJsonContent, this.VirtualNetworkName), this.WorkspaceName));
61+
}
62+
}
63+
}
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
2+
using Microsoft.Azure.Commands.Synapse.Common;
3+
using Microsoft.Azure.Commands.Synapse.Models;
4+
using Microsoft.Azure.Commands.Synapse.Properties;
5+
using Microsoft.WindowsAzure.Commands.Utilities.Common;
6+
using System.Management.Automation;
7+
8+
namespace Microsoft.Azure.Commands.Synapse
9+
{
10+
[Cmdlet(VerbsCommon.Remove, ResourceManager.Common.AzureRMConstants.AzureRMPrefix + SynapseConstants.SynapsePrefix + SynapseConstants.ManagedPrivateEndpoint,
11+
DefaultParameterSetName = RemoveByName, SupportsShouldProcess = true)]
12+
[OutputType(typeof(bool))]
13+
public class RemoveAzureSynapseManagedPrivateEndpoint : SynapseManagedPrivateEndpointsClientCmdletBase
14+
{
15+
private const string RemoveByName = "RemoveByName";
16+
private const string RemoveByObject = "RemoveByObject";
17+
private const string RemoveByInputObject = "RemoveByInputObject";
18+
19+
[Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByName,
20+
Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)]
21+
[ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")]
22+
[ValidateNotNullOrEmpty]
23+
public override string WorkspaceName { get; set; }
24+
25+
[Parameter(ValueFromPipeline = true, ParameterSetName = RemoveByObject,
26+
Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)]
27+
[ValidateNotNull]
28+
public PSSynapseWorkspace WorkspaceObject { get; set; }
29+
30+
[Parameter(ValueFromPipeline = true, ParameterSetName = RemoveByInputObject,
31+
Mandatory = true, HelpMessage = HelpMessages.ManagedPrivateEndpointObject)]
32+
[ValidateNotNull]
33+
public PSManagedPrivateEndpointResource InputObject { get; set; }
34+
35+
[Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByName,
36+
Mandatory = true, HelpMessage = HelpMessages.ManagedPrivateEndpointName)]
37+
[Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByObject,
38+
Mandatory = true, HelpMessage = HelpMessages.ManagedPrivateEndpointName)]
39+
[ValidateNotNullOrEmpty]
40+
[Alias("ManagedPrivateEndpointName")]
41+
public string Name { get; set; }
42+
43+
[Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.DefaultVNetName)]
44+
[ValidateNotNullOrEmpty]
45+
[Alias("VNetName")]
46+
[PSDefaultValue(Help = SynapseConstants.DefaultVNetName, Value = SynapseConstants.DefaultVNetName)]
47+
public string VirtualNetworkName { get; set; } = SynapseConstants.DefaultVNetName;
48+
49+
[Parameter(Mandatory = false, HelpMessage = HelpMessages.PassThru)]
50+
public SwitchParameter PassThru { get; set; }
51+
52+
[Parameter(Mandatory = false, HelpMessage = HelpMessages.AsJob)]
53+
public SwitchParameter AsJob { get; set; }
54+
55+
[Parameter(Mandatory = false, HelpMessage = HelpMessages.Force)]
56+
public SwitchParameter Force { get; set; }
57+
58+
public override void ExecuteCmdlet()
59+
{
60+
if (this.IsParameterBound(c => c.WorkspaceObject))
61+
{
62+
this.WorkspaceName = this.WorkspaceObject.Name;
63+
}
64+
65+
if (this.IsParameterBound(c => c.InputObject))
66+
{
67+
this.WorkspaceName = this.InputObject.WorkspaceName;
68+
this.Name = this.InputObject.Name;
69+
}
70+
71+
ConfirmAction(
72+
Force.IsPresent,
73+
string.Format(Resources.RemoveSynapseManagedPrivateEndpoint, this.Name),
74+
string.Format(Resources.RemovingSynapseManagedPrivateEndpoint, this.Name, this.WorkspaceName),
75+
Name,
76+
() =>
77+
{
78+
SynapseManagedPrivateEndpointsClient.DeleteManagedPrivateEndpoint(this.Name,this.VirtualNetworkName);
79+
if (PassThru)
80+
{
81+
WriteObject(true);
82+
}
83+
});
84+
}
85+
}
86+
}

src/Synapse/Synapse/Common/HelpMessages.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,5 +440,11 @@ SELECT on dbo.myTable by public
440440
public const string AutoPauseTimer = "The period of inactivity in minutes before automatically pausing the sql pool.";
441441

442442
public const string AutoResume = "Indicates whether the sql pool can automatically resume when connection attempts are made.";
443+
444+
public const string ManagedPrivateEndpointName = "The Synapse Managed Private Endpoint Name.";
445+
446+
public const string ManagedPrivateEndpointObject = "The Synapse Managed Private Endpoint Object.";
447+
448+
public const string DefaultVNetName = "Managed Virtual Network Name is 'default'.";
443449
}
444450
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Azure.Analytics.Synapse.ManagedPrivateEndpoints.Models;
2+
3+
namespace Microsoft.Azure.Commands.Synapse.Models
4+
{
5+
public class PSManagedPrivateEndpointConnectionState
6+
{
7+
public PSManagedPrivateEndpointConnectionState(ManagedPrivateEndpointConnectionState state)
8+
{
9+
this.Status = state?.Status;
10+
this.Description = state?.Description;
11+
this.ActionsRequired = state?.ActionsRequired;
12+
}
13+
14+
public string Status { get; }
15+
16+
public string Description { get; set; }
17+
18+
public string ActionsRequired { get; set; }
19+
}
20+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Azure.Analytics.Synapse.ManagedPrivateEndpoints.Models;
2+
3+
namespace Microsoft.Azure.Commands.Synapse.Models
4+
{
5+
public class PSManagedPrivateEndpointProperties
6+
{
7+
public PSManagedPrivateEndpointProperties(ManagedPrivateEndpointProperties properties)
8+
{
9+
this.PrivateLinkResourceId = properties?.PrivateLinkResourceId;
10+
this.GroupId = properties?.GroupId;
11+
this.ProvisioningState = properties?.ProvisioningState;
12+
this.IsReserved = properties?.IsReserved;
13+
this.ConnectionState = properties?.ConnectionState != null? new PSManagedPrivateEndpointConnectionState(properties?.ConnectionState) : null;
14+
}
15+
16+
public string PrivateLinkResourceId { get; set; }
17+
18+
public string GroupId { get; set; }
19+
20+
public string ProvisioningState { get; }
21+
22+
public PSManagedPrivateEndpointConnectionState ConnectionState { get; set; }
23+
24+
public bool? IsReserved { get; }
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Azure.Analytics.Synapse.ManagedPrivateEndpoints.Models;
2+
3+
namespace Microsoft.Azure.Commands.Synapse.Models
4+
{
5+
public class PSManagedPrivateEndpointResource
6+
{
7+
public PSManagedPrivateEndpointResource(ManagedPrivateEndpoint managedPrivateEndpoint, string workspaceName)
8+
{
9+
this.WorkspaceName = workspaceName;
10+
this.Id = managedPrivateEndpoint?.Id;
11+
this.Name = managedPrivateEndpoint?.Name;
12+
this.Type = managedPrivateEndpoint?.Type;
13+
this.Properties = managedPrivateEndpoint?.Properties != null? new PSManagedPrivateEndpointProperties(managedPrivateEndpoint.Properties) : null;
14+
}
15+
16+
public string WorkspaceName { get; set; }
17+
18+
public string Id { get; set; }
19+
20+
public string Name { get; set; }
21+
22+
public string Type { get; set; }
23+
24+
public PSManagedPrivateEndpointProperties Properties { get; set; }
25+
}
26+
}

src/Synapse/Synapse/Models/SynapseConstants.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ public static class SynapseConstants
167167

168168
public const string DisableMaxServiceObjectiveName = "remove";
169169

170+
public const string ManagedPrivateEndpoint = nameof(ManagedPrivateEndpoint);
171+
172+
public const string DefaultVNetName = "default";
173+
170174
public static Dictionary<string, ComputeNodeSize> ComputeNodeSizes = new Dictionary<string, ComputeNodeSize>
171175
{
172176
{

0 commit comments

Comments
 (0)