@@ -10,6 +10,8 @@ import (
10
10
"fmt"
11
11
12
12
"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"
13
15
14
16
"github.com/Azure-Samples/azure-sdk-for-go-samples/internal/config"
15
17
"github.com/Azure-Samples/azure-sdk-for-go-samples/network"
@@ -105,3 +107,113 @@ func AddIdentityToVM(ctx context.Context, vmName string) (ext compute.VirtualMac
105
107
106
108
return future .Result (extensionsClient )
107
109
}
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