@@ -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