From 062146a175833deabe0098e055c7d6ff15bee740 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Wed, 10 Feb 2021 10:01:31 +0800 Subject: [PATCH 01/33] fixing compliationerror --- .../NewAzureSynapseRoleAssignment.cs | 34 ++++++++++++------ src/Synapse/Synapse/Common/HelpMessages.cs | 2 ++ .../Synapse/Models/PSRoleAssignmentDetails.cs | 4 +-- src/Synapse/Synapse/Models/PSSynapseRole.cs | 6 ++-- .../Models/SynapseAnalyticsRoleClient.cs | 32 +++++++++-------- ...AccessControl.1.0.0-betazesluotest.1.nupkg | Bin 0 -> 62676 bytes ...ntrol.1.0.0-betazesluotest.1.symbols.nupkg | Bin 0 -> 106795 bytes 7 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.nupkg create mode 100644 tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.symbols.nupkg diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index b24ee2508d5c..a6d123d68739 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -20,8 +20,8 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string NewByWorkspaceNameAndIdParameterSet = "NewByWorkspaceNameAndIdParameterSet"; private const string NewByWorkspaceObjectAndNameParameterSet = "NewByWorkspaceObjectAndNameParameterSet"; private const string NewByWorkspaceObjectAndIdParameterSet = "NewByWorkspaceObjectAndIdParameterSet"; - private const string NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet = "NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet"; - private const string NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet = "NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet"; + private const string NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet = "NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet"; + private const string NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet = "NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet"; private const string NewByWorkspaceNameAndServicePrincipalNameParameterSet = "NewByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string NewByWorkspaceObjectAndServicePrincipalNameParameterSet = "NewByWorkspaceObjectAndServicePrincipalNameParameterSet"; @@ -29,7 +29,7 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -41,7 +41,7 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] - [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, + [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] @@ -63,13 +63,20 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, + Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, + Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] + [ValidateNotNullOrEmpty] + public string RoleAssignmentId { get; set; } + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, @@ -89,14 +96,21 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndIdParameterSet, + Mandatory = true, HelpMessage = HelpMessages.Scope)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndIdParameterSet, + Mandatory = true, HelpMessage = HelpMessages.Scope)] + [ValidateNotNullOrEmpty] + public string Scope { get; set; } + [Parameter(Mandatory = false, HelpMessage = HelpMessages.AsJob)] public SwitchParameter AsJob { get; set; } @@ -122,9 +136,9 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } - if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) + if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleAssignmentId, this.ObjectId))) { - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(this.RoleDefinitionId, this.ObjectId)); + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(this.RoleAssignmentId, this.RoleDefinitionId, this.ObjectId, this.Scope)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index caaff29e4356..fa2ddef8340c 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -267,6 +267,8 @@ SELECT on dbo.myTable by public public const string PrincipalId = "The Azure AD ObjectId of the User, Group or Service Principal."; + public const string Scope = "The Scope of the user."; + public const string SignInName = "The email address or the user principal name of the user."; public const string ServicePrincipalName = "The ServicePrincipalName of the service principal."; diff --git a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs index fb8dba3a2560..fa515081894f 100644 --- a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs +++ b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs @@ -11,8 +11,8 @@ public class PSRoleAssignmentDetails public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) { this.RoleAssignmentId = roleAssignmentDetails.Id; - this.RoleDefinitionId = roleAssignmentDetails.RoleId; - this.ObjectId = roleAssignmentDetails.PrincipalId; + this.RoleDefinitionId = roleAssignmentDetails.RoleDefinitionId.ToString(); + this.ObjectId = roleAssignmentDetails.PrincipalId.ToString(); } public string RoleAssignmentId { get; set; } diff --git a/src/Synapse/Synapse/Models/PSSynapseRole.cs b/src/Synapse/Synapse/Models/PSSynapseRole.cs index 75c87ca58eb6..cf9a523374c0 100644 --- a/src/Synapse/Synapse/Models/PSSynapseRole.cs +++ b/src/Synapse/Synapse/Models/PSSynapseRole.cs @@ -7,9 +7,9 @@ namespace Microsoft.Azure.Commands.Synapse.Models { public class PSSynapseRole { - public PSSynapseRole(SynapseRole synapseRole) + public PSSynapseRole(SynapseRoleDefinition synapseRole) { - this.Id = synapseRole.Id; + this.Id = synapseRole.Id.ToString(); this.Name = synapseRole.Name; this.IsBuiltIn = synapseRole.IsBuiltIn; } @@ -18,6 +18,6 @@ public PSSynapseRole(SynapseRole synapseRole) public string Name { get; set; } - public bool IsBuiltIn { get; set; } + public bool? IsBuiltIn { get; set; } } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index 32c954bbf30e..44db3b9c3b89 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -17,7 +17,8 @@ namespace Microsoft.Azure.Commands.Synapse.Models { public class SynapseAnalyticsRoleClient { - private readonly AccessControlClient _accessControlClient; + private readonly RoleAssignmentsClient _roleAssignmentsClient; + private readonly RoleDefinitionsClient _roleDefinitionsClient; private readonly ActiveDirectoryClient _activeDirectoryClient; public SynapseAnalyticsRoleClient(string workspaceName, IAzureContext context) @@ -29,45 +30,46 @@ public SynapseAnalyticsRoleClient(string workspaceName, IAzureContext context) string suffix = context.Environment.GetEndpoint(AzureEnvironment.ExtendedEndpoint.AzureSynapseAnalyticsEndpointSuffix); Uri uri = new Uri("https://" + workspaceName + "." + suffix); - _accessControlClient = new AccessControlClient(uri, new AzureSessionCredential(context)); + _roleAssignmentsClient = new RoleAssignmentsClient(uri, new AzureSessionCredential(context)); + _roleDefinitionsClient = new RoleDefinitionsClient(uri, new AzureSessionCredential(context)); _activeDirectoryClient = new ActiveDirectoryClient(context); } public IReadOnlyList ListRoleAssignments(string roleDefinitionId = null, string objectId = null, string continuationToken = null) { - return _accessControlClient.GetRoleAssignments(roleDefinitionId, objectId, continuationToken).Value; + return (IReadOnlyList)_roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, continuationToken).Value; } public RoleAssignmentDetails GetRoleAssignmentById(string roleAssignmentId) { - return _accessControlClient.GetRoleAssignmentById(roleAssignmentId); + return _roleAssignmentsClient.GetRoleAssignmentById(roleAssignmentId); } - public RoleAssignmentDetails CreateRoleAssignment(string roleDefinitionId, string objectId) + public RoleAssignmentDetails CreateRoleAssignment(string roleAssignmentId, string RoleDefinitionId, string objectId, string scope) { - RoleAssignmentOptions roleAssignmentOptions = new RoleAssignmentOptions(roleDefinitionId, objectId); - return _accessControlClient.CreateRoleAssignment(roleAssignmentOptions).Value; + //RoleAssignmentOptions roleAssignmentOptions = new RoleAssignmentOptions(roleAssignmentId, objectId); + return _roleAssignmentsClient.CreateRoleAssignment(roleAssignmentId, new Guid(RoleDefinitionId), new Guid(objectId), scope); } public void DeleteRoleAssignmentById(string roleAssignmentId) { - _accessControlClient.DeleteRoleAssignmentById(roleAssignmentId); + _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId) { string roleAssignmentId = roleDefinitionId + "-" + objectId; - _accessControlClient.DeleteRoleAssignmentById(roleAssignmentId); + _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } - public Pageable GetRoleDefinitions() + public IReadOnlyList GetRoleDefinitions() { - return _accessControlClient.GetRoleDefinitions(); + return (IReadOnlyList)_roleDefinitionsClient.ListRoleDefinitions(); } - public SynapseRole GetRoleDefinitionById(string roleId) + public SynapseRoleDefinition GetRoleDefinitionById(string roleId) { - return _accessControlClient.GetRoleDefinitionById(roleId).Value; + return _roleDefinitionsClient.GetRoleDefinitionById(roleId).Value; } public string GetObjectIdFromSignInName(string signInName) @@ -106,12 +108,12 @@ public string GetRoleDefinitionIdFromRoleDefinitionName(string roleDefinitionNam { return null; } - var roleDefinition = _accessControlClient.GetRoleDefinitions().SingleOrDefault(element => element.Name == roleDefinitionName); + var roleDefinition = _roleDefinitionsClient.ListRoleDefinitions().Value.SingleOrDefault(element => element.Name == roleDefinitionName); if (roleDefinition == null) { throw new InvalidOperationException(String.Format(Resources.RoleDefinitionNameDoesNotExist, roleDefinitionName)); } - return roleDefinition.Id; + return roleDefinition.Id.ToString(); } } } diff --git a/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.nupkg b/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..132158e00a9a5c0dad5209c5f086f2b531f88ed5 GIT binary patch literal 62676 zcma%BQ;;S+lx^F#ZQHi(?yo&PZDZQDZQHhO+s3qwoqylg=S+WuX~$}KE*xGf~!PYqo9X}QHV z2Uv*AsnL9Ko8+HjImYEn^CJtzLwJl+aW{fn2CfK(ZSatFvRQsj&c;-Tr)QV};GAY%M{WmRn#k%7Xy1!*0{I)2hW}bv3qAMJ=hW7v{T?qcQG?D$#U8 zQY$EJkr}&>_UkX32w%F*=dY0NC!J`P&Oqx6iOQZO`RU-5WvH%HC9tMKnADhQ)#+dJ zuIjWMB{YoqsaGd)Xvt~(awg!*2T%*3^1jpY>Uc_^d)(KkkT98EiG+1Z(gY+ z0^BTKun%P5)xdnWG4kB9z7xiJ>pv9S2C_3vv93XMj7q&RmXpqDx8r{D5}SMeR-$%> zkd-Q-co#>8<$od}r7!1zo)W0)ox|^&qBF8u1%$TUoO_@S^~_$JQ=4a+la#=FIL(4& zE7S254dt8!r)bGi(s7T$weIduiX~zN?GKHi^H@x>Jqn=xT(W>c?f^H z_Z2+fkDa`5wm$4!)hLxg7RW~;;HQ}ky$6b2;%xDEOB-Edz8r-!p!H;N2IDYX-TZLt7gtw zg`ZFqt)*at!}jtj_b1xrJf2^+JzJ<4XCW(F5AM>(*q0K); z$jQtxgVLK%CIQ-l(!zV{;m$HED_S9eEYus$+nocOyq2QRDyrzuCb6g5>DlSq)%8Eq9fMYGCz(iD6rTbpasdYJXvzx-AVQH>+@B@zMVGWjc`g|FXz z+x|q<{9>+3{^;Gx?iDux`M<>&Cp)bXX~!y#<7l4FGFFkTm}@wUfetR5u*!N-G^H(G zhg|K<5hE%g)B+lgQD^(y+H)ifEbW+#I~X%+7~m%d&fQK`L0*R|s&cj`k(*rO0o=?H zu=a#=kQMQ0s$IWLmvHTUt#T5K^)hj5Xpk#?RHexcnzsLh2|()jigs1|_$AO8p^ixs zrVazYkf%3YzCvv!wKQK(#MXXGe^Fom-s1Ax{GIdl@3#2Asz+23SLuiL^r{{BC-((l zAijT{jg<+bt(mivv$3tIv7;#q0~6!_&j_YAHcQ=*X=>stOnNUnH=7P3if1`MQ*cvo zZXI4IqF8ZNSWq%3z`}7vc}B9FL>p|dC~|&85x@@2r&X67BkTN9J|7We zMH3}P`QFa11Tkb?C8qgq6s67Utx>vBek_ULzEMc4QWHlC_`9PyGz1zKo;^#F{oMsb zc;kngGNs=GHgK#c-4mzTEQ-vEn^1ma<8HA5BpkYD)#vi*UlYPXcFG_JWTLbnXU4w^ zZ0GL9GMcXkzE}d&>i*;EeH;7!UEFJ1F)s<_y95_|s1$9pMG>Tey23Ci z6kKx#gk9SVsa!fAqGsra@>K^$43nvb9NGZPT4YOwT+n3zJL-5Zri75V8u2Dkzx14~xT$1KPW5|Vg_T$c+%*y06K@!WpHjGe!;WUPIe$t-8L zTqKUB3d(%>Y`SKZ+!mnwvs<;=oxdeBw=r;RE~4OH*{7d}=^n*bCUCR>Z^`AEPkZ!y zo5>6IIG;&y|N1(O8t{nJCjso3D7Y^C0V~w`@k6=cq>tO7MP1WkkI7oB#G<}u*0PmA zPo&cTJ|x@1M_g+#q@#BS#9 zP2@OYU%Yy3AF3jrr7en_Mm0=cR+P9$-%8I;CiP|i$q0kp|gv3J)8nF_9gBD)yP z1yN)JmbyGnofI4(5Pp3KcnEiQAM^?i9z70|*c2Y9#e&ciXaG^yI&%Tu2n;3YmyoGc z^TBfQHgTb0EarK*a2jzMSg(CV3eHsdTwRhMrNNOj+<97tpF@`5nY@~_)W+q@h>IPF zPL(ew7asUfaRf67A8sY4NpYax5Yr6*#0a1u6a%z^SR zPr8t8VE3300MT2bJac|Vv9)T3 z)07*4kHWr#Bi$)C&w2z5)=&c!v|sC#nrSK`zNZAl$LN{3VyiSG`PY*Unc=(|07YmT z(n@1_)QFHQ|2@wjJn*J!4E&uI*af`DvyOVGKsE7Lsj9=65-W=t{6JNy^yg7m{ZOk& z&;zarhlwt%Jt6WI-JG2#3{xjn*2OF@zN5`<$ubI&o&^j}ey}S1oC}%@ftC@;8b^7V z?L>A;h`@s96gzD<%TRjJfn0I;J+C#|j3iCdNi0c845C9b^LSaQ%ycKy~he+j578ymV88=zCs;NdP+Rw=>P+)ytr7Qk727Y z_-TmGy>j_+$lGQ(9uF~(v5(45yqeL0gE8WHub{an9k^fd@n-yWXzNb$y0L|?U3xEVla5`EbeYVsErBh5;)uD zc3}VyYw`#S7PxRrE67`9d`HWc3hFH|--xQtO1L&vlwmhXga-EA+>UP)6#OHta1EK5 zpSJ)VSP(QPLU^h;)GU=NT?^u(gbd|YM|tz$L2Zcz0gah^bd(RyqxbqWmp@!pY1E9i zvrY%2aMNfPSE^*bZ2X8zz_VaNfs1xrD~kM49sZ2Mg+AUiQ+e3fh;ffXbWTgP%snl! zu-+_1rOYfv`D`Lf#@NA}JD3)0+7E$>g80yx&e0o@qn|Mp%gRp^xqnZ+!(7o3nohSJ zq_OULcD6;IKCz!@HCtOcpZ1Qo$Tk^F12D)13RqE!%F&knO_;*_X*6>={>f^gl0oT& z(VqCYewMee;x@*@m}>TI zkkXtud0>P3vBXBBD!UzZhNk!@-c0jq?*U`{ zv^rsSv*^k;^>e5HlO-d5@^i;zvIg%8zAF+6&T{uj35HVNpcY_ol z+k?uF)p+VaenWC$Yh9E0okBg!?XLa0NWb5c)F~1xih{?^hpZB%*Y8bBB`wRlIMtBQX`FrK@51n=*}`U+*S?ourlAMlVY2a zZXg^|K}v*&*GKNFKs$XD*U&s*R*_9Xi($TUD$9KL({O6#p=j@+=1@o?zm(-nv5M`i zZ>4sUs!Hr#@YT!@+-mf#$%}2G`ws>7)P=cMUKCbr9umD7K?kW8h3G{Uf!-1PDehr1 zo@nh>Caf%}KV{Bie~Y%LM{1^`Is7&sSq?1{i&$oRmLR7W4i%GgICe5A0*3$@vu+Ao zjWHUN^}T*qydsw6uq`bD=pC$??zE?UXm>vOl2lGwTmN~7{k=2D%X^QqrXE`GpJHhRBH$w(o#H7 zw*ldk^zvmq(^%b{p6m#V2wW>F%qoT2!g}PX%};YabV13ugMhguOo-iX7#)#{whntv zpzfd zr>4b3>z1)KK|dUk=?gBMKxzj>M*b@?)Jd-|bp6Sf?D(-BPOyItgIa-HenN0sVZw>b zCq#P9Jii+T>oru1pZ&?Bx#|UHrHkMiL&0aKf2c<&^L+v2CwNa2Uk)yn%Ou^7=}!@B zPGKKOPdvuFKK%g~(X%ea^R5lfkFbf?sJ~k8?t4 ztXOb0y{2;lJ7%9HR@F;#`B#Gl4A?@NRAKXB%~5EV5V6fro5UW*;eG?4Eu&S_5*BHt zVu&ey<(+$))*cHf*bEmm#q!f3Rsq#DObJd<+?}J33w@dhXb%FbhGu>Y0;`H^z|Sz*qBJwuNIiFie6PZSSw+cDj@IsH`VwmMviUr(I9ZBV8$n_mOq+m9nl&_ z$P-xbJ25GoLpjt&s8S!2TD^7?--sxbx;LHY5!GW%3y7*XaB)b}QR~`QYF?V7cHCNl zi*FU*8-J1IxCCZVs)%O;_>TKq88SQwjrly_{A!A zToGxCzy54mLt^L@xsCU3{XCm@sNh zH0v!igE`GNEq#~V$d%GsS+cGTP~#4+o>5*Ll9*@IeraT?5-V5o#1O+^;~0r*q_v6q zPy@ud$AaMh3QS6@z%F4F$%UrtCPgpnKl@;TRLrhW9?GjCi(lTJrW=Ss(UMw#VEkds0PS(u0>jpxxEUQ6q||D&hN5A)z&P6N8h2uou)UeG&E!P%hb zs43#AX+p=NV(2g_6k2s4^^VMOeu!7p8+EFXmEes>O6IwCx(Du5o)NoxiG$mekajRu z+Mkm^*6q@460f@e-F}CyBTlLf_iQ{&Z#E|#Gm1m8cSx1lrWIWgEXq(qj4L`AEU&7j zaKG)kU7WqlzoM5re6H>w8xKQoT_8%pl!~rZnQ48@22Ww4VWyBdq@7(=Rn<7LfKz3q zVpfN(M>t2)5Vux^)RfFK?FWw5P2t1#teW#k2G>PnOVb$zz%x06f3%l%G{1F#=#9WF z%o2u8r-#RQv4So2eJ#!PjmfF4&WhR=H-UMhO52wk9C8sFE<~isq;C#bRTh?7QoOrY65&YhuXAWcfDC2?E6}g#D^7)^0__c0TE}x1(5!*QtU&_}h56HndvHt`Ez!eFU;Fho?Mo}QiJH#nNwx6$bAY49#(1Vk*Im*tgG4UGq%q<% zUpJCEeNcIXWQ&RQktkz$cfl(TS0QZt4k&_{x;Snt*Ne$i8V$e{`K+7o0#X_gFQ_SS zFg7S<<~cwI*$MYc<$)%sG-j;AV`)M^ludize~#S{~QURgO+P(cRIFkcJc-hNS?xj<M18!V!bXmgDY>ms!aw9T_9wJNGh(4K}kqA8GwdM3U z*t^@ZwH9tIH!Gt{V<=WIn@sX@Pd{F|G*w6pB>m6c2hMPb74Z^mZV)MdtRBEXHO-5~ zMzr9VGh78sPj-#DWZ5-{JL)sIxIwc&s4`sAfBjW9@G=aft~1yhXnx_OT4JeHJ)5{H zspEQ}`Io!H&xQ<DV94$Cn}KiUP)tE1o>>r7V}{ zkJP+nbVGo9!}haC_M~U#kE;rLW&n!J7nywHZyFOoijMi@myp6YPuGqw=V2O4&^ioQrJyY*Y|RU<%}1mZ=?=Lv z)w}6dh3U|vv26xWAH&2hivbCmGO_et$?tSpPQg(8HZ~$&@Q?uZ4!2)1wInMC^WErA zye7nk;-uZPYsgL?G!X3W-SOkXwWX_qk9C|b1iWxX(6eqLod|cr(4Z+LE`q(6iRCnO z+e+PRH~}~px_kt7;x>|WyPC{_JGgE`dUc>3fi!zn-8qqOL}o~%9!8Q+hB-`NBjy!Y z*VQ|Cs;TlXm!x`*&A6p+uQ8#%08cI*5U0GO!;W@F^5eCoalJ;R3#Ul_*{S2Qi2RW^ zI_0Uz%1L;97yE*&bQyG;W4IGfP0@RPAp`N22}#PTZf~w-5MF*R#p03V4j|mwc<&KN z&_j_Zu8Ekwaul0CRG!wjC2M95xHgVW{hVgF-m)$IZl<{2x-I?PTM*drvB1M*L%(mq zbm$jRF^P?>$beVE7$^h_#*1Xfi03YgZ#@r8Et5~j!mc%1hRhx#mMC4v7}7sBhmJ8` zi@^!P^|{0EUe1WAYdT9PTIPj0Qbnz}8-7{f=>Y6qI!5fzl?)rEoF^;<(~$x;()m1l?iU){DuXA?5(H>mTLN$*52udtK%K8 zPMZFRIkd^3&Cb{K*Uc?Qd}wVf@S2f@1mCQjQr~-Gha2bbymN^k9Ps1SKf<|(_2H5u zgaq%b@KUqTlQPpiHXF#skB&>h!G2YzsvPP3n{S-wLMu*yXtVzo42+2kMaeg@UnV*O zbh}xAj#yO@POB_JLx(u1p|18cM-@npIQ>Bb;}c#<9YlP{{&}FFH_6B&izRW*qBxe> z7Gvlge)%>$JA zH`4WBw$EexS7!qr!+gCdg|QCH<%rT_ARQ%JjL!_$By_Z!*d7+qlVnsjQ8rF+3*p7_ zt>|A_!AJi`(VwJ0XQJn!I{?8UOZO}$3gSt`{)x(*w%D#Q_fSHf`S=26vnDfngD|G` zC#IELsvoXNSnbQLx@W9~loTb}&|~4{WIu^K$v5x7>&lziXLT^wo0yv)a5u8irp0L= zv6j3cP`0{)RY+yGx)W$gdjgSHKKX9?7^6igi z?VsSs_t8m{zD0UH$&POd6USbv3_tA0_jc5&wb~4Ne##S$!ej0d6UBJW2#2s)fk7(1 z!BU#?-3FOmuxRFdkr?+3UGw3LCxnzJONig_*n{p;?lU?am-&>v&8$Xz-4wokQgpQ( zC-bPYhq5)17~B`Kk4LlS7-_G@M95or+(f&Wd;D8`$xh^?28~3rkIdAb`ZC$S_~4N5 zrqw{q5_H^G%E8_ENMH#87&qoN*!+VPs)hO+7%FZ49<1(Q-5cS$&_1Y)-vV}ix+&%rgp9sZzXV(ObG)1tR6TVtJ zVk(x6X$7TqtrA=A8=Ha%*HO6EsQ|LC<1Juxuv^7`pl5ZT8Lzw@XZA!KVlR3yqsjGO zr>`iCB#4pSC3fd0vftR^4++c5X9l1vWM6DtVV)$3pal336EBP0!17x&nY#8V8`b+o z`tpBZ*C(ywF;;SM-^-jskmca2#(ve5E&CyI6mU#%n4 zazkXwdPi)Fo+6VOwUF=D!DTlZ6saASH;Edkj=hUfyFIKe)E4_0ioe6b^rfFmPL(?w zW6yx#P|-0S+Q!9yw#MeiOjSa$qcZ1<#di>JM!L>KS*SYF@3Xe%l+Hc}PDL24|7xyr z_chRh9qMo|QwMiRQ%_)2ZO2CTA!ymy_WF7bCt=W6^p-?#G>n7=kZfLiYI}rJGwU*h zcMsjiD{y1kscg~Wg?3&h!Iy}|T#1LbTJ{~q-E3mrS$66rkzIO1MxTSTQQ#q3g}X5i zX44w;PN|!AmELl2`CFR;xao^i=4>yM!(Zabb`BTp{{&qM<|nH*I+2v$^}Hob|9 z-l430!bsYI2kLm(XkbJeNfKD|8+k2J?4O~3@gs&7qUpfPe502C0PScHr^f{4GWXj? z-3$pLTUm3cjO}8hBpBt)KyK!YNLI#@4jApq#X=gpoQgU#EgrAIEEdt(CYFmj?U9+Y?w&KcW3``bMxi*{Mk3gD=GItYBjatj62+^Wnpf5ouGc1Fsomp}cw&E<9XT zT=STNU+XJOglN?2;gjAqC!ikjmx95tdx9$oM9mmiICB@6oB@RFZy|o-E`u$SUO@Iu zloR^-3r1u2IV`3DcMuV<_W8w(!ZFd5=74aV)|c*qL@{is5}A5iL}NSiWZ5&F<55cs z07qF6@~|5M^E zj2Q+W)vDZUlD}Otyj>dKYyQ619Axw?(O}t##y(Dns+pn^89|(~|Hu%fcdx^UT@H}Inm!we68kMthsed1 z89UVTDwTCR377VGip%k}t!wjsm-#uE_DvZ7Z7%K0DD4|r)Z4nGPB<=!`p|zS0si10 zH&5|qpAVmRo$k%otms3Afmb&jd|@Nt`PlO2*CUG8@BJC&{g~%IFK*NxAmoq>msqt9#~*?D()<;(-n8?zB!j8QBRN;d24|X?}LGW5!w~Gq z0vhrO)3~l5WqYnBqD75|zD*i;Y+k_Dlm8Jc_X#FmI|I;evk;aa{Xhy3!m+6>7PKu^ zsg_G8_|&+AAo#_|nvZv90tg*HP-#njmpzCgoO{BqsJQV4`!m_3lLJ>svzX-}ErkWtb5@fdn4>24AgbS2IO5rA#v zTraY^Q`WtcSE3x7W#emMY}Xi~)Xw*pkZ}St{oy-Lt9xFLbV2&Bq+7`g4$rb(<#sLa zat)>31p9JLpd{N2%*@w#3uF!R7dD}j`c;;u2J z{llK()zmFi8OX82db1@o8{O14jwX`e(e13gI0%&_CL zL^kW`7jDpOLuh+}bFmd7b9~2E3uITUrQ_+d{nt+lf854=WAm>e^IeYN{K;aK)KVFJ zhQtm%2K442^kK`8{s^55yvB=z0EH(o*bOH<8i%jkd8o@nDrKJCB}px^*@mZj*WLHm z%O5Smy%-mkWzbc`nEVo+kt5pTKN`|sp9&Wi%{IR*r1;IW6r*gH>T@)BMvr)^8Syv6 zbM)ME##NFQ8}C&bLe-Y{p5{vb(Az_0^h#HKlHYkvKNW{@d56$DZ5d{*v`@h+JlK*KyGhS!8*Fx|8f7*=jz?to?hLUseQ%CC17ho8M(kZ?Yg2{RMYq( z^Jm-Lx*kuF+=DOq;BE=!7hmyW>z}QE-zN=(`d4-N0NypFg$ClaSw=9kA=oEVh&doS z5T=0Ko%7y$`dRy_(3w<@M)i#;@C9>*B#uV;j0p@5bP3J_8=6zzQ_&80GJnFj`n49PsDzYY>9uVaB?ebypZ{#(wB~;@v zkopx$5{6Ss5(6t~`vnS(vuTdvrEf^}GuAWQllFp9?GsK?(xJQ64A)~+M1gf}-*?(; zBiWsvPq+Kk=h9K$lZaGld_xA8F42qE7nRmc?baxBwmMrzry2Bi!EExcK7NmwZ|8c^ z`QG;Y!sjAS9A1vcrJp)M{a4+myV$R$Nzgga84nBIlde@Mem&YJ`|PBjWjbF4jts5u zRj$)6p6z_j(34zQJdo8ts*@3T?vpgPw-!g_kP8hNzN(Wfe<9Q8J*zl3SNacLE9Lb) zhXP|CI@{k9o6Hwv*P$5?=|feIw{QW>LzZyVIVW}*ehTN#1Z=T~j1c;9)d(1wm;<$UHB z^|!xDYT&_HA|x^;uxX}01$>GBNs2D;((MaWAPIw|5TOHgL*z2d{c zzLBL!EIYDgo2$TM8D50fkm;m}xrm-y@!=&%RPSyzDQTJw1IQ_ySYBV9|OyMqq%SxH)~xdxtE&f9=guR#c7B90^P5Xmk= zD;GB^5O&ND_Dg($UVHQn<1{_8;(LvfAKa$Py(G3c zFpjz5xJ?ASF5o|s?g8l`{5=Q*|M<>6!UP<%^Ps8lysT5#%xAAL%vg?!b@?c z1J%;SgWvWy<9O7uIWw@3`B2OyT`8RD-xUe#M3r=v5RGqi=Cf&s^ zW$6Rw5=J=|uW@a6L-@rL_!)C|C0mEYQ*AmCc z0_})GLN{Y|DRCr2O(O!a$$D#hPJqmA@>B8;x9wbi> z&TTDonQ?Tk(MG5`eHY3q-Dw?-Ln@mjY#&0lm1bMMOX=bnuYA+#H@=9X7!6#DKm>@o zcHmys`GACZH*neXO&wxKoPHEKuH^p8A{05O#|xLY&_~xED2|e22Wzl5kW7lVAEdWm zs1K0Az*QlzQ33MtNxhFBo?5_WEG>K-#F^VMhJZ@=05qsc&T2 zpZ=={+TqFF`;X}70jZTeJJLuW)YiU-q9tYw(WsHRs9l?#IAKPvn;|d#yIE)0Hf__E zAKW-~K7rc!-vlx}xg`AA!=>Kz>wM0H?qse!&9uDCTBGcf%a*H}v|IhCOLM;4>`k)8vHRuBq1siO(^{Ic=-+4&xw?wMK8$p|>r0X~tLn_4^)EW?nc=o2ul& zA0Amn;XY=~Z3_$Nov=?v11<=$&$wPf5_26fFvPI1ETuZ4Q=u>@6l8x5F5^hCAQ609 zpT=-^(KN9m0wiRQ{H=g4P-2qQusvm2{j$Nb;Ty>kho?74H6N-ZLnNNKi-&U0UrYBh zirG;*QQt@Px97#Bu{q_P?Ymn2Un8E}fBL(*PhZLN?7ab<4%6n?zHXiFYp2ETmU-HD z&V~?Oc!yzz<}HIgYf~+o^fxRvbcWjWHzc+Wm`;(MVl8d5$CknO{TO8C1Gv0yV;G_B zOhYzUCIWEGgdu5&q7`r=6OtA)HJ~`C4L&)`wmyJgo%L`{4~}Q`?b{dY0Nl$4VZ}?WuiU4-r`4IY zKU#{k8%~$ZSzmQ?-iI{)FMw+*#BCEoX9L1)_(}W#DWx;cW)8%CSd7 z3%h_r{2rcTnOrtWhn?U?3(%=yb-=pWRg>PcF97Hq58m(!-Z7A8?Z;fa{=?Dfe zd*w@3TOJmaL7fqf3fHw#@ooU3N{cOVDi3oZzX#j3{ZlXZIW62>D;N*|)rF0S`}Dn; z)~7xCw}OMZxu@F;#VP_d8_hyMM&9xm0}9lF)Sw$8X!`HkMai{7E++Bho#(p;ncxD= zp4SMn1}m)O#*{Vjva3-#O0@vV?orZZ(P5)pA!`G==F*VD<)B?hS_?;WzzR#FX%qHm zeo!#y>Ej&Y_MbLoOTZ%-7Z(xZ>pVoB&MW<~WuS~OnGppfMk02XeKF51tH2vR3}dab zEeJ@f`Jnn!%Ry2J2)C|gdkBn%2xrcNRCJwTY)88=*JGlqxTAq|$$L2retZ4t4ZVW4 zv0hQsrn&BBPTs+zi6xT?^>+8Ts>L=%?@D@ua{LM3A@SdJf7sRm(t6J0tZ8&tgCoy; z5}NqYz;cl~6ijyPD8Jb`qW(FDqT4=n=xwoPrqT1iON2@Y9sA zl>SqOw?~Q|$Oxa@)2IwDv5^3|hsZaa!OrzQ+oIU*_syDsS`9|Llo{=su1;FybsQ8q zNWQP35xXMq#;>d~d4@`#6=B?qQnO}7v6ZMq8^ZA3>*RvxaLyD^{?x`;yz}rftFEam zTk73hH$188UzA>>!DJKo3%mm(hBkk}xC|z09E@8$uAB5p9V)!>dp)xk4Wc{h&G zPD{qjtedHlyRI!~acvL}|8U*9LO!_CK47RXy8C!M(;rnK#`?f}KtM$PNm~f~zKd3P z0ny6yQmgNt+HrbnL;PtQVN{7Pt!F$TEc6GpS2MI%9af&Qp5$gcQ!cayZeS~CfjUu6n0E}xx9+5 z@$2ZYW^VfZ{!$0*)4}Zmyhh8dqJrz`AY%Ms^sS2)gut@`VSnGK)AB}L%nk+(Tv-B~ zQtY&v$M50ODzJ5JcKraOW<#e2C#a0B@c_{->>*Li+J9=N7TP5D7n+Y);?ePf@W{%l~FG1)heW3>ehIs%iox%Q&TO; z{W2PVoPK5r=I-Q5Hhm|Ud<0E7SBv#&4hpSFP+D}i3(oky#l#jr?-`ByBSzNEh|Mp@ z@{Y{ex>yLYC!;&*$kfYO73_@y8l12nrAXHLaEyP3KqoQ{JO$o{r=A3YiF-s9{3z!(v(rXVw*A!RW0#mv$@4SgH9M}XR zEpY7m`Nn|l>#!XrK?u&Lj2W^WbReVS87^q0unPcZbYVU~Zt&Msmtyl~x7D2f73(>E z##={Kwx{q*&Nu}Yl&KdurEKuKXrzX%ko2@B3KxX37W)7g^)8a#xy2gCLB(E1$-Eb~ zad(oCBz4*gViG2@$_vSg8oS~?wB|`{)|)_-fP%h1k$m40n?&(<(fx5o zI?*Clou%3>f!!T%1te-c!3EU)5}V0BJ;Mv&ChQGf7i>UX!MiJn4%3~Pfav&|@KiXw za1P%+dnxnR>IV|DQHjZ{$wc!?L$sfq57vYA##$Li3aM({RoP)VS2mV!5cs3TVo%!N zWi^NrW9(R&9^`VTo>}_?QpLKMeNKYegHER`%7)jQq8+_XgOg1;p9a+)p4V-{-~=v{}MqUr6f=|f1A`)C3i zF{%35cMY_em>)NT>??LnWxsi{P?uDFhd=vht0Fs>_|!RbhADt$4;j>F(F)23+5ANw zHfNf}Xb&*=?ZiiJIeGq-iVM97LasjzJ*eEQ{e2D)u)v>>a3k<@ylntGa~os|pYB;E zS`7X`P8&SPJkh}I61a+6Sh}7C+qQLGnyrU={ zedWuPYu;rY`=%p&b18kZt#y-pePp}c5O;1h-d!qsLz(V4s!O=Uw)6H6^9ba>n}`1& z=F5MW#Sz^z;iZ1qRo`o6&wGt!dvRrVi9%?L9%CDd?dl$xEouL(B?)X3hEVXBWChb1FxaTrs+jqrEw#7ua$@DHp!DO_Xt$PJc&?PcBfT8m=0gMKQdd zOa9$Xe)k^)OodH>OJm)gRYAMSk7YzU4*TKCtHngjq~^F-^&1yBoR*dPNhDtEh_45A@^aD^(13<3rl(g(_J9dUchQX|I0!y zzv^c>(%MoKdq#Cm%9G5dK4zs76-oXA;Qm!b8a$ znt`U~sPGy^hnM_aC%fq)xwjr~r~+Hx;vMjUVbobrmfjSTP}YvzG?I-iS>b1Kl&q^I z8-)jU9iz`ez98yGAXTH)eRb8Z;EM)fHnH)QceAT&s|jW2u40Se+&r);0L^@d}aTJ3qeTx+IXX%ROA7 zeciC8@n+N(yZv56?_M|Yej`CjRy90t+Y`bo5J79b<$E+V`O@jIM#z7>Kxw6;)aT@z9ay7x*yCqr9xt&@F}wS?XoJ*4KiL&6mH*O1{L8z?4llXq74z1O$x%xf@d z%TpqBRZktZG^7o&8@41i z3Rt46#tUFAiK0ud(rc z>7^PXbS^e97d7Axb|FOXqpf2pSgm4}y^^qiG2rU}%ezeQ$|pDC8LtcGtY0$BF7jLx z{vG&(+IxC7^lj{;);Evc@guYG^Lf=C$Dq(~MQG;@+{vZB;R|nr;#TL2D7gU6_}a+) z!D=m6vYW)MRA?|D;ll%MT+Vi3)uNm`BjMxOqRi-k^JMkGcCq+uwKR!1SC%SOsId9y zudLV_%|jo}ll^;1_WAcx=@(3)z;!DY`{LDT?hUgQM4^BJ&J&E)5^Y1Yr!-`tfc(Ez zuA?#{7)eC;78;{EL@TV8O5|q~Iec7sGi{SO@Xv=zDv4^CH%n4mTCLbp$rwUNuOov{aX?dsz+oRf&mcy33R#_s&LiBW z$x4HG?R3jo)MCM^sWux9lHtT*AZAB0P5&%FK2m#e-ehm6y$P$yu>tG-Go7Bo zBmqvNXQl+Z%Dbc~&1GR|)l3&o`N~0O3df51mrdkd;s4Nd6;M$=(H;>5L_k71lx|qM zkp^k$7Ld**mqtM8knWJ~?pSh>kX^c@8-%4}ski_4&O2w%@0*>zckbM8?$oEMaVAIq zg;RWc&okm&O{zcC3%PxvDi%}27h@TPKPvW9s#DdtX*>-5-!zsGHTLI$XrGV0 zd!K^5V=^I~{tXha@Bw;CtDxfA66k>=X0QQS7XH3l?l|PpPZ4RTP~iT}oof_#qP@#z zIX(a_%Q##3EhRgtALU#(0rRNcwj{*2f4sa*I4VBQwwcCg;T>zaxhT5JPCNcE@4frs z%#;>G(?fXjNqif!w)r8$I>@?Fl^67TacWgi8LwS_VvZNT>9vHy1DltTaAHSRG=90RtH{GlU;jdd;I0cwlekhMJq=;$pe zM0XMQ6D<4e2Q7c>4dEn%Oh&W_Igi??n1{^kY){5ZCk*G`MhgjCj1Xwrk2g#Q7Jjh3 zfdV~&?dV1vpXliXuEW8Evn_j@*JKUqBP1x z(gY5_2{)VM>^h86ZotXFy!<3nGM4gs^3wqUDNk>eixO%*W_C@ASrce|urdJrx%VLz zZ9+_Nmk6x^T;pD+D9CYKX#l%25U5#UKgT||YQ%gO)@HE%Zd*7DUHLtidpXB9u~{K0 z0qhu#aVCC8`$7{IyG|{HXM4t;W}QM zt#WY!fE2JYzIv+z+q#IXc$dmaQFSlAy-;4ltnLKVbZ-lAPHfKxiYCmZY8n0wf@)oR zs#3=lDQEGB-psyq9q9Wi6zIQ>V&-3 zZSYR-U;ca1GDf}rDNADi#qP3rZ%PA38&BtkBfJWucX$1LlymhGxE%h#A&xTr4{D6m z9pb&Hc87W+)awDx2oLWUpvOT06awH_)Cg_bg$AbZ@- zVavgV`cH}H5HE>m#e)kP`*{i0A}Gy@(tSET*v_LV-r=7o@IpC|?u`Z`DxT2x=a6rj zQ2?u%2v?U){D+e0rMHZs0h<}u!KP<)LGRG^5DiZsX}-ws1e1HizkOGfLM=+1HsQM< z>FCPk%T13z$mOHX$MZc3wWkklzwQOT6q8xhaW?drCZ$rJ8zwR!6(Lkc--1buGRii$=u%iQ4bUe6Y6b`!m( z=3YZoL)1lCWx?i6COf*8*)S!C3Q1kx6`L_G#|feG@kq6 zR>7rh0z4|WoZoiq5xDSa9DKIy7b3f4(CQU`Pxukn;9Mn%qb4|0Z~>RRm>f?*!Wm4?DZ3~RukB@1mc|B^r!1IMpmwU`~T`}>BQcRu>h z7Y)%wK9@&a1S-ZD0Ne|Zy1y~uY`I12OYJ?t9@BmKC0)BzQkS$u-5&O&L3C-3)3p`O zFN@x_HP27>H7zg$gsH>h-~W5#b@q3NKHRX0T@xnZVZ=DlT1)(NV~3yd4zUa2L# z4>2-ke=YkHw?mTlq;BYCC(XXlU}S^h3z;G$d-?)9hs_mezJagmvDfuBiic0XM;f$9 z>cy3}@vINXBtPpIy4nyr46BND;o-fCvJiX!t?TUO3z`N?iwq{AQwJ9*G_Zd=_M{K8 zX1+!zBpGP75)y#@fRRNYQNe+#FmtL-QtOd3R~8-Lx#6ydEf$a=-$0{R?~9#7 zO3lV$JtxN`)FeH5m7DHt;ur53^)4yqK4-G=h~u(^u57yUi+SJFa83_hXivl}tQT}B z&iR{}yie^V%QLS3C^xRWQ68=AF!lah6i-!UI(98g(*?S z+^xFiYe0v-MtE^R1?`iJ3Eb)TyYLiRoS`B8+E$Fup3sEDhPnlw^{$S({S}HlO%Rv% zD(d$i-}lxp4&8>}5fiU|9SbmnOGEgHBes02Z0Cl&68&}1tQwlA^R)i{)+9t8`}a@S zo(pG|6b~`(QZs%I&$S6L?cY4V_3`XzdmkuLH1W&0|EgS&U4ZC=c$&a_g>v2T&J>Wr z%u6eM?53S4me-^9!eRv~2`#ueuiesqrB8p%{iq`h36f(7`*y=KiFTPBNukuJ9!d|_ z(Qvl1z}C=tZtWCx)1nG+0+m=!)+D0t1F+LBOu|) zYCxlZUZ>!@*t_n&WmPe%&enn~koj#l&PN}rlDO%*rgC6Y)GH9z+s6$PlIB+u(ffC% z>g^Hh0x8V^}AlZms${&{L=r3CRNSiJZd zZ_zV`&jOf+jMdvYIr{h5UVQ?+wncMHZxbc3e-j<(X={@AMlLHx$pZRe$Oz=G)Ed;hR!y>j{%~|=`a0t$FOl&(GJ@_$LBcxJ0dHo}h zx7Z0?vK1453biNn(oB3d$_V z>_k^8eF~2f#A1DkMa_gu0w?gmXj*hh(cF{?A<(|J?eGyc6H~HNh=P}mJCy$b{))|? zr{6BQn^NniWb%JqlA~@%C`V07V%t$r>_PJJd-An~rSbtSXLyq_{B|yz90BxW(fJ}o7yQ0bkT!WfO^lKv(bYplX>}yaL?JJ`Rr{xekY&26*G`rw-OnEY)@KKW77nmFb(^!a@a}MHYW;5XN&Y$SP&m92- zm)vLtJE&l?F%tEZ56Q%JdEpHw;jq{Bx%nUYrOAM}Qmq8Lto0e^$0w06Lm<8soR6-_ z)RAeQtzyIYMWq~yi2_VsAGzip!Ypkx=!C|>G};o?iAiqt-s9(O(ywpG!%afy|IUEH zUy@NVf-90829uKKsEjv>fQ4bXbo;pV(fM$!4m{)q6#{*y)=?nEhm`z6RM7Bh(xwYq zG1d};>1PVcCG3)@*SzHfJ0%$ZICL%bW zWH4OzYQ$B)^wVAEZTi%8TSBTHgSJZY@w+^c{F}i&v_G`e62xW%9xsanIC^OJ9Zy5G z2IDs=gurQB&eUQ(14rx4r)bR#3}sCCRW7YOi)P44 zKF=^4P@!k!)5~Hic`LOP7%Hn(?v$(s+ktuH)R>gA{DCTrE!jo9>c{)9Z=2-o7=Ei4 zJLTjh513(qt=k& zghhB+he6=xmLgfWfMBimFyMn2jlfI8(mL=D8 zAnM&niUMT?S{%UNUrqmLKF$8baKoI74fXEe3f)s)ZBoWZ=cib|)4FNg@XQ?DWZfQ5&?Y!!JG1QA?nu{%2^f&fdRA*s;APVns&nlzDTk3y#8M8gb=}ZH{&K z-9=k3vggjG)8mmE-hEi4lQ&ahlB6rH0@dp%eX*DQAm0n7eU_eY(|JNPZV1;tIjsl0 z7RwsK3SA4m!6%yj2;~8>S~Q=1NRDaJiF_vdg7q*_{8;*ar~ST+&Y&QEU-sYdvb0>BZS4(~nNY9TX9iK5wn~XtCdfed$(ocj= zN9%X5#JNiM9xpF7MpD9Re+cy7+YPQfgkZ0Ws|e8rOPh%42G&+Y^IA}Yp4(eUb6aOF zgZGZaJEUSe2Q7!b6mxPo8g3;{;d}|tvOl}S5~ulL<0VX&Mf2BNn0R-Xco+X0HbYOO zPYyQ!ZE@xMDYBl}j2w}c;l*RumQDeAqO+KLf6xg*>j2@|yU8F}VVrkUP&`~U!9P9M zq*4Q$IX$I#}Zqr%vqb!RN=uaL4pg}+dR2_^9I}nDLG~Z1r;KE zL2-^f=(&Cl8G)sIZ*9I_i08d>k1h?Td6;mI4`DNl+Woj7+{#7$X`fX#D*mUwewTx=G$zV)E`#(% zAsQj(NKxjyxKm~OKqUnVlLc!@&wIa2jvHk?>aOQ`lOMf>gV!rgQmo4ldKqpZccQ(_Fu_>(67v1rb+StFVZai6R!5 z#o}=a(?GPrrfHs!JmLxh&lsO>t=}RRxYo-f?oDp}|HQU?VRd&NR{}~J36N_GI{o^8 zPYI8dogI5;lST|+D%hE*GhD6tTPPyDY)%wXMuR4O!YC%HFo83f5&vK>qqk4lvT#;H z!_{d9=azhaadC@4Z^EU&yzg=0=F(tz1{ZFvK*6%#kD-2YLf-daa|%SzK@ z1G=6Rn5P{4s)|rpoUDT&KfUZH?9UF(O%+KvVUue13PJ~J4QOV%a8Q^)R*UbP3&#-)^R(c71IzWfnv_YYsy>UXejtpS08X-8V*acK$G$$=qMBZ z+7!hY(vtjl)m6hZ2#}EPWMS^Pu+Ih2*AU!#573e}!-*#k9V{iDnJ1+U(fq+ka>M^4 zvMtQify$PWy+moh@D$TBtWC)N=o%APir)TW=}$td#jTKK(XFoZL8j%4(OAHY=c%q$ z5hh{N(lYk~hkVrQ46lEu)paMInF{XEaK0)!#;{r>3;oQ;OID9wK{4Sfcrma?UN}@p zAOhYcvW!{y!yi#;=?p9)rM9UakC3RLW+)j{t(b=B1Bs>7qgwjfmq2F`DJ2nD7HR0! z0LBQ;E0r;hNgN10KtozkC(lKNSWqw_xeM>6ZGm6z?@+>R{yD8>6lgNUi(G4HkKi2P z0*HGjX$aGD^?fLlH_B=pqzsw!(|f09*ErZOpG2HK7VS}JvgTMn_sI`WO+Ror;kMzQ zp&;c;I}2v$Ga=>ck=A^$E%p#)h;Fp#gVjmcZJ|o%0JuhorOEn7;7O8Rt1J=sb~md= zF~_@Nf^$6yOoxx%3?9-au_!pnusM973Co{td)&U-Yyk?x`LZg(>HmH zoclvCs~x|7yR-RK9-3@t!whms)o( z-E4z5#2!Bd>AG&eCF$e9&Jdq8?WDpF!GsQ2hH#Tice*OI90eH0=#L)?mpYsBA*;H? z{3(F*iobG|=7y3)V&R9DD01F*z(=PR9KZ5_LC0zbH|2C(W;5@aE1RgCP}c$Vady(zVB)ob=(k@^Tz%>_>Oj0u~Yie`nMkt zq`#74ksns`rdF$lfR4VY8Cus-IYf%}*aH>OKgix@zAyv~Xzn&!^bG!`uAZtPELAL1 z$dfs$Aspiv2cS45+PN!NG*Ju+D6j~wvpt9(Jhk&vw@-#pUj$M1EQU03CLKC^ew;pX zCY;w|SspwIbU!+I%MeORUcpt-sil$xW2r8kTj6L?X4Z6gK1u+)M<-P6s@TOa=$l+3HawWv@mwMzkg4YUh z5hnx}9JZe>xh&4!YITTSmJS)nID+qE7Q_axo1hWV!g)6pbIs_`h#cZ3W`rIvlzn=( zOAJwUTNp+xDEs!9!No-^Q$7)mlNPSQ=7l*CxKRYA5YKM#1!-!pd(NYR;@O3hj-Bypi>fx&t*U)HkzYLihUJ&n` z&VjiU%}_;hAMvGUl{}e)6gQ=owSk6Om*$AR2L0+UV@D~Sv%t|SVr?2p#k)fEW=J?Q zRB8YGugoR}8(e9BWwdZBoULy_#n#$CnP(V2^ zVJEc|G{*T=X|Tf+xUbr0&IApUc3NWAWz3~r@$R+Kv+tw0KV+-!(@<8NrPd%MES2(^ zF!i%Ax7IMR6~Q|aHo42`;^o14oxHoG(N`fY5#POqVnxj?$QGCf}%5u#}mV zT#`Apw(X4OPkKcg)ll}?tr~4wU5%wg8l;OVEdS-y>!EgX_v=XHh3tBLC!n%)&(eg% z{LC$AXpksGsto-{)*X86LnE;KT}~KvC8aS~O;}mFestgvs!g2;^J3ni+>ya{H-412 z+SLCcQJ(%eDA%n%tfw+t2P}7&6*f_BtPj>%k^#Xh0_)<3+)ED`&&KA zy*9nGbo2X}NNwZp7wNVkl(l?3dc5W6%%x>YZu7aN<%ws<4@*bax$3!llgdS!WZtY? zmVLhh;gDRvrE2J04mR}({-AjT?tFU1An~ohJr+E>R-%#&JC}mbtrd3B7jX2zk7zV- zGk(KvrF?MWSv~Uc95=CptOhu(_@s=6c80ESpv;2EF~YyH!Ng_;Xr&Qpd&T6K` z@`=&tLU{?A`W3i1dm=&bjaXM@m6f8gVMoP=$xbbr6Je)4)Dfiavl!AM;Gh4mIsb@4 zLR%skHkXY-A)#wLoC%x8$zx6-zLXv)9sP*Cw0xSuV<3I?^M*n~&)U%L+3r?4!$Il^ z62!tp&?IM^qBV2d++bQlrK!Di8|$`Hs3`>cCXmk)u!lfi^dkj~cUUIO<%`Zs`j?%BimD-x4X&j|u`$RqSc7mjSy19W!_gmkrM|@_8ceA~M5x3rp#xJ@f?! zJroqt2Zdk51TbjqW6DSrZ6n}|kk41jSUKc>rx)aM1VRf^p71ExW)xJ);#X&6oHCUJ z_PfE&zsgIOM5Z_K^3l<%&r+(kTRaYY$faRvQ*ow6ACzC;IE#m6NXPo)jYnSP zgz>mt8Q6U`iy;iLoWGjG$APA+G>gG*tA8PX#g81#J!@$dJL#^aCJ08r6bMAzdVlZ! zITS>5`W`xG`J$i3FX8CtAETM)_!jRMF%@l3!+WcpSu1}mFKENMxVdEc&=P~`3Aniu zm@zZ+e=XE~CDF%H`t2N?-;9+%o2rZNSnvynVUDDS)zGd!k*l7Acp0I$JXPyd@GB*- zezu~yY3WIFZ~Sk!cM^L2F0WjLmdiqCFb$&dpF7JOadUH_TUGfKGEN{9o*@gH1bu!%T zT2-S5TJQ4uz9mX$&#O7AQY0ao-Xgh6vM|CX6`qm;#h=I$NMgC@4oZ0@lAYd!H3oMU|wFc&;mo!1hfKJn{ z6(mZ04`}VsOWo0ZkO8}OHWxmI2d;RzqX#(;4I@;4)+KJMUoLAe>>~H3JWLE2K{9BcUiUylTF^nPXq9+B z`0~grU4%*ZK^adu4>Luj5*Fhk+mGnZJd>q&l>cu2Kud5PGta#m8D{c%gD-oHd!Q!R zCFZidw*MX@4G`?aikgYzPLcJcaZ1Rb)BHQe>&DXTG6$64D!x$`LDY zy=wE_iu~?TSHA?%zV@2J(s9Y^dn};kxS_ux#v5$)-HObj^SZr>^Tij}fJ5LgEufbzMCqCtly&GWJQKs?Hth-`GC^Kp^oP z=Q&ANzXv~X>NOj;Z(c)xotOXUYc@V-KL`?ABrU(cBlEj4FqebCB-pAJ+MK}ebR8Yn zT)xNhQv0vIrmzva=;BY!bLe{NVh~;>C2yi1rjXR_>4{`xo8Y|-3Jq7MC$ih4z*EfI z>pFz$8GjM0=_jb{(bu#Pvq5lHO)-)qdm@~1*0vbpk_@k?xHD`APF+eh^xt-#ldY0F zMg0V6AfAS&t8~bZF{+LA$XltJtn*nd8_y>rK3f?J(z{>JT|)J=$*N`M-e_C><^CGW ztRt`gy;~4ic1pWtBQuvSXI4@m;p(FMi_;l`V=C%|X{;a72aIsZ{RSrrx|@Ls)xYuf zfyzS|0$AiMDqy30~2$Ae-JmiY74Mp3O6s_k*NI#K>pLwM& ze*S7F3Nd4v80h?B;-RLb1Q^T#jnx9nYMKICg*rUW@peD_-Gc#3t%dgHVJ_Teg!jCd zPzBZw5C(h)r=BPJJUd2^UJa-x&^+nTR(nh^UyirN0`bylIx$9{RwpoqFczLr%fGZ@g|860k?^k_D_IO=S>$! z&@K@}ja84_@}!D4PAhvs#xHTt&hb`Y9-0EH7Ka*vJ){aC`bfLXTfn)RDdnADZASl7 z$XoTEkGxU3+sf~(PF`lbF95BI%$19YoI^PpV$(*GL#8mwlvc0m7F0lB*M_B>t%7GD zDliHVvNl;s{Cd?!y->}_$g8TK)!984hq2Ro%J}R2VOvnh2j}T-5C3AY}xEG!Q)dEpUZN%(up`fLRf zq`uqAtN4RHhn-ANCGlM5=e(>5du z^HO1xSh+oq@{N(Iu5I!!YwnSy_7F$OWw~=!4|Z7;vM zVp)};Ji#uR2WsJ+`NKfmopfx&q$bZ_pM3C4pA35=p7r^GN%8usBUn6z9DHrF^MP>_iyGgu}cK%T8@7dVj1F>x-o^5r<;u4)ZBW`nW>Yj|vDBoyUOwW~M)UE!)5BM=(XiBgp*>`E zqiXJ;d%`||cEZTTVnRZ3>YinyRH|Me`jJq4NdQ2#H@d8E&9thaZTm6%HJm7IlMj>z zWSfZow*HSN;v(V9AsZWRe%B4c@GSJgTymDG#P1FrYleQPuduH43In^l**3}#AB2ue zqN(6VlCQW^7f-G{r1g!wEk&Dbe-Q7*AI_8>^c){;Q&cB1<8pv0L^3fA9t`WBW0t!0 z7tESfkT_f(y&579@RRlZEL$&c#?ZaTT#3D})wGh5H^1iY@AFsh${x1%gZ>d!nmqwTyGsV|EZLc&0g)0iE{qkgPi2%?RitYXMECfj!}_rAy-TdZ0^rE zx0vryGG(D=XG=@3e$k__q)d^B+?^2JSUdND!g3q>2;`4K0j2Aw>6 zGL}dJ61nE~qc4$Fl5L zaK5)tQltW%@6jt%;n{QpCr*m4ri_phL4^U92XC#Vpr|i}&{XoL)=lzAj^DI8ZXJ5iG z7mK?r{U^rMweiF(12^6=M{6=<&L34j`e{0kOeN%nD5)U}VB47A7i3(W&ZROr7Ar2+ znG+UAG#2g(@dpG>`0wQd4R$>9X*f*||3VP0^-oUZ0UY31t;Leh1@QdU=??j057UB` z5Yh22f{rTOVy3B3GHsc9{>7x5-NA%{qWMqKH(SQnXa2L z-q}`&xrUo>XLm#*=+*v%^_3O9NFK3K5Vm>e@%Zlr{G*&PEN$DYsCxsVVVSD6yX8k% z#j-xeKGXw|Y&6(PzMjq&Nj|CR00K*!&iFkOiq`%ujHL3SU}sacGD+WWUi0AEUK&xz zI{eD?yCjlYTYqDFi4F~xUwegPd)W;`36kXh4&ENHMsE?9g9!?0p#}Kye!o9Q##~DN zIPkNLKx$1W#nl$;B#kD%a&uLic0am=K+22>u_q!=L*S0 z55STwRDCUUNu|Mie#fB4d)_|jnSHcJzgO`Q>@&kq$i z1l$FKuMz3O=!omgcoQbrNf@CGrF-DGnQ+ef^`pLDzPvXLkWbCM)2>McUxCtlwwRY` z%p~9J-A%)VxHxdC{Y1{#PwGpCUvnc+J7u{*Ymtyl;XtgTKQ;Gdcu(4xm6~(dg{L>b zJt|`h#iq71OqcO!(7FCSZ<3Jkvh_33S4z(xh_{XBBnt{fb&wl0DQ zf(FmhfRZ-;;(;XFYatJ8=L3@MgfHcUP3okI}DV&zLg=n z8CbOqyOysO7XWk;;9igkld>o-Sx~>y`cfF42l=uj?BK>h0%qs21Z~_K9)C_>KC=w_ zv3YZ$N6OUZ(Hs|V?9DJE;+)rOmCadP9*YgI!(Z&CXuWZ&0r()S6 z)X+&|4Tp_Y9_N`pP$LMJClukJUl40CLXb*114f&`|IqN9Dby$B1n4^h?F>iW!(?KM zWQ@>{9`b3nE~>x6@WU$*9;k~P(z_k z6o*Lf;Wv!@q>NIH9%CXNM`{t?C$AxL@6!OF?Y_MQYG^ zM*3xs`_IC{_tVRc^fo<&tq}^Pa&g}yn^!F-20Y!nqA6Ws+6gW%Jm&rAu;$`vQ;m zxo#7hdlsK8RV@zYzDgD#zBsRZ73)~r-;qmL>mF50!AD1FgAkf#!a?AkzJw&P-@Vux zcKn8mVep0aCg1owkwbFmcJ#YMf2?p_Hu?+}O2ho;F+c9^ZwKv2XE>Env-R$6#+J?9 z(72tY+JaR1+F&_yd}58eQo?5}aAIDcBo7|#EO+om>DSHq90$#mr?pMN$GBcNPj zdqKCIcdL$0`&<@MiQ8e+JTC<{YMPgF_$_d30asp6!ujV7BRRZpH@>Ih^E&o~EuD*7 zYW<<%UFB`jdE(znAZERz-?CCYEHKmZHK5C~o6cnV8sj{DQq>_?6MJLOWYNVySEXqf z7|VC>6N^8`oN89+GW%icZem}R-JNi6uy%6(BrvweZLMh1h5L>l5%-uZP+B)}*Ad#2 zEIz>?GQxleR&K%)ndU*-gk2~3E)Fi64}S;m+9NL-Gmvk}NjSi1djBSUb-HK&&UcqK zz-Z@WTz=tsAVY7z$cchJ4@Gr{eADwFK^{Ekk$8}l&m=5(mJWBFauE>DzRXg^WqOp> zqLpVVRrHvGN75s$3Mqn|ONaL_*(G0}p8yKqt1F(jv*%&oRRNHXvGXCd%p+x3=UQYI zDnc~ZzC@iY=&XveP`Ipy4{cohdJud53{!^sQSUTaWfaTfsBE!t1B13zx&+R3o zM3sw5&3r@oZCYpICRqw*=clCI|nRhxJ6otlg|Nbb7>=^H5 z{fQAZcn(eq%(ClM0(UlrPcLEPXf@n~2C*dE%B&lwb<5ogpP%xq5&37hU^-9co^J+* z2oSQhcB>&COS;*E(%n1fl?2i8M3tWElD6^OpTgf~qzV`DC5>a?Cf@Z*@rY`?@dGq)*09>DCE7HXYG6}PRT+BNDEm~-Kit+fcb^2z3R*)m*#G0T+xpO^`6r- zKB%QWr|)<-AfIa^=W#-b>M?Y8nm~HV-t)pu#lYYl41FZH8}y{_DC-B}jiuE+P^Yd9 zocrkqz8=$S^nW=9x4L_kx;A$1XAsCW2DQ4gMqa6Ves2&67=zo~J+g!Ib{^T+Am`?( zG!}Qr^xMA@8igi7@b$-zfXS8f zTl;(mN|yG2eB$P}SfM5_$wcr`H@o&hl+~J8^P%cCve9*c%ZBM=!q6SDJvV1};nwzS zXwvUJhFs$b8P2^A^GY`_#D!cQEPg7)5M+I`Je3%ya~qluzT3>DZB3^`M0ahH110yj zHl@~=H#OIl&ZthG8GDSvyfHU1J{I7ht}MOf*1X5(mh;2sNor1eZ&rf5n&V@we*Vxq zzai;k<=(8O@*(G#o+5XYbVlm$Dw&|jGb@N?43qwVSB`6`+W8~Gn>lsWD4UTSXA^2= z{6)jI@r-KF@OQRDjA>EBLR+yu3H7je@0;Q7UQ|eAj804=DGARjQa#>lU=@eT8ni9` z?ClmlgfONw*m=WC!Z55UdvN4s$M?07;^@K#v5{N8EeQw-DITC_@Rn!Gg)|<}GXe@Z zqk;rSA6_IMWtDwX|5%FkM|J<}B{w6WgvXlO8n6o>=2o++vdA6=p>NU3(^w_|-&qP; z;%yzrhz2_YYwtC;ZD6W*KHu)bNzE+$GtT%SbTPxE>fAj8x70^>30EMoA|~j--B-$C zp>IH1OR_C(2rGmvra49mq7xGk)5`5^{wo55X+V;##~5`Ui9c<4`m6-7txs|tw`a+pjjMdf z^yyd8P2a1%c&@4Ltkc$x5DlIl!uxi$NqWk2#`GnLIa@c%8|A~7%6;@2A}$n}P0UmI zjWYIk6mlk3=&NcEH4UczWOlRBpmp}HJZAE>(QMsawB8IpiNQpQ4Dio8iXq)IjYkg3 zjuaVh_kCyFl~@?kBE$>4x-AvDe81{Tq%Qe8n?xu@Fa4R(0hDJ~s>^%`DRq#Ix9kWx z@O7%ZEej-e&rByo(T&FgbmKE=4owU4*c8fNd0{I%@4!|fL|Zljcg2RXL)n88cFex` zf4_6#e#Y7DDtMID7U+Wd%P{p65U#-@^KcQ~DRKy1&3TPJ5Appm^33$>17p8+K0!1g z-H1DizV@CC;$26p31?eI`U&SbFUe_j;6Anrxc`zOJ6tg1Lc;w`sE}HyJ=e*fvlNsF#;yBtK}zFF+)W{}X)5E_yCi_p-+jej zIznWQgqw1OuP8;L4;XQsc3`@@O>VZq2XDijw_&m4i=){qTmYb7pv<_#z$S@mxpxxEu2B+5N-d&B?dVdZy%$WYKslxQ#=q?0#f{^v% zwGnjpYTTA`O_13o1!gA+DQP{D48DuHM$jVb0%nf0m<<8<^!%5B3o5bt4PcFAxMei4 zK*-r@_XhA^4uD6Z=};BC`f)(X_vku^rvx7tu%4Pk>AHg&Uq`2V{J=7!dVFo@QcH#A z3*ueLn#a2+pRF|;!?sAc2cb=NmczT-&QSvuK>*bkkwK5zd;CcwPi*%Vo>H3Zf{J^C zffq1{9GB}pVD5qOB8PgD2-Jp7HVi0DJ@Ca#DN8wsjd{#fkX@1MOke#2N;t!jN4_V* z>X~yl=TOXFs@$iqk*j;nk|0<9e;$~qz;|I%Fk7>dwRL@Y)Jb%#zg+2@)*VRx2uqY0 zWn44C+Lng1k=z}+bS}Xl!wb<84~$?~Q+z+>lV=qp`zxB%fw28my7Q;6k1FBmCtLqD z#D7uoczXJI;Jo%q#!N8>$n9SxZ0R*t9l7-%BG0D>{b}3{$pm?vH(@W8o|$~PM0&GB zV_dkY6>L{P17l016kUUMR=#vwoRF26&=?Fd`(>eTzBC^h*^yo`4ul9xtaQN*>v#hdqKupCipoXP}py zkQb?xUlF8*ip7D|#RNG}{a*b6{js*N$>D{uh2gg7GZY8XuL$NX0A#B?neZp%&c>ri z^AMRMugQQ1M`3(@JW`3g-vY@0R11(Qnzqd^c6ZL;{L=B`z_28Z``EH0?LeaBKI23k z{82Or!MRHrJh6E&JT;QrtQm$=2vT`D7kk6o9SIDc{HYn%{evqM5oq>m?aQ>EZ44aC)s(!w;3sZJW=|4x|peEFM@$>ijZJ zZ2k__<8lWipOKD50F3o4BPMJ*f)B`%wYlcG27vPpUdAYp#m5#15E#hr@e+Tne}xP} zG?ZEUBGZcX3jKa4REc(+Q1U8hE0)MRK!q6{Mq^Rfr#FVxrvV9XZ}=~H1A>9f_tZ}6 z18;BTw&Hmdwq0vT9o#@oUwyGGxe8Oqte{pDmL30<6gn=dcv``?`3B(?Mkq@tgTl$h9`3J;Zeh?ND<(|vFh|uTnzNS1W?Y%$r20Zr)8|$gi zSQ&1+Ph1G=sgQ6Z8Sf-9dq_~?M|Mw!$4zZTgl^1){+Hx6H9nq-5LVjS0!Fh9np6E8~ zGjR5%-?X7M-E0P~A4Z4w-kI!7UKs46Qm1i(WGOq^O1AL<^(8bQy+2>DuE+sr_`nKl zth(lF=2HzPRhF-Z{>4N~c)kuMPxNXzKrG8O`V%0MW}>8aTrzJ}>pxcG=KqjwQsGnp#SNY|l@v;GN|%Xm>}pFGKE{qj3I;KsE?vwMHj6IJ^dqH6Zz4uIwFQEC+JZbS zfZUD~g*es)rDYyzP7z+*XRPwaHsPpPijR|hozN_a2XL?o>!lQZ$U7j1{P<*=rhC5s z$3xO9)|L*k#SSm~wVGxom(39K#A*r$1O%TkTRzE!@y95W{?}^pJW&ViBl==Fms}ZY zk2}m;X9q>?ZJFNkv+tJjju4g4>dCV-)g|rhL9gH`)^%!-!k9Z=VL3=3WYxE&$rsmY zT?6SxdN!s*7oebIK#;)2|7N>u*6)uDc^PAY8_qMw&1wE0tHgRi$(no(VwN~t1Q1hX zpaR)YF|zmpArGA9U7-9hZNCNN6+|`qx7w?8iHZHT)M{L$%6$RZJSt1U2nJV*P3)Vg zWETvHnVCVek9=Mst;7A7I5>H1M3Q!-2ucTQk0#f{7@WlGNp`WpeX~!XztF@NnU55x z*-0qSbrl+$zfCdKY4sps2P3ufz!GrHN@;+RpRu2sXjOMjcOk>!B4P+}b1Av+TsU%D z4b0oJi3<{8%@!1L@jL`LN`Jt#tAj!?DXXS0cSv%zm%0!le94DmZa@TuO$60=^shwdDnaI@D6$3 z_I}_UlYDXVs^puKwSEb#Zwm;30UYK5!en> zlb^deHz)6ldG4_X$6j^L&U51Px8(mTe@nroh0TSx7T#0%y+Swc#wOx+cM|S)dvPN+ z8B~hMz?oJSPM&i><>BvGF%GBB=i=_?c{t&kfIF8Z;7kUmT#Oe}!MzaNX*l<)L`W6x z%~p#^Vg^EIBJ^T})*!SN_h;+CsfVutw`XUGOK=nQGT=O%W?zB(ve)3A?6u-^xS6yB zw_^Rc5gP!t3^z%ai>0`y+KO{A`nj>9y3M$g{)KU01D4P12lmzxwlN+o8UXIfcsN4u zP9)k>@EGt0?^D1h@(FvA2&-7b=31ivT>M?&_b&VaaQ);T0jE# z+my;w!f&2WX)T)i4lp>zN>`@%#+1h*oHwR?0K9qHDd3YOp8&U&7`Q@~$f;yAj=snP z&hIOefq8|bZS+MM%*lyxHjgLFK9?|&OS=4`0{RZAay;<9iiyBSvxuKmUJ3f2CH26o zMib`<WeY39DIV^)MO9 zF($3$ylnv9$rxr_%D9{LKf$#(ZQPeZubn{j`4wA1=T0V>Z5I;fyy^FWet!DHz^_cF zT9tH1*<--685ZYSZg)H0G5%Tb-@NDtzy}yfQioL=xI>QPB;a}I7aDBaMc=Fm5AXt< z`s%RrB;ZW+7ai7|3Y>#JqvIBI2Jljm3A_w_NXK319H0-qhFBTcLT>bM_f?p$j)5iSFLJ5H4~@g<;+^W3SRHv@HX z2YQ(oZCVfTZrnfD#dhuUz#ZBbfcI*B z!27g~z;9}|0QI}F=$jYqUf_4NZvvmyb^-TmyMfPX_XB^RJpg=OdkAT{W+>({dxLwM;`=^)(--6^%sEk`j4n?^+Uh~ zIJ-_3&!9Dv#s7!aOct-AHB-c&z(GqIC0ZTs0F-F6@XoA6n=SmnMsb@l5pDP-V-jp` zGw932S3%DecY>ZP?gBjz@3JQXzXtkpu^sf~;v1mni~Ecjz<%Rm;J1ug;DAvN{I)R* zqw&KCT|n=kfsYxN0G~kU0`VP$UW2gT5B`b|wOU3;H^76!dlC z_n;T!4$nm3TcEEOZ-c&G{1J4E_^S~F{>_+*(O!4VLf@!%Oa#t!OhON-0UZ=|pl=Wj zpl=YfL9Y~ZK(7>+f^HLYLAQy^LAQ$qpxecjpgTk}=nioe=uUAB=uUAh=q|AsbeH%X z=#W?fIwY2Y4&!dmMBp;e-C_mkZgB(XHKGml8qp4Vt>^^3R&;@0hnqhWfonkbh;^WQ z#Cp){#m%7Ci(aNTIOYR4Ij#WS>SzMq=2!^)lH+RNX2&AnR~^>@?{r)byvxx7+~)9M zw%hKQ0sMyJV&F~(&42ef>Vf^Jr5nY!90A~fV=Bf8vX4c`?-#^Z#69ToKNLR|uZh?3 zZuq450B?dvYbDyX+ET4U`?7YAwp-hyeNQ{29nt=%eXRXUOV>;E3jHd5sot&Mr&r^? z=-bA>jLRGkI-bUz&)+-T&aiV*+>E%Uxc0bXaha|H*F@LFu5Y-$<$A~Up=-X|=f1&> z_l@p@?mxKyVIdH&$}m!~j(cKpNf&%_^$|9gC5!i5Qq30Edu zo6wQan{ZpgHxs{=_*mkv6aSF-=fv4bUrzc_lGA&Rcf0p7?@zr)z5n#4Bo`;oO5T+G z{p8n^T`AQm%TvCSvOV>esk778q}`OZJMEFQy=iZ!eVCS=UYQS*ONOx_xjwGxi9AaCimUkOY^SDTbB2H-p})n<*gpOe(c7v-x#}l z?4GeN7yPo|cLgU4P8C!X))xi}zf@0~Co72d*MnOlEeDXhvM*TE7}_Laia zIvImjaPrUVh4g##0djOThhpTp|0 z1@qSuJU%>2@wDRc;|btdhG#jR6|n0do*VG2#M6dn71opO7#lnAbmCc!*|-a9%MhM0 zo^CvA@T|oQxDHPbp7qGxjr@N}3*`C*c2mSt{QqR9!cTRPDn8FePgnkQ_^BrGe%DF- z48_k-{0#67c3a{oJX3{ds_;w|o{4Z$oGIRBxhy4@rR1`dT$Yl{f*d87CDL3ZpQGe+ zlzfho&r$L@N?ij!h;r*!7B-+}g& z^4&^qt@tDVuPr^wy-T^ZmlNsQ>)4R)GL2I`%zCyZl2=LQ*!f_f4=fx zq2!v_9fSKj(!E;oTa_D7?sDaRQMr#Q`KQ@+U>zj+--k=-d|#98^PF-o)>ZzMd%bd7 zlpQrSoZvC$CVGtYq>V@`uJav- zKa8eS&9M&tyHY)l0k}s~lO6BDO-ReYYl9-kytF@Pccd-Q{)y-I^k(f4p5jppwDQ!M zpy3+L+Qk_QwEB!MJARc>~aT!d%NIftCL;Q8t~N1Sis`4gUx&pF|2 z%Rk}l#)z5t8gR7FDdT>&s^ zLp|-SDtKvIVCK>mD{KTCdavwg3p50l1>1w+U`KmhPotkT%=EXkl$DtgNvJjy3NCM7 z6=)CJ1)3oMrH4?dtON4C6Igy=r(fOO{!6l++xQIM5YhRjVRZ zG$+v3DYh$(A?!~T^Vd&u9%UUQ-0GsFR-ektB1_DE4V69 zCR$c^2fE>|p@Jh?IIs%LHD!@rYjw!zURy4zNp(|eM`s{pXE%5CAZlZKxB@h!LL@PH z=G2xJcvb~MA#@Do;~+(2Y+&=^icq{xh&Bb+N5sPzCRR~N0$qy5b==$$Nxxi<6Xo0w zmy|0@>_)GL=dwT#`xp3vUGT=L^>WeJ5M(>^p_a;r)ooNzq=uuoT&?A*TFYg%mUFd& zxu*P6tFtLl8Az=cz+7AAU1Wb_U|btpXB7i?<5YgyJY03=DyTYh6;yr7B#v+Y~UVPibZ`+(IH1!#-N$bcAS5E|sJbTHxz4 zNw#fC&Ti`ttuPC6hLw=`)GjRSJw^;0qQvP8N1WD7#p#SmjOezJ%!QEuD9%Vz6T^+{ z3^q|Zd?v20U5_9tC>btwT zkaaA!kO_bD3Y622pz4`zEiGKLzP1RHVBU|<0PgOha3&U4y+6T8a@HF3ed{3O!Ob#zHv$5M3jK)^3TEg^Earb4yhu&;Fm zyqJOlU2Pq$D{;#9SdMqX~+Of8AnSIf%MkXue(}wY41*t(5v0!eObO+Ic8vQd@ zwzSmAh1~35pbb3Pdq(nYeQ0E$*@$C~Pf;CoS(u~v)Xbn>YLolMkwKS+I@(VcHmj?vBL@4Du8!``Mt|ruEf|B} z5C~&{3w>Hm#SmB!=voyFohDG$QLOYL6&NG%@{aJQg`YM|?dW3U6UQ&BFcQTI!^&ut zFB~iXYfvk`r9nDAkV})(n&ai&)Ur}jjC${0dIM&Skpa!VE(~9%)f#i42-mj-F@we) ziL4nmmRWblVv}`YD-4DL^OtcCp5H|QwA57tJCDd5bXgES zvS7=%uq((eM*nWC6uOnTJhl-yXNr(5;L~)@tHOXB4(wr#ep%fSUT6f5G-EDMJ~d@1 zUrSe%7sf$OdmtPN``Z1!E}Gft3~zqd)hp2baD3Goz*$o$&=rOSjtHToBBQokVV!PF zSBw4A1R`Ij3u@(txBN|QLCTYV4b6+@gx?VKEpP7#g@dgj8!adK5r>?jMW!W}JeXNT za|fL@F^OzO=l~5hOjXZZ+tT8fyO4QG4Aw7C2^RSLwAR1@idxp8IWT&V7%i~n29;(c zZfQx$=I41zE%8m?oN&0)q*aeFz3NazHArLom2_ewuzTU78!Wc`jqPhXRt7{}05h7R zn>)-yS^FWZTA4LP9mA@e3_F|^ExaEXA!cJVT6;Bh=x1Y`<}mk+N4aM{qeYG)WFw}L zCafxP+__#d7KWEqQumAEqP-eAx{10HJsyWAG;hy=&C4+I(Xo%>G@&`$Ec1rJ&>X@f z@$4%G(P8&+sJWAu!BIY*)L`RahI^#yb~9cR7W%8CjVKZ`LZBIW6|_xc0=p3m3|(RN z$bn}rmffh!RZGd0mCs|xJZv0@C8Jn=^mNN3w}Eu5UAiFHiDhZKG{A@l2IA`s1?1=( z;kI;|)a4xj%>KSkvk)kouysN9OM_8i(x#<{>(xAZL>s76OroN8c+8=iiRMIhee6^1 zsJb<8jM?96qpbqV<#qcSAFQN3T#qavM1~7>o{rufQ>qb#!>+~*#zX;gTd<sXfn^T#Ju3T2*C#g z(pNpRtfhr5R33Hl)>@c5D!aMH?B=E1zj%CHwUpifgnj5bKJ239PMLOOmS+}LFMfZ( z#-W6;=j}4L<+dPB`m__6P0plvoVWOw2f9&5WC?OFIu|D29VO8aSlYdOITgbeOAXz& zOh?zQEn!vY=3qFQJ#0W27KHP9KC+1|LX#gVgSw8zoWC@LMOWCykt@2{wAx(T(Y4YZ zza9DIw_+od(mdKWy!e5xIYG2ZyRE?M(0OUCJ+i2?(N=2XG%~QUeHpKcIPud;nUfI9 zjSRMJY^*@uenDyIDr^wY2AK0ll#Ta1_QI)&Jetj~Yi6}!tXC@>D+p_dwOEgZ^D0d=OD4lx5cvZs_hiH~gWGzm|QQc~RAtzrO zDI>}?wvBCP%EC%zSH&7ftM3iPxZO;Pa~^1ofg(m~R|S+ia9)uJVO02Ph7a z7`7zGA6Pek8D`?PWi*yH`n#Nx0y*bi7BqX^_lQP{4AEb#@taO(u~LrmG=40_7FV>I1X>R($CauiSVz$DKXd4P z5ffP8t>moH;@i6EAi@OA*juz?eSoo=j6}|lcYn-RaoQDO9YxqMl7!60nh1HIi+%CMZ*^k{Y(9A$Z%*yM|Yc_QkN&Q zSlyb#oVjS1`{U?6v6&xiMb0iY(d47PwLSnF72SAjOV%cS^)KY@1?9n#h+STcA|*By zCNNyAQppQ!2mKwZggg$So`HeIqOtf2uIh&CTgNVK-_#MaIy1!CwMo(VDhD*V7&J#S zG<$@!4RWkU9jUOtHe`yh8?}=o!+~v#V3~Db9zsfP^~{QvmevvMFyo~iK^ZUl$Zo`H zdRVY8+G`sgFsOE|!TEyeg&Mop*BLZPTN0{?uSCDHP6n+Px^p{P*~JKeCG=(O9cyhY zvqNJph%kAdJA4C-o@?{4m2uCGBxCI~M^^WhI1hjcsWiLnK6{Nf(lVRYA~I-rgIKwZ z;$Ge5>x^Phyldu#qImWeG`ov@>4lYhB$oY@8P;g?&@omJ!-?{mGe%&UdNF0cO@+iF zWFxvL-Z)t=fguPx#crl;L`aM#je5-?H=rFM>A{dm7LQ>m!onD=s58A}#-2GGsp(;S zTCsI>MR75vB49Qh8d}WSuH`s)Xk@auw1;gA`XlCIh0rF-@&((m z^|8EIWQ^2oapagCStAR-jW*W=m`+M54NQ16y~- zx#cFB&e`N-!Cq^9($pHjrKDg7v*jY2Np%FxbYuW0&$WRrgoZmh>1bA-w$QPMZ6Ghj z6u8>-GcDiMovs>N)QKdHj5}ugxu4_y@5WV`z% zsP+`uC{KCKz2|A}21f7dqJzwX&4}N2(qr=E`*>>Q;UTj5Odp>-uz8~fO=k7Xa7)Wl z<-s`P$J_USe?c2|$SXRSDTiY$ICw!R7n=f6*fqC+w(}#pJ3*WA5eI_y(S=4JG)RSA>dgLXSFwZNLmjZ2G$Wc=(-&*O& zVOuqnIs`WD1{n!ONK(d29(iOfq(wIc=>9FNfZjWF$qRwQc&ZkMv-$kk;w`|CWclWx zVJx5R#^+gIK*4fq_yrWI$mlC7(Z|ljkQ<@1Oz(_IeRdtqXA#dPKTMc+!#00ut3-B2 zzQT~hs?9I=-gZuld@V9OlKB>tH%1HFgX?&OhIbLzbkNRV7>A@xdS0-#t0UC0EL>XG z+Eyw@5n69AL+1?*-=diZWoo$;`jm?o)_ko_zf@PJms=Q*LPFh_#1g4v`E1NvWQ9Ta zZO6C^!*mcpOmnl_6z*w*mp5P?7&rWK0Of-e>o7WGyTT>Uo8h!9!<~`em;v;8!l`@CDmt>|rnQhpqWfYp{{iMsyc2Y+g0nNgEr{ zLB0%&x}_l6qrLu-(l$wxlo#@18GNj}mBOkjd13&2u*N)-H7t@GF71J~tC!J%q`sk} zRW7C#Po7A~GVn`X(X84;9@{Cp1xG0zYt2z-MEk|MbkE}(4iqCI(OHXeQPfgqv%Zjd ziO{S>xsD3)>t^c9>Kh7c4{9>x0hW0y#5Q#Dv~LSB3pbok)4n44ohdI#*&FM%6(^u> zn(*$)q$9(sd~;wmy{+gp%9_cC)qu|TQHBp`ifg}3`yXE_pvO%LI3Bo2P=^$#kFA?NO2T_L;I^M>Sc@3KG5>;4Hh(D=e3GqJG!&q2@>)R%!q?I z9_%p=$g`zc>xkq&jMD#n#3W0@ z;Uzm~SiWIRMhg`cO`fRBoJOCrk34r59n!h7gH{o91IxnJCWE&L7+P9r>mO{D^sIG? zwpAdhRacBmPUNuBWHieg;_7w3^4RZ=|2ORa-_vA|8KLkJinHA@7h_6Sa zZN6An7r}-{9TsAXZVNHzQTyzv?uB=RO@APYZ&wxbF8;6^<1pMc!LANT+b5UE;mO(T zIAYw;SJ&nLlS}?*qrw*Z3}W`r%c2I8&zwl}8DrSH&V+2tauVUr=xYg9y&X|9ilvH2YU z5p-W_PLOkrHv{HdOy+iPx~7R$)IvZFwHcL`>g&9N6%yR+C{}KC+8jo8giC z5o4-dAojJSSSq3h-zXI^#!pj1-bW-AkvD?u!JI)(3!h6f`Dyz>7UG3ET8i6^310d} zi0-g_IV;RBpX|rg)=N=wRr%!d$t{yBTPBy`25?|aFt8R!r0ax_PIUNnIP?%Aa9MC2 zeGKI5i7aOL+{aqWNH4C7uxq`$rcH(!Hk@NEcch;ajyk!;>&jqjPmC9^DxeMr(Sa_0 z4^-P7UO{2!SOhIOcBe=nkn+8kV@q$TfG^M6XnQ^BRZnnS^|kV=g<*O9Qp- zAgwj1YH%CFY<3%~xx?m>CSYUuEs~Pty@LHS8?#B}uGl^TC{Ari5qw>msbM!4XJct< z#;y0^rWe-ia#Pb42t*j_bG3*cw;?4#OFZ=@J}>>+1E$YP$K0ax>j;~NTHN%t_)N;Y zp3QgWhTqJVOd34RmmO5H2#p);lAu40R|%iM%V!Y~`JxqcJN|ZvFnmjyN1S|6t3)Tb zJuKCM7;WISf`dB-kSG+uyg(uiH-4H1d)yAhlzG8hV91gd;-y8<-M={ffSP$8tPO+5Rwk<8e$_BqN}EuNI_&1MPZYJ# z-@~;xGOm_Hzb6~y^7xTnYowkPCp`o`t;~`22%c*tTxvJUFY(q1QE|DdA(HRJU+NcT z4Xv?R)k-cUafPu^h^ez#l58j(vAOos>beNr@j^4kbIz@pqM$yiugLzmM%8$}C=?>I zkZrbuEi@liDEptNI&(~ENikz))v_(x+mmqO`!4Ox#7e*P-t&9@*Nv4f82@ehJWO~AA zz%w6D2fAbra!Y^dXF%rx{ghHwEN(M~qB$@;Tvg(q)uUm0S=8TaVUPi);>V+U$xN2T=mD{M5zQpjNJP&avk;q18n3~D)XXd~iN=1vDl3^RRdBv&1ZA%^8Fmpga;#L+ zLF2s~^}$b_!=~j|^DH>?tr7A{&M}!Q-qC|z5E+-H{N-x4ux9UCHaBVm*=1o|6`x&; z$e3)?lxdv0L;m;+qvpb7I>CjBC77uPV2*|OeX#s#uN zQ`fZ53iOMyN<;nWB-SC_wfuKtq=rwEO5R*G+mWwUt-;oqb9zQ8tYrAGBQnWmu$@H= z`?xPsM{o+7)!Havn-808>ok$&LkpI&O$@8o3!2&9SB{uZM$X>iGHd9Ng9(*x4fOgV z_916asxfLKN|9p67>=5*SGwXpW+3HB;Ak|?{5w0uKk%D2X>Piy(uajZ5v8=cW@ z6e~ug7Hj{Vyf$&)=~OFM8YOV)7ijK#NK3bUU71Q6{5+qib$kZ(py2SDE1=(>K4TBa zl=0{nr|mJdBr_hDDzkG$D>FYK6v??rGTWU-Br)yNM#&PM0nPC@GIkbyT8=SRXGPCI z6ESDXnN%w{Q(VsRq)9v{1lV@%mf93G4qb`4hsHaROf&aV)Pjq05namIu~5o_GfBu+AuTeWQ5KZvvz3ctQ>#U6BGq03){}RpS`+8gomsOF?}tUSnAR3_T>2BYR(xj&)(zpOtc zkA14GRmS;vrxsM35_08iZeO{H-jB>JQ82QoG&h(lxNww35|s;8b9X_92XaY4o2oL_ z;ETkhT?!2$t0Egzk}QcFppb6!Kx8~m=5kjdCunLalBF(6%fnewy5#<L8RB2uWMc} zGp=A-XFA}@Nb9{t8!O1YUAbS;(nTCX(|TW$&TCi^r}b5NGSd2H=;Kx*GaN`)#XQRZ3dO5hSo+C$aB8KTgr<8PE*Trm5tpKgJh0m-|NkF#=~guce=FH-bbYcKg1U7q-N}W6s_S+L=;_?daN+w(Lsbr z+wc{XviC{Nn~WYJ4UQ@^U5s&g-D$l~dyy7p;cm@9vUy&&7slZ>-1&wKgwN|ng76vW zWC%$RhLlIBN0r#{rU^r-k(jz+i;PA33{+8C?+eJ-sC<$lqh%vX?cE1E<~r&tMsOkm z-;;r3g$DyRd8sSN;G{S!92QR{dx0AedI%1=CTp6Of~fJPMlxSY5Uq`sQtv*fNUJ23 zaIfLGX}!m|4nH9cpKzrTBdt$ESf6IZrM8jKDS~J9IMfDIpU17MqlTeV=D&n{ku85N z#dN78Wu}NDBTS|;a0Fz*r5I$_k|V_@N5rQnmE_7WqP(g?5kW@QVq>R+CW{vC_Y1K?%@U*z5 zOszdgdT8JeG8G>eVP?7X=wUrV(6~sQUyhRzb^;BYDsoExut2JAj5=;|$*l`tr2Gqnc#X{IN>8lxm49$sN!2=gsAy+|<6+-15};Yz*D}55#J2 zPoSo!(8R8%#KSIvn3cTJocp|q zu(94#X??fkrEPf9O}Va-a|1c?#PV<>u}ffc3>c^WRa!1Yp)Q)u2i zXNG-1;IW7txpb1WT2o06WsqE24QdIPsu6{I9fmDQ!k9HLrW2^obCL(N$}{E|f$_74 zQdgzuaSK|_rfzsGUKqK#AQ6_N@|4>59{#D0%TWjV<_+aJc>UmCEyXQJtoafpNNi=;iBogS%?Ry8glZn`E1RDhD#!0&)p)yRBPQ_Tk#aMx%FpX<_15J);8;9J^MGD1%F_vveUuuq!>lIk zfeqxk$%e_Ga;cKiHoQYKe{QY^Yht;iq?F-cUQ?@VnmyAtO!Rtbu-F14_KtBGV8qA{ zYn(`H6*%~p>t+TTfM*IYcn6tFcA2)J4F53S<>uz)VrH__}N=lv&Xk0ykU2OBfgazEy-4GZPsG_5a%SJ&`kQl&QNmoq)@cUadR|UWD|2w0>_XGNEUd)uDADZEcJw4Z|~ns z(Pz^vQJ(tJ`tn)+*$hkG3@{_@kIJ`{-yfCli0FZoVfv+&A4ngjojOLGi`Sqi4z03# zd(CYb_70@##}QTAb*{wYtm?;EE+?;_kIVJ3E!-Wi2&}T9FRgD>TJJza>xZoMFe^En zP7)7AG;rNxPpYeZ6Q+KyZE$H5zGAWTlJuT7L9bj;dfh59?>R2?nJ`XpOhAplLE;}e zbvKc6FqDiM)X}>axIB?%AiR+TWZ8*ft%(!ulB#xk-{rb~H^asGN$Ydi^Qdy?$Z)x6 zutR>MLn#k^qTH3JLahY)gk4g#gou@uK5SD}Fqd4YBC#?|W;Q2Q7Gx+d*Ugiz$-@L)qj{IO(jtni zdWlIzH=5VpWD(9tBHmJp0pPD^kX4sqwm%4Ni;?1y0FxAv(P5eG?~{m_AR?>CB15 zcuc$}l&Cxgd#B9hL6PWu;%o~RohqN(n0m?6;7V2sX;_pBVk-1vKdg$Wrg>EnNW*q6 zgEjr3=p^}22TKtd#yelHI*+0)n$#t$SF`hRugI?a2Clz>ON4H6K=Ac{9cBp_(%24C` zNUrZ`mXn)=d*zG>hr2Ms=uA@zaR){mI!)rZteOa3uJZ{JR?Rf1Y?!FVnGF-=5>&Mc zEkJp11{;<>3huQ|rpT;iI=yBbY3b7CqaC^H=zUWznWc)`l=*Xp<$2}PD#&zcuPRsH zT!zS+T=g5(k@~hr#JB@dbJEHlt#*i$J;6iFhIyPCDN4k=5~XrqBnwQ@CShI*9z>^j z=o1^RAOh>K4f8<9W0^)H9~Nm`ck`y8i>CFyYOc0fk!@ATWwQBY4@^-89AT#nmm8@_ zwV#cJMSp2j>WQX=>0y=T(jNbk%ygNT6eW=q6*qg$R3 z%-wBy6wwL23_8@M*FHjUoa|9Zc)ZI^x^DdoP4`J(LQeW(JL!0O-RJ3bpQqPjEsH2g z-WfhTkBCqCxSaB3jC#mIGj`gS=F`5|PFpQY5Zk*oy}%Qt-cdG)+P5pbdNR)Xl5y6T zjI)wyNk(l7t}D}XzS!n`vCTbLo9RehmLm(#@OfVn&ij&Zo=$gX&(ON=3{I57>v+-4 zYcuajyd#&8p6k%m(;ayQE$isK#dGd25C?Zb=1e@U!DU6_Uk_tO(%`!;d|_Ve0#Lz?Tcd%uPXlY+cW>Nd~s#3@%;JU z{evHWviG-N_|x`3{AO(V?hoxh`qmF$OLfh?&}BW}b@IK#Z#>=l(qBLR;79)E_?J$+ zF?RTK@4RJqZ=M*`=UdyogCZPaMrI_O5C2|NlMjY|zs4u!!2Wj75II%kW=CrLs5^U ze(Lxnnq*Rd5J6NFf?X@nQAQYYzi1#3W|?5Lsfmf+KwC5z)MRf{BpM32hTdQ_+T83h z_J$Tmu~PI}^foVzLJI4*>TOws!6Mo!KM?2x*43gI-6f_l#ua3dKs~?)#es+-ffhl* z2p!VhLKrDXeMp+B<>i`Yp%?H^1P}}}l1iL{d^`?X4yXvzB@~I1s3|Fl@y+O@Sd$g(VWe#5DoNrFtL)Q#96)R5wC|h!!lF z$?QmrGP1V^R0Jp)Y=03U**X$%sW$KkF~#9r0|j*a zw7XQ;VN4#tSZE}~wMHa>I|&n=B}xFATu&t06S~>ZUKpVM{&R z-8u%l8ktRz32&Q_D?F?`)n$g9%?8b{PRqi~ztjxXTi#+eJC;6MVM6`RwGTwikXSf2 zfO)yz0tBN09s*edDi8;tG`_*&BLIhjK!wE(z&1%%JaR z4og>O9mX?cu(1Pyk!DT{wB}`R=I1!`@Al{zYfk8}h!wU?jU8(8V*2yK##pOq zEpUN;3r^siB=9>Tw}Om}gxgfo)Kh8>bae%wr_@_U(0vflDRctC5T7U&;}K86kVInU zh~$P=FX&LfZBSpvtf3{(5iTq@2)iz0yqIhk7RgaPZy3Z{MAJ%+dOD=92RU4jZGXYG z6dNWD+E{QbK{7jA4VMvi9ZCe+9mpx2Vek$_e+Y-fGoaw5_|U8)%E$FGP4XtCMf`-T zOgVS6v_c_Bn=U3NPoO_2{|rHgjCF63j1Zwj%-UhnvP>sP%F@~Ph{uRdK%klcjH+@d z)Ik_vXAO2U36`FdIezi%k#1Vnd5%5cCjZ=_4FZ&O|M5e@af>|Qw`1TAOJhV@F(Bgr zjZrL&`<%#F7{138Nj=Dq2s+p|WD^442BH7MM90BCls3?+yScT`T{`zUOXsFO6%K`I zAqy%J?4y5p>4Pu{=xka;_c{MsqX~lv#x`rh2oaDwjF4ES;)T^IaWOD=MM8Zv#qryw z_sj)EMFShr?=n5du5J8Yc2l3*e1+sD%Wgr}VpdYm_1Yp-)i-m3gTsj$pmvLB&w;Av z?nPwf{Qpm%>L$)wK88pSZDq3@`WR^O^z_nk&dxw5>961Bxl4d=8kjc1dbg%#KW(Vl z$L6O%d8a*HnZCo^exNWuR@`hKToaEc2jlb%=J=BrQ#_uDCxsCAbTXY9Or#RzldXxu zUn!9;m5POAK9kEO^XXJ7XO#yF*-S2ziKohTCNXFgO6hdkj_2)i!OE2jxtvXgL^)eX z6pNN^my&j_oJ*$4R^GPDsdA}=xD(lOF`h`;Rwi3Y4rcS&bi#@ka>aNqYYirH>GWWt zkV_{DrCcGADd$Rg7zg7vY!bynykKPzH-hD}b~-zl%qKHxJD0Z0nPe%QNtX)gxRuFU zb^?A%>A_MKe2~V$QXy5!S@}dd0ak@#p%k}E9&G25M3pgAS8Uscox}R-+&lEuFl!!7#^R{g$Wr%0Ji2gk+>#4Ff6Y+0xZKP; zC#UvL>Z@32$KJBT9=GWpNtH5G?A0S?L$5J&{rI@a_q0u$Q=|{=QM(jVYP+E}@7y~! zZQ{4G*Y*VF#$)QVn{FdArSX`$^_Zen-W(q*Op#hGPEjHjryr$;47H981J?Ndy;dxV zN<7m}Txez<0`;)0L?M#fph)HRVPqb7Hb$ z7Hm`BC{Z#WLuBS8ig?O&SWL&vT`1b>Rl;Uv5_MCV8nYj@xi%>DfeJ#?wPG-p>=+JT z(98L3hK^{^-G>de^@gSj%r_cpz31x8TCLFi&duBRS!0!rq@LHg5{I>6t}Ts>WFAT= zb*G`$df2R=+E>fzp+x`c%QH!$FRe9H{^~ruwY_C*B+b$#>@hR5$IQ&k9y7bm%?tOKCthCyavRYlOh)7jOMrEEj60Ywmz*XZw(x5f>8Hs||$&PE%62uEx@mJg0X4uu(7{q$7s3`=_n{rbb@7y=cTgmH&lz!ZY zXz?qA6uv5&FCE0GTMZ}@=4{bzDndAZouN5y=;_W&(9#EP znU~_j{RyDTxL0+UQOs$n?yEVu>2lQX2?Maqj|A+s82Jg|Cn1>9b0t(b!$b`lhtSY- zrF*zUo?du&0osk0Ms%&;Ip=SD4=&lOyceK=tb=b1bC&nT- zu};TCkL??K`}3s))>?FWfu1VUfk^KI$7ek}UQ64`ISXVKXT&>ytC1x#$`my+?KDyHNTzFZ&);oqyi<^%Jf-Q*WZQI6GEaU(A}^ z_P|~8Uq$|)j0PT%PkA5rsoVKk-npN7Rm80GSwej5fcd@I{B^rfsNB3iXN=+Fv_G^t zq7_WVLb$feB%;9;cvim$5n#y_Z<3#d4lyDP#tSJaZ6nI@(XDI=ggA^k;J3PR-}c#I5zG4z6o2q{`avmYv}R_*i7%;=YF9qvu;MCC}#c z)03LDjmUWhLq683_gt;7Z|ip(tH=xWeP%Ah@ml5TrV{ueyyZD3td9!`RwQNpX$7vJ z9no{Oek<@x1S_c0_62?`ya~6xP82r&8t~7(gsbb{RW2{%K2;RSKh825sTBNUdwjnG zlke8Y@Cavq_Z4bCJEf|7bUZL$kgQ9f-#m6?@Wp1$%Qpi&iEVM@qJ7PL~S-om%(y7|}CV%U@_!rmsOc%8}piics zBJZU&2h)(Gy=ANxwLWRAK^LWZKOsbhU<>_~Sj^l+!SfuocFKO4uFIt0=Xn7KRr<9g zueb0iR+l$V5&g%Qpi_ude@Vc`>8If5WA^7aMHw(~bPx~_Xb>btF#xR|arOun2ngL1 z2ngTTRU1nqMq5*7Cuc)j6GKN676v9pVNVxFQwCvMLmLlgOJgSnWe;0Jd#A4}#>S>j zPCx8yogM9L7~Fw2=en9sYvRqm-Kvj*xo4qu6{3JYK2ojdQzHpz4XA@OQc`BwyO`63 zOnrU5BH@WQe%)Kgww2&LkT47h+cc46DHn6*rwuNTqg#Z!!@q8c8htK9)h|PaYv3=^ zx=g+12=xYMOs?K5y8WKEKDq0>(Fh?wvTB+3FRB_8y9e20Ti^PR{q}w$DexcCk*vXo zF2Ti4is&%Q5rmj`VL@~`v7k|ayW*Dtu`(URS@K~S|0H>!?HNjzEy=d4J^Yq@*)9UM`jCY|zPBR{- zRlJfWzjJlj= z6_(x11G=U#ro%Y<0K`AYo3_)sr3W(uR0D*_S+bZ_tU^wA5*<+mDaX#1A$mXkFXcXg zoCIVW2dJ&1mwb1%fbQ1zk)IKPi2AtK4m`=ok1E@lzZ1VL<&if8o_c+_jC(Q%kJhiv zgIGyD{z`)M5vK7v{RCHJ@D{{vjl8QO-o$0ecP!Ny+4Jl-XMJ_!eg{pMO9Phbt1{Z9 z75LTlmpUJz_cL#?*_ZsO$!Pz{O0shm@TQaCC0YiPUERIm&9tADU7*2o zwz`)dzocGp+9-)$$5O7YUj(q?#Ou*h4ODHhksck$LD1_J^du{##?}tFFI?58Ic=U+c$euFl$|oIv4c?GQ5KYTrBbu}U82EVP=ozVG|p5|~kUWjwSwpl~;o zcFENung%V4MSx`E#PzX1$bht5)&FU=@PQFf!I3~(lHY5W^^zI%tv_WTd(}yi^eCTr zEGn!TBs`35?^}LN^^T$tGJM}Y$mp=qiD|EBIt_i21!+p+7V>rUujp^q!PcfnU%XBh zFmq+f8FVV8f{;*)=gr&0r|cCkGeJeOEvoY>mfrMZchJpLyRh$b4bok-D(HYBJoZ8o zEgCUb_tA%-2YlksdboXBlTk};G~<%gy+SHU`yvq1rZJPFkQ4s0#ABl#U83#*GWvZc z9DTr30n_wgkMEhULH|}a@5jZ{)ZXPMpYP)l-L_MPU?VnNCm+{`ul<{CuAY3*H?s}+ z^rXwk+9PkH!~vs`HdF0Zbyxl7Ch*Hdnl-JV2LiL0Xhru%VZl&9v&)Fea^Z(X*(iQ0 zaDjQzKNUzHxRDCHH`QkUo~6>ee}N7<**#<*MfFnP>vwm}bjp#Nh+(aXgPtyH9ZE96 zNuh5mi>jpC2+_Io?DJDI2gdWIo9Lxt-@w(ly>(r7Z0-(l0jRhGKsx>yG<%4%y*^AN z*HZW@$y_f|f=;=x^8jSykTq z9#dGCS*Cj}MU3LeaD3-_`m4P3k?KZ0f9Yn@0y7%=Q5=?LDFI5CTIvqVzQmX|Yd;Nrsy9;; zQs*Xjw71xQx*3ElHF*;md(E+7=n}I%4mx3yVfz8C8oj;RdHJeq7YB>UyHGJzZES~x zg(v`YDPs`_ogz4t7v9aeDG}33o)@dN6`~!;QR8%h5b^x}C(wyi@_jgM8O!Tq56CNN z7qBvQD}JDbxDK63Ze&~HLIU|b00FbYhyhWXLCrqm3wG8w4+ruo9~!}W6Dd=@o0 zfy!&`@#lR^9Lg$##Sakg84n0#-tVrFr24bu0YfxSL|vD&!wjHwzU=D448kp>-xA}~ z%$6OIF5*sALTUE^8O*A4wJ91A=rCN;<0bLhR_p>@b?qeE#GwU!cv3HyeS|9%&)IOy zx3Lm*zZ@Nley9JcoUO$T=+K^PUOq?(ZY^qBiM-{I)OfEj9ww)}*ve*^vapUWDoHM@ zB_&sm(yB&mBlT>{@InFFMOhKR_nXpE6M0*^mO-@PE1l6cXl%^* z(tX(l9Hp%Zvh?}vAP=GSzSltCc*lifD;O+4|En%P;B+{^_ARHFSL2wi0d0XK&VeFS zGj#88=2D6hw#P3utm^(2_qx+M_;)?3t>(&k9(FbAVZOM2?Jsc;wg^koT;^6Q1`Fc+Y$9(0n8)o&N?NKV zvsR#JsbzkLVXrNDA?)F#_vi`5BR}qY{#*deN?-f>rI($XP<4#DG*PH?+k8)r?|eDR zm<;{zgmE>?{)D2wv8zg}Dkq?ZR6@Uwj3NSUZ83sv`0guctI)?+4xQU5*4-Au4TJO2 z)`)JOJbPq7<7aC|c-``Tm&9$ck6!Zzg)RQDDJ_KI-mz={PbIinjxS<4p3HGk`Y|I! z@U>EmK-`_h;@_m^j&?Z?ayTtp7xU|B_%pInr|frBZO2Loo#ygDii4=_ofo;Wb1y2$ z3$72a-}Al#r<@~)iZW-5uE=<;F&gNRLrz#OQVmty1tZC{q?$4|E$u5+(A0G{mQ6yJ)*#%I)5uHHiiEGYKiBgsiTw*pDjy&|EQ1j% z@gqX4)_1w2*H+at*WPd*K#}@(1R49@{1*^d=%IEN%qT6TcImOWg{I?JaCAhgT6XFs zRDi>X*$y^e06{MP4W)TS=MM5XtUEdsfgV;Q&LD)UzdhwPKJE}uU+VK_ zU4%BXXdw@5tHEvjTRNyPvLeGGx3A5?6ifi$Z$cy578(83$V74AEDe_HpZL~SYm|JfH9)TY1Z z&g;yGu8FnZ^VyjO71+*l zpM8_ZVI?!KfSP&Hdz|;Nf$9rDSeE)%YHY#T7FVj7fnPga>n@$ACEBPdt@&svTOTP! zzXCDGZn}Q*0FXscP7PAQ6Yr)E_5R?Z*{&U5hyT76P24n~!w#wH#%{5Oa;w+p1+%r4 zUZL05o^0>(B7QCOaE_mrP!S{>BRi^V}2hM0QiX)Wh_rdek`sOzPI!J8u8^yJK;vBe~kxMk&HHDxG&5P4)NquM0F zQb|Yl94F&2Cl*!i9k;m5bYE|RP?u{q3#z(VtVKeHc79 zw|IUF9f!lZV1>KzMk({&()`1C)PcFb#@Y{D+S=ch?9(9V&qcTBmF6O^dCVS?^~Ed z6|7(;tbdYKLw#4j?4LCiJ3-=XobPvzTVv_t6?CPmliiCUrm>j-ng#iO?>UP8QC>6E zD+u?NMpwsqPzDIOeE?3!~sV@8QMDQ}@aNz%Qmi zl!yb*%R;6e>+@sH0pfY=^hNlO-C6-@C#tuj`3#A~ zlPdT4`Ay)i1MJ|8LkKutaT$32(EvspiGFa1m9M+wi8%9?=aHF9zjof=1F_p=k=}-# zGQo?pF#WmoKlrSRN;oAXHHeYCK@wQfiFhXB(ZT~zj%DRAYxv>rS_Yd926#67V76lD z{)6&`vWI>)$^24H8ufxjRRhH+jj-E6A1Rxid5_NAEIxuhnilLcT+q-;VUv>2oZ$f~ z!5kb_Ln#>~=$UmU3ZDv};hLgq!%J?U`H4!aD^6;Y)=JiJvOEvfzc>%Vl~dogC<=J; zN6ru&Q<7wVR5s~V@GfC9h|%f#0Mf)*SOIrTTtms2{mP)-?t4r zL(ox8f7}dfAv9rCG%L0Jq!$=UghBd%X0iqsY9VmayVm?U4LcJzgGkfROApr?43m{U zfOJbh%qSRR2CYZj5~3xAWSk1G*vm4IV`MEB5k@Tf2x5<1cS6G8QD-zj+e}UuY!nOv zqs^qx6qs{gS7-V?5>{jYot%ee2tk0G#+7c@(u2LEL$@O=jUc{bBkx4+10?OY0;og& z5=mG6q~{_tnX0vUd0qY=$#!I)3Rq1+tQ_Q^D1H-=ObCcIS47k|R_kPQ`ul#_pO~)Q)tvq ztcMGeVR})IL->*Q`*Q{jy`9kOwpIK-(43+3 zmo0Z?ct}y8yQE{!nAsr z4X_-33b)x_oPYjA1`*4)8o#Q6bPhEXseU~AtlVg_)X zk(^ao7{}m$NfcvkpvSV3O+Bwa>>(@hn~i-fTS=Ega`VpQZZ@^@Q!E~=tVyQk*_NH> zMW(6d33^Xt!^*Crc6iq_`tp4f&l|$Of6lVdVK3*X`g^X3;8-gj2Sj@(LiZBmpS-=m6Tii@9(jS`45{hFtuZ-wi)a&Qd9_wyf-0%s3eD9G zA7R&i2V(xQs~RhBFFVir;TrVYNY*%NIdVG7Ae#wu(0so$4w;4s!`(71nj~=*@)rXF zv@$(-<+rxf0wRlx)d0_t;sHJG4)lZRZHGqw5_dF*Lf?L?HGh|N@9Ox-@ydhjYEq3H4AxO-Em;W!ndqvjOs>{dy%tWlP;D%#AB>dj5CMFN%E39Qxg=0 z?McC{IA@v ztZdbzs0iByD^L5I>xkY>K3&FJPO9r~1vDQ;=Qso%mLT%XNn~afF;4n5rao*WERRBA z-+=N&B6}kdmYO280Yhjlp=w>QSiMweYRI_(GprfG7*0VWC<(20ahyj`*oDiv}YJk_%&5(B7A7wmZcZF0DIEB+}u zLKetTiuZr&t3f~u-sn&%LgqyQLAHa3{PEyH^f6IU%F7iVEexxOF%yIEf1FDbx{`#z z8RNYSa!FkPBH_!a`zWB&Td#P@rIEVzqQ`AUB3AO7&NxrHDZXf-@juL`s9`#M#oKux zHe!~1?*gGPHS%=c9mO|CErX6PIbvF>l@uw|cMuuKK1J^0`@@GVyIS{L zKad0Cz_qw$b;pyRJO>YMB4mygpqvlmpf8&7n-wwXJgB=90!hyx$5E*y#iMxOvCa_7 zBhNBq+l^iCI-L_l54FnJAvB~o!-F~Q4CDeAZ`nI5h22iwVnw!rEIP-AD#+Z`PXm)9ZW7PS17cF~}U3=69T+Hhitv zKya;V0yQ|J|C zv)zqF>gAjv-BLf~BNLf#gKlJ@m8w8(n7t`WMP->+AjazlK*iv}y+`q7!%eQI-R#{R zeB!UepY`=wu%!0 zSNsN9RQ|aA;-p=z@T2moJ&#RZ|7cO8<4;wUyKW=RiDG<62C~0oj#{soWH6O%o|y49 zdJ)N>DOedPaUk|i=p0~Bdhly8IXZoPzyP!)KtogC{V2Pb+YGKrxfDEh1#VgfYc+Wv zxOo0Gf9TWayn6m{xaEcE`Mva{H{}tq#G<2&$cdLI5_nhMH(-fz5s;aY#*SPxp|LB)6qe~u91Pk_Whkb4Cw4PqKRHevR81yDhNO(1VQ{DJiNDr&@YE_jvO{HusKQv ztl_u_ZM&o8!wpwti_V(weWQzo1{Zk(J~`t>C9)}-y3FOf1guBj&kiv4xurbAq569R z0_QT$?8@YGc2U3h9tqFlQNXL@i28aTg+w-_LNWa=!<(Ao0PP;{l3=Z&PxYE5IOgSr zHeQNJ+t?*VZ{u!17ad>a9{y0m1q!#yMF$oSPo~c123YmY-Z#VRE=ni7a&|rRx<6a( zLFWj21Vc!4@YUi3)*o`-O`W4}ZApLK6h1fHKryS+?b_}GG`Aa4?vT((Kq1Ulf%?@? z#euhK1A4=^PP%d)nv`Gf8E5uYWS>`e7_T+5BBnjUr$(BOR5Nytnz}37NgF$iw5Kgn zds+*A)*mw&oLOqRR@aV48RyH`swCZ|ff2e>06Y2$bPowoa)6CaN6aX?QdsQ8x^hOQ zVn`LdRbUt*cCzf7>qqUg~`<@6=j65CePw3C7iv zSi@Op7?V|4oCHV={`Qgn%_J!x>uQTH;%TSgzn%2_q{J)6IZNcxaf*08NZ1|vOIsNpOV?B@!5Jk5XjT;AuYLc$0B?p${)BrUvnuxT)C50 zz}Y1D=?0Ur-t02o#;TVULj~_`{k&7PTe7~sU*%O(BDVE8{KU`i@(#t@ZflTYaOHgO zqCZBn5nM@|J8m-3d>7~$tp-N08N0C{D^%_@F6>$fJ=ii z85~q@{J55HmC%TB0pDbZsq3_AI1e7@$6a4wUd~wAT@WfWUlp9Uvww zDkt{U?)6yCduN(&0; z>CnGu4^l5#tPSebHYFDC!@Co$TZfqq=DWM8V>AvvR0n^k9hAm)w_Oeg#8Rk_28yUV z*@H)5tE3rWJL_i&239rVyPjV*jz^D2+oN4cmefo)w`ssa=8MpL3xZb409?u|vM}mZ znKylv&mpyg_q(bzUEiwKO%^cW3zv#3g;^RlFvcphh6XFrdi;Yj<*6ZCpViD4xf&i& z!bTb918I6zBV?vk9*#zbUbDP-a%4cIf3pK%F>m>VreqF|=GZI>37R6|T}Ow`^QBv9 zlF)dqFDln<^Aso|cZr(olib=m(1ZXYJSCUXfMw=>0oGs20lR8maeZ3|b|q(lA>{Ak zo^|y^P_!Am5HcFQ=@*rd{yLu253}XbW#5^TO&Rn~c)oHv zjFJ}ysL6vXR>c%9ttIYWKLD}pd`_< z`jJI5BV<#IAhON$F~tw#+<>E%#>DMmLh?Go`w9bA2)v((dXhD^5+c6aJv`XC|&l0#^m%14PoA+~W5`=ugaOYUX%=xU6u}1--gncyLl) z#ghbiT5SCRJ|l`MH?#ZJdT0Z1lX%jfA`j{JTIO1q_-I{a1{dPuY9#w9YF8uMnAzes z8>+#Ll66*4SpBn=(q#`uy2&^TXqpy&2ECj^HTO`8u+{u%JOd;5xaL} zoCJA9CfQ3`VN>}O3E-nLnlxRK-Ll=1ae_!%=W~o{V!$HWib_v?;;c@`63TEc!B|&e zsj14%_~e}I9JuSR0{8tuI`!|Cno15t4`8OaU=RErW;uPy@nO2mdYa`P5 z0ZH0>VcxBT08&|1l6x3uTBHCPS|fiSqCo^zwjKKXv%NGidu19OGC}qB48q0=sF?kbYU1GFA7 z$#wJ)|2pMs<*W+SqULA=)k9t|-mIJ{MbW>}wh>?Dt(A{D%UBR(La+zu3-pPO za8OYtOy5d$v+qzC{n+MD-e zdKqeiaoRCH4LJXf;m?2^>l!2bMEfc+Ev5cwYD9j1H_eI8dR{R89(+;=rZ8@6nE1fv zq(9CO`4vADYe|hN6l)u7;-(YQUw?i*9A>yf(9apWK8P&ooU({N66NeSScXSokS6jb zI2MzBWe3u21V&bnJCmGPD}U95;~T6`!m%o;yIST@m|8So%in}p%HfvPP`x7BD{6OB z@bX`9Xt!eH$Koty()l@DoRC9lPMn@#pEYnwrla5m9^!gVMCqK|sQ&G`O2jEz-5h;k zXnZ*CYYSZd2#0M9E<&T0pY_nsoI~`5hg3BNeX*M1!!L$dj(k;Ylj5HncvS)&`a8Wa zE0YB>-tmKvcKV?`sJ}0f*Gyl9)*Xoo;PtY@PXU*%V}b}qv6$V@Ivs-+3X|U;G6Gvs zVswrJA^Apy2ysntACl>NC_p(&rUnzu*M0y#_Z4w2zZGWoHT5l0_z7bGA!>mdr z^*Y4-&WaZNTXCoj@PI6=-{HS{*H}^#eo)53YDZ!#o1%y4w&+Z>sge41s@jHH-&e*q zDK6JyArizs0->W}IKokx2AM@F?Y%tXl|LUl^0GgKiqDUZ_Dpk#d?SGBx}T?SCT8=w z-`SZfwwWR_*M31(2{9s#zhMp$yMqik6bE+dL_L*aUhnDQa`r08KLn>mVZ(cfLW-j} zCqWBp(T(dB;L3em1+hLZ3CK%_j=ynkKHOTCn*6A(;2`mp;ST53!}bx}lPQ+=R_b-d za+3@yION2=wz!>ZoFMj#nRhd0L?2}aIR(GGsY-ZuGj$-Ul@Q@psX_dZ;6pAa;ZX=? zP?sHgUjfFUg!zCH=g(lh;d0;(%b%L~U7gzT_X{oti>?h5?{H1X1ioW*scQJPZeMpb zfvtRsUBxQ#@P}jiL`@P^795_-LQXzKigdm#k!RLMZ=H=jSodGw6n7I|`V6&utcc;g z{sP#|Nrakn3-IN5B-ZlPJ)>O~77^P=*EmK5`pCkxvS`r7efNdddxXp>N>x3ro!?az zGI^K#ar#Kzw=6|F+K72z+}!ulq4r&wz$bAX`^PP2mL3H4^IoNEb)OM9sUtGEQKu4N zZR52S))-7n@;!`tWhVcScB(6~q3i`HJ0@E^jvv90y)+&%-8BqW4Fg8|$8hbXWcuk< z+0*R)+gqTTo@th9);C4$q|gczgJ0}go&m$=Iv?c|yDsl*-W&u>$XhyZ=WeW;LGfV1~cV#{XkWVH!De(VJu0xI! z0|=(_n(cheo})oQK+wKEwf{wyGqrWrSMjhnb<+J8XRa_oSiYYLS?p1Az4r!_9FY!L zM5-Ocwg-aFD?wvctT)^-LaAE;+y zlYQsw<~7&thgw^1x-UFMa%ThIj+1b}fo32#q?3^BnKByZLg)&5JM9uXWQs0iX|gu$ zB3Jf-A>J;kWM>^Me*+rdU-Fwl`!pXMF^LN zL~6JW!?a?VWju&qxp$N~-wMnKxA(>(<1kE#_0@h&o`WIiV|Vc8_ipP)2oR9ZPq2Sm z68-Cr2s2tkb$tT?!TbUfl)mnWy`izSp}8relc}St%cpO*?!D=@9VA90?)RIi}F}P=>xE{06XHiZzeMb_C*UkyeLhy#H$P% z7yU{W>RB;s{<^Y-cO@cTk*9B;`GlLvcx*!i+Tq`8C(TT1^1#!S6P|=5NdN9{OlR*n>un=QE_IoV zg$$TEdB6PV2it9~Tjmft^xW>h7^wf-S-ydygZyuH>c8BDFc)8w`paF=z6Q|0u&4h# z^c_uYoERDYbyk%5PeFAs4%o^sAyCLKYU_VU0lw7zpD|i(U7YMqjsIQqzX-FvFrHpD zeP1ePzx{uN*?*Kvg8yI8XH9Hu{->q?NzMJolG5=1g{7~c^Y51a8^rgIC8w?b0Q~-4 z@V_A({|Hv?{wLn??~?xwVE9MUV(;JJhJP3PZxQt$vFeNe8ejjXg8vzS{!!3#`Trms YDat^6dEmb=6c~`1FMmA0{@1tv1*Xazi~s-t literal 0 HcmV?d00001 diff --git a/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.symbols.nupkg b/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.symbols.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..95d919e1daa2afb56831450af141009da91598d9 GIT binary patch literal 106795 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 Date: Fri, 19 Feb 2021 21:43:40 +0800 Subject: [PATCH 02/33] getroleassignment --- .../AccessControl/GetAzureSynapseRoleAssignment.cs | 3 +-- .../AccessControl/NewAzureSynapseRoleAssignment.cs | 12 +++--------- .../Synapse/Models/SynapseAnalyticsRoleClient.cs | 6 +++--- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs index 3d445890a1d5..497ecbf0ff70 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs @@ -138,8 +138,7 @@ public override void ExecuteCmdlet() } else { - var roleAssignment = SynapseAnalyticsClient.ListRoleAssignments(this.RoleDefinitionId, this.ObjectId) - .Select(element => new PSRoleAssignmentDetails(element)); + var roleAssignment = SynapseAnalyticsClient.ListRoleAssignments(this.RoleDefinitionId, this.ObjectId).Value.Select(element => new PSRoleAssignmentDetails(element)); // TODO: Currently, when only `ObjectId` is specified, the cmdlet returns incorrect result. Filter from client side as a workaround if (!string.IsNullOrEmpty(this.ObjectId)) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index a6d123d68739..8dd81fdddf02 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -70,13 +70,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, - Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, - Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] - [ValidateNotNullOrEmpty] - public string RoleAssignmentId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, @@ -136,9 +129,10 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } - if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleAssignmentId, this.ObjectId))) + if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) { - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(this.RoleAssignmentId, this.RoleDefinitionId, this.ObjectId, this.Scope)); + string RoleAssignmentId = this.RoleDefinitionId + "-" + this.ObjectId; + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(RoleAssignmentId, this.RoleDefinitionId, this.ObjectId, this.Scope)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index 44db3b9c3b89..f9105b3c38cf 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -35,9 +35,9 @@ public SynapseAnalyticsRoleClient(string workspaceName, IAzureContext context) _activeDirectoryClient = new ActiveDirectoryClient(context); } - public IReadOnlyList ListRoleAssignments(string roleDefinitionId = null, string objectId = null, string continuationToken = null) + public RoleAssignmentDetailsList ListRoleAssignments(string roleDefinitionId = null, string objectId = null, string continuationToken = null) { - return (IReadOnlyList)_roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, continuationToken).Value; + return _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, continuationToken).Value; } public RoleAssignmentDetails GetRoleAssignmentById(string roleAssignmentId) @@ -64,7 +64,7 @@ public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId) public IReadOnlyList GetRoleDefinitions() { - return (IReadOnlyList)_roleDefinitionsClient.ListRoleDefinitions(); + return _roleDefinitionsClient.ListRoleDefinitions().Value; } public SynapseRoleDefinition GetRoleDefinitionById(string roleId) From d2fa90335ca1a93dcba652c6e67a9775c8ebd585 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Fri, 12 Mar 2021 11:03:50 +0800 Subject: [PATCH 03/33] refine parametersetname --- .../NewAzureSynapseRoleAssignment.cs | 24 ++++++++++--------- .../Models/SynapseAnalyticsRoleClient.cs | 1 - src/Synapse/Synapse/Synapse.csproj | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 8dd81fdddf02..aa8681778190 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -20,16 +20,18 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string NewByWorkspaceNameAndIdParameterSet = "NewByWorkspaceNameAndIdParameterSet"; private const string NewByWorkspaceObjectAndNameParameterSet = "NewByWorkspaceObjectAndNameParameterSet"; private const string NewByWorkspaceObjectAndIdParameterSet = "NewByWorkspaceObjectAndIdParameterSet"; - private const string NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet = "NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet"; - private const string NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet = "NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet"; + private const string NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet = "NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet"; + private const string NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet = "NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet"; private const string NewByWorkspaceNameAndServicePrincipalNameParameterSet = "NewByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string NewByWorkspaceObjectAndServicePrincipalNameParameterSet = "NewByWorkspaceObjectAndServicePrincipalNameParameterSet"; + private const string NewByWorkspaceNameAndScopeParameterSet = "NewByWorkspaceNameAndScopeParameterSet"; + private const string NewByWorkspaceObjectAndScopeParameterSet = "NewByWorkspaceObjectAndScopeParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -41,7 +43,7 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] - [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, + [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] @@ -63,9 +65,9 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } @@ -89,17 +91,17 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleAssignmentIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleAssignmentIdAndObjectIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndScopeParameterSet, Mandatory = true, HelpMessage = HelpMessages.Scope)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndIdParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndScopeParameterSet, Mandatory = true, HelpMessage = HelpMessages.Scope)] [ValidateNotNullOrEmpty] public string Scope { get; set; } @@ -132,7 +134,7 @@ public override void ExecuteCmdlet() if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) { string RoleAssignmentId = this.RoleDefinitionId + "-" + this.ObjectId; - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(RoleAssignmentId, this.RoleDefinitionId, this.ObjectId, this.Scope)); + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(RoleAssignmentId, this.RoleDefinitionId, this.ObjectId, this.Scope)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index f9105b3c38cf..f227579a74b5 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -47,7 +47,6 @@ public RoleAssignmentDetails GetRoleAssignmentById(string roleAssignmentId) public RoleAssignmentDetails CreateRoleAssignment(string roleAssignmentId, string RoleDefinitionId, string objectId, string scope) { - //RoleAssignmentOptions roleAssignmentOptions = new RoleAssignmentOptions(roleAssignmentId, objectId); return _roleAssignmentsClient.CreateRoleAssignment(roleAssignmentId, new Guid(RoleDefinitionId), new Guid(objectId), scope); } diff --git a/src/Synapse/Synapse/Synapse.csproj b/src/Synapse/Synapse/Synapse.csproj index 698bd5dc895a..7dc3c892dfd3 100644 --- a/src/Synapse/Synapse/Synapse.csproj +++ b/src/Synapse/Synapse/Synapse.csproj @@ -13,7 +13,7 @@ - + From 7197b83d15a0da282b4eac1bfe7907955e0733ac Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Mon, 15 Mar 2021 20:00:42 +0800 Subject: [PATCH 04/33] add scope to newroleassignment --- .../AccessControl/NewAzureSynapseRoleAssignment.cs | 4 +++- src/Synapse/Synapse/Synapse.csproj | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index aa8681778190..6bd0de52f07e 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -133,7 +133,9 @@ public override void ExecuteCmdlet() if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) { - string RoleAssignmentId = this.RoleDefinitionId + "-" + this.ObjectId; + int index = this.RoleDefinitionId.LastIndexOf("-"); + string RoleAssignmentId = this.RoleDefinitionId.Substring(0, index) + this.ObjectId.Substring(index); + //this.Scope = "Workspaces/zes0219test/linkedServices/zes0219test-WorkspaceDefaultSqlServer"; PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(RoleAssignmentId, this.RoleDefinitionId, this.ObjectId, this.Scope)); WriteObject(roleAssignmentDetails); } diff --git a/src/Synapse/Synapse/Synapse.csproj b/src/Synapse/Synapse/Synapse.csproj index 7fa4ca2bdb6b..29c46cfd650d 100644 --- a/src/Synapse/Synapse/Synapse.csproj +++ b/src/Synapse/Synapse/Synapse.csproj @@ -14,7 +14,7 @@ - + From 5487fc7a6682606da8691af2788bb2acf6beb0eb Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Mon, 15 Mar 2021 20:11:36 +0800 Subject: [PATCH 05/33] add list scope command --- src/Synapse/Synapse/Az.Synapse.psd1 | 2 +- .../AccessControl/GetAzureSynapseRoleScope.cs | 32 +++++++++++++++++++ .../Models/SynapseAnalyticsRoleClient.cs | 8 ++++- .../Synapse/Models/SynapseConstants.cs | 2 ++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs diff --git a/src/Synapse/Synapse/Az.Synapse.psd1 b/src/Synapse/Synapse/Az.Synapse.psd1 index 1a2621819003..8d1d54bf90db 100644 --- a/src/Synapse/Synapse/Az.Synapse.psd1 +++ b/src/Synapse/Synapse/Az.Synapse.psd1 @@ -123,7 +123,7 @@ CmdletsToExport = 'Get-AzSynapseSparkJob', 'Stop-AzSynapseSparkJob', 'Remove-AzSynapseFirewallRule', 'Get-AzSynapseFirewallRule', 'Update-AzSynapseFirewallRule', 'Get-AzSynapseRoleAssignment', 'New-AzSynapseRoleAssignment', 'Remove-AzSynapseRoleAssignment', - 'Get-AzSynapseRoleDefinition', 'Get-AzSynapseSqlDatabase', + 'Get-AzSynapseRoleDefinition', 'Get-AzSynapseRoleScope', 'Get-AzSynapseSqlDatabase', 'New-AzSynapseSqlDatabase', 'Remove-AzSynapseSqlDatabase', 'Update-AzSynapseSqlDatabase', 'Test-AzSynapseSqlDatabase', 'Disable-AzSynapseSqlPoolSensitivityRecommendation', diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs new file mode 100644 index 000000000000..6f97e44479b6 --- /dev/null +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs @@ -0,0 +1,32 @@ +using Microsoft.Azure.Commands.Common.Exceptions; +using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; +using Microsoft.Azure.Commands.Synapse.Common; +using Microsoft.Azure.Commands.Synapse.Models; +using Microsoft.Azure.Commands.Synapse.Properties; +using Microsoft.WindowsAzure.Commands.Utilities.Common; +using System; +using System.Linq; +using System.Management.Automation; + +namespace Microsoft.Azure.Commands.Synapse +{ + [Cmdlet(VerbsCommon.Get, ResourceManager.Common.AzureRMConstants.AzureRMPrefix + SynapseConstants.SynapsePrefix + SynapseConstants.RoleScope, + DefaultParameterSetName = GetByWorkspaceNameParameterSet)] + [OutputType(typeof(PSSynapseRole))] + public class GetAzureSynapseRoleScope : SynapseRoleCmdletBase + { + private const string GetByWorkspaceNameParameterSet = "GetByWorkspaceNameParameterSet"; + + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] + [ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")] + [ValidateNotNullOrEmpty] + public override string WorkspaceName { get; set; } + + public override void ExecuteCmdlet() + { + var roleScopes = SynapseAnalyticsClient.ListRoleScopes(); + WriteObject(roleScopes, true); + } + } +} diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index a425e5e7fae8..e51d049081bc 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -57,10 +57,16 @@ public void DeleteRoleAssignmentById(string roleAssignmentId) public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId) { - string roleAssignmentId = roleDefinitionId + "-" + objectId; + int index = roleDefinitionId.LastIndexOf("-"); + string roleAssignmentId = roleDefinitionId.Substring(0, index) + objectId.Substring(index); _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } + public IReadOnlyList ListRoleScopes() + { + return _roleDefinitionsClient.ListScopes().Value; + } + public IReadOnlyList GetRoleDefinitions() { return _roleDefinitionsClient.ListRoleDefinitions().Value; diff --git a/src/Synapse/Synapse/Models/SynapseConstants.cs b/src/Synapse/Synapse/Models/SynapseConstants.cs index f387156cef61..9d15396a0d3c 100644 --- a/src/Synapse/Synapse/Models/SynapseConstants.cs +++ b/src/Synapse/Synapse/Models/SynapseConstants.cs @@ -72,6 +72,8 @@ public static class SynapseConstants public const string RoleDefinition = nameof(RoleDefinition); + public const string RoleScope = nameof(RoleScope); + public const string SparkDotNetJarFile = "local:///usr/hdp/current/spark2-client/jars/microsoft-spark.jar"; public const string SparkDotNetClassName = "org.apache.spark.deploy.dotnet.DotnetRunner"; From 0d10f4761158a221ea04fc0d3b2f9fa106360b4e Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 16 Mar 2021 11:52:32 +0800 Subject: [PATCH 06/33] refine new-azuresynapseroleassignment --- .../AccessControl/NewAzureSynapseRoleAssignment.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 6bd0de52f07e..d40375122734 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -99,9 +99,9 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndScopeParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.Scope)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndScopeParameterSet, + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.Scope)] [ValidateNotNullOrEmpty] public string Scope { get; set; } @@ -131,7 +131,12 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } - if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) + //if (this.IsParameterBound(c => c.Scope)) + //{ + // this.Scope = this.Scope; + //} + + if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId, this.Scope))) { int index = this.RoleDefinitionId.LastIndexOf("-"); string RoleAssignmentId = this.RoleDefinitionId.Substring(0, index) + this.ObjectId.Substring(index); From f41287686b21c7e1aaaca2d25ba099012ebae0a6 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 16 Mar 2021 20:21:32 +0800 Subject: [PATCH 07/33] add Itemtype and Item --- .../NewAzureSynapseRoleAssignment.cs | 44 ++++++++++++++----- src/Synapse/Synapse/Common/HelpMessages.cs | 4 ++ .../Synapse/Properties/Resources.Designer.cs | 9 ++++ src/Synapse/Synapse/Properties/Resources.resx | 3 ++ 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index d40375122734..081a430db3af 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -6,6 +6,7 @@ using Microsoft.WindowsAzure.Commands.Utilities.Common; using System; using System.Collections.Generic; +using System.Globalization; using System.Management.Automation; using System.Text; @@ -24,8 +25,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet = "NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet"; private const string NewByWorkspaceNameAndServicePrincipalNameParameterSet = "NewByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string NewByWorkspaceObjectAndServicePrincipalNameParameterSet = "NewByWorkspaceObjectAndServicePrincipalNameParameterSet"; - private const string NewByWorkspaceNameAndScopeParameterSet = "NewByWorkspaceNameAndScopeParameterSet"; - private const string NewByWorkspaceObjectAndScopeParameterSet = "NewByWorkspaceObjectAndScopeParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -100,12 +99,26 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase public string ObjectId { get; set; } [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, - Mandatory = true, HelpMessage = HelpMessages.Scope)] + Mandatory = false, HelpMessage = HelpMessages.Scope)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, - Mandatory = true, HelpMessage = HelpMessages.Scope)] + Mandatory = false, HelpMessage = HelpMessages.Scope)] [ValidateNotNullOrEmpty] public string Scope { get; set; } + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItemType)] + [ValidateNotNullOrEmpty] + public string ItemType { get; set; } + + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItem)] + [ValidateNotNullOrEmpty] + public string Item { get; set; } + [Parameter(Mandatory = false, HelpMessage = HelpMessages.AsJob)] public SwitchParameter AsJob { get; set; } @@ -131,17 +144,24 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } - //if (this.IsParameterBound(c => c.Scope)) - //{ - // this.Scope = this.Scope; - //} + if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) + { + this.Scope = "workspaces/" + this.WorkspaceName + "/" + this.ItemType + "/" + this.Item; + } + + if ((this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item)) || (!this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item))) + { + throw new ArgumentException(Resources.NeedItemTypeOrItem); + } - if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId, this.Scope))) + if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) { int index = this.RoleDefinitionId.LastIndexOf("-"); - string RoleAssignmentId = this.RoleDefinitionId.Substring(0, index) + this.ObjectId.Substring(index); - //this.Scope = "Workspaces/zes0219test/linkedServices/zes0219test-WorkspaceDefaultSqlServer"; - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(RoleAssignmentId, this.RoleDefinitionId, this.ObjectId, this.Scope)); + Guid RoleAssignmentId = Guid.NewGuid(); + if (string.IsNullOrEmpty(this.Scope)) { + this.Scope = "workspaces/" + this.WorkspaceName; + } + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(RoleAssignmentId.ToString(), this.RoleDefinitionId, this.ObjectId, this.Scope)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index bc699b7d9bae..303f7b1d0eef 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -265,6 +265,10 @@ SELECT on dbo.myTable by public public const string RoleDefinitionId = "Id of the Role that is assigned to the principal."; + public const string RoleAssignmentItemType = "Item type of the Role that is assigned to the principal."; + + public const string RoleAssignmentItem = "Item of the Role that is assigned to the principal."; + public const string RoleDefinitionName = "Name of the Role that is assigned to the principal."; public const string PrincipalId = "The Azure AD ObjectId of the User, Group or Service Principal."; diff --git a/src/Synapse/Synapse/Properties/Resources.Designer.cs b/src/Synapse/Synapse/Properties/Resources.Designer.cs index 750a79c12bce..e21922d6acde 100644 --- a/src/Synapse/Synapse/Properties/Resources.Designer.cs +++ b/src/Synapse/Synapse/Properties/Resources.Designer.cs @@ -765,6 +765,15 @@ internal static string NeedIntegrationRuntimeType { } } + /// + /// Looks up a localized string similar to Pramater 'ItemType' and 'Item' must be provided together when creating new role assigment.. + /// + internal static string NeedItemTypeOrItem { + get { + return ResourceManager.GetString("NeedItemTypeOrItem", resourceCulture); + } + } + /// /// Looks up a localized string similar to Please provide valid value for StorageAccountName or BlobStorageSasUri parameter.. /// diff --git a/src/Synapse/Synapse/Properties/Resources.resx b/src/Synapse/Synapse/Properties/Resources.resx index 8f4bcbae688d..53a7deeb8d91 100644 --- a/src/Synapse/Synapse/Properties/Resources.resx +++ b/src/Synapse/Synapse/Properties/Resources.resx @@ -370,6 +370,9 @@ Are you sure you want to continue? Pramater 'Type' must be provided when creating new integration runtime. + + Pramater 'ItemType' and 'Item' must be provided together when creating new role assigment. + Updating the authentication key of linked integration runtime '{0}' is not allowed. From e7871963c06f9a57f3a3a4be7ea81d589c9a1ccf Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Fri, 19 Mar 2021 19:34:54 +0800 Subject: [PATCH 08/33] refine newAzureSynapseRoleAssignment --- .../AccessControl/GetAzureSynapseRoleScope.cs | 25 ++++ .../NewAzureSynapseRoleAssignment.cs | 76 ++++++---- .../RemoveAzureSynapseRoleAssignment.cs | 26 ---- src/Synapse/Synapse/Common/HelpMessages.cs | 4 +- .../Synapse/Models/PSRoleAssignmentDetails.cs | 4 +- src/Synapse/Synapse/Models/PSSynapseRole.cs | 6 +- .../Models/SynapseAnalyticsRoleClient.cs | 7 - .../Synapse/Properties/Resources.Designer.cs | 9 -- src/Synapse/Synapse/Properties/Resources.resx | 3 - src/Synapse/Synapse/Synapse.csproj | 4 +- .../help/Remove-AzSynapseRoleAssignment.md | 137 +----------------- 11 files changed, 82 insertions(+), 219 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs index 6f97e44479b6..447ae0eeb5a2 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs @@ -3,6 +3,7 @@ using Microsoft.Azure.Commands.Synapse.Common; using Microsoft.Azure.Commands.Synapse.Models; using Microsoft.Azure.Commands.Synapse.Properties; +using Microsoft.Azure.Management.Internal.Resources.Utilities.Models; using Microsoft.WindowsAzure.Commands.Utilities.Common; using System; using System.Linq; @@ -16,6 +17,7 @@ namespace Microsoft.Azure.Commands.Synapse public class GetAzureSynapseRoleScope : SynapseRoleCmdletBase { private const string GetByWorkspaceNameParameterSet = "GetByWorkspaceNameParameterSet"; + private const string GetByWorkspaceObjectParameterSet = "GetByWorkspaceObjectParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -23,8 +25,31 @@ public class GetAzureSynapseRoleScope : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public override string WorkspaceName { get; set; } + [Parameter(ValueFromPipeline = true, ParameterSetName = GetByWorkspaceObjectParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] + [ValidateNotNull] + public PSSynapseWorkspace WorkspaceObject { get; set; } + + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentResourceId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentResourceId)] + [ValidateNotNullOrEmpty] + public string ResourceId { get; set; } + public override void ExecuteCmdlet() { + if (this.IsParameterBound(c => c.ResourceId)) + { + var resourceIdentifier = new ResourceIdentifier(this.ResourceId); + this.WorkspaceName = resourceIdentifier.ResourceName; + } + + if (this.IsParameterBound(c => c.WorkspaceObject)) + { + this.WorkspaceName = this.WorkspaceObject.Name; + } + var roleScopes = SynapseAnalyticsClient.ListRoleScopes(); WriteObject(roleScopes, true); } diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 081a430db3af..0b19e7bd94fb 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -25,6 +25,8 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet = "NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet"; private const string NewByWorkspaceNameAndServicePrincipalNameParameterSet = "NewByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string NewByWorkspaceObjectAndServicePrincipalNameParameterSet = "NewByWorkspaceObjectAndServicePrincipalNameParameterSet"; + private const string NewByWorkspaceNameAndItemParameterSet = "NewByWorkspaceNameAndItemParameterSet"; + private const string NewByWorkspaceObjectAndItemParameterSet = "NewByWorkspaceObjectAndItemParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -34,6 +36,8 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")] [ValidateNotNullOrEmpty] public override string WorkspaceName { get; set; } @@ -46,6 +50,8 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] + [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [ValidateNotNull] public PSSynapseWorkspace WorkspaceObject { get; set; } @@ -61,6 +67,10 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } @@ -68,6 +78,10 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } @@ -75,6 +89,10 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.SignInName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Alias("Email", "UserPrincipalName")] [ValidateNotNullOrEmpty] public string SignInName { get; set; } @@ -83,6 +101,10 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [ValidateNotNullOrEmpty] public string ServicePrincipalName { get; set; } @@ -94,28 +116,28 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, - Mandatory = false, HelpMessage = HelpMessages.Scope)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, - Mandatory = false, HelpMessage = HelpMessages.Scope)] - [ValidateNotNullOrEmpty] - public string Scope { get; set; } - - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItemType)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItemType)] [ValidateNotNullOrEmpty] + [ValidateSet("bigDataPools", "integrationRuntimes", "linkedServices", "credentials")] + //[ValidateSet("Apache Spark pool", "Integration runtime", "Linked service", "Credential")] + [PSArgumentCompleter("bigDataPools", "integrationRuntimes", "linkedServices", "credentials")] public string ItemType { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItem)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } @@ -144,24 +166,18 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } - if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) - { - this.Scope = "workspaces/" + this.WorkspaceName + "/" + this.ItemType + "/" + this.Item; - } - - if ((this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item)) || (!this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item))) - { - throw new ArgumentException(Resources.NeedItemTypeOrItem); - } - if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) { - int index = this.RoleDefinitionId.LastIndexOf("-"); - Guid RoleAssignmentId = Guid.NewGuid(); - if (string.IsNullOrEmpty(this.Scope)) { - this.Scope = "workspaces/" + this.WorkspaceName; + Guid roleAssignmentId = Guid.NewGuid(); + string scope; + if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) + { + scope = "workspaces/" + this.WorkspaceName + "/" + this.ItemType + "/" + this.Item; + } else { + scope = "workspaces/" + this.WorkspaceName; } - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(RoleAssignmentId.ToString(), this.RoleDefinitionId, this.ObjectId, this.Scope)); + + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId.ToString(), this.RoleDefinitionId, this.ObjectId, scope)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs index 0c14063f5e3e..7fab169dbee6 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs @@ -133,32 +133,6 @@ public override void ExecuteCmdlet() } } } - else - { - if (this.IsParameterBound(c => c.RoleDefinitionName)) - { - this.RoleDefinitionId = SynapseAnalyticsClient.GetRoleDefinitionIdFromRoleDefinitionName(this.RoleDefinitionName); - } - - if (this.IsParameterBound(c => c.SignInName)) - { - this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromSignInName(this.SignInName); - } - - if (this.IsParameterBound(c => c.ServicePrincipalName)) - { - this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); - } - - if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.RemovingSynapseRoleAssignment, this.RoleDefinitionId, this.ObjectId, this.WorkspaceName))) - { - SynapseAnalyticsClient.DeleteRoleAssignmentByName(this.RoleDefinitionId, this.ObjectId); - if (PassThru) - { - WriteObject(true); - } - } - } } } } diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index 303f7b1d0eef..7912161aaf89 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -265,10 +265,12 @@ SELECT on dbo.myTable by public public const string RoleDefinitionId = "Id of the Role that is assigned to the principal."; - public const string RoleAssignmentItemType = "Item type of the Role that is assigned to the principal."; + public const string RoleAssignmentItemType = "Item type of the role assignment:'bigDataPools', 'integrationRuntimes', 'linkedServices', 'credentials'."; public const string RoleAssignmentItem = "Item of the Role that is assigned to the principal."; + public const string RoleAssignmentResourceId = "ResourceId of the role assignment."; + public const string RoleDefinitionName = "Name of the Role that is assigned to the principal."; public const string PrincipalId = "The Azure AD ObjectId of the User, Group or Service Principal."; diff --git a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs index fa515081894f..7ab8bf669a2a 100644 --- a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs +++ b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs @@ -11,8 +11,8 @@ public class PSRoleAssignmentDetails public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) { this.RoleAssignmentId = roleAssignmentDetails.Id; - this.RoleDefinitionId = roleAssignmentDetails.RoleDefinitionId.ToString(); - this.ObjectId = roleAssignmentDetails.PrincipalId.ToString(); + this.RoleDefinitionId = roleAssignmentDetails.RoleDefinitionId?.ToString(); + this.ObjectId = roleAssignmentDetails.PrincipalId?.ToString(); } public string RoleAssignmentId { get; set; } diff --git a/src/Synapse/Synapse/Models/PSSynapseRole.cs b/src/Synapse/Synapse/Models/PSSynapseRole.cs index cf9a523374c0..ed7b2eab4c81 100644 --- a/src/Synapse/Synapse/Models/PSSynapseRole.cs +++ b/src/Synapse/Synapse/Models/PSSynapseRole.cs @@ -9,15 +9,15 @@ public class PSSynapseRole { public PSSynapseRole(SynapseRoleDefinition synapseRole) { - this.Id = synapseRole.Id.ToString(); + this.Id = synapseRole.Id?.ToString(); this.Name = synapseRole.Name; - this.IsBuiltIn = synapseRole.IsBuiltIn; + this.IsBuiltIn = synapseRole.IsBuiltIn.Value; } public string Id { get; set; } public string Name { get; set; } - public bool? IsBuiltIn { get; set; } + public bool IsBuiltIn { get; set; } } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index e51d049081bc..bb85cf22c2c0 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -55,13 +55,6 @@ public void DeleteRoleAssignmentById(string roleAssignmentId) _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } - public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId) - { - int index = roleDefinitionId.LastIndexOf("-"); - string roleAssignmentId = roleDefinitionId.Substring(0, index) + objectId.Substring(index); - _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); - } - public IReadOnlyList ListRoleScopes() { return _roleDefinitionsClient.ListScopes().Value; diff --git a/src/Synapse/Synapse/Properties/Resources.Designer.cs b/src/Synapse/Synapse/Properties/Resources.Designer.cs index e21922d6acde..750a79c12bce 100644 --- a/src/Synapse/Synapse/Properties/Resources.Designer.cs +++ b/src/Synapse/Synapse/Properties/Resources.Designer.cs @@ -765,15 +765,6 @@ internal static string NeedIntegrationRuntimeType { } } - /// - /// Looks up a localized string similar to Pramater 'ItemType' and 'Item' must be provided together when creating new role assigment.. - /// - internal static string NeedItemTypeOrItem { - get { - return ResourceManager.GetString("NeedItemTypeOrItem", resourceCulture); - } - } - /// /// Looks up a localized string similar to Please provide valid value for StorageAccountName or BlobStorageSasUri parameter.. /// diff --git a/src/Synapse/Synapse/Properties/Resources.resx b/src/Synapse/Synapse/Properties/Resources.resx index 53a7deeb8d91..8f4bcbae688d 100644 --- a/src/Synapse/Synapse/Properties/Resources.resx +++ b/src/Synapse/Synapse/Properties/Resources.resx @@ -370,9 +370,6 @@ Are you sure you want to continue? Pramater 'Type' must be provided when creating new integration runtime. - - Pramater 'ItemType' and 'Item' must be provided together when creating new role assigment. - Updating the authentication key of linked integration runtime '{0}' is not allowed. diff --git a/src/Synapse/Synapse/Synapse.csproj b/src/Synapse/Synapse/Synapse.csproj index 29c46cfd650d..a28485b6b9ee 100644 --- a/src/Synapse/Synapse/Synapse.csproj +++ b/src/Synapse/Synapse/Synapse.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md index 91b57d8d8cd1..f400565b1687 100644 --- a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md @@ -12,71 +12,18 @@ Deletes a Synapse Analytics role assignment. ## SYNTAX -### RemoveByWorkspaceNameAndNameParameterSet (Default) -``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName - [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] -``` - -### RemoveByWorkspaceNameAndIdParameterSet +### RemoveByWorkspaceNameAndIdParameterSet (Default) ``` Remove-AzSynapseRoleAssignment -WorkspaceName -RoleAssignmentId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` -### RemoveByWorkspaceNameAndObjectIdParameterSet -``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId - [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] -``` - -### RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet -``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId - [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] -``` - -### RemoveByWorkspaceNameAndServicePrincipalNameParameterSet -``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName - -ServicePrincipalName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] - [-Confirm] [] -``` - ### RemoveByWorkspaceObjectAndIdParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleAssignmentId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` -### RemoveByWorkspaceObjectAndNameParameterSet -``` -Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -SignInName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] -``` - -### RemoveByWorkspaceObjectAndObjectIdParameterSet -``` -Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ObjectId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] -``` - -### RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet -``` -Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId - -ObjectId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] -``` - -### RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet -``` -Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ServicePrincipalName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] - [-Confirm] [] -``` - ## DESCRIPTION The **Remove-AzSynapseRoleAssignment** cmdlet permanently deletes an Azure Synapse Analytics role assignment. @@ -91,13 +38,6 @@ This command deletes an Azure Synapse Analytics role assignment with a role assi ### Example 2 ```powershell -PS C:\> Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentName ContosoRole -SignInName ContosoName -``` - -This command deletes an Azure Synapse Analytics role assignment with a role name and a user principal name. - -### Example 3 -```powershell PS C:\> $ws = Get-AzSynapseWorkspace -Name ContosoWorkspace PS C:\> $ws | Remove-AzSynapseRoleAssignment -RoleAssignmentId ContosoRoleAssignmentId ``` @@ -136,21 +76,6 @@ Accept pipeline input: False Accept wildcard characters: False ``` -### -ObjectId -The Azure AD ObjectId of the User, Group or Service Principal. - -```yaml -Type: System.String -Parameter Sets: RemoveByWorkspaceNameAndObjectIdParameterSet, RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, RemoveByWorkspaceObjectAndObjectIdParameterSet, RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet -Aliases: Id, PrincipalId - -Required: True -Position: Named -Default value: None -Accept pipeline input: False -Accept wildcard characters: False -``` - ### -PassThru This Cmdlet does not return an object by default. If this switch is specified, it returns true if successful. @@ -182,66 +107,6 @@ Accept pipeline input: False Accept wildcard characters: False ``` -### -RoleDefinitionId -Id of the Role that is assigned to the principal. - -```yaml -Type: System.String -Parameter Sets: RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet -Aliases: - -Required: True -Position: Named -Default value: None -Accept pipeline input: False -Accept wildcard characters: False -``` - -### -RoleDefinitionName -Name of the Role that is assigned to the principal. - -```yaml -Type: System.String -Parameter Sets: RemoveByWorkspaceNameAndNameParameterSet, RemoveByWorkspaceNameAndObjectIdParameterSet, RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, RemoveByWorkspaceObjectAndNameParameterSet, RemoveByWorkspaceObjectAndObjectIdParameterSet, RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet -Aliases: - -Required: True -Position: Named -Default value: None -Accept pipeline input: False -Accept wildcard characters: False -``` - -### -ServicePrincipalName -The ServicePrincipalName of the service principal. - -```yaml -Type: System.String -Parameter Sets: RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet -Aliases: - -Required: True -Position: Named -Default value: None -Accept pipeline input: False -Accept wildcard characters: False -``` - -### -SignInName -The email address or the user principal name of the user. - -```yaml -Type: System.String -Parameter Sets: RemoveByWorkspaceNameAndNameParameterSet, RemoveByWorkspaceObjectAndNameParameterSet -Aliases: Email, UserPrincipalName - -Required: True -Position: Named -Default value: None -Accept pipeline input: False -Accept wildcard characters: False -``` - ### -WorkspaceName Name of Synapse workspace. From df14f92d4fd04bf2c990ef483998a022d5adf6ff Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Fri, 19 Mar 2021 19:56:42 +0800 Subject: [PATCH 09/33] remove unnecessary feeds --- ....AccessControl.1.0.0-betazesluotest.1.nupkg | Bin 62676 -> 0 bytes ...ontrol.1.0.0-betazesluotest.1.symbols.nupkg | Bin 106795 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.nupkg delete mode 100644 tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.symbols.nupkg diff --git a/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.nupkg b/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.nupkg deleted file mode 100644 index 132158e00a9a5c0dad5209c5f086f2b531f88ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62676 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 YDat^6dEmb=6c~`1FMmA0{@1tv1*Xazi~s-t diff --git a/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.symbols.nupkg b/tools/LocalFeed/Azure.Analytics.Synapse.AccessControl.1.0.0-betazesluotest.1.symbols.nupkg deleted file mode 100644 index 95d919e1daa2afb56831450af141009da91598d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106795 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 Date: Tue, 23 Mar 2021 17:01:55 +0800 Subject: [PATCH 10/33] refine deleteroleassignmentid --- .../NewAzureSynapseRoleAssignment.cs | 24 ++- .../RemoveAzureSynapseRoleAssignment.cs | 26 ++++ .../Models/SynapseAnalyticsRoleClient.cs | 7 + .../help/Remove-AzSynapseRoleAssignment.md | 138 +++++++++++++++++- 4 files changed, 190 insertions(+), 5 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 0b19e7bd94fb..6003a17b5778 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -129,9 +129,8 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItemType)] [ValidateNotNullOrEmpty] - [ValidateSet("bigDataPools", "integrationRuntimes", "linkedServices", "credentials")] - //[ValidateSet("Apache Spark pool", "Integration runtime", "Linked service", "Credential")] - [PSArgumentCompleter("bigDataPools", "integrationRuntimes", "linkedServices", "credentials")] + [ValidateSet("Apache Spark pool", "Integration runtime", "Linked service", "Credential")] + [PSArgumentCompleter("Apache Spark pool", "Integration runtime", "Linked service", "Credential")] public string ItemType { get; set; } [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, @@ -172,7 +171,24 @@ public override void ExecuteCmdlet() string scope; if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) { - scope = "workspaces/" + this.WorkspaceName + "/" + this.ItemType + "/" + this.Item; + string itemType = ""; + switch (this.ItemType) + { + case "Apache Spark pool": + itemType = "bigDataPools"; + break; + case "Integration runtime": + itemType = "integrationRuntimes"; + break; + case "Linked service": + itemType = "linkedServices"; + break; + case "Credential": + itemType = "credentials"; + break; + } + + scope = "workspaces/" + this.WorkspaceName + "/" + itemType + "/" + this.Item; } else { scope = "workspaces/" + this.WorkspaceName; } diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs index 7fab169dbee6..0c14063f5e3e 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs @@ -133,6 +133,32 @@ public override void ExecuteCmdlet() } } } + else + { + if (this.IsParameterBound(c => c.RoleDefinitionName)) + { + this.RoleDefinitionId = SynapseAnalyticsClient.GetRoleDefinitionIdFromRoleDefinitionName(this.RoleDefinitionName); + } + + if (this.IsParameterBound(c => c.SignInName)) + { + this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromSignInName(this.SignInName); + } + + if (this.IsParameterBound(c => c.ServicePrincipalName)) + { + this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); + } + + if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.RemovingSynapseRoleAssignment, this.RoleDefinitionId, this.ObjectId, this.WorkspaceName))) + { + SynapseAnalyticsClient.DeleteRoleAssignmentByName(this.RoleDefinitionId, this.ObjectId); + if (PassThru) + { + WriteObject(true); + } + } + } } } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index bb85cf22c2c0..dc6a53195f16 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -55,6 +55,13 @@ public void DeleteRoleAssignmentById(string roleAssignmentId) _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } + public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId) + { + var roleAssignment = _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, null).Value.Value.Select(element => new PSRoleAssignmentDetails(element)); + string roleAssignmentId = roleAssignment.SingleOrDefault().RoleAssignmentId; + _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); + } + public IReadOnlyList ListRoleScopes() { return _roleDefinitionsClient.ListScopes().Value; diff --git a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md index f400565b1687..bfd9edb9f53f 100644 --- a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md @@ -12,18 +12,72 @@ Deletes a Synapse Analytics role assignment. ## SYNTAX +### RemoveByWorkspaceNameAndNameParameterSet (Default) +``` +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName + [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ### RemoveByWorkspaceNameAndIdParameterSet (Default) ``` + +### RemoveByWorkspaceNameAndIdParameterSet +``` Remove-AzSynapseRoleAssignment -WorkspaceName -RoleAssignmentId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` +### RemoveByWorkspaceNameAndObjectIdParameterSet +``` +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId + [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] +``` + +### RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet +``` +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId + [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] +``` + +### RemoveByWorkspaceNameAndServicePrincipalNameParameterSet +``` +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName + -ServicePrincipalName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] + [-Confirm] [] +``` + ### RemoveByWorkspaceObjectAndIdParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleAssignmentId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` +### RemoveByWorkspaceObjectAndNameParameterSet +``` +Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName + -SignInName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + [] +``` + +### RemoveByWorkspaceObjectAndObjectIdParameterSet +``` +Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName + -ObjectId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + [] +``` + +### RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet +``` +Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId + -ObjectId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + [] +``` + +### RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet +``` +Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName + -ServicePrincipalName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] + [-Confirm] [] +``` + ## DESCRIPTION The **Remove-AzSynapseRoleAssignment** cmdlet permanently deletes an Azure Synapse Analytics role assignment. @@ -38,6 +92,13 @@ This command deletes an Azure Synapse Analytics role assignment with a role assi ### Example 2 ```powershell +PS C:\> Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentName ContosoRole -SignInName ContosoName +``` + +This command deletes an Azure Synapse Analytics role assignment with a role name and a user principal name. + +### Example 3 +```powershell PS C:\> $ws = Get-AzSynapseWorkspace -Name ContosoWorkspace PS C:\> $ws | Remove-AzSynapseRoleAssignment -RoleAssignmentId ContosoRoleAssignmentId ``` @@ -76,6 +137,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ObjectId +The Azure AD ObjectId of the User, Group or Service Principal. + +```yaml +Type: System.String +Parameter Sets: RemoveByWorkspaceNameAndObjectIdParameterSet, RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, RemoveByWorkspaceObjectAndObjectIdParameterSet, RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet +Aliases: Id, PrincipalId + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -PassThru This Cmdlet does not return an object by default. If this switch is specified, it returns true if successful. @@ -107,6 +183,66 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -RoleDefinitionId +Id of the Role that is assigned to the principal. + +```yaml +Type: System.String +Parameter Sets: RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -RoleDefinitionName +Name of the Role that is assigned to the principal. + +```yaml +Type: System.String +Parameter Sets: RemoveByWorkspaceNameAndNameParameterSet, RemoveByWorkspaceNameAndObjectIdParameterSet, RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, RemoveByWorkspaceObjectAndNameParameterSet, RemoveByWorkspaceObjectAndObjectIdParameterSet, RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ServicePrincipalName +The ServicePrincipalName of the service principal. + +```yaml +Type: System.String +Parameter Sets: RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -SignInName +The email address or the user principal name of the user. + +```yaml +Type: System.String +Parameter Sets: RemoveByWorkspaceNameAndNameParameterSet, RemoveByWorkspaceObjectAndNameParameterSet +Aliases: Email, UserPrincipalName + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -WorkspaceName Name of Synapse workspace. @@ -181,4 +317,4 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable ## NOTES -## RELATED LINKS +## RELATED LINKS \ No newline at end of file From 84236ef7de5f4ce4b0125baf241ed4bb97bc2421 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 23 Mar 2021 17:04:20 +0800 Subject: [PATCH 11/33] refine resourceid name --- .../AccessControl/GetAzureSynapseRoleScope.cs | 4 ++-- src/Synapse/Synapse/Common/HelpMessages.cs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs index 447ae0eeb5a2..c2b6afdaa5be 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleScope.cs @@ -31,9 +31,9 @@ public class GetAzureSynapseRoleScope : SynapseRoleCmdletBase public PSSynapseWorkspace WorkspaceObject { get; set; } [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentResourceId)] + Mandatory = false, HelpMessage = HelpMessages.WorkspaceResourceId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentResourceId)] + Mandatory = false, HelpMessage = HelpMessages.WorkspaceResourceId)] [ValidateNotNullOrEmpty] public string ResourceId { get; set; } diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index 7912161aaf89..b0b556989568 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -269,8 +269,6 @@ SELECT on dbo.myTable by public public const string RoleAssignmentItem = "Item of the Role that is assigned to the principal."; - public const string RoleAssignmentResourceId = "ResourceId of the role assignment."; - public const string RoleDefinitionName = "Name of the Role that is assigned to the principal."; public const string PrincipalId = "The Azure AD ObjectId of the User, Group or Service Principal."; From 6a3ca26df05bd31d71442ba2f70e123c8c38d559 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Wed, 31 Mar 2021 13:31:39 +0800 Subject: [PATCH 12/33] improve remove and getroleassignments --- .../GetAzureSynapseRoleAssignment.cs | 87 ++++++++++++++++++- .../NewAzureSynapseRoleAssignment.cs | 29 ++++--- .../RemoveAzureSynapseRoleAssignment.cs | 75 +++++++++++++++- src/Synapse/Synapse/Common/HelpMessages.cs | 12 ++- .../Synapse/Models/PSRoleAssignmentDetails.cs | 3 + .../Models/SynapseAnalyticsRoleClient.cs | 25 ++++-- src/Synapse/Synapse/Models/SynaspeEnums.cs | 18 ++++ .../Synapse/Properties/Resources.Designer.cs | 18 ++++ src/Synapse/Synapse/Properties/Resources.resx | 6 ++ 9 files changed, 240 insertions(+), 33 deletions(-) create mode 100644 src/Synapse/Synapse/Models/SynaspeEnums.cs diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs index 497ecbf0ff70..4f8ccc137689 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs @@ -1,4 +1,5 @@ using Azure.Analytics.Synapse.AccessControl; +using Microsoft.Azure.Commands.Common.Exceptions; using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; using Microsoft.Azure.Commands.Synapse.Common; using Microsoft.Azure.Commands.Synapse.Models; @@ -26,6 +27,8 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string GetByWorkspaceObjectAndAssignmentIdParameterSet = "GetByWorkspaceObjectAndAssignmentIdParameterSet"; private const string GetByWorkspaceNameAndServicePrincipalNameParameterSet = "GetByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string GetByWorkspaceObjectAndServicePrincipalNameParameterSet = "GetByWorkspaceObjectAndServicePrincipalNameParameterSet"; + private const string GetByWorkspaceNameAndItemParameterSet = "GetByWorkspaceNameAndItemParameterSet"; + private const string GetByWorkspaceObjectAndItemParameterSet = "GetByWorkspaceObjectAndItemParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -37,6 +40,8 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")] [ValidateNotNullOrEmpty] public override string WorkspaceName { get; set; } @@ -51,6 +56,8 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [ValidateNotNull] public PSSynapseWorkspace WorkspaceObject { get; set; } @@ -58,6 +65,10 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndAssignmentIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] [ValidateNotNullOrEmpty] public string RoleAssignmentId { get; set; } @@ -73,6 +84,10 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } @@ -80,6 +95,10 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } @@ -87,6 +106,10 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.SignInName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Alias("Email", "UserPrincipalName")] [ValidateNotNullOrEmpty] public string SignInName { get; set; } @@ -95,6 +118,10 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [ValidateNotNullOrEmpty] public string ServicePrincipalName { get; set; } @@ -106,10 +133,28 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] + [ValidateNotNullOrEmpty] + public SynaspeEnums.WorkspaceItemType ItemType { get; set; } + + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [ValidateNotNullOrEmpty] + public string Item { get; set; } + public override void ExecuteCmdlet() { if (this.IsParameterBound(c => c.WorkspaceObject)) @@ -138,12 +183,46 @@ public override void ExecuteCmdlet() } else { - var roleAssignment = SynapseAnalyticsClient.ListRoleAssignments(this.RoleDefinitionId, this.ObjectId).Value.Select(element => new PSRoleAssignmentDetails(element)); + string scope = null; + string itemType = null; + + if (this.IsParameterBound(c => c.ItemType)) + { + switch (this.ItemType) + { + case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: + itemType = "bigDataPools"; + break; + case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: + itemType = "integrationRuntimes"; + break; + case SynaspeEnums.WorkspaceItemType.LinkedService: + itemType = "linkedServices"; + break; + case SynaspeEnums.WorkspaceItemType.Credential: + itemType = "credentials"; + break; + } + + if (this.IsParameterBound(c => c.Item)) + { + scope = "workspaces/" + this.WorkspaceName + "/" + itemType + "/" + this.Item; + } + else + { + scope = null; + } + } + else + { + scope = null; + } + + var roleAssignment = SynapseAnalyticsClient.ListRoleAssignments(this.RoleDefinitionId, this.ObjectId, scope).Select(element => new PSRoleAssignmentDetails(element)); - // TODO: Currently, when only `ObjectId` is specified, the cmdlet returns incorrect result. Filter from client side as a workaround - if (!string.IsNullOrEmpty(this.ObjectId)) + if (!string.IsNullOrEmpty(itemType) && string.IsNullOrEmpty(this.Item)) { - roleAssignment = roleAssignment.Where(element => element.ObjectId == this.ObjectId); + roleAssignment = roleAssignment.Where(element => element.Scope == "workspaces/" + this.WorkspaceName || element.Scope.StartsWith("workspaces/" + this.WorkspaceName + '/' + itemType)); } WriteObject(roleAssignment, true); diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 6003a17b5778..1f778b5c9faa 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -125,18 +125,16 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase public string ObjectId { get; set; } [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItemType)] + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItemType)] + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] - [ValidateSet("Apache Spark pool", "Integration runtime", "Linked service", "Credential")] - [PSArgumentCompleter("Apache Spark pool", "Integration runtime", "Linked service", "Credential")] - public string ItemType { get; set; } + public SynaspeEnums.WorkspaceItemType ItemType { get; set; } [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItem)] + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentItem)] + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } @@ -168,28 +166,31 @@ public override void ExecuteCmdlet() if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) { Guid roleAssignmentId = Guid.NewGuid(); - string scope; + string scope = null; + string itemType = null; + if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) { - string itemType = ""; switch (this.ItemType) { - case "Apache Spark pool": + case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: itemType = "bigDataPools"; break; - case "Integration runtime": + case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: itemType = "integrationRuntimes"; break; - case "Linked service": + case SynaspeEnums.WorkspaceItemType.LinkedService: itemType = "linkedServices"; break; - case "Credential": + case SynaspeEnums.WorkspaceItemType.Credential: itemType = "credentials"; break; } scope = "workspaces/" + this.WorkspaceName + "/" + itemType + "/" + this.Item; - } else { + } + else + { scope = "workspaces/" + this.WorkspaceName; } diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs index 0c14063f5e3e..a8390a4d8a8c 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs @@ -25,6 +25,8 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet = "RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet"; private const string RemoveByWorkspaceNameAndServicePrincipalNameParameterSet = "RemoveByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet = "RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet"; + private const string RemoveByWorkspaceNameAndItemParameterSet = "RemoveByWorkspaceNameAndItemParameterSet"; + private const string RemoveByWorkspaceObjectAndItemParameterSet = "RemoveByWorkspaceObjectAndItemParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -36,6 +38,8 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")] [ValidateNotNullOrEmpty] public override string WorkspaceName { get; set; } @@ -50,6 +54,8 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] + [Parameter(ValueFromPipeline = true, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [ValidateNotNull] public PSSynapseWorkspace WorkspaceObject { get; set; } @@ -57,6 +63,10 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] [ValidateNotNullOrEmpty] public string RoleAssignmentId { get; set; } @@ -72,6 +82,10 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } @@ -79,6 +93,10 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } @@ -86,6 +104,10 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndSignInNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.SignInName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Alias("Email", "UserPrincipalName")] [ValidateNotNullOrEmpty] public string SignInName { get; set; } @@ -94,6 +116,10 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [ValidateNotNullOrEmpty] public string ServicePrincipalName { get; set; } @@ -105,10 +131,28 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] + [ValidateNotNullOrEmpty] + public SynaspeEnums.WorkspaceItemType ItemType { get; set; } + + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, + Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] + [ValidateNotNullOrEmpty] + public string Item { get; set; } + [Parameter(Mandatory = false, HelpMessage = HelpMessages.PassThru)] public SwitchParameter PassThru { get; set; } @@ -152,7 +196,36 @@ public override void ExecuteCmdlet() if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.RemovingSynapseRoleAssignment, this.RoleDefinitionId, this.ObjectId, this.WorkspaceName))) { - SynapseAnalyticsClient.DeleteRoleAssignmentByName(this.RoleDefinitionId, this.ObjectId); + string scope = null; + string itemType = null; + + if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) + { + switch (this.ItemType) + { + case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: + itemType = "bigDataPools"; + break; + case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: + itemType = "integrationRuntimes"; + break; + case SynaspeEnums.WorkspaceItemType.LinkedService: + itemType = "linkedServices"; + break; + case SynaspeEnums.WorkspaceItemType.Credential: + itemType = "credentials"; + break; + } + + scope = "workspaces/" + this.WorkspaceName + "/" + itemType + "/" + this.Item; + } + else + { + scope = "workspaces/" + this.WorkspaceName; + } + + SynapseAnalyticsClient.DeleteRoleAssignmentByName(this.RoleDefinitionId, this.ObjectId, scope, this.WorkspaceName); + if (PassThru) { WriteObject(true); diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index b0b556989568..a94b577d25ca 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -265,16 +265,10 @@ SELECT on dbo.myTable by public public const string RoleDefinitionId = "Id of the Role that is assigned to the principal."; - public const string RoleAssignmentItemType = "Item type of the role assignment:'bigDataPools', 'integrationRuntimes', 'linkedServices', 'credentials'."; - - public const string RoleAssignmentItem = "Item of the Role that is assigned to the principal."; - - public const string RoleDefinitionName = "Name of the Role that is assigned to the principal."; + public const string RoleDefinitionName = "Name of the Role that is assigned to the principal."; public const string PrincipalId = "The Azure AD ObjectId of the User, Group or Service Principal."; - public const string Scope = "The Scope of the user."; - public const string SignInName = "The email address or the user principal name of the user."; public const string ServicePrincipalName = "The ServicePrincipalName of the service principal."; @@ -421,6 +415,10 @@ SELECT on dbo.myTable by public public const string WorkspaceKeyName = "The name of the workspace key."; + public const string WorkspaceItemType = "Item type of the workspace:'bigDataPools', 'integrationRuntimes', 'linkedServices', 'credentials'."; + + public const string WorkspaceItem = "Item of the workspace."; + public const string IsActiveCustomerManagedKey = "Indicates whether to activate the workspace after a customer managed key is provided."; public const string KeyResourceId = "The resource identifier of Synapse SQL Pool."; diff --git a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs index 7ab8bf669a2a..890bd0253c3d 100644 --- a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs +++ b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs @@ -13,6 +13,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) this.RoleAssignmentId = roleAssignmentDetails.Id; this.RoleDefinitionId = roleAssignmentDetails.RoleDefinitionId?.ToString(); this.ObjectId = roleAssignmentDetails.PrincipalId?.ToString(); + this.Scope = roleAssignmentDetails.Scope; } public string RoleAssignmentId { get; set; } @@ -20,5 +21,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) public string RoleDefinitionId { get; set; } public string ObjectId { get; set; } + + public string Scope { get; set; } } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index dc6a53195f16..55e1b438efe1 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -35,9 +35,9 @@ public SynapseAnalyticsRoleClient(string workspaceName, IAzureContext context) _activeDirectoryClient = new ActiveDirectoryClient(context); } - public RoleAssignmentDetailsList ListRoleAssignments(string roleDefinitionId = null, string objectId = null, string continuationToken = null) + public IReadOnlyList ListRoleAssignments(string roleDefinitionId = null, string objectId = null, string scope = null) { - return _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, continuationToken).Value; + return _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, scope).Value.Value; } public RoleAssignmentDetails GetRoleAssignmentById(string roleAssignmentId) @@ -55,11 +55,22 @@ public void DeleteRoleAssignmentById(string roleAssignmentId) _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } - public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId) + public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId, string scope, string workspaceName) { - var roleAssignment = _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, null).Value.Value.Select(element => new PSRoleAssignmentDetails(element)); - string roleAssignmentId = roleAssignment.SingleOrDefault().RoleAssignmentId; - _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); + var roleAssignment = _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, scope).Value.Value; + + if (roleAssignment.Count == 0) + { + throw new AzPSResourceNotFoundCloudException(String.Format(Resources.WorkspaceRoleAssignmentNotFound, workspaceName)); + } + else if (roleAssignment.Count == 1) + { + string roleAssignmentId = roleAssignment.SingleOrDefault().Id; + _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); + } + else { + throw new AzPSInvalidOperationException(String.Format(Resources.WorkspaceRoleAssignmentMoreThanOneFound, workspaceName)); + } } public IReadOnlyList ListRoleScopes() @@ -113,7 +124,7 @@ public string GetRoleDefinitionIdFromRoleDefinitionName(string roleDefinitionNam { return null; } - var roleDefinition = _roleDefinitionsClient.ListRoleDefinitions().Value.SingleOrDefault(element => element.Name == roleDefinitionName); + var roleDefinition = _roleDefinitionsClient.ListRoleDefinitions().Value.SingleOrDefault(element => element.Name.Equals(roleDefinitionName, StringComparison.OrdinalIgnoreCase)); if (roleDefinition == null) { throw new InvalidOperationException(String.Format(Resources.RoleDefinitionNameDoesNotExist, roleDefinitionName)); diff --git a/src/Synapse/Synapse/Models/SynaspeEnums.cs b/src/Synapse/Synapse/Models/SynaspeEnums.cs new file mode 100644 index 000000000000..f7fe52b4108a --- /dev/null +++ b/src/Synapse/Synapse/Models/SynaspeEnums.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Azure.Commands.Synapse.Models +{ + public class SynaspeEnums + { + public enum WorkspaceItemType + { + ApacheSparkPool, + IntegrationRuntime, + LinkedService, + Credential + } + + } +} diff --git a/src/Synapse/Synapse/Properties/Resources.Designer.cs b/src/Synapse/Synapse/Properties/Resources.Designer.cs index 750a79c12bce..160dbd1442e0 100644 --- a/src/Synapse/Synapse/Properties/Resources.Designer.cs +++ b/src/Synapse/Synapse/Properties/Resources.Designer.cs @@ -1691,5 +1691,23 @@ internal static string WorkspaceKeyExists { return ResourceManager.GetString("WorkspaceKeyExists", resourceCulture); } } + + /// + /// Looks up a localized string similar to More than one Roleassignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId. + /// + internal static string WorkspaceRoleAssignmentMoreThanOneFound { + get { + return ResourceManager.GetString("WorkspaceRoleAssignmentMoreThanOneFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find workspace roleassignment under workspace '{0}'.. + /// + internal static string WorkspaceRoleAssignmentNotFound { + get { + return ResourceManager.GetString("WorkspaceRoleAssignmentNotFound", resourceCulture); + } + } } } diff --git a/src/Synapse/Synapse/Properties/Resources.resx b/src/Synapse/Synapse/Properties/Resources.resx index 8f4bcbae688d..d76d0552d2ed 100644 --- a/src/Synapse/Synapse/Properties/Resources.resx +++ b/src/Synapse/Synapse/Properties/Resources.resx @@ -660,6 +660,12 @@ Are you sure you want to continue? A workspace key with name '{0}' in resource group '{1}' under workspace '{2}' already exists. Please use Update-AzSynapseWorkspaceKey to update an existing workspace key. + + More than one Roleassignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId + + + Cannot find workspace roleassignment under workspace '{0}'. + ScanId is a required parameter for this cmdlet. Please explicitly provide it or pass the Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord output via pipe. From 585d3f7e5e3bed02c7c328ea133c1ea6ed48b0b4 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Thu, 1 Apr 2021 19:37:23 +0800 Subject: [PATCH 13/33] itemtype and item improvement --- .../GetAzureSynapseRoleAssignment.cs | 83 ++----------------- .../NewAzureSynapseRoleAssignment.cs | 66 +-------------- .../RemoveAzureSynapseRoleAssignment.cs | 71 +--------------- .../Synapse/Models/PSRoleAssignmentDetails.cs | 3 + src/Synapse/Synapse/Models/PSSynapseRole.cs | 12 +++ .../Models/SynapseAnalyticsRoleClient.cs | 24 +++++- src/Synapse/Synapse/Models/SynaspeEnums.cs | 20 +++++ .../Synapse/Properties/Resources.Designer.cs | 13 ++- src/Synapse/Synapse/Properties/Resources.resx | 7 +- 9 files changed, 89 insertions(+), 210 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs index 4f8ccc137689..b79d5228d254 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs @@ -27,8 +27,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string GetByWorkspaceObjectAndAssignmentIdParameterSet = "GetByWorkspaceObjectAndAssignmentIdParameterSet"; private const string GetByWorkspaceNameAndServicePrincipalNameParameterSet = "GetByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string GetByWorkspaceObjectAndServicePrincipalNameParameterSet = "GetByWorkspaceObjectAndServicePrincipalNameParameterSet"; - private const string GetByWorkspaceNameAndItemParameterSet = "GetByWorkspaceNameAndItemParameterSet"; - private const string GetByWorkspaceObjectAndItemParameterSet = "GetByWorkspaceObjectAndItemParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -40,8 +38,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")] [ValidateNotNullOrEmpty] public override string WorkspaceName { get; set; } @@ -56,8 +52,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [ValidateNotNull] public PSSynapseWorkspace WorkspaceObject { get; set; } @@ -65,10 +59,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndAssignmentIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] [ValidateNotNullOrEmpty] public string RoleAssignmentId { get; set; } @@ -84,10 +74,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } @@ -95,10 +81,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } @@ -106,10 +88,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.SignInName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Alias("Email", "UserPrincipalName")] [ValidateNotNullOrEmpty] public string SignInName { get; set; } @@ -118,10 +96,6 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [ValidateNotNullOrEmpty] public string ServicePrincipalName { get; set; } @@ -133,25 +107,15 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] - public SynaspeEnums.WorkspaceItemType ItemType { get; set; } + public SynaspeEnums.WorkspaceItemType? ItemType { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } @@ -183,46 +147,13 @@ public override void ExecuteCmdlet() } else { - string scope = null; - string itemType = null; - - if (this.IsParameterBound(c => c.ItemType)) - { - switch (this.ItemType) - { - case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: - itemType = "bigDataPools"; - break; - case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: - itemType = "integrationRuntimes"; - break; - case SynaspeEnums.WorkspaceItemType.LinkedService: - itemType = "linkedServices"; - break; - case SynaspeEnums.WorkspaceItemType.Credential: - itemType = "credentials"; - break; - } - - if (this.IsParameterBound(c => c.Item)) - { - scope = "workspaces/" + this.WorkspaceName + "/" + itemType + "/" + this.Item; - } - else - { - scope = null; - } - } - else - { - scope = null; - } - + string scope = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, true)[0]; + string itemTypeString = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, true)[1]; var roleAssignment = SynapseAnalyticsClient.ListRoleAssignments(this.RoleDefinitionId, this.ObjectId, scope).Select(element => new PSRoleAssignmentDetails(element)); - if (!string.IsNullOrEmpty(itemType) && string.IsNullOrEmpty(this.Item)) + if (this.IsParameterBound(c => c.ItemType) && string.IsNullOrEmpty(this.Item)) { - roleAssignment = roleAssignment.Where(element => element.Scope == "workspaces/" + this.WorkspaceName || element.Scope.StartsWith("workspaces/" + this.WorkspaceName + '/' + itemType)); + roleAssignment = roleAssignment.Where(element => element.Scope == "workspaces/" + this.WorkspaceName || element.Scope.StartsWith("workspaces/" + this.WorkspaceName + '/' + itemTypeString)); } WriteObject(roleAssignment, true); diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 1f778b5c9faa..201d8f87ba50 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -25,8 +25,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet = "NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet"; private const string NewByWorkspaceNameAndServicePrincipalNameParameterSet = "NewByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string NewByWorkspaceObjectAndServicePrincipalNameParameterSet = "NewByWorkspaceObjectAndServicePrincipalNameParameterSet"; - private const string NewByWorkspaceNameAndItemParameterSet = "NewByWorkspaceNameAndItemParameterSet"; - private const string NewByWorkspaceObjectAndItemParameterSet = "NewByWorkspaceObjectAndItemParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -36,8 +34,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")] [ValidateNotNullOrEmpty] public override string WorkspaceName { get; set; } @@ -50,8 +46,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] - [Parameter(ValueFromPipeline = true, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [ValidateNotNull] public PSSynapseWorkspace WorkspaceObject { get; set; } @@ -67,10 +61,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } @@ -78,10 +68,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } @@ -89,10 +75,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.SignInName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Alias("Email", "UserPrincipalName")] [ValidateNotNullOrEmpty] public string SignInName { get; set; } @@ -101,10 +83,6 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [ValidateNotNullOrEmpty] public string ServicePrincipalName { get; set; } @@ -116,25 +94,15 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] - public SynaspeEnums.WorkspaceItemType ItemType { get; set; } + public SynaspeEnums.WorkspaceItemType? ItemType { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = NewByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } @@ -166,33 +134,7 @@ public override void ExecuteCmdlet() if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) { Guid roleAssignmentId = Guid.NewGuid(); - string scope = null; - string itemType = null; - - if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) - { - switch (this.ItemType) - { - case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: - itemType = "bigDataPools"; - break; - case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: - itemType = "integrationRuntimes"; - break; - case SynaspeEnums.WorkspaceItemType.LinkedService: - itemType = "linkedServices"; - break; - case SynaspeEnums.WorkspaceItemType.Credential: - itemType = "credentials"; - break; - } - - scope = "workspaces/" + this.WorkspaceName + "/" + itemType + "/" + this.Item; - } - else - { - scope = "workspaces/" + this.WorkspaceName; - } + string scope = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, false)[0]; PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId.ToString(), this.RoleDefinitionId, this.ObjectId, scope)); WriteObject(roleAssignmentDetails); diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs index a8390a4d8a8c..fae128fe77bc 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs @@ -25,8 +25,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase private const string RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet = "RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet"; private const string RemoveByWorkspaceNameAndServicePrincipalNameParameterSet = "RemoveByWorkspaceNameAndServicePrincipalNameParameterSet"; private const string RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet = "RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet"; - private const string RemoveByWorkspaceNameAndItemParameterSet = "RemoveByWorkspaceNameAndItemParameterSet"; - private const string RemoveByWorkspaceObjectAndItemParameterSet = "RemoveByWorkspaceObjectAndItemParameterSet"; [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] @@ -38,8 +36,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceName)] [ResourceNameCompleter(ResourceTypes.Workspace, "ResourceGroupName")] [ValidateNotNullOrEmpty] public override string WorkspaceName { get; set; } @@ -54,8 +50,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [Parameter(ValueFromPipeline = true, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] - [Parameter(ValueFromPipeline = true, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceObject)] [ValidateNotNull] public PSSynapseWorkspace WorkspaceObject { get; set; } @@ -63,10 +57,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleAssignmentId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleAssignmentId)] [ValidateNotNullOrEmpty] public string RoleAssignmentId { get; set; } @@ -82,10 +72,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionName)] [ValidateNotNullOrEmpty] public string RoleDefinitionName { get; set; } @@ -93,10 +79,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.RoleDefinitionId)] [ValidateNotNullOrEmpty] public string RoleDefinitionId { get; set; } @@ -104,10 +86,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.SignInName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndSignInNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.SignInName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.SignInName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.SignInName)] [Alias("Email", "UserPrincipalName")] [ValidateNotNullOrEmpty] public string SignInName { get; set; } @@ -116,10 +94,6 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, Mandatory = true, HelpMessage = HelpMessages.ServicePrincipalName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.ServicePrincipalName)] [ValidateNotNullOrEmpty] public string ServicePrincipalName { get; set; } @@ -131,25 +105,15 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, Mandatory = true, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = false, HelpMessage = HelpMessages.PrincipalId)] [Alias("Id", "PrincipalId")] [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] - public SynaspeEnums.WorkspaceItemType ItemType { get; set; } + public SynaspeEnums.WorkspaceItemType? ItemType { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] - [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndItemParameterSet, - Mandatory = true, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } @@ -196,34 +160,7 @@ public override void ExecuteCmdlet() if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.RemovingSynapseRoleAssignment, this.RoleDefinitionId, this.ObjectId, this.WorkspaceName))) { - string scope = null; - string itemType = null; - - if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) - { - switch (this.ItemType) - { - case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: - itemType = "bigDataPools"; - break; - case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: - itemType = "integrationRuntimes"; - break; - case SynaspeEnums.WorkspaceItemType.LinkedService: - itemType = "linkedServices"; - break; - case SynaspeEnums.WorkspaceItemType.Credential: - itemType = "credentials"; - break; - } - - scope = "workspaces/" + this.WorkspaceName + "/" + itemType + "/" + this.Item; - } - else - { - scope = "workspaces/" + this.WorkspaceName; - } - + string scope = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, false)[0]; SynapseAnalyticsClient.DeleteRoleAssignmentByName(this.RoleDefinitionId, this.ObjectId, scope, this.WorkspaceName); if (PassThru) diff --git a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs index 890bd0253c3d..5e571811fc09 100644 --- a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs +++ b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs @@ -14,6 +14,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) this.RoleDefinitionId = roleAssignmentDetails.RoleDefinitionId?.ToString(); this.ObjectId = roleAssignmentDetails.PrincipalId?.ToString(); this.Scope = roleAssignmentDetails.Scope; + this.principalType = roleAssignmentDetails.PrincipalType; } public string RoleAssignmentId { get; set; } @@ -23,5 +24,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) public string ObjectId { get; set; } public string Scope { get; set; } + + public string principalType { get; set; } } } diff --git a/src/Synapse/Synapse/Models/PSSynapseRole.cs b/src/Synapse/Synapse/Models/PSSynapseRole.cs index ed7b2eab4c81..f45351bbb1fe 100644 --- a/src/Synapse/Synapse/Models/PSSynapseRole.cs +++ b/src/Synapse/Synapse/Models/PSSynapseRole.cs @@ -12,6 +12,10 @@ public PSSynapseRole(SynapseRoleDefinition synapseRole) this.Id = synapseRole.Id?.ToString(); this.Name = synapseRole.Name; this.IsBuiltIn = synapseRole.IsBuiltIn.Value; + this.Description = synapseRole.Description; + this.AvailabilityStatus = synapseRole.AvailabilityStatus; + this.Permissions = synapseRole.Permissions; + this.Scopes = synapseRole.Scopes; } public string Id { get; set; } @@ -19,5 +23,13 @@ public PSSynapseRole(SynapseRoleDefinition synapseRole) public string Name { get; set; } public bool IsBuiltIn { get; set; } + + public string Description { get; set; } + + public string AvailabilityStatus { get; set; } + + public IReadOnlyList Permissions { get; set; } + + public IReadOnlyList Scopes { get; set; } } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index 55e1b438efe1..249707894cef 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -68,7 +68,8 @@ public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId, string roleAssignmentId = roleAssignment.SingleOrDefault().Id; _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } - else { + else + { throw new AzPSInvalidOperationException(String.Format(Resources.WorkspaceRoleAssignmentMoreThanOneFound, workspaceName)); } } @@ -131,5 +132,26 @@ public string GetRoleDefinitionIdFromRoleDefinitionName(string roleDefinitionNam } return roleDefinition.Id.ToString(); } + + public List GetScopeFromRoleItemTypeAndItem(SynaspeEnums.WorkspaceItemType? itemType, string item, string workspaceName, bool isGetRoleAssignment) + { + string scope = null; + string itemTypeString = SynaspeEnums.GetItemTypeString(itemType); + + if (itemType != null && !string.IsNullOrEmpty(item)) + { + scope = "workspaces/" + workspaceName + "/" + itemTypeString + "/" + item; + } + else if (!isGetRoleAssignment && ((itemType != null && string.IsNullOrEmpty(item)) || (itemType == null && !string.IsNullOrEmpty(item)))) + { + throw new InvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); + } + else if (!isGetRoleAssignment) + { + scope = "workspaces/" + workspaceName; + } + + return new List { scope, itemTypeString }; + } } } diff --git a/src/Synapse/Synapse/Models/SynaspeEnums.cs b/src/Synapse/Synapse/Models/SynaspeEnums.cs index f7fe52b4108a..3b5a6955e59d 100644 --- a/src/Synapse/Synapse/Models/SynaspeEnums.cs +++ b/src/Synapse/Synapse/Models/SynaspeEnums.cs @@ -13,6 +13,26 @@ public enum WorkspaceItemType LinkedService, Credential } + public static String GetItemTypeString(SynaspeEnums.WorkspaceItemType? itemType) + { + string itemTypeString = null; + switch (itemType) + { + case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: + itemTypeString = "bigDataPools"; + break; + case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: + itemTypeString = "integrationRuntimes"; + break; + case SynaspeEnums.WorkspaceItemType.LinkedService: + itemTypeString = "linkedServices"; + break; + case SynaspeEnums.WorkspaceItemType.Credential: + itemTypeString = "credentials"; + break; + } + return itemTypeString; + } } } diff --git a/src/Synapse/Synapse/Properties/Resources.Designer.cs b/src/Synapse/Synapse/Properties/Resources.Designer.cs index 160dbd1442e0..fd872fc499b9 100644 --- a/src/Synapse/Synapse/Properties/Resources.Designer.cs +++ b/src/Synapse/Synapse/Properties/Resources.Designer.cs @@ -1683,6 +1683,15 @@ internal static string WorkspaceDoesNotExist { } } + /// + /// Looks up a localized string similar to A workspace itemType and item not appear together. Please input itemType and item together.. + /// + internal static string WorkspaceItemTypeAndItemNotAppearTogether { + get { + return ResourceManager.GetString("WorkspaceItemTypeAndItemNotAppearTogether", resourceCulture); + } + } + /// /// Looks up a localized string similar to A workspace key with name '{0}' in resource group '{1}' under workspace '{2}' already exists. Please use Update-AzSynapseWorkspaceKey to update an existing workspace key.. /// @@ -1693,7 +1702,7 @@ internal static string WorkspaceKeyExists { } /// - /// Looks up a localized string similar to More than one Roleassignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId. + /// Looks up a localized string similar to More than one role assignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId. /// internal static string WorkspaceRoleAssignmentMoreThanOneFound { get { @@ -1702,7 +1711,7 @@ internal static string WorkspaceRoleAssignmentMoreThanOneFound { } /// - /// Looks up a localized string similar to Cannot find workspace roleassignment under workspace '{0}'.. + /// Looks up a localized string similar to Cannot find workspace role assignment under workspace '{0}'.. /// internal static string WorkspaceRoleAssignmentNotFound { get { diff --git a/src/Synapse/Synapse/Properties/Resources.resx b/src/Synapse/Synapse/Properties/Resources.resx index d76d0552d2ed..8342f0a01806 100644 --- a/src/Synapse/Synapse/Properties/Resources.resx +++ b/src/Synapse/Synapse/Properties/Resources.resx @@ -657,14 +657,17 @@ Are you sure you want to continue? Updating workspace key '{0}' in resource group '{1}' under Workspace '{2}'. + + A workspace itemType and item not appear together. Please input itemType and item together. + A workspace key with name '{0}' in resource group '{1}' under workspace '{2}' already exists. Please use Update-AzSynapseWorkspaceKey to update an existing workspace key. - More than one Roleassignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId + More than one role assignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId - Cannot find workspace roleassignment under workspace '{0}'. + Cannot find workspace role assignment under workspace '{0}'. ScanId is a required parameter for this cmdlet. Please explicitly provide it or pass the Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord output via pipe. From 7284040a04f940eb6283c2cc5dd675c79c3089c9 Mon Sep 17 00:00:00 2001 From: Dongwei Wang Date: Fri, 2 Apr 2021 00:57:02 -0700 Subject: [PATCH 14/33] Fix a few issues --- .../GetAzureSynapseRoleAssignment.cs | 74 +++++++++++++++---- .../NewAzureSynapseRoleAssignment.cs | 31 +++++--- .../RemoveAzureSynapseRoleAssignment.cs | 57 ++++++++++++-- src/Synapse/Synapse/Common/HelpMessages.cs | 4 +- src/Synapse/Synapse/Common/Utils.cs | 23 ++++++ .../Synapse/Models/PSRoleAssignmentDetails.cs | 10 +-- .../Models/SynapseAnalyticsRoleClient.cs | 40 +++++----- .../Synapse/Models/SynapseConstants.cs | 8 ++ src/Synapse/Synapse/Models/SynaspeEnums.cs | 38 ---------- .../Synapse/Properties/Resources.Designer.cs | 6 +- src/Synapse/Synapse/Properties/Resources.resx | 6 +- 11 files changed, 193 insertions(+), 104 deletions(-) delete mode 100644 src/Synapse/Synapse/Models/SynaspeEnums.cs diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs index b79d5228d254..814e10b3375d 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs @@ -1,14 +1,11 @@ -using Azure.Analytics.Synapse.AccessControl; -using Microsoft.Azure.Commands.Common.Exceptions; -using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; +using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; using Microsoft.Azure.Commands.Synapse.Common; using Microsoft.Azure.Commands.Synapse.Models; using Microsoft.WindowsAzure.Commands.Utilities.Common; -using System; -using System.Collections.Generic; using System.Linq; using System.Management.Automation; -using System.Text; +using System.Text.RegularExpressions; +using static Microsoft.Azure.Commands.Synapse.Models.SynapseConstants; namespace Microsoft.Azure.Commands.Synapse { @@ -111,11 +108,41 @@ public class GetAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] - public SynaspeEnums.WorkspaceItemType? ItemType { get; set; } + public WorkspaceItemType ItemType { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceNameAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = GetByWorkspaceObjectAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } @@ -141,22 +168,39 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } + string itemType = null; + if (this.IsParameterBound(c => c.ItemType)) + { + itemType = this.ItemType.ToSdkObject(); + } + if (this.IsParameterBound(c => c.RoleAssignmentId)) { WriteObject(new PSRoleAssignmentDetails(SynapseAnalyticsClient.GetRoleAssignmentById(this.RoleAssignmentId))); } else { - string scope = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, true)[0]; - string itemTypeString = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, true)[1]; - var roleAssignment = SynapseAnalyticsClient.ListRoleAssignments(this.RoleDefinitionId, this.ObjectId, scope).Select(element => new PSRoleAssignmentDetails(element)); + var roleAssignments = SynapseAnalyticsClient.ListRoleAssignments(this.RoleDefinitionId, this.ObjectId).Select(element => new PSRoleAssignmentDetails(element)); + string allowedScopePattern = null; + if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) + { + allowedScopePattern = $"(^workspaces/{this.WorkspaceName}$)|(%workspaces/{this.WorkspaceName}/{itemType}/{this.Item}$)"; + } + else if (this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item)) + { + allowedScopePattern = $"(^workspaces/{this.WorkspaceName}$)|(^workspaces/{this.WorkspaceName}/{itemType}/[^/]+$)"; + } + else if (!this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) + { + allowedScopePattern = $"(^workspaces/{this.WorkspaceName}$)|(^workspaces/{this.WorkspaceName}/[^/]+/{this.Item}$)"; + } - if (this.IsParameterBound(c => c.ItemType) && string.IsNullOrEmpty(this.Item)) + if (!string.IsNullOrEmpty(allowedScopePattern)) { - roleAssignment = roleAssignment.Where(element => element.Scope == "workspaces/" + this.WorkspaceName || element.Scope.StartsWith("workspaces/" + this.WorkspaceName + '/' + itemTypeString)); + roleAssignments = roleAssignments.Where(ra => ra.Scope == null || Regex.IsMatch(ra.Scope, allowedScopePattern, RegexOptions.IgnoreCase)); } - WriteObject(roleAssignment, true); + WriteObject(roleAssignments, true); } } } diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 201d8f87ba50..ff35f26d5db2 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -1,14 +1,11 @@ -using Azure.Analytics.Synapse.AccessControl.Models; -using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; +using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; using Microsoft.Azure.Commands.Synapse.Common; using Microsoft.Azure.Commands.Synapse.Models; using Microsoft.Azure.Commands.Synapse.Properties; using Microsoft.WindowsAzure.Commands.Utilities.Common; using System; -using System.Collections.Generic; -using System.Globalization; using System.Management.Automation; -using System.Text; +using static Microsoft.Azure.Commands.Synapse.Models.SynapseConstants; namespace Microsoft.Azure.Commands.Synapse { @@ -100,12 +97,14 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] - public SynaspeEnums.WorkspaceItemType? ItemType { get; set; } + public WorkspaceItemType ItemType { get; set; } [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } + // TODO: add principal type parameter!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + [Parameter(Mandatory = false, HelpMessage = HelpMessages.AsJob)] public SwitchParameter AsJob { get; set; } @@ -131,12 +130,24 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } - if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) + string itemType = null; + if (this.IsParameterBound(c => c.ItemType)) { - Guid roleAssignmentId = Guid.NewGuid(); - string scope = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, false)[0]; + itemType = this.ItemType.ToSdkObject(); + } - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId.ToString(), this.RoleDefinitionId, this.ObjectId, scope)); + if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) + { + // Item type and item should appear Report error if either item type or item is specified. + if ((!this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) || + (this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item))) + { + throw new InvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); + } + + string roleAssignmentId = Guid.NewGuid().ToString(); + string scope = SynapseAnalyticsClient.GetRoleAssignmentScope(this.WorkspaceName, itemType, this.Item); + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId, this.RoleDefinitionId, this.ObjectId, scope)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs index fae128fe77bc..d6b83da1fe52 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs @@ -4,9 +4,8 @@ using Microsoft.Azure.Commands.Synapse.Properties; using Microsoft.WindowsAzure.Commands.Utilities.Common; using System; -using System.Collections.Generic; using System.Management.Automation; -using System.Text; +using static Microsoft.Azure.Commands.Synapse.Models.SynapseConstants; namespace Microsoft.Azure.Commands.Synapse { @@ -109,11 +108,41 @@ public class RemoveAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string ObjectId { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndSignInNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndSignInNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] - public SynaspeEnums.WorkspaceItemType? ItemType { get; set; } + public WorkspaceItemType ItemType { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndSignInNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndSignInNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndObjectIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] + [Parameter(ValueFromPipelineByPropertyName = false, ParameterSetName = RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet, + Mandatory = false, HelpMessage = HelpMessages.WorkspaceItem)] [ValidateNotNullOrEmpty] public string Item { get; set; } @@ -158,11 +187,23 @@ public override void ExecuteCmdlet() this.ObjectId = SynapseAnalyticsClient.GetObjectIdFromServicePrincipalName(this.ServicePrincipalName); } + string itemType = null; + if (this.IsParameterBound(c => c.ItemType)) + { + itemType = this.ItemType.ToSdkObject(); + } + if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.RemovingSynapseRoleAssignment, this.RoleDefinitionId, this.ObjectId, this.WorkspaceName))) { - string scope = SynapseAnalyticsClient.GetScopeFromRoleItemTypeAndItem(this.ItemType, this.Item, this.WorkspaceName, false)[0]; - SynapseAnalyticsClient.DeleteRoleAssignmentByName(this.RoleDefinitionId, this.ObjectId, scope, this.WorkspaceName); - + // Item type and item should appear Report error if either item type or item is specified. + if ((!this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) || + (this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item))) + { + throw new InvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); + } + + string scope = SynapseAnalyticsClient.GetRoleAssignmentScope(this.WorkspaceName, itemType, this.Item); + SynapseAnalyticsClient.DeleteRoleAssignmentByName(this.WorkspaceName, this.RoleDefinitionId, this.ObjectId, scope); if (PassThru) { WriteObject(true); diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index a94b577d25ca..42a54341f5fc 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -415,9 +415,9 @@ SELECT on dbo.myTable by public public const string WorkspaceKeyName = "The name of the workspace key."; - public const string WorkspaceItemType = "Item type of the workspace:'bigDataPools', 'integrationRuntimes', 'linkedServices', 'credentials'."; + public const string WorkspaceItemType = "The workspace item type."; - public const string WorkspaceItem = "Item of the workspace."; + public const string WorkspaceItem = "The workspace item."; public const string IsActiveCustomerManagedKey = "Indicates whether to activate the workspace after a customer managed key is provided."; diff --git a/src/Synapse/Synapse/Common/Utils.cs b/src/Synapse/Synapse/Common/Utils.cs index 568c8210ad95..886cdbf36905 100644 --- a/src/Synapse/Synapse/Common/Utils.cs +++ b/src/Synapse/Synapse/Common/Utils.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Net; using System.Text.RegularExpressions; +using static Microsoft.Azure.Commands.Synapse.Models.SynapseConstants; namespace Microsoft.Azure.Commands.Synapse.Common { @@ -197,5 +198,27 @@ public static Response Poll(this Operation operation) { return operation.WaitForCompletionAsync().Result; } + + public static string ToSdkObject(this WorkspaceItemType itemType) + { + string itemTypeString = null; + switch (itemType) + { + case WorkspaceItemType.ApacheSparkPool: + itemTypeString = "bigDataPools"; + break; + case WorkspaceItemType.IntegrationRuntime: + itemTypeString = "integrationRuntimes"; + break; + case WorkspaceItemType.LinkedService: + itemTypeString = "linkedServices"; + break; + case WorkspaceItemType.Credential: + itemTypeString = "credentials"; + break; + } + + return itemTypeString; + } } } diff --git a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs index 5e571811fc09..ce7360a2e9c0 100644 --- a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs +++ b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs @@ -1,8 +1,4 @@ -using Azure.Analytics.Synapse.AccessControl; -using Azure.Analytics.Synapse.AccessControl.Models; -using System; -using System.Collections.Generic; -using System.Text; +using Azure.Analytics.Synapse.AccessControl.Models; namespace Microsoft.Azure.Commands.Synapse.Models { @@ -12,7 +8,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) { this.RoleAssignmentId = roleAssignmentDetails.Id; this.RoleDefinitionId = roleAssignmentDetails.RoleDefinitionId?.ToString(); - this.ObjectId = roleAssignmentDetails.PrincipalId?.ToString(); + this.PrincipalId = roleAssignmentDetails.PrincipalId?.ToString(); this.Scope = roleAssignmentDetails.Scope; this.principalType = roleAssignmentDetails.PrincipalType; } @@ -21,7 +17,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) public string RoleDefinitionId { get; set; } - public string ObjectId { get; set; } + public string PrincipalId { get; set; } public string Scope { get; set; } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index 249707894cef..c2e261eb035d 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -55,22 +55,24 @@ public void DeleteRoleAssignmentById(string roleAssignmentId) _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } - public void DeleteRoleAssignmentByName(string roleDefinitionId, string objectId, string scope, string workspaceName) + public void DeleteRoleAssignmentByName(string workspaceName, string roleDefinitionId, string objectId, string scope) { - var roleAssignment = _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId, scope).Value.Value; + var roleAssignments = _roleAssignmentsClient.ListRoleAssignments(roleDefinitionId, objectId).Value.Value + .Where(ra => string.IsNullOrEmpty(scope) || scope.Equals(ra.Scope, StringComparison.OrdinalIgnoreCase)) + .ToList(); - if (roleAssignment.Count == 0) + if (roleAssignments.Count == 0) { throw new AzPSResourceNotFoundCloudException(String.Format(Resources.WorkspaceRoleAssignmentNotFound, workspaceName)); } - else if (roleAssignment.Count == 1) + else if (roleAssignments.Count == 1) { - string roleAssignmentId = roleAssignment.SingleOrDefault().Id; + string roleAssignmentId = roleAssignments[0].Id; _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } else { - throw new AzPSInvalidOperationException(String.Format(Resources.WorkspaceRoleAssignmentMoreThanOneFound, workspaceName)); + throw new AzPSInvalidOperationException(String.Format(Resources.WorkspaceRoleAssignmentMoreThanOneFound, workspaceName, string.Join(", ", roleAssignments.Select(ra => ra.Id)))); } } @@ -95,12 +97,14 @@ public string GetObjectIdFromSignInName(string signInName) { return null; } + var odataQueryFilter = new Rest.Azure.OData.ODataQuery(s => s.UserPrincipalName == signInName); var user = _activeDirectoryClient.GraphClient.Users.List(odataQueryFilter.ToString()).SingleOrDefault(); if (user == null) { throw new InvalidOperationException(String.Format(Resources.UserNameDoesNotExist, signInName)); } + return user.ObjectId; } @@ -110,12 +114,14 @@ public string GetObjectIdFromServicePrincipalName(string servicePrincipalName) { return null; } + var odataQueryFilter = new Rest.Azure.OData.ODataQuery(s => s.ServicePrincipalNames.Contains(servicePrincipalName)); var servicePrincipal = _activeDirectoryClient.GraphClient.ServicePrincipals.List(odataQueryFilter.ToString()).SingleOrDefault(); if (servicePrincipal == null) { throw new InvalidOperationException(String.Format(Resources.ServicePrincipalNameDoesNotExist, servicePrincipalName)); } + return servicePrincipal.ObjectId; } @@ -125,33 +131,31 @@ public string GetRoleDefinitionIdFromRoleDefinitionName(string roleDefinitionNam { return null; } + var roleDefinition = _roleDefinitionsClient.ListRoleDefinitions().Value.SingleOrDefault(element => element.Name.Equals(roleDefinitionName, StringComparison.OrdinalIgnoreCase)); if (roleDefinition == null) { throw new InvalidOperationException(String.Format(Resources.RoleDefinitionNameDoesNotExist, roleDefinitionName)); } + return roleDefinition.Id.ToString(); } - public List GetScopeFromRoleItemTypeAndItem(SynaspeEnums.WorkspaceItemType? itemType, string item, string workspaceName, bool isGetRoleAssignment) + public string GetRoleAssignmentScope(string workspaceName, string itemType, string item) { - string scope = null; - string itemTypeString = SynaspeEnums.GetItemTypeString(itemType); - - if (itemType != null && !string.IsNullOrEmpty(item)) + if (string.IsNullOrEmpty(workspaceName)) { - scope = "workspaces/" + workspaceName + "/" + itemTypeString + "/" + item; + throw new AzPSArgumentNullException("Parameter cannot be null", workspaceName); } - else if (!isGetRoleAssignment && ((itemType != null && string.IsNullOrEmpty(item)) || (itemType == null && !string.IsNullOrEmpty(item)))) + + if (!string.IsNullOrEmpty(itemType) && !string.IsNullOrEmpty(item)) { - throw new InvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); + return $"workspaces/{workspaceName}/{itemType}/{item}"; } - else if (!isGetRoleAssignment) + else { - scope = "workspaces/" + workspaceName; + return $"workspaces/{workspaceName}"; } - - return new List { scope, itemTypeString }; } } } diff --git a/src/Synapse/Synapse/Models/SynapseConstants.cs b/src/Synapse/Synapse/Models/SynapseConstants.cs index 9d15396a0d3c..bdd87190c13a 100644 --- a/src/Synapse/Synapse/Models/SynapseConstants.cs +++ b/src/Synapse/Synapse/Models/SynapseConstants.cs @@ -231,5 +231,13 @@ public class DetectionType public const string Unsafe_Action = "Unsafe_Action"; public const string None = "None"; } + + public enum WorkspaceItemType + { + ApacheSparkPool, + IntegrationRuntime, + LinkedService, + Credential + } } } diff --git a/src/Synapse/Synapse/Models/SynaspeEnums.cs b/src/Synapse/Synapse/Models/SynaspeEnums.cs deleted file mode 100644 index 3b5a6955e59d..000000000000 --- a/src/Synapse/Synapse/Models/SynaspeEnums.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Microsoft.Azure.Commands.Synapse.Models -{ - public class SynaspeEnums - { - public enum WorkspaceItemType - { - ApacheSparkPool, - IntegrationRuntime, - LinkedService, - Credential - } - public static String GetItemTypeString(SynaspeEnums.WorkspaceItemType? itemType) - { - string itemTypeString = null; - switch (itemType) - { - case SynaspeEnums.WorkspaceItemType.ApacheSparkPool: - itemTypeString = "bigDataPools"; - break; - case SynaspeEnums.WorkspaceItemType.IntegrationRuntime: - itemTypeString = "integrationRuntimes"; - break; - case SynaspeEnums.WorkspaceItemType.LinkedService: - itemTypeString = "linkedServices"; - break; - case SynaspeEnums.WorkspaceItemType.Credential: - itemTypeString = "credentials"; - break; - } - - return itemTypeString; - } - } -} diff --git a/src/Synapse/Synapse/Properties/Resources.Designer.cs b/src/Synapse/Synapse/Properties/Resources.Designer.cs index fd872fc499b9..8e8cee0a6783 100644 --- a/src/Synapse/Synapse/Properties/Resources.Designer.cs +++ b/src/Synapse/Synapse/Properties/Resources.Designer.cs @@ -1684,7 +1684,7 @@ internal static string WorkspaceDoesNotExist { } /// - /// Looks up a localized string similar to A workspace itemType and item not appear together. Please input itemType and item together.. + /// Looks up a localized string similar to Either -ItemType and -Item should appear together or neither of them should be.. /// internal static string WorkspaceItemTypeAndItemNotAppearTogether { get { @@ -1702,7 +1702,7 @@ internal static string WorkspaceKeyExists { } /// - /// Looks up a localized string similar to More than one role assignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId. + /// Looks up a localized string similar to More than one role assignment under workspace '{0}' was found: {1}. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName <string> -RoleAssignmentId <string>. /// internal static string WorkspaceRoleAssignmentMoreThanOneFound { get { @@ -1711,7 +1711,7 @@ internal static string WorkspaceRoleAssignmentMoreThanOneFound { } /// - /// Looks up a localized string similar to Cannot find workspace role assignment under workspace '{0}'.. + /// Looks up a localized string similar to Cannot find role assignment under workspace '{0}'.. /// internal static string WorkspaceRoleAssignmentNotFound { get { diff --git a/src/Synapse/Synapse/Properties/Resources.resx b/src/Synapse/Synapse/Properties/Resources.resx index 8342f0a01806..87de098baa23 100644 --- a/src/Synapse/Synapse/Properties/Resources.resx +++ b/src/Synapse/Synapse/Properties/Resources.resx @@ -658,16 +658,16 @@ Are you sure you want to continue? Updating workspace key '{0}' in resource group '{1}' under Workspace '{2}'. - A workspace itemType and item not appear together. Please input itemType and item together. + Either -ItemType and -Item should appear together or neither of them should be. A workspace key with name '{0}' in resource group '{1}' under workspace '{2}' already exists. Please use Update-AzSynapseWorkspaceKey to update an existing workspace key. - More than one role assignment under workspace '{0}' was found. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentId ContosoRoleAssignmentId + More than one role assignment under workspace '{0}' was found: {1}. Please condiser using Remove-AzSynapseRoleAssignment -WorkspaceName <string> -RoleAssignmentId <string> - Cannot find workspace role assignment under workspace '{0}'. + Cannot find role assignment under workspace '{0}'. ScanId is a required parameter for this cmdlet. Please explicitly provide it or pass the Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord output via pipe. From 2583a84bd633c83705cbbbf5d3b2d706bdf60fd3 Mon Sep 17 00:00:00 2001 From: Dongwei Wang Date: Fri, 2 Apr 2021 01:27:38 -0700 Subject: [PATCH 15/33] Correct exception types --- .../AccessControl/NewAzureSynapseRoleAssignment.cs | 5 +++-- .../AccessControl/RemoveAzureSynapseRoleAssignment.cs | 5 +++-- .../Synapse/Models/SynapseAnalyticsRoleClient.cs | 10 ++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index ff35f26d5db2..776f35b9d558 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -1,4 +1,5 @@ -using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; +using Microsoft.Azure.Commands.Common.Exceptions; +using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; using Microsoft.Azure.Commands.Synapse.Common; using Microsoft.Azure.Commands.Synapse.Models; using Microsoft.Azure.Commands.Synapse.Properties; @@ -142,7 +143,7 @@ public override void ExecuteCmdlet() if ((!this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) || (this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item))) { - throw new InvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); + throw new AzPSInvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); } string roleAssignmentId = Guid.NewGuid().ToString(); diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs index d6b83da1fe52..69fc8ecc4f47 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs @@ -1,4 +1,5 @@ -using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; +using Microsoft.Azure.Commands.Common.Exceptions; +using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; using Microsoft.Azure.Commands.Synapse.Common; using Microsoft.Azure.Commands.Synapse.Models; using Microsoft.Azure.Commands.Synapse.Properties; @@ -199,7 +200,7 @@ public override void ExecuteCmdlet() if ((!this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) || (this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item))) { - throw new InvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); + throw new AzPSInvalidOperationException(String.Format(Resources.WorkspaceItemTypeAndItemNotAppearTogether)); } string scope = SynapseAnalyticsClient.GetRoleAssignmentScope(this.WorkspaceName, itemType, this.Item); diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index c2e261eb035d..44fbd30aa49d 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -1,5 +1,4 @@ -using Azure; -using Azure.Analytics.Synapse.AccessControl; +using Azure.Analytics.Synapse.AccessControl; using Azure.Analytics.Synapse.AccessControl.Models; using Microsoft.Azure.Commands.Common.Authentication.Abstractions; using Microsoft.Azure.Commands.Common.Exceptions; @@ -11,7 +10,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; namespace Microsoft.Azure.Commands.Synapse.Models { @@ -102,7 +100,7 @@ public string GetObjectIdFromSignInName(string signInName) var user = _activeDirectoryClient.GraphClient.Users.List(odataQueryFilter.ToString()).SingleOrDefault(); if (user == null) { - throw new InvalidOperationException(String.Format(Resources.UserNameDoesNotExist, signInName)); + throw new AzPSInvalidOperationException(String.Format(Resources.UserNameDoesNotExist, signInName)); } return user.ObjectId; @@ -119,7 +117,7 @@ public string GetObjectIdFromServicePrincipalName(string servicePrincipalName) var servicePrincipal = _activeDirectoryClient.GraphClient.ServicePrincipals.List(odataQueryFilter.ToString()).SingleOrDefault(); if (servicePrincipal == null) { - throw new InvalidOperationException(String.Format(Resources.ServicePrincipalNameDoesNotExist, servicePrincipalName)); + throw new AzPSInvalidOperationException(String.Format(Resources.ServicePrincipalNameDoesNotExist, servicePrincipalName)); } return servicePrincipal.ObjectId; @@ -135,7 +133,7 @@ public string GetRoleDefinitionIdFromRoleDefinitionName(string roleDefinitionNam var roleDefinition = _roleDefinitionsClient.ListRoleDefinitions().Value.SingleOrDefault(element => element.Name.Equals(roleDefinitionName, StringComparison.OrdinalIgnoreCase)); if (roleDefinition == null) { - throw new InvalidOperationException(String.Format(Resources.RoleDefinitionNameDoesNotExist, roleDefinitionName)); + throw new AzPSInvalidOperationException(String.Format(Resources.RoleDefinitionNameDoesNotExist, roleDefinitionName)); } return roleDefinition.Id.ToString(); From 91e1e29860ddd80993d92bf2ba1c3998926fbc62 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Mon, 5 Apr 2021 23:41:14 +0800 Subject: [PATCH 16/33] add principle type --- .../GetAzureSynapseRoleAssignment.cs | 2 +- .../NewAzureSynapseRoleAssignment.cs | 8 ++- src/Synapse/Synapse/Common/HelpMessages.cs | 2 + .../Models/SynapseAnalyticsRoleClient.cs | 4 +- .../help/Get-AzSynapseRoleAssignment.md | 64 ++++++++++++++++--- .../help/New-AzSynapseRoleAssignment.md | 32 +++++++--- .../help/Remove-AzSynapseRoleAssignment.md | 59 ++++++++++++++--- 7 files changed, 140 insertions(+), 31 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs index 814e10b3375d..922800200928 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs @@ -184,7 +184,7 @@ public override void ExecuteCmdlet() string allowedScopePattern = null; if (this.IsParameterBound(c => c.ItemType) && this.IsParameterBound(c => c.Item)) { - allowedScopePattern = $"(^workspaces/{this.WorkspaceName}$)|(%workspaces/{this.WorkspaceName}/{itemType}/{this.Item}$)"; + allowedScopePattern = $"(^workspaces/{this.WorkspaceName}$)|(^workspaces/{this.WorkspaceName}/{itemType}/{this.Item}$)"; } else if (this.IsParameterBound(c => c.ItemType) && !this.IsParameterBound(c => c.Item)) { diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index 776f35b9d558..b8c0e056e69a 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -96,6 +96,8 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string ObjectId { get; set; } + // Compared with Remove-AzSynapseRoleAssignment and Get-AzSynapseRoleAssignment, no need to specify roleAssignment, it is created as + // random uuid. Hence unnecessary to specify the ParameterSetName [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspaceItemType)] [ValidateNotNullOrEmpty] public WorkspaceItemType ItemType { get; set; } @@ -104,7 +106,9 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string Item { get; set; } - // TODO: add principal type parameter!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspacePrincipleType)] + [ValidateNotNullOrEmpty] + public string PrincipleType { get; set; } [Parameter(Mandatory = false, HelpMessage = HelpMessages.AsJob)] public SwitchParameter AsJob { get; set; } @@ -148,7 +152,7 @@ public override void ExecuteCmdlet() string roleAssignmentId = Guid.NewGuid().ToString(); string scope = SynapseAnalyticsClient.GetRoleAssignmentScope(this.WorkspaceName, itemType, this.Item); - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId, this.RoleDefinitionId, this.ObjectId, scope)); + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId, this.RoleDefinitionId, this.ObjectId, scope, this.PrincipleType)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index 42a54341f5fc..0f6e59caa302 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -419,6 +419,8 @@ SELECT on dbo.myTable by public public const string WorkspaceItem = "The workspace item."; + public const string WorkspacePrincipleType = "The workspace principle type."; + public const string IsActiveCustomerManagedKey = "Indicates whether to activate the workspace after a customer managed key is provided."; public const string KeyResourceId = "The resource identifier of Synapse SQL Pool."; diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index 44fbd30aa49d..eb40fc92a7b0 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -43,9 +43,9 @@ public RoleAssignmentDetails GetRoleAssignmentById(string roleAssignmentId) return _roleAssignmentsClient.GetRoleAssignmentById(roleAssignmentId); } - public RoleAssignmentDetails CreateRoleAssignment(string roleAssignmentId, string RoleDefinitionId, string objectId, string scope) + public RoleAssignmentDetails CreateRoleAssignment(string roleAssignmentId, string roleDefinitionId, string objectId, string scope, string principleType) { - return _roleAssignmentsClient.CreateRoleAssignment(roleAssignmentId, new Guid(RoleDefinitionId), new Guid(objectId), scope); + return _roleAssignmentsClient.CreateRoleAssignment(roleAssignmentId, new Guid(roleDefinitionId), new Guid(objectId), scope, principleType); } public void DeleteRoleAssignmentById(string roleAssignmentId) diff --git a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md index 8814a0358499..448d7d9c277a 100644 --- a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md @@ -14,19 +14,19 @@ Gets a Synapse Analytics role assignment. ### GetByWorkspaceNameAndNameParameterSet (Default) ``` -Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-SignInName ] +Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-SignInName ] [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` ### GetByWorkspaceNameAndIdParameterSet ``` -Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-ObjectId ] +Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-ObjectId ] [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` ### GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet ``` -Get-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId [-ObjectId ] +Get-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId [-ObjectId ] [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` @@ -39,25 +39,25 @@ Get-AzSynapseRoleAssignment -WorkspaceName -RoleAssignmentId ### GetByWorkspaceNameAndServicePrincipalNameParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] - [-ServicePrincipalName ] [-DefaultProfile ] [] + [-ServicePrincipalName ] [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndNameParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject [-RoleDefinitionName ] - -SignInName [-DefaultProfile ] [] + -SignInName [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndIdParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject [-RoleDefinitionName ] - [-ObjectId ] [-DefaultProfile ] [] + [-ObjectId ] [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId - [-ObjectId ] [-DefaultProfile ] [] + [-ObjectId ] [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndAssignmentIdParameterSet @@ -69,7 +69,7 @@ Get-AzSynapseRoleAssignment -WorkspaceObject -RoleAssignmen ### GetByWorkspaceObjectAndServicePrincipalNameParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject [-RoleDefinitionName ] - -ServicePrincipalName [-DefaultProfile ] [] + -ServicePrincipalName [-ItemType ] [-Item ] [-DefaultProfile ] [] ``` ## DESCRIPTION @@ -100,6 +100,20 @@ PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinit This command gets a role assignment under workspace ContosoWorkspace with role name ContosoRole and user principal name ContosoName. ### Example 4 +```powershells +PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType +``` + +This command gets role assignments under workspace ContosoWorkspace with role name ContosoRole, user principal name ContosoName and under itemtype ContosoItemtype. + +### Example 5 +```powershells +PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem +``` + +This command gets a role assignment under workspace ContosoWorkspace with role name ContosoRole, user principal name ContosoName, ContosoItemType and ContosoItem. + +### Example 6 ```powershell PS C:\> $ws = Get-AzSynapseWorkspace -Name ContosoWorkspace PS C:\> $ws | Get-AzSynapseRoleAssignment @@ -124,6 +138,40 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ItemType +The itemtype of Azure Synapse workspace. + +```yaml +Type: System.String +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, +GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, +GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Item +The item of Azure Synapse workspace. + +```yaml +Type: System.String +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, +GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, +GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -ObjectId The Azure AD ObjectId of the User, Group or Service Principal. diff --git a/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md index cd586cff9a8c..7b0a80a493fc 100644 --- a/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md @@ -14,52 +14,52 @@ Creates a Synapse Analytics role assignment. ### NewByWorkspaceNameAndNameParameterSet (Default) ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndServicePrincipalNameParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ServicePrincipalName +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndNameParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -SignInName [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -SignInName [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndIdParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ObjectId [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId -ObjectId +New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndServicePrincipalNameParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ServicePrincipalName [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` @@ -75,7 +75,21 @@ PS C:\> New-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinit This command assigns ContosoRole to the user whose principal name is ContosoName. -### Example 2 +### Example 3 +```powershell +PS C:\> New-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem +``` + +This command assigns ContosoRole to the user whose principal name is ContosoName. + +### Example 4 +```powershell +PS C:\> New-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem -PrincipleType ContosoPrincipleType +``` + +This command assigns ContosoRole to the user whose principal name is ContosoName and item type is ContosoItemType, item is ContosoItem, principle type is ContosoPrincipleType. + +### Example 5 ```powershell PS C:\> $ws = Get-AzSynapseWorkspace -Name ContosoWorkspace PS C:\> $ws | New-AzSynapseRoleAssignment -RoleDefinitionName ContosoRole -SignInName ContosoName diff --git a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md index bfd9edb9f53f..39b308c2058e 100644 --- a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md @@ -14,7 +14,7 @@ Deletes a Synapse Analytics role assignment. ### RemoveByWorkspaceNameAndNameParameterSet (Default) ``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ### RemoveByWorkspaceNameAndIdParameterSet (Default) ``` @@ -27,20 +27,20 @@ Remove-AzSynapseRoleAssignment -WorkspaceName -RoleAssignmentId -RoleDefinitionName -ObjectId +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet ``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceNameAndServicePrincipalNameParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName - -ServicePrincipalName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] + -ServicePrincipalName [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` @@ -53,28 +53,28 @@ Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleAssign ### RemoveByWorkspaceObjectAndNameParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -SignInName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -SignInName [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceObjectAndObjectIdParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ObjectId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId - -ObjectId [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ServicePrincipalName [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] + -ServicePrincipalName [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` @@ -95,10 +95,17 @@ This command deletes an Azure Synapse Analytics role assignment with a role assi PS C:\> Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentName ContosoRole -SignInName ContosoName ``` -This command deletes an Azure Synapse Analytics role assignment with a role name and a user principal name. +This command deletes an Azure Synapse Analytics role assignment at workspace level with a role name and a user principal name. ### Example 3 ```powershell +PS C:\> Remove-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleAssignmentName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem +``` + +This command deletes an Azure Synapse Analytics role assignment with a role name, a user principal name, a item type and a item. + +### Example 4 +```powershell PS C:\> $ws = Get-AzSynapseWorkspace -Name ContosoWorkspace PS C:\> $ws | Remove-AzSynapseRoleAssignment -RoleAssignmentId ContosoRoleAssignmentId ``` @@ -137,6 +144,40 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ItemType +The itemtype of Azure Synapse workspace. + +```yaml +Type: System.String +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, +GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, +GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Item +The item of Azure Synapse workspace. + +```yaml +Type: System.String +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, +GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, +GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -ObjectId The Azure AD ObjectId of the User, Group or Service Principal. From c8555d3d1a40480f5e83537a5ece371bfdcf34ae Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 14:15:48 +0800 Subject: [PATCH 17/33] add principaltype --- .../NewAzureSynapseRoleAssignment.cs | 14 +++++++--- .../RemoveAzureSynapseRoleAssignment.cs | 2 +- src/Synapse/Synapse/Common/HelpMessages.cs | 2 +- src/Synapse/Synapse/Common/Utils.cs | 21 +++++++++++++- .../Models/SynapseAnalyticsRoleClient.cs | 6 ++-- .../Synapse/Models/SynapseConstants.cs | 7 +++++ .../help/Get-AzSynapseRoleAssignment.md | 2 +- .../help/New-AzSynapseRoleAssignment.md | 28 +++++++++---------- 8 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs index b8c0e056e69a..ba84d8f0a739 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/NewAzureSynapseRoleAssignment.cs @@ -106,9 +106,9 @@ public class NewAzureSynapseRoleAssignment : SynapseRoleCmdletBase [ValidateNotNullOrEmpty] public string Item { get; set; } - [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspacePrincipleType)] + [Parameter(ValueFromPipelineByPropertyName = false, Mandatory = false, HelpMessage = HelpMessages.WorkspacePrincipalType)] [ValidateNotNullOrEmpty] - public string PrincipleType { get; set; } + public PrincipalType PrincipalType { get; set; } [Parameter(Mandatory = false, HelpMessage = HelpMessages.AsJob)] public SwitchParameter AsJob { get; set; } @@ -138,7 +138,13 @@ public override void ExecuteCmdlet() string itemType = null; if (this.IsParameterBound(c => c.ItemType)) { - itemType = this.ItemType.ToSdkObject(); + itemType = this.ItemType.GetItemTypeString(); + } + + string principalType = null; + if (this.IsParameterBound(c => c.PrincipalType)) + { + principalType = this.PrincipalType.GetPrincipalTypeString(); } if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.CreatingSynapseRoleAssignment, this.WorkspaceName, this.RoleDefinitionId, this.ObjectId))) @@ -152,7 +158,7 @@ public override void ExecuteCmdlet() string roleAssignmentId = Guid.NewGuid().ToString(); string scope = SynapseAnalyticsClient.GetRoleAssignmentScope(this.WorkspaceName, itemType, this.Item); - PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId, this.RoleDefinitionId, this.ObjectId, scope, this.PrincipleType)); + PSRoleAssignmentDetails roleAssignmentDetails = new PSRoleAssignmentDetails(SynapseAnalyticsClient.CreateRoleAssignment(roleAssignmentId, this.RoleDefinitionId, this.ObjectId, scope, principalType)); WriteObject(roleAssignmentDetails); } } diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs index 69fc8ecc4f47..5cf3e1e78926 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/RemoveAzureSynapseRoleAssignment.cs @@ -191,7 +191,7 @@ public override void ExecuteCmdlet() string itemType = null; if (this.IsParameterBound(c => c.ItemType)) { - itemType = this.ItemType.ToSdkObject(); + itemType = this.ItemType.GetItemTypeString(); } if (this.ShouldProcess(this.WorkspaceName, String.Format(Resources.RemovingSynapseRoleAssignment, this.RoleDefinitionId, this.ObjectId, this.WorkspaceName))) diff --git a/src/Synapse/Synapse/Common/HelpMessages.cs b/src/Synapse/Synapse/Common/HelpMessages.cs index 0f6e59caa302..eb964bc27724 100644 --- a/src/Synapse/Synapse/Common/HelpMessages.cs +++ b/src/Synapse/Synapse/Common/HelpMessages.cs @@ -419,7 +419,7 @@ SELECT on dbo.myTable by public public const string WorkspaceItem = "The workspace item."; - public const string WorkspacePrincipleType = "The workspace principle type."; + public const string WorkspacePrincipalType = "The workspace principal type."; public const string IsActiveCustomerManagedKey = "Indicates whether to activate the workspace after a customer managed key is provided."; diff --git a/src/Synapse/Synapse/Common/Utils.cs b/src/Synapse/Synapse/Common/Utils.cs index 886cdbf36905..48fe3fa92122 100644 --- a/src/Synapse/Synapse/Common/Utils.cs +++ b/src/Synapse/Synapse/Common/Utils.cs @@ -199,7 +199,7 @@ public static Response Poll(this Operation operation) return operation.WaitForCompletionAsync().Result; } - public static string ToSdkObject(this WorkspaceItemType itemType) + public static string GetItemTypeString(this WorkspaceItemType itemType) { string itemTypeString = null; switch (itemType) @@ -220,5 +220,24 @@ public static string ToSdkObject(this WorkspaceItemType itemType) return itemTypeString; } + + public static string GetPrincipalTypeString(this PrincipalType principalType) + { + string principalTypeString = null; + switch (principalType) + { + case PrincipalType.User: + principalTypeString = "user"; + break; + case PrincipalType.Group: + principalTypeString = "group"; + break; + case PrincipalType.ServicePrincipal: + principalTypeString = "serviceprincipal"; + break; + } + + return principalTypeString; + } } } diff --git a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs index eb40fc92a7b0..2f7cd1070d1e 100644 --- a/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs +++ b/src/Synapse/Synapse/Models/SynapseAnalyticsRoleClient.cs @@ -43,9 +43,9 @@ public RoleAssignmentDetails GetRoleAssignmentById(string roleAssignmentId) return _roleAssignmentsClient.GetRoleAssignmentById(roleAssignmentId); } - public RoleAssignmentDetails CreateRoleAssignment(string roleAssignmentId, string roleDefinitionId, string objectId, string scope, string principleType) + public RoleAssignmentDetails CreateRoleAssignment(string roleAssignmentId, string roleDefinitionId, string objectId, string scope, string principalType) { - return _roleAssignmentsClient.CreateRoleAssignment(roleAssignmentId, new Guid(roleDefinitionId), new Guid(objectId), scope, principleType); + return _roleAssignmentsClient.CreateRoleAssignment(roleAssignmentId, new Guid(roleDefinitionId), new Guid(objectId), scope, principalType); } public void DeleteRoleAssignmentById(string roleAssignmentId) @@ -68,7 +68,7 @@ public void DeleteRoleAssignmentByName(string workspaceName, string roleDefiniti string roleAssignmentId = roleAssignments[0].Id; _roleAssignmentsClient.DeleteRoleAssignmentById(roleAssignmentId); } - else + else { throw new AzPSInvalidOperationException(String.Format(Resources.WorkspaceRoleAssignmentMoreThanOneFound, workspaceName, string.Join(", ", roleAssignments.Select(ra => ra.Id)))); } diff --git a/src/Synapse/Synapse/Models/SynapseConstants.cs b/src/Synapse/Synapse/Models/SynapseConstants.cs index bdd87190c13a..4e1ea1d57a1a 100644 --- a/src/Synapse/Synapse/Models/SynapseConstants.cs +++ b/src/Synapse/Synapse/Models/SynapseConstants.cs @@ -239,5 +239,12 @@ public enum WorkspaceItemType LinkedService, Credential } + + public enum PrincipalType + { + User, + Group, + ServicePrincipal + } } } diff --git a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md index 448d7d9c277a..b9714831163d 100644 --- a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md @@ -104,7 +104,7 @@ This command gets a role assignment under workspace ContosoWorkspace with role n PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType ``` -This command gets role assignments under workspace ContosoWorkspace with role name ContosoRole, user principal name ContosoName and under itemtype ContosoItemtype. +This command gets role assignments under workspace ContosoWorkspace with role name ContosoRole, user principal name ContosoName and under itemtype ContosoItemtype. ### Example 5 ```powershells diff --git a/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md index 7b0a80a493fc..62cd7db0ee0c 100644 --- a/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md @@ -14,52 +14,52 @@ Creates a Synapse Analytics role assignment. ### NewByWorkspaceNameAndNameParameterSet (Default) ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndServicePrincipalNameParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipleType ] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndNameParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -SignInName [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -SignInName [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndIdParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipleType ] +New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndServicePrincipalNameParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipleType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` @@ -75,21 +75,21 @@ PS C:\> New-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinit This command assigns ContosoRole to the user whose principal name is ContosoName. -### Example 3 +### Example 2 ```powershell PS C:\> New-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem ``` -This command assigns ContosoRole to the user whose principal name is ContosoName. +This command assigns ContosoRole to the user whose principal name is ContosoName and item type is ContosoItemType, item is ContosoItem. -### Example 4 +### Example 3 ```powershell -PS C:\> New-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem -PrincipleType ContosoPrincipleType +PS C:\> New-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem -PrincipalType ContosoPrincipalType ``` -This command assigns ContosoRole to the user whose principal name is ContosoName and item type is ContosoItemType, item is ContosoItem, principle type is ContosoPrincipleType. +This command assigns ContosoRole to the user whose principal name is ContosoName and item type is ContosoItemType, item is ContosoItem, principal type is ContosoPrincipalType. -### Example 5 +### Example 4 ```powershell PS C:\> $ws = Get-AzSynapseWorkspace -Name ContosoWorkspace PS C:\> $ws | New-AzSynapseRoleAssignment -RoleDefinitionName ContosoRole -SignInName ContosoName From ab1f2e73462e2dc9da5bd02326be715d64f8ec2e Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 15:09:42 +0800 Subject: [PATCH 18/33] caseinsent --- .../AccessControl/GetAzureSynapseRoleAssignment.cs | 2 +- src/Synapse/Synapse/Common/Utils.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs index 922800200928..3174daa7e7fb 100644 --- a/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs +++ b/src/Synapse/Synapse/Commands/DataPlaneCommands/AccessControl/GetAzureSynapseRoleAssignment.cs @@ -171,7 +171,7 @@ public override void ExecuteCmdlet() string itemType = null; if (this.IsParameterBound(c => c.ItemType)) { - itemType = this.ItemType.ToSdkObject(); + itemType = this.ItemType.GetItemTypeString(); } if (this.IsParameterBound(c => c.RoleAssignmentId)) diff --git a/src/Synapse/Synapse/Common/Utils.cs b/src/Synapse/Synapse/Common/Utils.cs index 48fe3fa92122..1fbe67ac40b9 100644 --- a/src/Synapse/Synapse/Common/Utils.cs +++ b/src/Synapse/Synapse/Common/Utils.cs @@ -227,13 +227,13 @@ public static string GetPrincipalTypeString(this PrincipalType principalType) switch (principalType) { case PrincipalType.User: - principalTypeString = "user"; + principalTypeString = "User"; break; case PrincipalType.Group: - principalTypeString = "group"; + principalTypeString = "Group"; break; case PrincipalType.ServicePrincipal: - principalTypeString = "serviceprincipal"; + principalTypeString = "ServicePrincipal"; break; } From 12ea62c348534f3da64bfac33d3c1969fa882b07 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 15:33:32 +0800 Subject: [PATCH 19/33] update changelog --- src/Synapse/Synapse/ChangeLog.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index ef9684ac3071..bc8f7bf9fba7 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -22,6 +22,14 @@ * Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 * Fixed the issue of retrieving Apache Spark pool information through management API +## Version 0.9.0 +* Updated support for workspace role assignment + - Update `New-AzSynapseRoleAssignment` cmdlet + - Update `Get-AzSynapseRoleAssignment` cmdlet + - Update `Remove-AzSynapseRoleAssignment` cmdlet +* Added support for workspace role scope + - Add `Get-AzSynapseRoleScope` cmdlet + ## Version 0.9.0 * Added support for workspace key encryption management - Add `New-AzSynapseWorkspaceKey` cmdlet From 850226cca56392dc8215fffe540778447cdfa09b Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 15:48:53 +0800 Subject: [PATCH 20/33] add doc for get-azsyanpserolescope --- src/Synapse/Synapse/ChangeLog.md | 2 +- .../Synapse/help/Get-AzSynapseRoleScope.md | 106 ++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index bc8f7bf9fba7..cd4a3d6705b9 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -22,7 +22,7 @@ * Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 * Fixed the issue of retrieving Apache Spark pool information through management API -## Version 0.9.0 +## Version 0.10.0 * Updated support for workspace role assignment - Update `New-AzSynapseRoleAssignment` cmdlet - Update `Get-AzSynapseRoleAssignment` cmdlet diff --git a/src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md b/src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md new file mode 100644 index 000000000000..addc9c6540cf --- /dev/null +++ b/src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md @@ -0,0 +1,106 @@ +--- +external help file: Microsoft.Azure.PowerShell.Cmdlets.Synapse.dll-Help.xml +Module Name: Az.Synapse +online version: https://docs.microsoft.com/powershell/module/az.synapse/get-azsynapserolescope +schema: 2.0.0 +--- + +# Get-AzSynapseRoleScope + +## SYNOPSIS +Gets a Synapse Analytics role scope. + +## SYNTAX + +### GetByWorkspaceNameParameterSet (Default) +``` +Get-AzSynapseRoleScope -WorkspaceName + [-DefaultProfile ] [] +``` + +### GetByWorkspaceObjectParameterSet +``` +Get-AzSynapseRoleScope -WorkspaceObject [-DefaultProfile ] [] +``` + +## DESCRIPTION +The **Get-AzSynapseRoleScope** cmdlet gets a Azure Synapse Analytics Role Scope. + +## EXAMPLES + +### Example 1 +```powershell +PS C:\> Get-AzSynapseRoleScope -WorkspaceName ContosoWorkspace +``` + +This command gets all role scopes under a workspace. + +### Example 6 +```powershell +PS C:\> $ws = Get-AzSynapseWorkspace -Name ContosoWorkspace +PS C:\> $ws | Get-AzSynapseRoleScope +``` + +This command gets all role scopes under a workspace through pipeline. + +## PARAMETERS + +### -DefaultProfile +The credentials, account, tenant, and subscription used for communication with Azure. + +```yaml +Type: Microsoft.Azure.Commands.Common.Authentication.Abstractions.Core.IAzureContextContainer +Parameter Sets: (All) +Aliases: AzContext, AzureRmContext, AzureCredential + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WorkspaceName +Name of Synapse workspace. + +```yaml +Type: System.String +Parameter Sets: GetByWorkspaceNameParameterSet +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WorkspaceObject +workspace input object, usually passed through the pipeline. + +```yaml +Type: Microsoft.Azure.Commands.Synapse.Models.PSSynapseWorkspace +Parameter Sets: GetByWorkspaceObjectParameterSet +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### CommonParameters +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +### Microsoft.Azure.Commands.Synapse.Models.PSSynapseWorkspace + +## OUTPUTS + +### Microsoft.Azure.Commands.Synapse.Models.PSSynapseRole + +## NOTES + +## RELATED LINKS From c8184ca975de35a74443e6c9ead9e81892f99910 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 16:16:04 +0800 Subject: [PATCH 21/33] remove powershlles --- src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md index b9714831163d..990b3bc51e36 100644 --- a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md @@ -86,28 +86,28 @@ PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace This command gets all role assignments under a workspace. ### Example 2 -```powershells +```powershell PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole ``` This command gets all role assignments under workspace ContosoWorkspace with role name ContosoRole. ### Example 3 -```powershells +```powershell PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName ``` This command gets a role assignment under workspace ContosoWorkspace with role name ContosoRole and user principal name ContosoName. ### Example 4 -```powershells +```powershell PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType ``` This command gets role assignments under workspace ContosoWorkspace with role name ContosoRole, user principal name ContosoName and under itemtype ContosoItemtype. ### Example 5 -```powershells +```powershell PS C:\> Get-AzSynapseRoleAssignment -WorkspaceName ContosoWorkspace -RoleDefinitionName ContosoRole -SignInName ContosoName -ItemType ContosoItemType -Item ContosoItem ``` From 24232cb8e9a5d4167e7056a9746fd41877a2c9a1 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 17:49:24 +0800 Subject: [PATCH 22/33] update help doc --- src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md | 8 ++------ .../Synapse/help/Remove-AzSynapseRoleAssignment.md | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md index 990b3bc51e36..c0bf53efdc98 100644 --- a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md @@ -143,9 +143,7 @@ The itemtype of Azure Synapse workspace. ```yaml Type: System.String -Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, -GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, -GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceObjectAndServicePrincipalNameParameterSet Aliases: Required: False @@ -160,9 +158,7 @@ The item of Azure Synapse workspace. ```yaml Type: System.String -Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, -GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, -GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceObjectAndServicePrincipalNameParameterSet Aliases: Required: False diff --git a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md index 39b308c2058e..6e6bd100c2d2 100644 --- a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md @@ -149,9 +149,7 @@ The itemtype of Azure Synapse workspace. ```yaml Type: System.String -Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, -GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, -GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceObjectAndServicePrincipalNameParameterSet Aliases: Required: False @@ -166,9 +164,7 @@ The item of Azure Synapse workspace. ```yaml Type: System.String -Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, -GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, -GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceObjectAndServicePrincipalNameParameterSet Aliases: Required: False From 351318e091dcd85d968b6923fe305de49fd04524 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 18:37:15 +0800 Subject: [PATCH 23/33] add objectid back --- src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs index ce7360a2e9c0..e2dd309e3cd5 100644 --- a/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs +++ b/src/Synapse/Synapse/Models/PSRoleAssignmentDetails.cs @@ -8,7 +8,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) { this.RoleAssignmentId = roleAssignmentDetails.Id; this.RoleDefinitionId = roleAssignmentDetails.RoleDefinitionId?.ToString(); - this.PrincipalId = roleAssignmentDetails.PrincipalId?.ToString(); + this.ObjectId = roleAssignmentDetails.PrincipalId?.ToString(); this.Scope = roleAssignmentDetails.Scope; this.principalType = roleAssignmentDetails.PrincipalType; } @@ -17,7 +17,7 @@ public PSRoleAssignmentDetails(RoleAssignmentDetails roleAssignmentDetails) public string RoleDefinitionId { get; set; } - public string PrincipalId { get; set; } + public string ObjectId { get; set; } public string Scope { get; set; } From eba1c346730c183eba12b9dfa497ff1bdbda4435 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 18:43:36 +0800 Subject: [PATCH 24/33] update Az.Synapse.md --- src/Synapse/Synapse/help/Az.Synapse.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Synapse/Synapse/help/Az.Synapse.md b/src/Synapse/Synapse/help/Az.Synapse.md index c32cf775b308..6162ba26cfdb 100644 --- a/src/Synapse/Synapse/help/Az.Synapse.md +++ b/src/Synapse/Synapse/help/Az.Synapse.md @@ -83,6 +83,9 @@ Gets a Synapse Analytics role assignment. ### [Get-AzSynapseRoleDefinition](Get-AzSynapseRoleDefinition.md) Gets a Synapse Analytics role definition. +### [Get-AzSynapseRoleScope](Get-AzSynapseRoleScope.md) +Gets the Synapse Analytics role scope. + ### [Get-AzSynapseSparkJob](Get-AzSynapseSparkJob.md) Gets a Synapse Analytics Spark job. From 4f356473c2892ad696ad3458e29c115d78c3c606 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Tue, 6 Apr 2021 19:20:11 +0800 Subject: [PATCH 25/33] update auto generated mdfiles --- src/Synapse/Synapse/help/Az.Synapse.md | 2 +- .../help/Get-AzSynapseRoleAssignment.md | 41 ++++++---- .../Synapse/help/Get-AzSynapseRoleScope.md | 22 +++++- .../help/New-AzSynapseRoleAssignment.md | 77 ++++++++++++++++--- .../help/Remove-AzSynapseRoleAssignment.md | 55 +++++++------ 5 files changed, 140 insertions(+), 57 deletions(-) diff --git a/src/Synapse/Synapse/help/Az.Synapse.md b/src/Synapse/Synapse/help/Az.Synapse.md index 6162ba26cfdb..013ea2057426 100644 --- a/src/Synapse/Synapse/help/Az.Synapse.md +++ b/src/Synapse/Synapse/help/Az.Synapse.md @@ -84,7 +84,7 @@ Gets a Synapse Analytics role assignment. Gets a Synapse Analytics role definition. ### [Get-AzSynapseRoleScope](Get-AzSynapseRoleScope.md) -Gets the Synapse Analytics role scope. +Gets a Synapse Analytics role scope. ### [Get-AzSynapseSparkJob](Get-AzSynapseSparkJob.md) Gets a Synapse Analytics Spark job. diff --git a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md index c0bf53efdc98..799a2b871ad5 100644 --- a/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Get-AzSynapseRoleAssignment.md @@ -14,20 +14,23 @@ Gets a Synapse Analytics role assignment. ### GetByWorkspaceNameAndNameParameterSet (Default) ``` -Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-SignInName ] [-ItemType ] [-Item ] - [-DefaultProfile ] [] +Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-SignInName ] + [-ItemType ] [-Item ] [-DefaultProfile ] + [] ``` ### GetByWorkspaceNameAndIdParameterSet ``` -Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-ObjectId ] [-ItemType ] [-Item ] - [-DefaultProfile ] [] +Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] [-ObjectId ] + [-ItemType ] [-Item ] [-DefaultProfile ] + [] ``` ### GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet ``` -Get-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId [-ObjectId ] [-ItemType ] [-Item ] - [-DefaultProfile ] [] +Get-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId [-ObjectId ] + [-ItemType ] [-Item ] [-DefaultProfile ] + [] ``` ### GetByWorkspaceNameAndAssignmentIdParameterSet @@ -39,25 +42,29 @@ Get-AzSynapseRoleAssignment -WorkspaceName -RoleAssignmentId ### GetByWorkspaceNameAndServicePrincipalNameParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceName [-RoleDefinitionName ] - [-ServicePrincipalName ] [-ItemType ] [-Item ] [-DefaultProfile ] [] + [-ServicePrincipalName ] [-ItemType ] [-Item ] + [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndNameParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject [-RoleDefinitionName ] - -SignInName [-ItemType ] [-Item ] [-DefaultProfile ] [] + -SignInName [-ItemType ] [-Item ] + [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndIdParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject [-RoleDefinitionName ] - [-ObjectId ] [-ItemType ] [-Item ] [-DefaultProfile ] [] + [-ObjectId ] [-ItemType ] [-Item ] + [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId - [-ObjectId ] [-ItemType ] [-Item ] [-DefaultProfile ] [] + [-ObjectId ] [-ItemType ] [-Item ] + [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectAndAssignmentIdParameterSet @@ -69,7 +76,8 @@ Get-AzSynapseRoleAssignment -WorkspaceObject -RoleAssignmen ### GetByWorkspaceObjectAndServicePrincipalNameParameterSet ``` Get-AzSynapseRoleAssignment -WorkspaceObject [-RoleDefinitionName ] - -ServicePrincipalName [-ItemType ] [-Item ] [-DefaultProfile ] [] + -ServicePrincipalName [-ItemType ] [-Item ] + [-DefaultProfile ] [] ``` ## DESCRIPTION @@ -138,8 +146,8 @@ Accept pipeline input: False Accept wildcard characters: False ``` -### -ItemType -The itemtype of Azure Synapse workspace. +### -Item +The item of Azure Synapse workspace. ```yaml Type: System.String @@ -153,13 +161,14 @@ Accept pipeline input: False Accept wildcard characters: False ``` -### -Item -The item of Azure Synapse workspace. +### -ItemType +The itemtype of Azure Synapse workspace. ```yaml -Type: System.String +Type: Microsoft.Azure.Commands.Synapse.Models.SynapseConstants+WorkspaceItemType Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceObjectAndServicePrincipalNameParameterSet Aliases: +Accepted values: ApacheSparkPool, IntegrationRuntime, LinkedService, Credential Required: False Position: Named diff --git a/src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md b/src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md index addc9c6540cf..318e339b213b 100644 --- a/src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md +++ b/src/Synapse/Synapse/help/Get-AzSynapseRoleScope.md @@ -1,4 +1,4 @@ ---- +--- external help file: Microsoft.Azure.PowerShell.Cmdlets.Synapse.dll-Help.xml Module Name: Az.Synapse online version: https://docs.microsoft.com/powershell/module/az.synapse/get-azsynapserolescope @@ -14,13 +14,14 @@ Gets a Synapse Analytics role scope. ### GetByWorkspaceNameParameterSet (Default) ``` -Get-AzSynapseRoleScope -WorkspaceName +Get-AzSynapseRoleScope -WorkspaceName [-ResourceId ] [-DefaultProfile ] [] ``` ### GetByWorkspaceObjectParameterSet ``` -Get-AzSynapseRoleScope -WorkspaceObject [-DefaultProfile ] [] +Get-AzSynapseRoleScope -WorkspaceObject [-ResourceId ] + [-DefaultProfile ] [] ``` ## DESCRIPTION @@ -60,6 +61,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ResourceId +Resource identifier of Synapse workspace. + +```yaml +Type: System.String +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -WorkspaceName Name of Synapse workspace. diff --git a/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md index 62cd7db0ee0c..1a7b26dec874 100644 --- a/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/New-AzSynapseRoleAssignment.md @@ -14,52 +14,58 @@ Creates a Synapse Analytics role assignment. ### NewByWorkspaceNameAndNameParameterSet (Default) ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName + [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId + [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId + [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceNameAndServicePrincipalNameParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipalType ] - [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] +New-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ServicePrincipalName + [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndNameParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -SignInName [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] + -SignInName [-ItemType ] [-Item ] [-PrincipalType ] + [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndIdParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] + -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet ``` -New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] [-PrincipalType ] - [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] +New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId -ObjectId + [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### NewByWorkspaceObjectAndServicePrincipalNameParameterSet ``` New-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ServicePrincipalName [-ItemType ] [-Item ] [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] + -ServicePrincipalName [-ItemType ] [-Item ] + [-PrincipalType ] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` @@ -129,6 +135,37 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -Item +The workspace item. + +```yaml +Type: System.String +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ItemType +The workspace item type. + +```yaml +Type: Microsoft.Azure.Commands.Synapse.Models.SynapseConstants+WorkspaceItemType +Parameter Sets: (All) +Aliases: +Accepted values: ApacheSparkPool, IntegrationRuntime, LinkedService, Credential + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -ObjectId The Azure AD ObjectId of the User, Group or Service Principal. @@ -144,6 +181,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -PrincipalType +The workspace principal type. + +```yaml +Type: Microsoft.Azure.Commands.Synapse.Models.SynapseConstants+PrincipalType +Parameter Sets: (All) +Aliases: +Accepted values: User, Group, ServicePrincipal + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -RoleDefinitionId Id of the Role that is assigned to the principal. diff --git a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md index 6e6bd100c2d2..dc87125b397a 100644 --- a/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md +++ b/src/Synapse/Synapse/help/Remove-AzSynapseRoleAssignment.md @@ -14,9 +14,9 @@ Deletes a Synapse Analytics role assignment. ### RemoveByWorkspaceNameAndNameParameterSet (Default) ``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName [-ItemType ] [-Item ] - [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] -### RemoveByWorkspaceNameAndIdParameterSet (Default) +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -SignInName + [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceNameAndIdParameterSet @@ -27,21 +27,23 @@ Remove-AzSynapseRoleAssignment -WorkspaceName -RoleAssignmentId -RoleDefinitionName -ObjectId [-ItemType ] [-Item ] - [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName -ObjectId + [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet ``` -Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId [-ItemType ] [-Item ] - [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] [] +Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionId -ObjectId + [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceNameAndServicePrincipalNameParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceName -RoleDefinitionName - -ServicePrincipalName [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] - [-Confirm] [] + -ServicePrincipalName [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceObjectAndIdParameterSet @@ -53,29 +55,29 @@ Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleAssign ### RemoveByWorkspaceObjectAndNameParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -SignInName [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] + -SignInName [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceObjectAndObjectIdParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] + -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionId - -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] [-Confirm] - [] + -ObjectId [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ### RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet ``` Remove-AzSynapseRoleAssignment -WorkspaceObject -RoleDefinitionName - -ServicePrincipalName [-ItemType ] [-Item ] [-PassThru] [-AsJob] [-DefaultProfile ] [-WhatIf] - [-Confirm] [] + -ServicePrincipalName [-ItemType ] [-Item ] [-PassThru] [-AsJob] + [-DefaultProfile ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -144,12 +146,12 @@ Accept pipeline input: False Accept wildcard characters: False ``` -### -ItemType -The itemtype of Azure Synapse workspace. +### -Item +The item of Azure Synapse workspace. ```yaml Type: System.String -Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Parameter Sets: RemoveByWorkspaceNameAndNameParameterSet, RemoveByWorkspaceNameAndObjectIdParameterSet, RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, RemoveByWorkspaceObjectAndNameParameterSet, RemoveByWorkspaceObjectAndObjectIdParameterSet, RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet Aliases: Required: False @@ -159,13 +161,14 @@ Accept pipeline input: False Accept wildcard characters: False ``` -### -Item -The item of Azure Synapse workspace. +### -ItemType +The itemtype of Azure Synapse workspace. ```yaml -Type: System.String -Parameter Sets: GetByWorkspaceNameAndNameParameterSet, GetByWorkspaceNameAndIdParameterSet, GetByWorkspaceNameAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceNameAndServicePrincipalNameParameterSet, GetByWorkspaceObjectAndNameParameterSet, GetByWorkspaceObjectAndIdParameterSet, GetByWorkspaceObjectAndRoleDefinitionIdAndObjectIdParameterSet, GetByWorkspaceObjectAndServicePrincipalNameParameterSet +Type: Microsoft.Azure.Commands.Synapse.Models.SynapseConstants+WorkspaceItemType +Parameter Sets: RemoveByWorkspaceNameAndNameParameterSet, RemoveByWorkspaceNameAndObjectIdParameterSet, RemoveByWorkspaceNameAndRoleDefinitionIdParameterSet, RemoveByWorkspaceNameAndServicePrincipalNameParameterSet, RemoveByWorkspaceObjectAndNameParameterSet, RemoveByWorkspaceObjectAndObjectIdParameterSet, RemoveByWorkspaceObjectAndRoleDefinitionIdParameterSet, RemoveByWorkspaceObjectAndServicePrincipalNameParameterSet Aliases: +Accepted values: ApacheSparkPool, IntegrationRuntime, LinkedService, Credential Required: False Position: Named @@ -354,4 +357,6 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable ## NOTES -## RELATED LINKS \ No newline at end of file +## RELATED LINKS + +## RELATED LINKS From 43c8e1d785af3f97376c2cc2fb2a625028603432 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Wed, 7 Apr 2021 15:38:21 +0800 Subject: [PATCH 26/33] update changelog --- src/Synapse/Synapse/ChangeLog.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index cd4a3d6705b9..42b6c7c550dc 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -18,17 +18,9 @@ - Additional information about change #1 --> ## Upcoming Release -* Renamed -AllowAllAzureIP to -AllowAllAzureIp and changed IP range to 0.0.0.0-0.0.0.0 -* Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 -* Fixed the issue of retrieving Apache Spark pool information through management API - -## Version 0.10.0 -* Updated support for workspace role assignment - - Update `New-AzSynapseRoleAssignment` cmdlet - - Update `Get-AzSynapseRoleAssignment` cmdlet - - Update `Remove-AzSynapseRoleAssignment` cmdlet -* Added support for workspace role scope - - Add `Get-AzSynapseRoleScope` cmdlet +* Upgraded `New-AzSynapseRoleAssignment` cmdlet, `Get-AzSynapseRoleAssignment` cmdlet and `Remove-AzSynapseRoleAssignment` cmdlet +* Added `Get-AzSynapseRoleScope` cmdlet +* Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 ## Version 0.9.0 * Added support for workspace key encryption management From d6f8a4ce40158da3c7aac876872f37f87b5d5f64 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Wed, 7 Apr 2021 16:41:23 +0800 Subject: [PATCH 27/33] update changelog2 --- src/Synapse/Synapse/ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index 42b6c7c550dc..1186e188aaf6 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -22,6 +22,7 @@ * Added `Get-AzSynapseRoleScope` cmdlet * Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 + ## Version 0.9.0 * Added support for workspace key encryption management - Add `New-AzSynapseWorkspaceKey` cmdlet From bc5873ef88286dafaf07d2ba9defe427a61cc876 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Wed, 7 Apr 2021 17:28:57 +0800 Subject: [PATCH 28/33] update changelog3 --- src/Synapse/Synapse/ChangeLog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index 1186e188aaf6..80a73e9f3f30 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -22,6 +22,10 @@ * Added `Get-AzSynapseRoleScope` cmdlet * Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 +## Upcoming Release +* Renamed -AllowAllAzureIP to -AllowAllAzureIp and changed IP range to 0.0.0.0-0.0.0.0 +* Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 +* Fixed the issue of retrieving Apache Spark pool information through management API ## Version 0.9.0 * Added support for workspace key encryption management From 99336aab2785285777e433c9921ea8b9633c1ee7 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Wed, 7 Apr 2021 17:57:44 +0800 Subject: [PATCH 29/33] update changelog4 --- src/Synapse/Synapse/ChangeLog.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index 80a73e9f3f30..5413314b7276 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -21,8 +21,6 @@ * Upgraded `New-AzSynapseRoleAssignment` cmdlet, `Get-AzSynapseRoleAssignment` cmdlet and `Remove-AzSynapseRoleAssignment` cmdlet * Added `Get-AzSynapseRoleScope` cmdlet * Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 - -## Upcoming Release * Renamed -AllowAllAzureIP to -AllowAllAzureIp and changed IP range to 0.0.0.0-0.0.0.0 * Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 * Fixed the issue of retrieving Apache Spark pool information through management API From 11576cd5f60d1cb4741c87691343aa2ecf32bfa5 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Thu, 8 Apr 2021 11:38:55 +0800 Subject: [PATCH 30/33] update changelog5 --- src/Synapse/Synapse/ChangeLog.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index 5413314b7276..070ff8bbc2a1 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -18,9 +18,12 @@ - Additional information about change #1 --> ## Upcoming Release -* Upgraded `New-AzSynapseRoleAssignment` cmdlet, `Get-AzSynapseRoleAssignment` cmdlet and `Remove-AzSynapseRoleAssignment` cmdlet -* Added `Get-AzSynapseRoleScope` cmdlet -* Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 +* Add support for Synapse Role-based access control + * Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 + * Updated `New-AzSynapseRoleAssignment` cmdlet + * Updated `Get-AzSynapseRoleAssignment` cmdlet + * Updated `Remove-AzSynapseRoleAssignment` cmdlet + * Added `Get-AzSynapseRoleScope` cmdlet * Renamed -AllowAllAzureIP to -AllowAllAzureIp and changed IP range to 0.0.0.0-0.0.0.0 * Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 * Fixed the issue of retrieving Apache Spark pool information through management API From ce1fb1f603378af6e35917e17c7db130d758b708 Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Thu, 8 Apr 2021 12:56:51 +0800 Subject: [PATCH 31/33] update changelog6 --- src/Synapse/Synapse/ChangeLog.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index 070ff8bbc2a1..e9a8c50eb4d2 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -19,11 +19,11 @@ --> ## Upcoming Release * Add support for Synapse Role-based access control - * Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 - * Updated `New-AzSynapseRoleAssignment` cmdlet - * Updated `Get-AzSynapseRoleAssignment` cmdlet - * Updated `Remove-AzSynapseRoleAssignment` cmdlet - * Added `Get-AzSynapseRoleScope` cmdlet + - Upgraded Azure.Analytics.Synapse.AccessControl to 1.0.0-preview.3 + - Updated `New-AzSynapseRoleAssignment` cmdlet + - Updated `Get-AzSynapseRoleAssignment` cmdlet + - Updated `Remove-AzSynapseRoleAssignment` cmdlet + - Added `Get-AzSynapseRoleScope` cmdlet * Renamed -AllowAllAzureIP to -AllowAllAzureIp and changed IP range to 0.0.0.0-0.0.0.0 * Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 * Fixed the issue of retrieving Apache Spark pool information through management API From 05c3fc10eed1a8731ab77610e592c722b449da9e Mon Sep 17 00:00:00 2001 From: Zeshi Luo Date: Thu, 8 Apr 2021 15:21:17 +0800 Subject: [PATCH 32/33] update changelog7 --- src/Synapse/Synapse/ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index e9a8c50eb4d2..c318fa3fe8e0 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -28,6 +28,7 @@ * Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 * Fixed the issue of retrieving Apache Spark pool information through management API + ## Version 0.9.0 * Added support for workspace key encryption management - Add `New-AzSynapseWorkspaceKey` cmdlet From 4e6c2fae8b4d950214aa1b1b15cd5372b2094911 Mon Sep 17 00:00:00 2001 From: zesluo Date: Thu, 8 Apr 2021 15:34:31 +0800 Subject: [PATCH 33/33] Update src/Synapse/Synapse/ChangeLog.md Co-authored-by: Beisi Zhou --- src/Synapse/Synapse/ChangeLog.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Synapse/Synapse/ChangeLog.md b/src/Synapse/Synapse/ChangeLog.md index c318fa3fe8e0..e9a8c50eb4d2 100644 --- a/src/Synapse/Synapse/ChangeLog.md +++ b/src/Synapse/Synapse/ChangeLog.md @@ -28,7 +28,6 @@ * Added -AllowAllIp and set IP range to 0.0.0.0-255.255.255.255 * Fixed the issue of retrieving Apache Spark pool information through management API - ## Version 0.9.0 * Added support for workspace key encryption management - Add `New-AzSynapseWorkspaceKey` cmdlet