1// +build go1.7
2
3package virtualmachine
4
5// Copyright (c) Microsoft Corporation. All rights reserved.
6// Licensed under the MIT License. See License.txt in the project root for license information.
7
8import (
9	"encoding/xml"
10
11	"github.com/Azure/azure-sdk-for-go/services/classic/management"
12	vmdisk "github.com/Azure/azure-sdk-for-go/services/classic/management/virtualmachinedisk"
13)
14
15// VirtualMachineClient is used to perform operations on Azure Virtual Machines
16type VirtualMachineClient struct {
17	client management.Client
18}
19
20// DeploymentRequest is the type for creating a deployment and Virtual Machine
21// in the deployment based on the specified configuration. See
22// https://msdn.microsoft.com/en-us/library/azure/jj157194.aspx
23type DeploymentRequest struct {
24	XMLName xml.Name `xml:"http://schemas.microsoft.com/windowsazure Deployment"`
25	// Required parameters:
26	Name           string ``            // Specifies a name for the deployment. The deployment name must be unique among other deployments for the cloud service.
27	DeploymentSlot string ``            // Specifies the environment in which the Virtual Machine is to be deployed. The only allowable value is Production.
28	Label          string ``            // Specifies an identifier for the deployment. The label can be up to 100 characters long. The label can be used for tracking purposes.
29	RoleList       []Role `xml:">Role"` // Contains information about the Virtual Machines that are to be deployed.
30	// Optional parameters:
31	VirtualNetworkName string         `xml:",omitempty"`                         // Specifies the name of an existing virtual network to which the deployment will belong.
32	DNSServers         []DNSServer    `xml:"Dns>DnsServers>DnsServer,omitempty"` // Contains a list of DNS servers to associate with the Virtual Machine.
33	LoadBalancers      []LoadBalancer `xml:">LoadBalancer,omitempty"`            // Contains a list of internal load balancers that can be assigned to input endpoints.
34	ReservedIPName     string         `xml:",omitempty"`                         // Specifies the name of a reserved IP address that is to be assigned to the deployment.
35}
36
37// DeploymentResponse is the type for receiving deployment information
38// See https://msdn.microsoft.com/en-us/library/azure/ee460804.aspx
39type DeploymentResponse struct {
40	XMLName xml.Name `xml:"http://schemas.microsoft.com/windowsazure Deployment"`
41
42	Name                   string
43	DeploymentSlot         string
44	PrivateID              string
45	Status                 DeploymentStatus
46	Label                  string
47	URL                    string `xml:"Url"`
48	Configuration          string
49	RoleInstanceList       []RoleInstance `xml:">RoleInstance"`
50	UpgradeStatus          UpgradeStatus
51	UpgradeDomainCount     int
52	RoleList               []Role `xml:">Role"`
53	SdkVersion             string
54	Locked                 bool
55	RollbackAllowed        bool
56	CreatedTime            string
57	LastModifiedTime       string
58	VirtualNetworkName     string
59	DNSServers             []DNSServer        `xml:"Dns>DnsServers>DnsServer"`
60	LoadBalancers          []LoadBalancer     `xml:">LoadBalancer"`
61	ExtendedProperties     []ExtendedProperty `xml:">ExtendedProperty"`
62	PersistentVMDowntime   PersistentVMDowntime
63	VirtualIPs             []VirtualIP `xml:">VirtualIP"`
64	ExtensionConfiguration ExtensionConfiguration
65	ReservedIPName         string
66	InternalDNSSuffix      string `xml:"InternalDnsSuffix"`
67}
68
69type DeploymentStatus string
70
71const (
72	DeploymentStatusRunning                DeploymentStatus = "Running"
73	DeploymentStatusSuspended              DeploymentStatus = "Suspended"
74	DeploymentStatusRunningTransitioning   DeploymentStatus = "RunningTransitioning"
75	DeploymentStatusSuspendedTransitioning DeploymentStatus = "SuspendedTransitioning"
76	DeploymentStatusStarting               DeploymentStatus = "Starting"
77	DeploymentStatusSuspending             DeploymentStatus = "Suspending"
78	DeploymentStatusDeploying              DeploymentStatus = "Deploying"
79	DeploymentStatusDeleting               DeploymentStatus = "Deleting"
80)
81
82// DeploymentSlot for cloud services are either Production or Staging Slots
83type DeploymentSlot string
84
85const (
86	// DeploymentSlotProduction represents the Production slot of a cloud service
87	DeploymentSlotProduction DeploymentSlot = "Production"
88	// DeploymentSlotStaging represents the Staging slot of a cloud service
89	DeploymentSlotStaging DeploymentSlot = "Staging"
90)
91
92type RoleInstance struct {
93	RoleName                          string
94	InstanceName                      string
95	InstanceStatus                    InstanceStatus
96	ExtendedInstanceStatus            string
97	InstanceUpgradeDomain             int
98	InstanceFaultDomain               int
99	InstanceSize                      string
100	InstanceStateDetails              string
101	InstanceErrorCode                 string
102	IPAddress                         string             `xml:"IpAddress"`
103	InstanceEndpoints                 []InstanceEndpoint `xml:">InstanceEndpoint"`
104	PowerState                        PowerState
105	HostName                          string
106	RemoteAccessCertificateThumbprint string
107	GuestAgentStatus                  string                    // todo: implement
108	ResourceExtensionStatusList       []ResourceExtensionStatus `xml:">ResourceExtensionStatus"`
109	PublicIPs                         []PublicIP                `xml:">PublicIP"`
110}
111
112type InstanceStatus string
113
114const (
115	InstanceStatusUnknown            = "Unknown"
116	InstanceStatusCreatingVM         = "CreatingVM"
117	InstanceStatusStartingVM         = "StartingVM"
118	InstanceStatusCreatingRole       = "CreatingRole"
119	InstanceStatusStartingRole       = "StartingRole"
120	InstanceStatusReadyRole          = "ReadyRole"
121	InstanceStatusBusyRole           = "BusyRole"
122	InstanceStatusStoppingRole       = "StoppingRole"
123	InstanceStatusStoppingVM         = "StoppingVM"
124	InstanceStatusDeletingVM         = "DeletingVM"
125	InstanceStatusStoppedVM          = "StoppedVM"
126	InstanceStatusRestartingRole     = "RestartingRole"
127	InstanceStatusCyclingRole        = "CyclingRole"
128	InstanceStatusFailedStartingRole = "FailedStartingRole"
129	InstanceStatusFailedStartingVM   = "FailedStartingVM"
130	InstanceStatusUnresponsiveRole   = "UnresponsiveRole"
131	InstanceStatusStoppedDeallocated = "StoppedDeallocated"
132	InstanceStatusPreparing          = "Preparing"
133)
134
135type InstanceEndpoint struct {
136	Name       string
137	Vip        string
138	PublicPort int
139	LocalPort  int
140	Protocol   InputEndpointProtocol
141}
142
143type PowerState string
144
145const (
146	PowerStateStarting PowerState = "Starting"
147	PowerStateStarted  PowerState = "Started"
148	PowerStateStopping PowerState = "Stopping"
149	PowerStateStopped  PowerState = "Stopped"
150	PowerStateUnknown  PowerState = "Unknown"
151)
152
153type ResourceExtensionStatus struct {
154	HandlerName            string
155	Version                string
156	Status                 ResourceExtensionState
157	Code                   string
158	FormattedMessage       FormattedMessage
159	ExtensionSettingStatus ExtensionSettingStatus
160}
161
162type ResourceExtensionState string
163
164const (
165	ResourceExtensionStateInstalling   ResourceExtensionState = "Installing"
166	ResourceExtensionStateReady        ResourceExtensionState = "Ready"
167	ResourceExtensionStateNotReady     ResourceExtensionState = "NotReady"
168	ResourceExtensionStateUnresponsive ResourceExtensionState = "Unresponsive"
169)
170
171type FormattedMessage struct {
172	Language string
173	Message  string
174}
175
176type ExtensionSettingStatus struct {
177	Timestamp        string
178	Name             string
179	Operation        string
180	Status           ExtensionSettingState
181	Code             string
182	FormattedMessage FormattedMessage
183	SubStatusList    []SubStatus `xml:">SubStatus"`
184}
185
186type ExtensionSettingState string
187
188const (
189	ExtensionSettingStateTransitioning ExtensionSettingState = "transitioning"
190	ExtensionSettingStateError         ExtensionSettingState = "error"
191	ExtensionSettingStateSuccess       ExtensionSettingState = "success"
192	ExtensionSettingStateWarning       ExtensionSettingState = "warning"
193)
194
195type SubStatus struct {
196	Name             string
197	Status           ExtensionSettingState
198	FormattedMessage FormattedMessage
199}
200
201type UpgradeStatus struct {
202	UpgradeType               UpgradeType
203	CurrentUpgradeDomainState CurrentUpgradeDomainState
204	CurrentUpgradeDomain      int
205}
206
207type UpgradeType string
208
209const (
210	UpgradeTypeAuto         UpgradeType = "Auto"
211	UpgradeTypeManual       UpgradeType = "Manual"
212	UpgradeTypeSimultaneous UpgradeType = "Simultaneous"
213)
214
215type CurrentUpgradeDomainState string
216
217const (
218	CurrentUpgradeDomainStateBefore CurrentUpgradeDomainState = "Before"
219	CurrentUpgradeDomainStateDuring CurrentUpgradeDomainState = "During"
220)
221
222type ExtendedProperty struct {
223	Name  string
224	Value string
225}
226
227type PersistentVMDowntime struct {
228	StartTime string
229	EndTime   string
230	Status    string
231}
232
233type VirtualIP struct {
234	Address        string
235	IsReserved     bool
236	ReservedIPName string
237	Type           IPAddressType
238}
239
240// Role contains the configuration sets that are used to create virtual
241// machines.
242type Role struct {
243	RoleName                    string                        `xml:",omitempty"` // Specifies the name for the Virtual Machine.
244	RoleType                    string                        `xml:",omitempty"` // Specifies the type of role to use. For Virtual Machines, this must be PersistentVMRole.
245	ConfigurationSets           []ConfigurationSet            `xml:"ConfigurationSets>ConfigurationSet,omitempty"`
246	ResourceExtensionReferences *[]ResourceExtensionReference `xml:"ResourceExtensionReferences>ResourceExtensionReference,omitempty"`
247	VMImageName                 string                        `xml:",omitempty"`                                         // Specifies the name of the VM Image that is to be used to create the Virtual Machine. If this element is used, the ConfigurationSets element is not used.
248	MediaLocation               string                        `xml:",omitempty"`                                         // Required if the Virtual Machine is being created from a published VM Image. Specifies the location of the VHD file that is created when VMImageName specifies a published VM Image.
249	AvailabilitySetName         string                        `xml:",omitempty"`                                         // Specifies the name of a collection of Virtual Machines. Virtual Machines specified in the same availability set are allocated to different nodes to maximize availability.
250	DataVirtualHardDisks        []DataVirtualHardDisk         `xml:"DataVirtualHardDisks>DataVirtualHardDisk,omitempty"` // Contains the parameters that are used to add a data disk to a Virtual Machine. If you are creating a Virtual Machine by using a VM Image, this element is not used.
251	OSVirtualHardDisk           *OSVirtualHardDisk            `xml:",omitempty"`                                         // Contains the parameters that are used to create the operating system disk for a Virtual Machine. If you are creating a Virtual Machine by using a VM Image, this element is not used.
252	RoleSize                    string                        `xml:",omitempty"`                                         // Specifies the size of the Virtual Machine. The default size is Small.
253	ProvisionGuestAgent         bool                          `xml:",omitempty"`                                         // Indicates whether the VM Agent is installed on the Virtual Machine. To run a resource extension in a Virtual Machine, this service must be installed.
254	VMImageInput                *VMImageInput                 `xml:",omitempty"`                                         // When a VM Image is used to create a new PersistentVMRole, the DiskConfigurations in the VM Image are used to create new Disks for the new VM. This parameter can be used to resize the newly created Disks to a larger size than the underlying DiskConfigurations in the VM Image.
255
256	UseCertAuth bool   `xml:"-"`
257	CertPath    string `xml:"-"`
258}
259
260// VMImageInput is for when a VM Image is used to create a new PersistantVMRole,
261// the DiskConfigurations in the VM Image are used to create new Disks for the
262// new VM. This parameter can be used to resize the newly created Disks to a
263// larger size than the underlying DiskConfigurations in the VM Image.
264type VMImageInput struct {
265	OSDiskConfiguration    *OSDiskConfiguration    `xml:",omitempty"`                       // This corresponds to the OSDiskConfiguration of the VM Image used to create a new role. The OSDiskConfiguration element is only available using version 2014-10-01 or higher.
266	DataDiskConfigurations []DataDiskConfiguration `xml:">DataDiskConfiguration,omitempty"` // This corresponds to the DataDiskConfigurations of the VM Image used to create a new role. The DataDiskConfigurations element is only available using version 2014-10-01 or higher.
267}
268
269// OSDiskConfiguration is used to resize the OS disk of a new VM created from a
270// previously saved VM image.
271type OSDiskConfiguration struct {
272	ResizedSizeInGB int
273}
274
275// DataDiskConfiguration is used to resize the data disks of a new VM created
276// from a previously saved VM image.
277type DataDiskConfiguration struct {
278	OSDiskConfiguration
279	Name string // The Name of the DataDiskConfiguration being referenced to.
280
281}
282
283// ExtensionConfiguration Contains extensions that are added to the cloud service.
284// https://docs.microsoft.com/en-us/rest/api/compute/cloudservices/rest-get-deployment#bk_extensionconfig
285type ExtensionConfiguration struct {
286	NamedRoles []NamedRole `xml:"NamedRoles>Role,omitempty"`
287}
288
289// NamedRole specifies a list of extensions that are applied to specific roles in a deployment.
290// https://docs.microsoft.com/en-us/rest/api/compute/cloudservices/rest-get-deployment#bk_namedroles
291type NamedRole struct {
292	RoleName   string      `xml:",omitempty"`
293	Extensions []Extension `xml:"Extensions>Extension,omitempty"`
294}
295
296// Extension Specifies an extension that is to be deployed to a role in a cloud service.
297// https://docs.microsoft.com/en-us/rest/api/compute/cloudservices/rest-get-deployment#bk_extension
298type Extension struct {
299	ID    string `xml:"Id"`
300	State string
301}
302
303// ResourceExtensionReference contains a collection of resource extensions that
304// are to be installed on the Virtual Machine. The VM Agent must be installed on
305// the Virtual Machine to install resource extensions. For more information, see
306// Manage Extensions:
307//
308// https://msdn.microsoft.com/en-us/library/dn606311.aspx.
309type ResourceExtensionReference struct {
310	ReferenceName   string
311	Publisher       string
312	Name            string
313	Version         string
314	ParameterValues []ResourceExtensionParameter `xml:"ResourceExtensionParameterValues>ResourceExtensionParameterValue,omitempty"`
315	State           string
316}
317
318// ResourceExtensionParameter specifies the key, value, and type of a parameter that is passed to the
319// resource extension when it is installed.
320type ResourceExtensionParameter struct {
321	Key   string
322	Value string
323	Type  ResourceExtensionParameterType // If this value is set to Private, the parameter will not be returned by Get Deployment ().
324}
325
326type ResourceExtensionParameterType string
327
328// Enum values for ResourceExtensionParameterType
329const (
330	ResourceExtensionParameterTypePublic  ResourceExtensionParameterType = "Public"
331	ResourceExtensionParameterTypePrivate ResourceExtensionParameterType = "Private"
332)
333
334// DataVirtualHardDisk specifies the properties that are used to create a data
335// disk.
336type DataVirtualHardDisk struct {
337	HostCaching         vmdisk.HostCachingType `xml:",omitempty"` // Specifies the caching mode of the data disk. The default value is None.
338	DiskLabel           string                 `xml:",omitempty"` // If the disk that is being added is already registered in the subscription, this element is ignored. If a new disk is being created, this element is used to provide a description of the disk. The value of this element is only obtained programmatically and does not appear in the Management Portal.
339	DiskName            string                 `xml:",omitempty"` // If the disk that is being added is already registered in the subscription, this element is used to identify the disk to add. If a new disk and the associated VHD are being created by Azure, this element is not used and Azure assigns a unique name that is a combination of the deployment name, role name, and identifying number. The name of the disk must contain only alphanumeric characters, underscores, periods, or dashes. The name must not be longer than 256 characters. The name must not end with period or dash.
340	Lun                 int                    `xml:",omitempty"` // Specifies the Logical Unit Number (LUN) for the data disk. If the disk is the first disk that is added, this element is optional and the default value of 0 is used. If more than one disk is being added, this element is required. Valid LUN values are 0 through 31.
341	LogicalDiskSizeInGB int                    `xml:",omitempty"` // Specifies the size, in GB, of an empty disk to be attached to the Virtual Machine. If the disk that is being added is already registered in the subscription, this element is ignored. If the disk and VHD is being created by Azure as it is added, this element defines the size of the new disk.
342	MediaLink           string                 `xml:",omitempty"` // If the disk that is being added is already registered in the subscription or the VHD for the disk already exists in blob storage, this element is ignored. If a VHD file does not exist in blob storage, this element defines the location of the new VHD that is created when the new disk is added.
343	SourceMediaLink     string                 `xml:",omitempty"` // If the disk that is being added is already registered in the subscription or the VHD for the disk does not exist in blob storage, this element is ignored. If the VHD file exists in blob storage, this element defines the path to the VHD and a disk is registered from it and attached to the virtual machine.
344}
345
346// OSVirtualHardDisk specifies the properties that are used to create an OS
347// disk.
348type OSVirtualHardDisk struct {
349	HostCaching           vmdisk.HostCachingType `xml:",omitempty"` // Specifies the caching mode of the data disk. The default value is None.
350	DiskLabel             string                 `xml:",omitempty"` // If the disk that is being added is already registered in the subscription, this element is ignored. If a new disk is being created, this element is used to provide a description of the disk. The value of this element is only obtained programmatically and does not appear in the Management Portal.
351	DiskName              string                 `xml:",omitempty"` // If the disk that is being added is already registered in the subscription, this element is used to identify the disk to add. If a new disk and the associated VHD are being created by Azure, this element is not used and Azure assigns a unique name that is a combination of the deployment name, role name, and identifying number. The name of the disk must contain only alphanumeric characters, underscores, periods, or dashes. The name must not be longer than 256 characters. The name must not end with period or dash.
352	MediaLink             string                 `xml:",omitempty"` // If the disk that is being added is already registered in the subscription or the VHD for the disk already exists in blob storage, this element is ignored. If a VHD file does not exist in blob storage, this element defines the location of the new VHD that is created when the new disk is added.
353	SourceImageName       string                 `xml:",omitempty"`
354	OS                    string                 `xml:",omitempty"`
355	RemoteSourceImageLink string                 `xml:",omitempty"` // Specifies a publicly accessible URI or a SAS URI to the location where an OS image is stored that is used to create the Virtual Machine. This location can be a different location than the user or platform image repositories in Azure. An image is always associated with a VHD, which is a .vhd file stored as a page blob in a storage account in Azure. If you specify the path to an image with this element, an associated VHD is created and you must use the MediaLink element to specify the location in storage where the VHD will be located. If this element is used, SourceImageName is not used.
356	ResizedSizeInGB       int                    `xml:",omitempty"`
357}
358
359// ConfigurationSet specifies the configuration elements of the Virtual Machine.
360// The type attribute is required to prevent the administrator password from
361// being written to the operation history file.
362type ConfigurationSet struct {
363	ConfigurationSetType ConfigurationSetType
364
365	// Windows provisioning:
366	ComputerName              string               `xml:",omitempty"`                          // Optional. Specifies the computer name for the Virtual Machine. If you do not specify a computer name, one is assigned that is a combination of the deployment name, role name, and identifying number. Computer names must be 1 to 15 characters long.
367	AdminPassword             string               `xml:",omitempty"`                          // Optional. Specifies the password to use for an administrator account on the Virtual Machine that is being created. If you are creating a Virtual Machine using an image, you must specify a name of an administrator account to be created on the machine using the AdminUsername element. You must use the AdminPassword element to specify the password of the administrator account that is being created. If you are creating a Virtual Machine using an existing specialized disk, this element is not used because the account should already exist on the disk.
368	EnableAutomaticUpdates    bool                 `xml:",omitempty"`                          // Optional. Specifies whether automatic updates are enabled for the Virtual Machine. The default value is true.
369	TimeZone                  string               `xml:",omitempty"`                          // Optional. Specifies the time zone for the Virtual Machine.
370	DomainJoin                *DomainJoin          `xml:",omitempty"`                          // Optional. Contains properties that define a domain to which the Virtual Machine will be joined.
371	StoredCertificateSettings []CertificateSetting `xml:">StoredCertificateSetting,omitempty"` // Optional. Contains a list of service certificates with which to provision to the new Virtual Machine.
372	WinRMListeners            *[]WinRMListener     `xml:"WinRM>Listeners>Listener,omitempty"`  // Optional. Contains configuration settings for the Windows Remote Management service on the Virtual Machine. This enables remote Windows PowerShell.
373	AdminUsername             string               `xml:",omitempty"`                          // Optional. Specifies the name of the administrator account that is created to access the Virtual Machine. If you are creating a Virtual Machine using an image, you must specify a name of an administrator account to be created by using this element. You must use the AdminPassword element to specify the password of the administrator account that is being created. If you are creating a Virtual Machine using an existing specialized disk, this element is not used because the account should already exist on the disk.
374	AdditionalUnattendContent string               `xml:",omitempty"`                          // Specifies additional base-64 encoded XML formatted information that can be included in the Unattend.xml file, which is used by Windows Setup.
375
376	// Linux provisioning:
377	HostName                         string `xml:",omitempty"`                                 // Required. Specifies the host name for the Virtual Machine. Host names must be 1 to 64 characters long.
378	UserName                         string `xml:",omitempty"`                                 // Required. Specifies the name of a user account to be created in the sudoer group of the Virtual Machine. User account names must be 1 to 32 characters long.
379	UserPassword                     string `xml:",omitempty"`                                 // Required. Specifies the password for the user account. Passwords must be 6 to 72 characters long.
380	DisableSSHPasswordAuthentication string `xml:"DisableSshPasswordAuthentication,omitempty"` // Optional. Specifies whether SSH password authentication is disabled. By default this value is set to true.
381	SSH                              *SSH   `xml:",omitempty"`                                 // Optional. Specifies the SSH public keys and key pairs to use with the Virtual Machine.
382
383	// In WindowsProvisioningConfiguration: The base-64 encoded string is decoded to a binary array that is saved as a file on the Virtual Machine. The maximum length of the binary array is 65535 bytes. The file is saved to %SYSTEMDRIVE%\AzureData\CustomData.bin. If the file exists, it is overwritten. The security on directory is set to System:Full Control and Administrators:Full Control.
384	// In LinuxProvisioningConfiguration: The base-64 encoded string is located in the ovf-env.xml file on the ISO of the Virtual Machine. The file is copied to /var/lib/waagent/ovf-env.xml by the Azure Linux Agent. The Azure Linux Agent will also place the base-64 encoded data in /var/lib/waagent/CustomData during provisioning. The maximum length of the binary array is 65535 bytes.
385	CustomData string `xml:",omitempty"` // Specifies a base-64 encoded string of custom data.
386
387	// Network configuration:
388	InputEndpoints                []InputEndpoint `xml:">InputEndpoint,omitempty"` // Optional in NetworkConfiguration. Contains a collection of external endpoints for the Virtual Machine.
389	SubnetNames                   []string        `xml:">SubnetName,omitempty"`    // Required if StaticVirtualNetworkIPAddress is specified; otherwise, optional in NetworkConfiguration. Contains a list of subnets to which the Virtual Machine will belong.
390	StaticVirtualNetworkIPAddress string          `xml:",omitempty"`               // Specifies the internal IP address for the Virtual Machine in a Virtual Network. If you specify this element, you must also specify the SubnetNames element with only one subnet defined. The IP address specified in this element must belong to the subnet that is defined in SubnetNames and it should not be the one of the first four IP addresses or the last IP address in the subnet. Deploying web roles or worker roles into a subnet that has Virtual Machines with StaticVirtualNetworkIPAddress defined is not supported.
391	NetworkSecurityGroup          string          `xml:",omitempty"`               // Optional in NetworkConfiguration. Represents the name of the Network Security Group that will be associated with the Virtual Machine. Network Security Group must exist in the context of subscription and be created in same region to which the virtual machine will be deployed.
392	PublicIPs                     []PublicIP      `xml:">PublicIP,omitempty"`      // Contains a public IP address that can be used in addition to the default virtual IP address for the Virtual Machine.
393}
394
395type ConfigurationSetType string
396
397// Enum values for ConfigurationSetType
398const (
399	ConfigurationSetTypeWindowsProvisioning ConfigurationSetType = "WindowsProvisioningConfiguration"
400	ConfigurationSetTypeLinuxProvisioning   ConfigurationSetType = "LinuxProvisioningConfiguration"
401	ConfigurationSetTypeNetwork             ConfigurationSetType = "NetworkConfiguration"
402)
403
404// DomainJoin contains properties that define a domain to which the Virtual
405// Machine will be joined.
406type DomainJoin struct {
407	Credentials     Credentials `xml:",omitempty"` // Specifies the credentials to use to join the Virtual Machine to the domain.
408	JoinDomain      string      `xml:",omitempty"` // Specifies the domain to join.
409	MachineObjectOU string      `xml:",omitempty"` // Specifies the Lightweight Directory Access Protocol (LDAP) X 500-distinguished name of the organizational unit (OU) in which the computer account is created. This account is in Active Directory on a domain controller in the domain to which the computer is being joined.
410}
411
412// Credentials specifies the credentials to use to join the Virtual Machine to
413// the domain. If Domain is not specified, Username must specify the user
414// principal name (UPN) format (user@fully-qualified-DNS-domain) or the fully-
415// qualified-DNS-domain\username format.
416type Credentials struct {
417	Domain   string // Specifies the name of the domain used to authenticate an account. The value is a fully qualified DNS domain.
418	Username string // Specifies a user name in the domain that can be used to join the domain.
419	Password string // Specifies the password to use to join the domain.
420}
421
422// CertificateSetting specifies the parameters for the certificate which to
423// provision to the new Virtual Machine.
424type CertificateSetting struct {
425	StoreLocation string // Required. Specifies the certificate store location on the Virtual Machine. The only supported value is "LocalMachine".
426	StoreName     string // Required. Specifies the name of the certificate store from which the certificate is retrieved. For example, "My".
427	Thumbprint    string // Required. Specifies the thumbprint of the certificate. The thumbprint must specify an existing service certificate.
428}
429
430// WinRMListener specifies the protocol and certificate information for a WinRM
431// listener.
432type WinRMListener struct {
433	Protocol              WinRMProtocol // Specifies the protocol of listener.
434	CertificateThumbprint string        `xml:",omitempty"` // Specifies the certificate thumbprint for the secure connection. If this value is not specified, a self-signed certificate is generated and used for the Virtual Machine.
435}
436
437type WinRMProtocol string
438
439// Enum values for WinRMProtocol
440const (
441	WinRMProtocolHTTP  WinRMProtocol = "Http"
442	WinRMProtocolHTTPS WinRMProtocol = "Https"
443)
444
445// SSH specifies the SSH public keys and key pairs to use with the Virtual Machine.
446type SSH struct {
447	PublicKeys []PublicKey `xml:">PublicKey"`
448	KeyPairs   []KeyPair   `xml:">KeyPair"`
449}
450
451// PublicKey specifies a public SSH key.
452type PublicKey struct {
453	Fingerprint string // Specifies the SHA1 fingerprint of an X509 certificate associated with the cloud service and includes the SSH public key.
454	// Specifies the full path of a file, on the Virtual Machine, where the SSH public key is stored. If
455	// the file already exists, the specified key is appended to the file.
456	Path string // Usually /home/username/.ssh/authorized_keys
457}
458
459// KeyPair specifies an SSH keypair.
460type KeyPair struct {
461	Fingerprint string // Specifies the SHA1 fingerprint of an X509 certificate that is associated with the cloud service and includes the SSH keypair.
462	// Specifies the full path of a file, on the virtual machine, which stores the SSH private key. The
463	// file is overwritten when multiple keys are written to it. The SSH public key is stored in the same
464	// directory and has the same name as the private key file with .pub suffix.
465	Path string // Usually /home/username/.ssh/id_rsa
466}
467
468// InputEndpoint specifies the properties that define an external endpoint for
469// the Virtual Machine.
470type InputEndpoint struct {
471	LocalPort int                   // Specifies the internal port on which the Virtual Machine is listening.
472	Name      string                // Specifies the name of the external endpoint.
473	Port      int                   // Specifies the external port to use for the endpoint.
474	Protocol  InputEndpointProtocol //Specifies the transport protocol for the endpoint.
475	Vip       string                `xml:",omitempty"`
476}
477
478type InputEndpointProtocol string
479
480// Enum values for InputEndpointProtocol
481const (
482	InputEndpointProtocolTCP InputEndpointProtocol = "TCP"
483	InputEndpointProtocolUDP InputEndpointProtocol = "UDP"
484)
485
486// PublicIP contains a public IP address that can be used in addition to default
487// virtual IP address for the Virtual Machine.
488type PublicIP struct {
489	Name                 string // Specifies the name of the public IP address.
490	Address              string // Specifies the IP address.
491	IdleTimeoutInMinutes int    `xml:",omitempty"` // Specifies the timeout for the TCP idle connection. The value can be set between 4 and 30 minutes. The default value is 4 minutes. This element is only used when the protocol is set to TCP.
492}
493
494// ServiceCertificate contains a certificate for adding it to a hosted service
495type ServiceCertificate struct {
496	XMLName           xml.Name `xml:"CertificateFile"`
497	Data              string
498	CertificateFormat string
499	Password          string `xml:",omitempty"`
500}
501
502// StartRoleOperation contains the information for starting a Role.
503type StartRoleOperation struct {
504	XMLName       xml.Name `xml:"http://schemas.microsoft.com/windowsazure StartRoleOperation"`
505	OperationType string
506}
507
508type PostShutdownAction string
509
510// Enum values for PostShutdownAction
511const (
512	PostShutdownActionStopped            PostShutdownAction = "Stopped"
513	PostShutdownActionStoppedDeallocated PostShutdownAction = "StoppedDeallocated"
514)
515
516// ShutdownRoleOperation contains the information for shutting down a Role.
517type ShutdownRoleOperation struct {
518	XMLName            xml.Name `xml:"http://schemas.microsoft.com/windowsazure ShutdownRoleOperation"`
519	OperationType      string
520	PostShutdownAction PostShutdownAction
521}
522
523// RestartRoleOperation contains the information for restarting a Role.
524type RestartRoleOperation struct {
525	XMLName       xml.Name `xml:"http://schemas.microsoft.com/windowsazure RestartRoleOperation"`
526	OperationType string
527}
528
529// CaptureRoleOperation contains the information for capturing a Role
530type CaptureRoleOperation struct {
531	XMLName                   xml.Name `xml:"http://schemas.microsoft.com/windowsazure CaptureRoleOperation"`
532	OperationType             string
533	PostCaptureAction         PostCaptureAction
534	ProvisioningConfiguration *ConfigurationSet `xml:",omitempty"`
535	TargetImageLabel          string
536	TargetImageName           string
537}
538
539type PostCaptureAction string
540
541// Enum values for PostCaptureAction
542const (
543	PostCaptureActionDelete      PostCaptureAction = "Delete"
544	PostCaptureActionReprovision PostCaptureAction = "Reprovision"
545)
546
547// RoleSizeList contains a list of the available role sizes
548type RoleSizeList struct {
549	XMLName   xml.Name   `xml:"RoleSizes"`
550	RoleSizes []RoleSize `xml:"RoleSize"`
551}
552
553// RoleSize contains a detailed explanation of a role size
554type RoleSize struct {
555	Name                               string
556	Label                              string
557	Cores                              int
558	MemoryInMb                         int
559	SupportedByWebWorkerRoles          bool
560	SupportedByVirtualMachines         bool
561	MaxDataDiskCount                   int
562	WebWorkerResourceDiskSizeInMb      int
563	VirtualMachineResourceDiskSizeInMb int
564}
565
566// DNSServer contains the definition of a DNS server for virtual machine deployment
567type DNSServer struct {
568	Name    string
569	Address string
570}
571
572// LoadBalancer contains the definition of a load balancer for virtual machine deployment
573type LoadBalancer struct {
574	Name                          string        // Specifies the name of the internal load balancer.
575	Type                          IPAddressType `xml:"FrontendIpConfiguration>Type"`                                    // Specifies the type of virtual IP address that is provided by the load balancer. The only allowable value is Private.
576	SubnetName                    string        `xml:"FrontendIpConfiguration>SubnetName,omitempty"`                    // Required if the deployment exists in a virtual network and a StaticVirtualNetworkIPAddress is assigned. Specifies the subnet of the virtual network that the load balancer uses. The virtual IP address that is managed by the load balancer is contained in this subnet.
577	StaticVirtualNetworkIPAddress string        `xml:"FrontendIpConfiguration>StaticVirtualNetworkIPAddress,omitempty"` // Specifies a specific virtual IP address that the load balancer uses from the subnet in the virtual network.
578}
579
580type IPAddressType string
581
582// Enum values for IPAddressType
583const (
584	IPAddressTypePrivate IPAddressType = "Private" // Only allowed value (currently) for IPAddressType
585)
586
587type ResourceExtensions struct {
588	List []ResourceExtension `xml:"ResourceExtension"`
589}
590
591type ResourceExtension struct {
592	Publisher                   string
593	Name                        string
594	Version                     string
595	Label                       string
596	Description                 string
597	PublicConfigurationSchema   string
598	PrivateConfigurationSchema  string
599	SampleConfig                string
600	ReplicationCompleted        string
601	Eula                        string
602	PrivacyURI                  string `xml:"PrivacyUri"`
603	HomepageURI                 string `xml:"HomepageUri"`
604	IsJSONExtension             bool   `xml:"IsJsonExtension"`
605	IsInternalExtension         bool
606	DisallowMajorVersionUpgrade bool
607	CompanyName                 string
608	SupportedOS                 string
609	PublishedDate               string
610}
611
612type PersistentVMRole struct {
613	XMLName xml.Name `xml:"http://schemas.microsoft.com/windowsazure PersistentVMRole"`
614	Role
615}
616