@@ -10,6 +10,8 @@ import (
1010 "fmt"
1111
1212 "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-06-01/compute"
13+ "github.com/Azure/azure-sdk-for-go/services/preview/msi/mgmt/2015-08-31-preview/msi"
14+ "github.com/pkg/errors"
1315
1416 "github.com/Azure-Samples/azure-sdk-for-go-samples/internal/config"
1517 "github.com/Azure-Samples/azure-sdk-for-go-samples/network"
@@ -105,3 +107,113 @@ func AddIdentityToVM(ctx context.Context, vmName string) (ext compute.VirtualMac
105107
106108 return future .Result (extensionsClient )
107109}
110+
111+ // CreateVMWithUserAssignedID creates a virtual machine with a user-assigned identity.
112+ func CreateVMWithUserAssignedID (ctx context.Context , vmName , nicName , username , password string , id msi.Identity ) (vm compute.VirtualMachine , err error ) {
113+ nic , _ := network .GetNic (ctx , nicName )
114+ vmClient := getVMClient ()
115+ future , err := vmClient .CreateOrUpdate (
116+ ctx ,
117+ config .GroupName (),
118+ vmName ,
119+ compute.VirtualMachine {
120+ Location : to .StringPtr (config .Location ()),
121+ Identity : & compute.VirtualMachineIdentity {
122+ Type : compute .ResourceIdentityTypeUserAssigned ,
123+ UserAssignedIdentities : map [string ]* compute.VirtualMachineIdentityUserAssignedIdentitiesValue {
124+ * id .ID : & compute.VirtualMachineIdentityUserAssignedIdentitiesValue {},
125+ },
126+ },
127+ VirtualMachineProperties : & compute.VirtualMachineProperties {
128+ HardwareProfile : & compute.HardwareProfile {
129+ VMSize : compute .BasicA0 ,
130+ },
131+ StorageProfile : & compute.StorageProfile {
132+ ImageReference : & compute.ImageReference {
133+ Publisher : to .StringPtr (publisher ),
134+ Offer : to .StringPtr (offer ),
135+ Sku : to .StringPtr (sku ),
136+ Version : to .StringPtr ("latest" ),
137+ },
138+ },
139+ OsProfile : & compute.OSProfile {
140+ ComputerName : to .StringPtr (vmName ),
141+ AdminUsername : to .StringPtr (username ),
142+ AdminPassword : to .StringPtr (password ),
143+ },
144+ NetworkProfile : & compute.NetworkProfile {
145+ NetworkInterfaces : & []compute.NetworkInterfaceReference {
146+ {
147+ ID : nic .ID ,
148+ NetworkInterfaceReferenceProperties : & compute.NetworkInterfaceReferenceProperties {
149+ Primary : to .BoolPtr (true ),
150+ },
151+ },
152+ },
153+ },
154+ },
155+ },
156+ )
157+ if err != nil {
158+ return vm , errors .Wrap (err , "failed to create VM" )
159+ }
160+ err = future .WaitForCompletion (ctx , vmClient .Client )
161+ if err != nil {
162+ return vm , errors .Wrap (err , "failed waiting for async operation to complete" )
163+ }
164+ return future .Result (vmClient )
165+ }
166+
167+ // AddUserAssignedIDToVM adds the specified user-assigned identity to the specified pre-existing VM.
168+ func AddUserAssignedIDToVM (ctx context.Context , vmName string , id msi.Identity ) (* compute.VirtualMachine , error ) {
169+ vmClient := getVMClient ()
170+ future , err := vmClient .Update (
171+ ctx ,
172+ config .GroupName (),
173+ vmName ,
174+ compute.VirtualMachineUpdate {
175+ Identity : & compute.VirtualMachineIdentity {
176+ Type : compute .ResourceIdentityTypeUserAssigned ,
177+ UserAssignedIdentities : map [string ]* compute.VirtualMachineIdentityUserAssignedIdentitiesValue {
178+ * id .ID : & compute.VirtualMachineIdentityUserAssignedIdentitiesValue {},
179+ },
180+ },
181+ },
182+ )
183+ if err != nil {
184+ return nil , errors .Wrap (err , "failed to update VM" )
185+ }
186+ err = future .WaitForCompletionRef (ctx , vmClient .Client )
187+ if err != nil {
188+ return nil , errors .Wrap (err , "failed waiting for async operation to complete" )
189+ }
190+ vm , err := future .Result (vmClient )
191+ return & vm , err
192+ }
193+
194+ // RemoveUserAssignedIDFromVM removes the specified user-assigned identity from the specified pre-existing VM.
195+ func RemoveUserAssignedIDFromVM (ctx context.Context , vmName string , id msi.Identity ) (* compute.VirtualMachine , error ) {
196+ vmClient := getVMClient ()
197+ future , err := vmClient .Update (
198+ ctx ,
199+ config .GroupName (),
200+ vmName ,
201+ compute.VirtualMachineUpdate {
202+ Identity : & compute.VirtualMachineIdentity {
203+ Type : compute .ResourceIdentityTypeUserAssigned ,
204+ UserAssignedIdentities : map [string ]* compute.VirtualMachineIdentityUserAssignedIdentitiesValue {
205+ * id .ID : nil ,
206+ },
207+ },
208+ },
209+ )
210+ if err != nil {
211+ return nil , errors .Wrap (err , "failed to update VM" )
212+ }
213+ err = future .WaitForCompletionRef (ctx , vmClient .Client )
214+ if err != nil {
215+ return nil , errors .Wrap (err , "failed waiting for async operation to complete" )
216+ }
217+ vm , err := future .Result (vmClient )
218+ return & vm , err
219+ }
0 commit comments