package servicemap

// Copyright (c) Microsoft and contributors.  All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Code generated by Microsoft (R) AutoRest Code Generator 1.0.1.0
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.

import (
	"github.com/Azure/go-autorest/autorest"
	"github.com/Azure/go-autorest/autorest/date"
	"github.com/Azure/go-autorest/autorest/to"
	"net/http"
)

// Accuracy enumerates the values for accuracy.
type Accuracy string

const (
	// Actual specifies the actual state for accuracy.
	Actual Accuracy = "actual"
	// Estimated specifies the estimated state for accuracy.
	Estimated Accuracy = "estimated"
)

// Bitness enumerates the values for bitness.
type Bitness string

const (
	// SixFourbit specifies the six fourbit state for bitness.
	SixFourbit Bitness = "64bit"
	// ThreeTwobit specifies the three twobit state for bitness.
	ThreeTwobit Bitness = "32bit"
)

// ConnectionFailureState enumerates the values for connection failure state.
type ConnectionFailureState string

const (
	// Failed specifies the failed state for connection failure state.
	Failed ConnectionFailureState = "failed"
	// Mixed specifies the mixed state for connection failure state.
	Mixed ConnectionFailureState = "mixed"
	// Ok specifies the ok state for connection failure state.
	Ok ConnectionFailureState = "ok"
)

// HypervisorType enumerates the values for hypervisor type.
type HypervisorType string

const (
	// Hyperv specifies the hyperv state for hypervisor type.
	Hyperv HypervisorType = "hyperv"
	// Unknown specifies the unknown state for hypervisor type.
	Unknown HypervisorType = "unknown"
)

// MachineRebootStatus enumerates the values for machine reboot status.
type MachineRebootStatus string

const (
	// MachineRebootStatusNotRebooted specifies the machine reboot status not
	// rebooted state for machine reboot status.
	MachineRebootStatusNotRebooted MachineRebootStatus = "notRebooted"
	// MachineRebootStatusRebooted specifies the machine reboot status rebooted
	// state for machine reboot status.
	MachineRebootStatusRebooted MachineRebootStatus = "rebooted"
	// MachineRebootStatusUnknown specifies the machine reboot status unknown
	// state for machine reboot status.
	MachineRebootStatusUnknown MachineRebootStatus = "unknown"
)

// MonitoringState enumerates the values for monitoring state.
type MonitoringState string

const (
	// Discovered specifies the discovered state for monitoring state.
	Discovered MonitoringState = "discovered"
	// Monitored specifies the monitored state for monitoring state.
	Monitored MonitoringState = "monitored"
)

// OperatingSystemFamily enumerates the values for operating system family.
type OperatingSystemFamily string

const (
	// OperatingSystemFamilyAix specifies the operating system family aix state
	// for operating system family.
	OperatingSystemFamilyAix OperatingSystemFamily = "aix"
	// OperatingSystemFamilyLinux specifies the operating system family linux
	// state for operating system family.
	OperatingSystemFamilyLinux OperatingSystemFamily = "linux"
	// OperatingSystemFamilySolaris specifies the operating system family
	// solaris state for operating system family.
	OperatingSystemFamilySolaris OperatingSystemFamily = "solaris"
	// OperatingSystemFamilyUnknown specifies the operating system family
	// unknown state for operating system family.
	OperatingSystemFamilyUnknown OperatingSystemFamily = "unknown"
	// OperatingSystemFamilyWindows specifies the operating system family
	// windows state for operating system family.
	OperatingSystemFamilyWindows OperatingSystemFamily = "windows"
)

// ProcessRole enumerates the values for process role.
type ProcessRole string

const (
	// AppServer specifies the app server state for process role.
	AppServer ProcessRole = "appServer"
	// DatabaseServer specifies the database server state for process role.
	DatabaseServer ProcessRole = "databaseServer"
	// LdapServer specifies the ldap server state for process role.
	LdapServer ProcessRole = "ldapServer"
	// SmbServer specifies the smb server state for process role.
	SmbServer ProcessRole = "smbServer"
	// WebServer specifies the web server state for process role.
	WebServer ProcessRole = "webServer"
)

// VirtualizationState enumerates the values for virtualization state.
type VirtualizationState string

const (
	// VirtualizationStateHypervisor specifies the virtualization state
	// hypervisor state for virtualization state.
	VirtualizationStateHypervisor VirtualizationState = "hypervisor"
	// VirtualizationStatePhysical specifies the virtualization state physical
	// state for virtualization state.
	VirtualizationStatePhysical VirtualizationState = "physical"
	// VirtualizationStateUnknown specifies the virtualization state unknown
	// state for virtualization state.
	VirtualizationStateUnknown VirtualizationState = "unknown"
	// VirtualizationStateVirtual specifies the virtualization state virtual
	// state for virtualization state.
	VirtualizationStateVirtual VirtualizationState = "virtual"
)

// VirtualMachineType enumerates the values for virtual machine type.
type VirtualMachineType string

const (
	// VirtualMachineTypeHyperv specifies the virtual machine type hyperv state
	// for virtual machine type.
	VirtualMachineTypeHyperv VirtualMachineType = "hyperv"
	// VirtualMachineTypeLdom specifies the virtual machine type ldom state for
	// virtual machine type.
	VirtualMachineTypeLdom VirtualMachineType = "ldom"
	// VirtualMachineTypeLpar specifies the virtual machine type lpar state for
	// virtual machine type.
	VirtualMachineTypeLpar VirtualMachineType = "lpar"
	// VirtualMachineTypeUnknown specifies the virtual machine type unknown
	// state for virtual machine type.
	VirtualMachineTypeUnknown VirtualMachineType = "unknown"
	// VirtualMachineTypeVirtualPc specifies the virtual machine type virtual
	// pc state for virtual machine type.
	VirtualMachineTypeVirtualPc VirtualMachineType = "virtualPc"
	// VirtualMachineTypeVmware specifies the virtual machine type vmware state
	// for virtual machine type.
	VirtualMachineTypeVmware VirtualMachineType = "vmware"
	// VirtualMachineTypeXen specifies the virtual machine type xen state for
	// virtual machine type.
	VirtualMachineTypeXen VirtualMachineType = "xen"
)

// Acceptor is a process accepting on a port.
type Acceptor struct {
	ID                  *string `json:"id,omitempty"`
	Type                *string `json:"type,omitempty"`
	Name                *string `json:"name,omitempty"`
	*AcceptorProperties `json:"properties,omitempty"`
}

// AcceptorProperties is properties for an acceptor relationship.
type AcceptorProperties struct {
	Source      *PortReference    `json:"source,omitempty"`
	Destination *ProcessReference `json:"destination,omitempty"`
	StartTime   *date.Time        `json:"startTime,omitempty"`
	EndTime     *date.Time        `json:"endTime,omitempty"`
}

// AgentConfiguration is describes the configuration of the Dependency Agent
// installed on a machine.
type AgentConfiguration struct {
	AgentID                 *string             `json:"agentId,omitempty"`
	DependencyAgentID       *string             `json:"dependencyAgentId,omitempty"`
	DependencyAgentVersion  *string             `json:"dependencyAgentVersion,omitempty"`
	DependencyAgentRevision *string             `json:"dependencyAgentRevision,omitempty"`
	RebootStatus            MachineRebootStatus `json:"rebootStatus,omitempty"`
	ClockGranularity        *int32              `json:"clockGranularity,omitempty"`
}

// ClientGroup is represents a collection of clients of a resource. A client
// group can represent the clients of a port, process, or a machine.
type ClientGroup struct {
	autorest.Response      `json:"-"`
	ID                     *string `json:"id,omitempty"`
	Type                   *string `json:"type,omitempty"`
	Name                   *string `json:"name,omitempty"`
	Etag                   *string `json:"etag,omitempty"`
	*ClientGroupProperties `json:"properties,omitempty"`
}

// ClientGroupProperties is resource properties.
type ClientGroupProperties struct {
	ClientsOf *ResourceReference `json:"clientsOf,omitempty"`
}

// ClientGroupMember is represents a member of a client group
type ClientGroupMember struct {
	ID                           *string `json:"id,omitempty"`
	Type                         *string `json:"type,omitempty"`
	Name                         *string `json:"name,omitempty"`
	*ClientGroupMemberProperties `json:"properties,omitempty"`
}

// ClientGroupMemberProperties is resource properties.
type ClientGroupMemberProperties struct {
	IPAddress *string             `json:"ipAddress,omitempty"`
	Port      *PortReference      `json:"port,omitempty"`
	Processes *[]ProcessReference `json:"processes,omitempty"`
}

// ClientGroupMembersCollection is collection of ClientGroupMember resources.
type ClientGroupMembersCollection struct {
	autorest.Response `json:"-"`
	Value             *[]ClientGroupMember `json:"value,omitempty"`
	NextLink          *string              `json:"nextLink,omitempty"`
}

// ClientGroupMembersCollectionPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client ClientGroupMembersCollection) ClientGroupMembersCollectionPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// ClientGroupMembersCount is specifies the number of members in a client
// group.
type ClientGroupMembersCount struct {
	autorest.Response `json:"-"`
	StartTime         *date.Time `json:"startTime,omitempty"`
	EndTime           *date.Time `json:"endTime,omitempty"`
	GroupID           *string    `json:"groupId,omitempty"`
	Count             *int32     `json:"count,omitempty"`
	Accuracy          Accuracy   `json:"accuracy,omitempty"`
}

// Connection is a network connection.
type Connection struct {
	ID                    *string `json:"id,omitempty"`
	Type                  *string `json:"type,omitempty"`
	Name                  *string `json:"name,omitempty"`
	*ConnectionProperties `json:"properties,omitempty"`
}

// ConnectionCollection is collection of Connection resources.
type ConnectionCollection struct {
	autorest.Response `json:"-"`
	Value             *[]Connection `json:"value,omitempty"`
	NextLink          *string       `json:"nextLink,omitempty"`
}

// ConnectionCollectionPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client ConnectionCollection) ConnectionCollectionPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// ConnectionProperties is properties for a connection resource.
type ConnectionProperties struct {
	Source       *ResourceReference     `json:"source,omitempty"`
	Destination  *ResourceReference     `json:"destination,omitempty"`
	StartTime    *date.Time             `json:"startTime,omitempty"`
	EndTime      *date.Time             `json:"endTime,omitempty"`
	ServerPort   *PortReference         `json:"serverPort,omitempty"`
	FailureState ConnectionFailureState `json:"failureState,omitempty"`
}

// CoreResource is marker resource for the core Service Map resources
type CoreResource struct {
	ID   *string `json:"id,omitempty"`
	Type *string `json:"type,omitempty"`
	Name *string `json:"name,omitempty"`
	Etag *string `json:"etag,omitempty"`
}

// Error is error details.
type Error struct {
	Code    *string `json:"code,omitempty"`
	Message *string `json:"message,omitempty"`
}

// ErrorResponse is an error response from the API.
type ErrorResponse struct {
	Error *Error `json:"error,omitempty"`
}

// HypervisorConfiguration is describes the hypervisor configuration of a
// machine.
type HypervisorConfiguration struct {
	HypervisorType      HypervisorType `json:"hypervisorType,omitempty"`
	NativeHostMachineID *string        `json:"nativeHostMachineId,omitempty"`
}

// Ipv4NetworkInterface is describes an IPv4 network interface.
type Ipv4NetworkInterface struct {
	IPAddress  *string `json:"ipAddress,omitempty"`
	SubnetMask *string `json:"subnetMask,omitempty"`
}

// Ipv6NetworkInterface is describes an IPv6 network interface.
type Ipv6NetworkInterface struct {
	IPAddress *string `json:"ipAddress,omitempty"`
}

// Liveness is specifies the contents of a check liveness response.
type Liveness struct {
	autorest.Response `json:"-"`
	StartTime         *date.Time `json:"startTime,omitempty"`
	EndTime           *date.Time `json:"endTime,omitempty"`
	Live              *bool      `json:"live,omitempty"`
}

// Machine is a machine resource represents a discovered computer system. It
// can be *monitored*, i.e., a Dependency Agent is running on it, or
// *discovered*, i.e., its existence was inferred by observing the data stream
// from monitored machines. As machines change, prior versions of the machine
// resource are preserved and available for access. A machine is live during an
// interval of time, if either its Dependency Agent has reported data during
// (parts) of that interval, or a Dependency agent running on other machines
// has reported activity associated with the machine.
type Machine struct {
	autorest.Response  `json:"-"`
	ID                 *string `json:"id,omitempty"`
	Type               *string `json:"type,omitempty"`
	Name               *string `json:"name,omitempty"`
	Etag               *string `json:"etag,omitempty"`
	*MachineProperties `json:"properties,omitempty"`
}

// MachineProperties is resource properties.
type MachineProperties struct {
	Timestamp                *date.Time                     `json:"timestamp,omitempty"`
	MonitoringState          MonitoringState                `json:"monitoringState,omitempty"`
	VirtualizationState      VirtualizationState            `json:"virtualizationState,omitempty"`
	DisplayName              *string                        `json:"displayName,omitempty"`
	ComputerName             *string                        `json:"computerName,omitempty"`
	FullyQualifiedDomainName *string                        `json:"fullyQualifiedDomainName,omitempty"`
	BootTime                 *date.Time                     `json:"bootTime,omitempty"`
	Timezone                 *Timezone                      `json:"timezone,omitempty"`
	Agent                    *AgentConfiguration            `json:"agent,omitempty"`
	Resources                *MachineResourcesConfiguration `json:"resources,omitempty"`
	Networking               *NetworkConfiguration          `json:"networking,omitempty"`
	OperatingSystem          *OperatingSystemConfiguration  `json:"operatingSystem,omitempty"`
	VirtualMachine           *VirtualMachineConfiguration   `json:"virtualMachine,omitempty"`
	Hypervisor               *HypervisorConfiguration       `json:"hypervisor,omitempty"`
}

// MachineCollection is collection of Machine resources.
type MachineCollection struct {
	autorest.Response `json:"-"`
	Value             *[]Machine `json:"value,omitempty"`
	NextLink          *string    `json:"nextLink,omitempty"`
}

// MachineCollectionPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client MachineCollection) MachineCollectionPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// MachineCountsByOperatingSystem is machines by operating system.
type MachineCountsByOperatingSystem struct {
	Windows *int32 `json:"windows,omitempty"`
	Linux   *int32 `json:"linux,omitempty"`
}

// MachineGroup is a user-defined logical grouping of machines.
type MachineGroup struct {
	autorest.Response       `json:"-"`
	ID                      *string `json:"id,omitempty"`
	Type                    *string `json:"type,omitempty"`
	Name                    *string `json:"name,omitempty"`
	Etag                    *string `json:"etag,omitempty"`
	*MachineGroupProperties `json:"properties,omitempty"`
}

// MachineGroupProperties is resource properties.
type MachineGroupProperties struct {
	DisplayName *string                      `json:"displayName,omitempty"`
	Machines    *[]MachineReferenceWithHints `json:"machines,omitempty"`
}

// MachineGroupCollection is collection of Machine Group resources.
type MachineGroupCollection struct {
	autorest.Response `json:"-"`
	Value             *[]MachineGroup `json:"value,omitempty"`
	NextLink          *string         `json:"nextLink,omitempty"`
}

// MachineGroupCollectionPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client MachineGroupCollection) MachineGroupCollectionPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// MachineGroupMapRequest is specifies the computation of a machine group
// dependency map. A machine group dependency map includes all direct
// dependencies of a group of machines.
type MachineGroupMapRequest struct {
	StartTime       *date.Time `json:"startTime,omitempty"`
	EndTime         *date.Time `json:"endTime,omitempty"`
	MachineGroupID  *string    `json:"machineGroupId,omitempty"`
	FilterProcesses *bool      `json:"filterProcesses,omitempty"`
}

// MachineReference is reference to a machine.
type MachineReference struct {
	ID   *string `json:"id,omitempty"`
	Type *string `json:"type,omitempty"`
	Name *string `json:"name,omitempty"`
}

// MachineReferenceWithHints is a machine reference with a hint of the
// machine's name and operating system.
type MachineReferenceWithHints struct {
	ID                                   *string `json:"id,omitempty"`
	Type                                 *string `json:"type,omitempty"`
	Name                                 *string `json:"name,omitempty"`
	*MachineReferenceWithHintsProperties `json:"properties,omitempty"`
}

// MachineReferenceWithHintsProperties is machine reference with name and os
// hints.
type MachineReferenceWithHintsProperties struct {
	DisplayNameHint *string               `json:"displayNameHint,omitempty"`
	OsFamilyHint    OperatingSystemFamily `json:"osFamilyHint,omitempty"`
}

// MachineResourcesConfiguration is describes the resources of a machine.
type MachineResourcesConfiguration struct {
	PhysicalMemory   *int32   `json:"physicalMemory,omitempty"`
	Cpus             *int32   `json:"cpus,omitempty"`
	CPUSpeed         *int32   `json:"cpuSpeed,omitempty"`
	CPUSpeedAccuracy Accuracy `json:"cpuSpeedAccuracy,omitempty"`
}

// MachinesSummary is a summary of the machines in the workspace.
type MachinesSummary struct {
	autorest.Response          `json:"-"`
	ID                         *string `json:"id,omitempty"`
	Type                       *string `json:"type,omitempty"`
	Name                       *string `json:"name,omitempty"`
	*MachinesSummaryProperties `json:"properties,omitempty"`
}

// MachinesSummaryProperties is summarizes machines in the workspace.
type MachinesSummaryProperties struct {
	StartTime *date.Time                      `json:"startTime,omitempty"`
	EndTime   *date.Time                      `json:"endTime,omitempty"`
	Total     *int32                          `json:"total,omitempty"`
	Live      *int32                          `json:"live,omitempty"`
	Os        *MachineCountsByOperatingSystem `json:"os,omitempty"`
}

// Map is a map of resources and relationships between them.
type Map struct {
	Nodes *MapNodes `json:"nodes,omitempty"`
	Edges *MapEdges `json:"edges,omitempty"`
}

// MapEdges is the edges (relationships) of a map.
type MapEdges struct {
	Connections *[]Connection `json:"connections,omitempty"`
	Acceptors   *[]Acceptor   `json:"acceptors,omitempty"`
}

// MapNodes is the nodes (entities) of a map.
type MapNodes struct {
	Machines     *[]Machine     `json:"machines,omitempty"`
	Processes    *[]Process     `json:"processes,omitempty"`
	Ports        *[]Port        `json:"Ports,omitempty"`
	ClientGroups *[]ClientGroup `json:"ClientGroups,omitempty"`
}

// MapRequest is specifies the contents of request to generate a map.
type MapRequest struct {
	StartTime *date.Time `json:"startTime,omitempty"`
	EndTime   *date.Time `json:"endTime,omitempty"`
}

// MapResponse is specified the contents of a map response.
type MapResponse struct {
	autorest.Response `json:"-"`
	StartTime         *date.Time `json:"startTime,omitempty"`
	EndTime           *date.Time `json:"endTime,omitempty"`
	Map               *Map       `json:"map,omitempty"`
}

// NetworkConfiguration is describes the network configuration of a machine.
type NetworkConfiguration struct {
	Ipv4Interfaces      *[]Ipv4NetworkInterface `json:"ipv4Interfaces,omitempty"`
	Ipv6Interfaces      *[]Ipv6NetworkInterface `json:"ipv6Interfaces,omitempty"`
	DefaultIpv4Gateways *[]string               `json:"defaultIpv4Gateways,omitempty"`
	MacAddresses        *[]string               `json:"macAddresses,omitempty"`
	DNSNames            *[]string               `json:"dnsNames,omitempty"`
}

// OperatingSystemConfiguration is describes the configuration of the operating
// system of a machine.
type OperatingSystemConfiguration struct {
	Family   OperatingSystemFamily `json:"family,omitempty"`
	FullName *string               `json:"fullName,omitempty"`
	Bitness  Bitness               `json:"bitness,omitempty"`
}

// Port is a port resource represents a server port on a machine. The port may
// be actively *monitored*, i.e., a Dependency Agent is running on its machine,
// or *discovered*, i.e., its existence was inferred by observing the data
// stream from monitored machines. A port is live during an interval of time,
// if that port had associated activity during (parts) of that interval.
type Port struct {
	autorest.Response `json:"-"`
	ID                *string `json:"id,omitempty"`
	Type              *string `json:"type,omitempty"`
	Name              *string `json:"name,omitempty"`
	Etag              *string `json:"etag,omitempty"`
	*PortProperties   `json:"properties,omitempty"`
}

// PortProperties is resource properties.
type PortProperties struct {
	MonitoringState MonitoringState    `json:"monitoringState,omitempty"`
	Machine         *ResourceReference `json:"machine,omitempty"`
	DisplayName     *string            `json:"displayName,omitempty"`
	IPAddress       *string            `json:"ipAddress,omitempty"`
	PortNumber      *int32             `json:"portNumber,omitempty"`
}

// PortCollection is collection of Port resources.
type PortCollection struct {
	autorest.Response `json:"-"`
	Value             *[]Port `json:"value,omitempty"`
	NextLink          *string `json:"nextLink,omitempty"`
}

// PortCollectionPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client PortCollection) PortCollectionPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// PortReference is reference to a port.
type PortReference struct {
	ID                       *string `json:"id,omitempty"`
	Type                     *string `json:"type,omitempty"`
	Name                     *string `json:"name,omitempty"`
	*PortReferenceProperties `json:"properties,omitempty"`
}

// PortReferenceProperties is resource properties.
type PortReferenceProperties struct {
	Machine    *MachineReference `json:"machine,omitempty"`
	IPAddress  *string           `json:"ipAddress,omitempty"`
	PortNumber *int32            `json:"portNumber,omitempty"`
}

// Process is a process resource represents a process running on a machine. The
// process may be actively *monitored*, i.e., a Dependency Agent is running on
// its machine, or *discovered*, i.e., its existence was inferred by observing
// the data stream from monitored machines. A process resource represents a
// pool of actual operating system resources that share command lines and
// metadata. As the process pool evolves over time, prior versions of the
// process resource are preserved and available for access. A process is live
// during an interval of time, if that process is executing during (parts) of
// that interval
type Process struct {
	autorest.Response  `json:"-"`
	ID                 *string `json:"id,omitempty"`
	Type               *string `json:"type,omitempty"`
	Name               *string `json:"name,omitempty"`
	Etag               *string `json:"etag,omitempty"`
	*ProcessProperties `json:"properties,omitempty"`
}

// ProcessProperties is resource properties.
type ProcessProperties struct {
	Timestamp       *date.Time         `json:"timestamp,omitempty"`
	MonitoringState MonitoringState    `json:"monitoringState,omitempty"`
	Machine         *ResourceReference `json:"machine,omitempty"`
	ExecutableName  *string            `json:"executableName,omitempty"`
	DisplayName     *string            `json:"displayName,omitempty"`
	StartTime       *date.Time         `json:"startTime,omitempty"`
	Role            ProcessRole        `json:"role,omitempty"`
	Details         *ProcessDetails    `json:"details,omitempty"`
	User            *ProcessUser       `json:"user,omitempty"`
	ClientOf        *ResourceReference `json:"clientOf,omitempty"`
	AcceptorOf      *ResourceReference `json:"acceptorOf,omitempty"`
}

// ProcessCollection is collection of Process resources.
type ProcessCollection struct {
	autorest.Response `json:"-"`
	Value             *[]Process `json:"value,omitempty"`
	NextLink          *string    `json:"nextLink,omitempty"`
}

// ProcessCollectionPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client ProcessCollection) ProcessCollectionPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// ProcessDetails is describes process metadata.
type ProcessDetails struct {
	PersistentKey    *string `json:"persistentKey,omitempty"`
	PoolID           *int32  `json:"poolId,omitempty"`
	FirstPid         *int32  `json:"firstPid,omitempty"`
	Description      *string `json:"description,omitempty"`
	CompanyName      *string `json:"companyName,omitempty"`
	InternalName     *string `json:"internalName,omitempty"`
	ProductName      *string `json:"productName,omitempty"`
	ProductVersion   *string `json:"productVersion,omitempty"`
	FileVersion      *string `json:"fileVersion,omitempty"`
	CommandLine      *string `json:"commandLine,omitempty"`
	ExecutablePath   *string `json:"executablePath,omitempty"`
	WorkingDirectory *string `json:"workingDirectory,omitempty"`
}

// ProcessReference is reference to a process.
type ProcessReference struct {
	ID                          *string `json:"id,omitempty"`
	Type                        *string `json:"type,omitempty"`
	Name                        *string `json:"name,omitempty"`
	*ProcessReferenceProperties `json:"properties,omitempty"`
}

// ProcessReferenceProperties is resource properties.
type ProcessReferenceProperties struct {
	Machine *MachineReference `json:"machine,omitempty"`
}

// ProcessUser is describes the user under which a process is running.
type ProcessUser struct {
	UserName   *string `json:"userName,omitempty"`
	UserDomain *string `json:"userDomain,omitempty"`
}

// Relationship is a typed relationship between two entities.
type Relationship struct {
	ID   *string `json:"id,omitempty"`
	Type *string `json:"type,omitempty"`
	Name *string `json:"name,omitempty"`
}

// RelationshipProperties is relationship properties.
type RelationshipProperties struct {
	Source      *ResourceReference `json:"source,omitempty"`
	Destination *ResourceReference `json:"destination,omitempty"`
	StartTime   *date.Time         `json:"startTime,omitempty"`
	EndTime     *date.Time         `json:"endTime,omitempty"`
}

// Resource is resource model definition.
type Resource struct {
	ID   *string `json:"id,omitempty"`
	Type *string `json:"type,omitempty"`
	Name *string `json:"name,omitempty"`
}

// ResourceReference is represents a reference to another resource.
type ResourceReference struct {
	ID   *string `json:"id,omitempty"`
	Type *string `json:"type,omitempty"`
	Name *string `json:"name,omitempty"`
}

// SingleMachineDependencyMapRequest is specifies the computation of a single
// server dependency map. A single server dependency map includes all direct
// dependencies of a given machine.
type SingleMachineDependencyMapRequest struct {
	StartTime *date.Time `json:"startTime,omitempty"`
	EndTime   *date.Time `json:"endTime,omitempty"`
	MachineID *string    `json:"machineId,omitempty"`
}

// Summary is base for all resource summaries.
type Summary struct {
	ID   *string `json:"id,omitempty"`
	Type *string `json:"type,omitempty"`
	Name *string `json:"name,omitempty"`
}

// SummaryProperties is base for all summaries.
type SummaryProperties struct {
	StartTime *date.Time `json:"startTime,omitempty"`
	EndTime   *date.Time `json:"endTime,omitempty"`
}

// Timezone is describes a timezone.
type Timezone struct {
	FullName *string `json:"fullName,omitempty"`
}

// VirtualMachineConfiguration is describes the virtualizaton-related
// configuration of a machine.
type VirtualMachineConfiguration struct {
	VirtualMachineType  VirtualMachineType `json:"virtualMachineType,omitempty"`
	NativeMachineID     *string            `json:"nativeMachineId,omitempty"`
	VirtualMachineName  *string            `json:"virtualMachineName,omitempty"`
	NativeHostMachineID *string            `json:"nativeHostMachineId,omitempty"`
}